File Index
Files and directories
Sign in
FILE

test_hmm.c

File preview with syntax highlighting.

linux-6.19.14/lib/test_hmm.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * This is a module to test the HMM (Heterogeneous Memory Management)
   4 * mirror and zone device private memory migration APIs of the kernel.
   5 * Userspace programs can register with the driver to mirror their own address
   6 * space and can use the device to read/write any valid virtual address.
   7 */
   8#include <linux/init.h>
   9#include <linux/fs.h>
  10#include <linux/mm.h>
  11#include <linux/module.h>
  12#include <linux/kernel.h>
  13#include <linux/cdev.h>
  14#include <linux/device.h>
  15#include <linux/memremap.h>
  16#include <linux/mutex.h>
  17#include <linux/rwsem.h>
  18#include <linux/sched.h>
  19#include <linux/slab.h>
  20#include <linux/highmem.h>
  21#include <linux/delay.h>
  22#include <linux/pagemap.h>
  23#include <linux/hmm.h>
  24#include <linux/vmalloc.h>
  25#include <linux/swap.h>
  26#include <linux/swapops.h>
  27#include <linux/sched/mm.h>
  28#include <linux/platform_device.h>
  29#include <linux/rmap.h>
  30#include <linux/mmu_notifier.h>
  31#include <linux/migrate.h>
  32
  33#include "test_hmm_uapi.h"
  34
  35#define DMIRROR_NDEVICES		4
  36#define DMIRROR_RANGE_FAULT_TIMEOUT	1000
  37#define DEVMEM_CHUNK_SIZE		(256 * 1024 * 1024U)
  38#define DEVMEM_CHUNKS_RESERVE		16
  39
  40/*
  41 * For device_private pages, dpage is just a dummy struct page
  42 * representing a piece of device memory. dmirror_devmem_alloc_page
  43 * allocates a real system memory page as backing storage to fake a
  44 * real device. zone_device_data points to that backing page. But
  45 * for device_coherent memory, the struct page represents real
  46 * physical CPU-accessible memory that we can use directly.
  47 */
  48#define BACKING_PAGE(page) (is_device_private_page((page)) ? \
  49			   (page)->zone_device_data : (page))
  50
  51static unsigned long spm_addr_dev0;
  52module_param(spm_addr_dev0, long, 0644);
  53MODULE_PARM_DESC(spm_addr_dev0,
  54		"Specify start address for SPM (special purpose memory) used for device 0. By setting this Coherent device type will be used. Make sure spm_addr_dev1 is set too. Minimum SPM size should be DEVMEM_CHUNK_SIZE.");
  55
  56static unsigned long spm_addr_dev1;
  57module_param(spm_addr_dev1, long, 0644);
  58MODULE_PARM_DESC(spm_addr_dev1,
  59		"Specify start address for SPM (special purpose memory) used for device 1. By setting this Coherent device type will be used. Make sure spm_addr_dev0 is set too. Minimum SPM size should be DEVMEM_CHUNK_SIZE.");
  60
  61static const struct dev_pagemap_ops dmirror_devmem_ops;
  62static const struct mmu_interval_notifier_ops dmirror_min_ops;
  63static dev_t dmirror_dev;
  64
  65struct dmirror_device;
  66
  67struct dmirror_bounce {
  68	void			*ptr;
  69	unsigned long		size;
  70	unsigned long		addr;
  71	unsigned long		cpages;
  72};
  73
  74#define DPT_XA_TAG_ATOMIC 1UL
  75#define DPT_XA_TAG_WRITE 3UL
  76
  77/*
  78 * Data structure to track address ranges and register for mmu interval
  79 * notifier updates.
  80 */
  81struct dmirror_interval {
  82	struct mmu_interval_notifier	notifier;
  83	struct dmirror			*dmirror;
  84};
  85
  86/*
  87 * Data attached to the open device file.
  88 * Note that it might be shared after a fork().
  89 */
  90struct dmirror {
  91	struct dmirror_device		*mdevice;
  92	struct xarray			pt;
  93	struct mmu_interval_notifier	notifier;
  94	struct mutex			mutex;
  95	__u64			flags;
  96};
  97
  98/*
  99 * ZONE_DEVICE pages for migration and simulating device memory.
 100 */
 101struct dmirror_chunk {
 102	struct dev_pagemap	pagemap;
 103	struct dmirror_device	*mdevice;
 104	bool remove;
 105};
 106
 107/*
 108 * Per device data.
 109 */
 110struct dmirror_device {
 111	struct cdev		cdevice;
 112	unsigned int            zone_device_type;
 113	struct device		device;
 114
 115	unsigned int		devmem_capacity;
 116	unsigned int		devmem_count;
 117	struct dmirror_chunk	**devmem_chunks;
 118	struct mutex		devmem_lock;	/* protects the above */
 119
 120	unsigned long		calloc;
 121	unsigned long		cfree;
 122	struct page		*free_pages;
 123	struct folio		*free_folios;
 124	spinlock_t		lock;		/* protects the above */
 125};
 126
 127static struct dmirror_device dmirror_devices[DMIRROR_NDEVICES];
 128
 129static int dmirror_bounce_init(struct dmirror_bounce *bounce,
 130			       unsigned long addr,
 131			       unsigned long size)
 132{
 133	bounce->addr = addr;
 134	bounce->size = size;
 135	bounce->cpages = 0;
 136	bounce->ptr = vmalloc(size);
 137	if (!bounce->ptr)
 138		return -ENOMEM;
 139	return 0;
 140}
 141
 142static bool dmirror_is_private_zone(struct dmirror_device *mdevice)
 143{
 144	return (mdevice->zone_device_type ==
 145		HMM_DMIRROR_MEMORY_DEVICE_PRIVATE);
 146}
 147
 148static enum migrate_vma_direction
 149dmirror_select_device(struct dmirror *dmirror)
 150{
 151	return (dmirror->mdevice->zone_device_type ==
 152		HMM_DMIRROR_MEMORY_DEVICE_PRIVATE) ?
 153		MIGRATE_VMA_SELECT_DEVICE_PRIVATE :
 154		MIGRATE_VMA_SELECT_DEVICE_COHERENT;
 155}
 156
 157static void dmirror_bounce_fini(struct dmirror_bounce *bounce)
 158{
 159	vfree(bounce->ptr);
 160}
 161
 162static int dmirror_fops_open(struct inode *inode, struct file *filp)
 163{
 164	struct cdev *cdev = inode->i_cdev;
 165	struct dmirror *dmirror;
 166	int ret;
 167
 168	/* Mirror this process address space */
 169	dmirror = kzalloc(sizeof(*dmirror), GFP_KERNEL);
 170	if (dmirror == NULL)
 171		return -ENOMEM;
 172
 173	dmirror->mdevice = container_of(cdev, struct dmirror_device, cdevice);
 174	mutex_init(&dmirror->mutex);
 175	xa_init(&dmirror->pt);
 176
 177	ret = mmu_interval_notifier_insert(&dmirror->notifier, current->mm,
 178				0, ULONG_MAX & PAGE_MASK, &dmirror_min_ops);
 179	if (ret) {
 180		kfree(dmirror);
 181		return ret;
 182	}
 183
 184	filp->private_data = dmirror;
 185	return 0;
 186}
 187
 188static int dmirror_fops_release(struct inode *inode, struct file *filp)
 189{
 190	struct dmirror *dmirror = filp->private_data;
 191
 192	mmu_interval_notifier_remove(&dmirror->notifier);
 193	xa_destroy(&dmirror->pt);
 194	kfree(dmirror);
 195	return 0;
 196}
 197
 198static struct dmirror_chunk *dmirror_page_to_chunk(struct page *page)
 199{
 200	return container_of(page_pgmap(page), struct dmirror_chunk,
 201			    pagemap);
 202}
 203
 204static struct dmirror_device *dmirror_page_to_device(struct page *page)
 205
 206{
 207	return dmirror_page_to_chunk(page)->mdevice;
 208}
 209
 210static int dmirror_do_fault(struct dmirror *dmirror, struct hmm_range *range)
 211{
 212	unsigned long *pfns = range->hmm_pfns;
 213	unsigned long pfn;
 214
 215	for (pfn = (range->start >> PAGE_SHIFT);
 216	     pfn < (range->end >> PAGE_SHIFT);
 217	     pfn++, pfns++) {
 218		struct page *page;
 219		void *entry;
 220
 221		/*
 222		 * Since we asked for hmm_range_fault() to populate pages,
 223		 * it shouldn't return an error entry on success.
 224		 */
 225		WARN_ON(*pfns & HMM_PFN_ERROR);
 226		WARN_ON(!(*pfns & HMM_PFN_VALID));
 227
 228		page = hmm_pfn_to_page(*pfns);
 229		WARN_ON(!page);
 230
 231		entry = page;
 232		if (*pfns & HMM_PFN_WRITE)
 233			entry = xa_tag_pointer(entry, DPT_XA_TAG_WRITE);
 234		else if (WARN_ON(range->default_flags & HMM_PFN_WRITE))
 235			return -EFAULT;
 236		entry = xa_store(&dmirror->pt, pfn, entry, GFP_ATOMIC);
 237		if (xa_is_err(entry))
 238			return xa_err(entry);
 239	}
 240
 241	return 0;
 242}
 243
 244static void dmirror_do_update(struct dmirror *dmirror, unsigned long start,
 245			      unsigned long end)
 246{
 247	unsigned long pfn;
 248	void *entry;
 249
 250	/*
 251	 * The XArray doesn't hold references to pages since it relies on
 252	 * the mmu notifier to clear page pointers when they become stale.
 253	 * Therefore, it is OK to just clear the entry.
 254	 */
 255	xa_for_each_range(&dmirror->pt, pfn, entry, start >> PAGE_SHIFT,
 256			  end >> PAGE_SHIFT)
 257		xa_erase(&dmirror->pt, pfn);
 258}
 259
 260static bool dmirror_interval_invalidate(struct mmu_interval_notifier *mni,
 261				const struct mmu_notifier_range *range,
 262				unsigned long cur_seq)
 263{
 264	struct dmirror *dmirror = container_of(mni, struct dmirror, notifier);
 265
 266	/*
 267	 * Ignore invalidation callbacks for device private pages since
 268	 * the invalidation is handled as part of the migration process.
 269	 */
 270	if (range->event == MMU_NOTIFY_MIGRATE &&
 271	    range->owner == dmirror->mdevice)
 272		return true;
 273
 274	if (mmu_notifier_range_blockable(range))
 275		mutex_lock(&dmirror->mutex);
 276	else if (!mutex_trylock(&dmirror->mutex))
 277		return false;
 278
 279	mmu_interval_set_seq(mni, cur_seq);
 280	dmirror_do_update(dmirror, range->start, range->end);
 281
 282	mutex_unlock(&dmirror->mutex);
 283	return true;
 284}
 285
 286static const struct mmu_interval_notifier_ops dmirror_min_ops = {
 287	.invalidate = dmirror_interval_invalidate,
 288};
 289
 290static int dmirror_range_fault(struct dmirror *dmirror,
 291				struct hmm_range *range)
 292{
 293	struct mm_struct *mm = dmirror->notifier.mm;
 294	unsigned long timeout =
 295		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
 296	int ret;
 297
 298	while (true) {
 299		if (time_after(jiffies, timeout)) {
 300			ret = -EBUSY;
 301			goto out;
 302		}
 303
 304		range->notifier_seq = mmu_interval_read_begin(range->notifier);
 305		mmap_read_lock(mm);
 306		ret = hmm_range_fault(range);
 307		mmap_read_unlock(mm);
 308		if (ret) {
 309			if (ret == -EBUSY)
 310				continue;
 311			goto out;
 312		}
 313
 314		mutex_lock(&dmirror->mutex);
 315		if (mmu_interval_read_retry(range->notifier,
 316					    range->notifier_seq)) {
 317			mutex_unlock(&dmirror->mutex);
 318			continue;
 319		}
 320		break;
 321	}
 322
 323	ret = dmirror_do_fault(dmirror, range);
 324
 325	mutex_unlock(&dmirror->mutex);
 326out:
 327	return ret;
 328}
 329
 330static int dmirror_fault(struct dmirror *dmirror, unsigned long start,
 331			 unsigned long end, bool write)
 332{
 333	struct mm_struct *mm = dmirror->notifier.mm;
 334	unsigned long addr;
 335	unsigned long pfns[32];
 336	struct hmm_range range = {
 337		.notifier = &dmirror->notifier,
 338		.hmm_pfns = pfns,
 339		.pfn_flags_mask = 0,
 340		.default_flags =
 341			HMM_PFN_REQ_FAULT | (write ? HMM_PFN_REQ_WRITE : 0),
 342		.dev_private_owner = dmirror->mdevice,
 343	};
 344	int ret = 0;
 345
 346	/* Since the mm is for the mirrored process, get a reference first. */
 347	if (!mmget_not_zero(mm))
 348		return 0;
 349
 350	for (addr = start; addr < end; addr = range.end) {
 351		range.start = addr;
 352		range.end = min(addr + (ARRAY_SIZE(pfns) << PAGE_SHIFT), end);
 353
 354		ret = dmirror_range_fault(dmirror, &range);
 355		if (ret)
 356			break;
 357	}
 358
 359	mmput(mm);
 360	return ret;
 361}
 362
 363static int dmirror_do_read(struct dmirror *dmirror, unsigned long start,
 364			   unsigned long end, struct dmirror_bounce *bounce)
 365{
 366	unsigned long pfn;
 367	void *ptr;
 368
 369	ptr = bounce->ptr + ((start - bounce->addr) & PAGE_MASK);
 370
 371	for (pfn = start >> PAGE_SHIFT; pfn < (end >> PAGE_SHIFT); pfn++) {
 372		void *entry;
 373		struct page *page;
 374
 375		entry = xa_load(&dmirror->pt, pfn);
 376		page = xa_untag_pointer(entry);
 377		if (!page)
 378			return -ENOENT;
 379
 380		memcpy_from_page(ptr, page, 0, PAGE_SIZE);
 381
 382		ptr += PAGE_SIZE;
 383		bounce->cpages++;
 384	}
 385
 386	return 0;
 387}
 388
 389static int dmirror_read(struct dmirror *dmirror, struct hmm_dmirror_cmd *cmd)
 390{
 391	struct dmirror_bounce bounce;
 392	unsigned long start, end;
 393	unsigned long size = cmd->npages << PAGE_SHIFT;
 394	int ret;
 395
 396	start = cmd->addr;
 397	end = start + size;
 398	if (end < start)
 399		return -EINVAL;
 400
 401	ret = dmirror_bounce_init(&bounce, start, size);
 402	if (ret)
 403		return ret;
 404
 405	while (1) {
 406		mutex_lock(&dmirror->mutex);
 407		ret = dmirror_do_read(dmirror, start, end, &bounce);
 408		mutex_unlock(&dmirror->mutex);
 409		if (ret != -ENOENT)
 410			break;
 411
 412		start = cmd->addr + (bounce.cpages << PAGE_SHIFT);
 413		ret = dmirror_fault(dmirror, start, end, false);
 414		if (ret)
 415			break;
 416		cmd->faults++;
 417	}
 418
 419	if (ret == 0) {
 420		if (copy_to_user(u64_to_user_ptr(cmd->ptr), bounce.ptr,
 421				 bounce.size))
 422			ret = -EFAULT;
 423	}
 424	cmd->cpages = bounce.cpages;
 425	dmirror_bounce_fini(&bounce);
 426	return ret;
 427}
 428
 429static int dmirror_do_write(struct dmirror *dmirror, unsigned long start,
 430			    unsigned long end, struct dmirror_bounce *bounce)
 431{
 432	unsigned long pfn;
 433	void *ptr;
 434
 435	ptr = bounce->ptr + ((start - bounce->addr) & PAGE_MASK);
 436
 437	for (pfn = start >> PAGE_SHIFT; pfn < (end >> PAGE_SHIFT); pfn++) {
 438		void *entry;
 439		struct page *page;
 440
 441		entry = xa_load(&dmirror->pt, pfn);
 442		page = xa_untag_pointer(entry);
 443		if (!page || xa_pointer_tag(entry) != DPT_XA_TAG_WRITE)
 444			return -ENOENT;
 445
 446		memcpy_to_page(page, 0, ptr, PAGE_SIZE);
 447
 448		ptr += PAGE_SIZE;
 449		bounce->cpages++;
 450	}
 451
 452	return 0;
 453}
 454
 455static int dmirror_write(struct dmirror *dmirror, struct hmm_dmirror_cmd *cmd)
 456{
 457	struct dmirror_bounce bounce;
 458	unsigned long start, end;
 459	unsigned long size = cmd->npages << PAGE_SHIFT;
 460	int ret;
 461
 462	start = cmd->addr;
 463	end = start + size;
 464	if (end < start)
 465		return -EINVAL;
 466
 467	ret = dmirror_bounce_init(&bounce, start, size);
 468	if (ret)
 469		return ret;
 470	if (copy_from_user(bounce.ptr, u64_to_user_ptr(cmd->ptr),
 471			   bounce.size)) {
 472		ret = -EFAULT;
 473		goto fini;
 474	}
 475
 476	while (1) {
 477		mutex_lock(&dmirror->mutex);
 478		ret = dmirror_do_write(dmirror, start, end, &bounce);
 479		mutex_unlock(&dmirror->mutex);
 480		if (ret != -ENOENT)
 481			break;
 482
 483		start = cmd->addr + (bounce.cpages << PAGE_SHIFT);
 484		ret = dmirror_fault(dmirror, start, end, true);
 485		if (ret)
 486			break;
 487		cmd->faults++;
 488	}
 489
 490fini:
 491	cmd->cpages = bounce.cpages;
 492	dmirror_bounce_fini(&bounce);
 493	return ret;
 494}
 495
 496static int dmirror_allocate_chunk(struct dmirror_device *mdevice,
 497				  struct page **ppage, bool is_large)
 498{
 499	struct dmirror_chunk *devmem;
 500	struct resource *res = NULL;
 501	unsigned long pfn;
 502	unsigned long pfn_first;
 503	unsigned long pfn_last;
 504	void *ptr;
 505	int ret = -ENOMEM;
 506
 507	devmem = kzalloc(sizeof(*devmem), GFP_KERNEL);
 508	if (!devmem)
 509		return ret;
 510
 511	switch (mdevice->zone_device_type) {
 512	case HMM_DMIRROR_MEMORY_DEVICE_PRIVATE:
 513		res = request_free_mem_region(&iomem_resource, DEVMEM_CHUNK_SIZE,
 514					      "hmm_dmirror");
 515		if (IS_ERR_OR_NULL(res))
 516			goto err_devmem;
 517		devmem->pagemap.range.start = res->start;
 518		devmem->pagemap.range.end = res->end;
 519		devmem->pagemap.type = MEMORY_DEVICE_PRIVATE;
 520		break;
 521	case HMM_DMIRROR_MEMORY_DEVICE_COHERENT:
 522		devmem->pagemap.range.start = (MINOR(mdevice->cdevice.dev) - 2) ?
 523							spm_addr_dev0 :
 524							spm_addr_dev1;
 525		devmem->pagemap.range.end = devmem->pagemap.range.start +
 526					    DEVMEM_CHUNK_SIZE - 1;
 527		devmem->pagemap.type = MEMORY_DEVICE_COHERENT;
 528		break;
 529	default:
 530		ret = -EINVAL;
 531		goto err_devmem;
 532	}
 533
 534	devmem->pagemap.nr_range = 1;
 535	devmem->pagemap.ops = &dmirror_devmem_ops;
 536	devmem->pagemap.owner = mdevice;
 537
 538	mutex_lock(&mdevice->devmem_lock);
 539
 540	if (mdevice->devmem_count == mdevice->devmem_capacity) {
 541		struct dmirror_chunk **new_chunks;
 542		unsigned int new_capacity;
 543
 544		new_capacity = mdevice->devmem_capacity +
 545				DEVMEM_CHUNKS_RESERVE;
 546		new_chunks = krealloc(mdevice->devmem_chunks,
 547				sizeof(new_chunks[0]) * new_capacity,
 548				GFP_KERNEL);
 549		if (!new_chunks)
 550			goto err_release;
 551		mdevice->devmem_capacity = new_capacity;
 552		mdevice->devmem_chunks = new_chunks;
 553	}
 554	ptr = memremap_pages(&devmem->pagemap, numa_node_id());
 555	if (IS_ERR_OR_NULL(ptr)) {
 556		if (ptr)
 557			ret = PTR_ERR(ptr);
 558		else
 559			ret = -EFAULT;
 560		goto err_release;
 561	}
 562
 563	devmem->mdevice = mdevice;
 564	pfn_first = devmem->pagemap.range.start >> PAGE_SHIFT;
 565	pfn_last = pfn_first + (range_len(&devmem->pagemap.range) >> PAGE_SHIFT);
 566	mdevice->devmem_chunks[mdevice->devmem_count++] = devmem;
 567
 568	mutex_unlock(&mdevice->devmem_lock);
 569
 570	pr_info("added new %u MB chunk (total %u chunks, %u MB) PFNs [0x%lx 0x%lx)\n",
 571		DEVMEM_CHUNK_SIZE / (1024 * 1024),
 572		mdevice->devmem_count,
 573		mdevice->devmem_count * (DEVMEM_CHUNK_SIZE / (1024 * 1024)),
 574		pfn_first, pfn_last);
 575
 576	spin_lock(&mdevice->lock);
 577	for (pfn = pfn_first; pfn < pfn_last; ) {
 578		struct page *page = pfn_to_page(pfn);
 579
 580		if (is_large && IS_ALIGNED(pfn, HPAGE_PMD_NR)
 581			&& (pfn + HPAGE_PMD_NR <= pfn_last)) {
 582			page->zone_device_data = mdevice->free_folios;
 583			mdevice->free_folios = page_folio(page);
 584			pfn += HPAGE_PMD_NR;
 585			continue;
 586		}
 587
 588		page->zone_device_data = mdevice->free_pages;
 589		mdevice->free_pages = page;
 590		pfn++;
 591	}
 592
 593	ret = 0;
 594	if (ppage) {
 595		if (is_large) {
 596			if (!mdevice->free_folios) {
 597				ret = -ENOMEM;
 598				goto err_unlock;
 599			}
 600			*ppage = folio_page(mdevice->free_folios, 0);
 601			mdevice->free_folios = (*ppage)->zone_device_data;
 602			mdevice->calloc += HPAGE_PMD_NR;
 603		} else if (mdevice->free_pages) {
 604			*ppage = mdevice->free_pages;
 605			mdevice->free_pages = (*ppage)->zone_device_data;
 606			mdevice->calloc++;
 607		} else {
 608			ret = -ENOMEM;
 609			goto err_unlock;
 610		}
 611	}
 612err_unlock:
 613	spin_unlock(&mdevice->lock);
 614
 615	return ret;
 616
 617err_release:
 618	mutex_unlock(&mdevice->devmem_lock);
 619	if (res && devmem->pagemap.type == MEMORY_DEVICE_PRIVATE)
 620		release_mem_region(devmem->pagemap.range.start,
 621				   range_len(&devmem->pagemap.range));
 622err_devmem:
 623	kfree(devmem);
 624
 625	return ret;
 626}
 627
 628static struct page *dmirror_devmem_alloc_page(struct dmirror *dmirror,
 629					      bool is_large)
 630{
 631	struct page *dpage = NULL;
 632	struct page *rpage = NULL;
 633	unsigned int order = is_large ? HPAGE_PMD_ORDER : 0;
 634	struct dmirror_device *mdevice = dmirror->mdevice;
 635
 636	/*
 637	 * For ZONE_DEVICE private type, this is a fake device so we allocate
 638	 * real system memory to store our device memory.
 639	 * For ZONE_DEVICE coherent type we use the actual dpage to store the
 640	 * data and ignore rpage.
 641	 */
 642	if (dmirror_is_private_zone(mdevice)) {
 643		rpage = folio_page(folio_alloc(GFP_HIGHUSER, order), 0);
 644		if (!rpage)
 645			return NULL;
 646	}
 647	spin_lock(&mdevice->lock);
 648
 649	if (is_large && mdevice->free_folios) {
 650		dpage = folio_page(mdevice->free_folios, 0);
 651		mdevice->free_folios = dpage->zone_device_data;
 652		mdevice->calloc += 1 << order;
 653		spin_unlock(&mdevice->lock);
 654	} else if (!is_large && mdevice->free_pages) {
 655		dpage = mdevice->free_pages;
 656		mdevice->free_pages = dpage->zone_device_data;
 657		mdevice->calloc++;
 658		spin_unlock(&mdevice->lock);
 659	} else {
 660		spin_unlock(&mdevice->lock);
 661		if (dmirror_allocate_chunk(mdevice, &dpage, is_large))
 662			goto error;
 663	}
 664
 665	zone_device_folio_init(page_folio(dpage),
 666			       page_pgmap(folio_page(page_folio(dpage), 0)),
 667			       order);
 668	dpage->zone_device_data = rpage;
 669	return dpage;
 670
 671error:
 672	if (rpage)
 673		__free_pages(rpage, order);
 674	return NULL;
 675}
 676
 677static void dmirror_migrate_alloc_and_copy(struct migrate_vma *args,
 678					   struct dmirror *dmirror)
 679{
 680	const unsigned long *src = args->src;
 681	unsigned long *dst = args->dst;
 682	unsigned long addr;
 683
 684	for (addr = args->start; addr < args->end; ) {
 685		struct page *spage;
 686		struct page *dpage;
 687		struct page *rpage;
 688		bool is_large = *src & MIGRATE_PFN_COMPOUND;
 689		int write = (*src & MIGRATE_PFN_WRITE) ? MIGRATE_PFN_WRITE : 0;
 690		unsigned long nr = 1;
 691
 692		if (!(*src & MIGRATE_PFN_MIGRATE))
 693			goto next;
 694
 695		/*
 696		 * Note that spage might be NULL which is OK since it is an
 697		 * unallocated pte_none() or read-only zero page.
 698		 */
 699		spage = migrate_pfn_to_page(*src);
 700		if (WARN(spage && is_zone_device_page(spage),
 701		     "page already in device spage pfn: 0x%lx\n",
 702		     page_to_pfn(spage)))
 703			goto next;
 704
 705		if (dmirror->flags & HMM_DMIRROR_FLAG_FAIL_ALLOC) {
 706			dmirror->flags &= ~HMM_DMIRROR_FLAG_FAIL_ALLOC;
 707			dpage = NULL;
 708		} else
 709			dpage = dmirror_devmem_alloc_page(dmirror, is_large);
 710
 711		if (!dpage) {
 712			struct folio *folio;
 713			unsigned long i;
 714			unsigned long spfn = *src >> MIGRATE_PFN_SHIFT;
 715			struct page *src_page;
 716
 717			if (!is_large)
 718				goto next;
 719
 720			if (!spage && is_large) {
 721				nr = HPAGE_PMD_NR;
 722			} else {
 723				folio = page_folio(spage);
 724				nr = folio_nr_pages(folio);
 725			}
 726
 727			for (i = 0; i < nr && addr < args->end; i++) {
 728				dpage = dmirror_devmem_alloc_page(dmirror, false);
 729				rpage = BACKING_PAGE(dpage);
 730				rpage->zone_device_data = dmirror;
 731
 732				*dst = migrate_pfn(page_to_pfn(dpage)) | write;
 733				src_page = pfn_to_page(spfn + i);
 734
 735				if (spage)
 736					copy_highpage(rpage, src_page);
 737				else
 738					clear_highpage(rpage);
 739				src++;
 740				dst++;
 741				addr += PAGE_SIZE;
 742			}
 743			continue;
 744		}
 745
 746		rpage = BACKING_PAGE(dpage);
 747
 748		/*
 749		 * Normally, a device would use the page->zone_device_data to
 750		 * point to the mirror but here we use it to hold the page for
 751		 * the simulated device memory and that page holds the pointer
 752		 * to the mirror.
 753		 */
 754		rpage->zone_device_data = dmirror;
 755
 756		pr_debug("migrating from sys to dev pfn src: 0x%lx pfn dst: 0x%lx\n",
 757			 page_to_pfn(spage), page_to_pfn(dpage));
 758
 759		*dst = migrate_pfn(page_to_pfn(dpage)) | write;
 760
 761		if (is_large) {
 762			int i;
 763			struct folio *folio = page_folio(dpage);
 764			*dst |= MIGRATE_PFN_COMPOUND;
 765
 766			if (folio_test_large(folio)) {
 767				for (i = 0; i < folio_nr_pages(folio); i++) {
 768					struct page *dst_page =
 769						pfn_to_page(page_to_pfn(rpage) + i);
 770					struct page *src_page =
 771						pfn_to_page(page_to_pfn(spage) + i);
 772
 773					if (spage)
 774						copy_highpage(dst_page, src_page);
 775					else
 776						clear_highpage(dst_page);
 777					src++;
 778					dst++;
 779					addr += PAGE_SIZE;
 780				}
 781				continue;
 782			}
 783		}
 784
 785		if (spage)
 786			copy_highpage(rpage, spage);
 787		else
 788			clear_highpage(rpage);
 789
 790next:
 791		src++;
 792		dst++;
 793		addr += PAGE_SIZE;
 794	}
 795}
 796
 797static int dmirror_check_atomic(struct dmirror *dmirror, unsigned long start,
 798			     unsigned long end)
 799{
 800	unsigned long pfn;
 801
 802	for (pfn = start >> PAGE_SHIFT; pfn < (end >> PAGE_SHIFT); pfn++) {
 803		void *entry;
 804
 805		entry = xa_load(&dmirror->pt, pfn);
 806		if (xa_pointer_tag(entry) == DPT_XA_TAG_ATOMIC)
 807			return -EPERM;
 808	}
 809
 810	return 0;
 811}
 812
 813static int dmirror_atomic_map(unsigned long addr, struct page *page,
 814		struct dmirror *dmirror)
 815{
 816	void *entry;
 817
 818	/* Map the migrated pages into the device's page tables. */
 819	mutex_lock(&dmirror->mutex);
 820
 821	entry = xa_tag_pointer(page, DPT_XA_TAG_ATOMIC);
 822	entry = xa_store(&dmirror->pt, addr >> PAGE_SHIFT, entry, GFP_ATOMIC);
 823	if (xa_is_err(entry)) {
 824		mutex_unlock(&dmirror->mutex);
 825		return xa_err(entry);
 826	}
 827
 828	mutex_unlock(&dmirror->mutex);
 829	return 0;
 830}
 831
 832static int dmirror_migrate_finalize_and_map(struct migrate_vma *args,
 833					    struct dmirror *dmirror)
 834{
 835	unsigned long start = args->start;
 836	unsigned long end = args->end;
 837	const unsigned long *src = args->src;
 838	const unsigned long *dst = args->dst;
 839	unsigned long pfn;
 840	const unsigned long start_pfn = start >> PAGE_SHIFT;
 841	const unsigned long end_pfn = end >> PAGE_SHIFT;
 842
 843	/* Map the migrated pages into the device's page tables. */
 844	mutex_lock(&dmirror->mutex);
 845
 846	for (pfn = start_pfn; pfn < end_pfn; pfn++, src++, dst++) {
 847		struct page *dpage;
 848		void *entry;
 849		int nr, i;
 850		struct page *rpage;
 851
 852		if (!(*src & MIGRATE_PFN_MIGRATE))
 853			continue;
 854
 855		dpage = migrate_pfn_to_page(*dst);
 856		if (!dpage)
 857			continue;
 858
 859		if (*dst & MIGRATE_PFN_COMPOUND)
 860			nr = folio_nr_pages(page_folio(dpage));
 861		else
 862			nr = 1;
 863
 864		WARN_ON_ONCE(end_pfn < start_pfn + nr);
 865
 866		rpage = BACKING_PAGE(dpage);
 867		VM_WARN_ON(folio_nr_pages(page_folio(rpage)) != nr);
 868
 869		for (i = 0; i < nr; i++) {
 870			entry = folio_page(page_folio(rpage), i);
 871			if (*dst & MIGRATE_PFN_WRITE)
 872				entry = xa_tag_pointer(entry, DPT_XA_TAG_WRITE);
 873			entry = xa_store(&dmirror->pt, pfn + i, entry, GFP_ATOMIC);
 874			if (xa_is_err(entry)) {
 875				mutex_unlock(&dmirror->mutex);
 876				return xa_err(entry);
 877			}
 878		}
 879	}
 880
 881	mutex_unlock(&dmirror->mutex);
 882	return 0;
 883}
 884
 885static int dmirror_exclusive(struct dmirror *dmirror,
 886			     struct hmm_dmirror_cmd *cmd)
 887{
 888	unsigned long start, end, addr;
 889	unsigned long size = cmd->npages << PAGE_SHIFT;
 890	struct mm_struct *mm = dmirror->notifier.mm;
 891	struct dmirror_bounce bounce;
 892	int ret = 0;
 893
 894	start = cmd->addr;
 895	end = start + size;
 896	if (end < start)
 897		return -EINVAL;
 898
 899	/* Since the mm is for the mirrored process, get a reference first. */
 900	if (!mmget_not_zero(mm))
 901		return -EINVAL;
 902
 903	mmap_read_lock(mm);
 904	for (addr = start; !ret && addr < end; addr += PAGE_SIZE) {
 905		struct folio *folio;
 906		struct page *page;
 907
 908		page = make_device_exclusive(mm, addr, NULL, &folio);
 909		if (IS_ERR(page)) {
 910			ret = PTR_ERR(page);
 911			break;
 912		}
 913
 914		ret = dmirror_atomic_map(addr, page, dmirror);
 915		folio_unlock(folio);
 916		folio_put(folio);
 917	}
 918	mmap_read_unlock(mm);
 919	mmput(mm);
 920
 921	if (ret)
 922		return ret;
 923
 924	/* Return the migrated data for verification. */
 925	ret = dmirror_bounce_init(&bounce, start, size);
 926	if (ret)
 927		return ret;
 928	mutex_lock(&dmirror->mutex);
 929	ret = dmirror_do_read(dmirror, start, end, &bounce);
 930	mutex_unlock(&dmirror->mutex);
 931	if (ret == 0) {
 932		if (copy_to_user(u64_to_user_ptr(cmd->ptr), bounce.ptr,
 933				 bounce.size))
 934			ret = -EFAULT;
 935	}
 936
 937	cmd->cpages = bounce.cpages;
 938	dmirror_bounce_fini(&bounce);
 939	return ret;
 940}
 941
 942static vm_fault_t dmirror_devmem_fault_alloc_and_copy(struct migrate_vma *args,
 943						      struct dmirror *dmirror)
 944{
 945	const unsigned long *src = args->src;
 946	unsigned long *dst = args->dst;
 947	unsigned long start = args->start;
 948	unsigned long end = args->end;
 949	unsigned long addr;
 950	unsigned int order = 0;
 951	int i;
 952
 953	for (addr = start; addr < end; ) {
 954		struct page *dpage, *spage;
 955
 956		spage = migrate_pfn_to_page(*src);
 957		if (!spage || !(*src & MIGRATE_PFN_MIGRATE)) {
 958			addr += PAGE_SIZE;
 959			goto next;
 960		}
 961
 962		if (WARN_ON(!is_device_private_page(spage) &&
 963			    !is_device_coherent_page(spage))) {
 964			addr += PAGE_SIZE;
 965			goto next;
 966		}
 967
 968		spage = BACKING_PAGE(spage);
 969		order = folio_order(page_folio(spage));
 970		if (order)
 971			*dst = MIGRATE_PFN_COMPOUND;
 972		if (*src & MIGRATE_PFN_WRITE)
 973			*dst |= MIGRATE_PFN_WRITE;
 974
 975		if (dmirror->flags & HMM_DMIRROR_FLAG_FAIL_ALLOC) {
 976			dmirror->flags &= ~HMM_DMIRROR_FLAG_FAIL_ALLOC;
 977			*dst &= ~MIGRATE_PFN_COMPOUND;
 978			dpage = NULL;
 979		} else if (order) {
 980			dpage = folio_page(vma_alloc_folio(GFP_HIGHUSER_MOVABLE,
 981						order, args->vma, addr), 0);
 982		} else {
 983			dpage = alloc_page_vma(GFP_HIGHUSER_MOVABLE, args->vma, addr);
 984		}
 985
 986		if (!dpage && !order)
 987			return VM_FAULT_OOM;
 988
 989		pr_debug("migrating from sys to dev pfn src: 0x%lx pfn dst: 0x%lx\n",
 990				page_to_pfn(spage), page_to_pfn(dpage));
 991
 992		if (dpage) {
 993			lock_page(dpage);
 994			*dst |= migrate_pfn(page_to_pfn(dpage));
 995		}
 996
 997		for (i = 0; i < (1 << order); i++) {
 998			struct page *src_page;
 999			struct page *dst_page;
1000
1001			/* Try with smaller pages if large allocation fails */
1002			if (!dpage && order) {
1003				dpage = alloc_page_vma(GFP_HIGHUSER_MOVABLE, args->vma, addr);
1004				lock_page(dpage);
1005				dst[i] = migrate_pfn(page_to_pfn(dpage));
1006				dst_page = pfn_to_page(page_to_pfn(dpage));
1007				dpage = NULL; /* For the next iteration */
1008			} else {
1009				dst_page = pfn_to_page(page_to_pfn(dpage) + i);
1010			}
1011
1012			src_page = pfn_to_page(page_to_pfn(spage) + i);
1013
1014			xa_erase(&dmirror->pt, addr >> PAGE_SHIFT);
1015			addr += PAGE_SIZE;
1016			copy_highpage(dst_page, src_page);
1017		}
1018next:
1019		src += 1 << order;
1020		dst += 1 << order;
1021	}
1022	return 0;
1023}
1024
1025static unsigned long
1026dmirror_successful_migrated_pages(struct migrate_vma *migrate)
1027{
1028	unsigned long cpages = 0;
1029	unsigned long i;
1030
1031	for (i = 0; i < migrate->npages; i++) {
1032		if (migrate->src[i] & MIGRATE_PFN_VALID &&
1033		    migrate->src[i] & MIGRATE_PFN_MIGRATE)
1034			cpages++;
1035	}
1036	return cpages;
1037}
1038
1039static int dmirror_migrate_to_system(struct dmirror *dmirror,
1040				     struct hmm_dmirror_cmd *cmd)
1041{
1042	unsigned long start, end, addr;
1043	unsigned long size = cmd->npages << PAGE_SHIFT;
1044	struct mm_struct *mm = dmirror->notifier.mm;
1045	struct vm_area_struct *vma;
1046	struct migrate_vma args = { 0 };
1047	unsigned long next;
1048	int ret;
1049	unsigned long *src_pfns;
1050	unsigned long *dst_pfns;
1051
1052	src_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*src_pfns), GFP_KERNEL | __GFP_NOFAIL);
1053	dst_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*dst_pfns), GFP_KERNEL | __GFP_NOFAIL);
1054
1055	start = cmd->addr;
1056	end = start + size;
1057	if (end < start)
1058		return -EINVAL;
1059
1060	/* Since the mm is for the mirrored process, get a reference first. */
1061	if (!mmget_not_zero(mm))
1062		return -EINVAL;
1063
1064	cmd->cpages = 0;
1065	mmap_read_lock(mm);
1066	for (addr = start; addr < end; addr = next) {
1067		vma = vma_lookup(mm, addr);
1068		if (!vma || !(vma->vm_flags & VM_READ)) {
1069			ret = -EINVAL;
1070			goto out;
1071		}
1072		next = min(end, addr + (PTRS_PER_PTE << PAGE_SHIFT));
1073		if (next > vma->vm_end)
1074			next = vma->vm_end;
1075
1076		args.vma = vma;
1077		args.src = src_pfns;
1078		args.dst = dst_pfns;
1079		args.start = addr;
1080		args.end = next;
1081		args.pgmap_owner = dmirror->mdevice;
1082		args.flags = dmirror_select_device(dmirror) | MIGRATE_VMA_SELECT_COMPOUND;
1083
1084		ret = migrate_vma_setup(&args);
1085		if (ret)
1086			goto out;
1087
1088		pr_debug("Migrating from device mem to sys mem\n");
1089		dmirror_devmem_fault_alloc_and_copy(&args, dmirror);
1090
1091		migrate_vma_pages(&args);
1092		cmd->cpages += dmirror_successful_migrated_pages(&args);
1093		migrate_vma_finalize(&args);
1094	}
1095out:
1096	mmap_read_unlock(mm);
1097	mmput(mm);
1098	kvfree(src_pfns);
1099	kvfree(dst_pfns);
1100
1101	return ret;
1102}
1103
1104static int dmirror_migrate_to_device(struct dmirror *dmirror,
1105				struct hmm_dmirror_cmd *cmd)
1106{
1107	unsigned long start, end, addr;
1108	unsigned long size = cmd->npages << PAGE_SHIFT;
1109	struct mm_struct *mm = dmirror->notifier.mm;
1110	struct vm_area_struct *vma;
1111	struct dmirror_bounce bounce;
1112	struct migrate_vma args = { 0 };
1113	unsigned long next;
1114	int ret;
1115	unsigned long *src_pfns = NULL;
1116	unsigned long *dst_pfns = NULL;
1117
1118	start = cmd->addr;
1119	end = start + size;
1120	if (end < start)
1121		return -EINVAL;
1122
1123	/* Since the mm is for the mirrored process, get a reference first. */
1124	if (!mmget_not_zero(mm))
1125		return -EINVAL;
1126
1127	ret = -ENOMEM;
1128	src_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*src_pfns),
1129			  GFP_KERNEL | __GFP_NOFAIL);
1130	if (!src_pfns)
1131		goto free_mem;
1132
1133	dst_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*dst_pfns),
1134			  GFP_KERNEL | __GFP_NOFAIL);
1135	if (!dst_pfns)
1136		goto free_mem;
1137
1138	ret = 0;
1139	mmap_read_lock(mm);
1140	for (addr = start; addr < end; addr = next) {
1141		vma = vma_lookup(mm, addr);
1142		if (!vma || !(vma->vm_flags & VM_READ)) {
1143			ret = -EINVAL;
1144			goto out;
1145		}
1146		next = min(end, addr + (PTRS_PER_PTE << PAGE_SHIFT));
1147		if (next > vma->vm_end)
1148			next = vma->vm_end;
1149
1150		args.vma = vma;
1151		args.src = src_pfns;
1152		args.dst = dst_pfns;
1153		args.start = addr;
1154		args.end = next;
1155		args.pgmap_owner = dmirror->mdevice;
1156		args.flags = MIGRATE_VMA_SELECT_SYSTEM |
1157				MIGRATE_VMA_SELECT_COMPOUND;
1158		ret = migrate_vma_setup(&args);
1159		if (ret)
1160			goto out;
1161
1162		pr_debug("Migrating from sys mem to device mem\n");
1163		dmirror_migrate_alloc_and_copy(&args, dmirror);
1164		migrate_vma_pages(&args);
1165		dmirror_migrate_finalize_and_map(&args, dmirror);
1166		migrate_vma_finalize(&args);
1167	}
1168	mmap_read_unlock(mm);
1169	mmput(mm);
1170
1171	/*
1172	 * Return the migrated data for verification.
1173	 * Only for pages in device zone
1174	 */
1175	ret = dmirror_bounce_init(&bounce, start, size);
1176	if (ret)
1177		goto free_mem;
1178	mutex_lock(&dmirror->mutex);
1179	ret = dmirror_do_read(dmirror, start, end, &bounce);
1180	mutex_unlock(&dmirror->mutex);
1181	if (ret == 0) {
1182		if (copy_to_user(u64_to_user_ptr(cmd->ptr), bounce.ptr,
1183				 bounce.size))
1184			ret = -EFAULT;
1185	}
1186	cmd->cpages = bounce.cpages;
1187	dmirror_bounce_fini(&bounce);
1188	goto free_mem;
1189
1190out:
1191	mmap_read_unlock(mm);
1192	mmput(mm);
1193free_mem:
1194	kfree(src_pfns);
1195	kfree(dst_pfns);
1196	return ret;
1197}
1198
1199static void dmirror_mkentry(struct dmirror *dmirror, struct hmm_range *range,
1200			    unsigned char *perm, unsigned long entry)
1201{
1202	struct page *page;
1203
1204	if (entry & HMM_PFN_ERROR) {
1205		*perm = HMM_DMIRROR_PROT_ERROR;
1206		return;
1207	}
1208	if (!(entry & HMM_PFN_VALID)) {
1209		*perm = HMM_DMIRROR_PROT_NONE;
1210		return;
1211	}
1212
1213	page = hmm_pfn_to_page(entry);
1214	if (is_device_private_page(page)) {
1215		/* Is the page migrated to this device or some other? */
1216		if (dmirror->mdevice == dmirror_page_to_device(page))
1217			*perm = HMM_DMIRROR_PROT_DEV_PRIVATE_LOCAL;
1218		else
1219			*perm = HMM_DMIRROR_PROT_DEV_PRIVATE_REMOTE;
1220	} else if (is_device_coherent_page(page)) {
1221		/* Is the page migrated to this device or some other? */
1222		if (dmirror->mdevice == dmirror_page_to_device(page))
1223			*perm = HMM_DMIRROR_PROT_DEV_COHERENT_LOCAL;
1224		else
1225			*perm = HMM_DMIRROR_PROT_DEV_COHERENT_REMOTE;
1226	} else if (is_zero_pfn(page_to_pfn(page)))
1227		*perm = HMM_DMIRROR_PROT_ZERO;
1228	else
1229		*perm = HMM_DMIRROR_PROT_NONE;
1230	if (entry & HMM_PFN_WRITE)
1231		*perm |= HMM_DMIRROR_PROT_WRITE;
1232	else
1233		*perm |= HMM_DMIRROR_PROT_READ;
1234	if (hmm_pfn_to_map_order(entry) + PAGE_SHIFT == PMD_SHIFT)
1235		*perm |= HMM_DMIRROR_PROT_PMD;
1236	else if (hmm_pfn_to_map_order(entry) + PAGE_SHIFT == PUD_SHIFT)
1237		*perm |= HMM_DMIRROR_PROT_PUD;
1238}
1239
1240static bool dmirror_snapshot_invalidate(struct mmu_interval_notifier *mni,
1241				const struct mmu_notifier_range *range,
1242				unsigned long cur_seq)
1243{
1244	struct dmirror_interval *dmi =
1245		container_of(mni, struct dmirror_interval, notifier);
1246	struct dmirror *dmirror = dmi->dmirror;
1247
1248	if (mmu_notifier_range_blockable(range))
1249		mutex_lock(&dmirror->mutex);
1250	else if (!mutex_trylock(&dmirror->mutex))
1251		return false;
1252
1253	/*
1254	 * Snapshots only need to set the sequence number since any
1255	 * invalidation in the interval invalidates the whole snapshot.
1256	 */
1257	mmu_interval_set_seq(mni, cur_seq);
1258
1259	mutex_unlock(&dmirror->mutex);
1260	return true;
1261}
1262
1263static const struct mmu_interval_notifier_ops dmirror_mrn_ops = {
1264	.invalidate = dmirror_snapshot_invalidate,
1265};
1266
1267static int dmirror_range_snapshot(struct dmirror *dmirror,
1268				  struct hmm_range *range,
1269				  unsigned char *perm)
1270{
1271	struct mm_struct *mm = dmirror->notifier.mm;
1272	struct dmirror_interval notifier;
1273	unsigned long timeout =
1274		jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);
1275	unsigned long i;
1276	unsigned long n;
1277	int ret = 0;
1278
1279	notifier.dmirror = dmirror;
1280	range->notifier = &notifier.notifier;
1281
1282	ret = mmu_interval_notifier_insert(range->notifier, mm,
1283			range->start, range->end - range->start,
1284			&dmirror_mrn_ops);
1285	if (ret)
1286		return ret;
1287
1288	while (true) {
1289		if (time_after(jiffies, timeout)) {
1290			ret = -EBUSY;
1291			goto out;
1292		}
1293
1294		range->notifier_seq = mmu_interval_read_begin(range->notifier);
1295
1296		mmap_read_lock(mm);
1297		ret = hmm_range_fault(range);
1298		mmap_read_unlock(mm);
1299		if (ret) {
1300			if (ret == -EBUSY)
1301				continue;
1302			goto out;
1303		}
1304
1305		mutex_lock(&dmirror->mutex);
1306		if (mmu_interval_read_retry(range->notifier,
1307					    range->notifier_seq)) {
1308			mutex_unlock(&dmirror->mutex);
1309			continue;
1310		}
1311		break;
1312	}
1313
1314	n = (range->end - range->start) >> PAGE_SHIFT;
1315	for (i = 0; i < n; i++)
1316		dmirror_mkentry(dmirror, range, perm + i, range->hmm_pfns[i]);
1317
1318	mutex_unlock(&dmirror->mutex);
1319out:
1320	mmu_interval_notifier_remove(range->notifier);
1321	return ret;
1322}
1323
1324static int dmirror_snapshot(struct dmirror *dmirror,
1325			    struct hmm_dmirror_cmd *cmd)
1326{
1327	struct mm_struct *mm = dmirror->notifier.mm;
1328	unsigned long start, end;
1329	unsigned long size = cmd->npages << PAGE_SHIFT;
1330	unsigned long addr;
1331	unsigned long next;
1332	unsigned long pfns[32];
1333	unsigned char perm[32];
1334	char __user *uptr;
1335	struct hmm_range range = {
1336		.hmm_pfns = pfns,
1337		.dev_private_owner = dmirror->mdevice,
1338	};
1339	int ret = 0;
1340
1341	start = cmd->addr;
1342	end = start + size;
1343	if (end < start)
1344		return -EINVAL;
1345
1346	/* Since the mm is for the mirrored process, get a reference first. */
1347	if (!mmget_not_zero(mm))
1348		return -EINVAL;
1349
1350	/*
1351	 * Register a temporary notifier to detect invalidations even if it
1352	 * overlaps with other mmu_interval_notifiers.
1353	 */
1354	uptr = u64_to_user_ptr(cmd->ptr);
1355	for (addr = start; addr < end; addr = next) {
1356		unsigned long n;
1357
1358		next = min(addr + (ARRAY_SIZE(pfns) << PAGE_SHIFT), end);
1359		range.start = addr;
1360		range.end = next;
1361
1362		ret = dmirror_range_snapshot(dmirror, &range, perm);
1363		if (ret)
1364			break;
1365
1366		n = (range.end - range.start) >> PAGE_SHIFT;
1367		if (copy_to_user(uptr, perm, n)) {
1368			ret = -EFAULT;
1369			break;
1370		}
1371
1372		cmd->cpages += n;
1373		uptr += n;
1374	}
1375	mmput(mm);
1376
1377	return ret;
1378}
1379
1380static void dmirror_device_evict_chunk(struct dmirror_chunk *chunk)
1381{
1382	unsigned long start_pfn = chunk->pagemap.range.start >> PAGE_SHIFT;
1383	unsigned long end_pfn = chunk->pagemap.range.end >> PAGE_SHIFT;
1384	unsigned long npages = end_pfn - start_pfn + 1;
1385	unsigned long i;
1386	unsigned long *src_pfns;
1387	unsigned long *dst_pfns;
1388	unsigned int order = 0;
1389
1390	src_pfns = kvcalloc(npages, sizeof(*src_pfns), GFP_KERNEL | __GFP_NOFAIL);
1391	dst_pfns = kvcalloc(npages, sizeof(*dst_pfns), GFP_KERNEL | __GFP_NOFAIL);
1392
1393	migrate_device_range(src_pfns, start_pfn, npages);
1394	for (i = 0; i < npages; i++) {
1395		struct page *dpage, *spage;
1396
1397		spage = migrate_pfn_to_page(src_pfns[i]);
1398		if (!spage || !(src_pfns[i] & MIGRATE_PFN_MIGRATE))
1399			continue;
1400
1401		if (WARN_ON(!is_device_private_page(spage) &&
1402			    !is_device_coherent_page(spage)))
1403			continue;
1404
1405		order = folio_order(page_folio(spage));
1406		spage = BACKING_PAGE(spage);
1407		if (src_pfns[i] & MIGRATE_PFN_COMPOUND) {
1408			dpage = folio_page(folio_alloc(GFP_HIGHUSER_MOVABLE,
1409					      order), 0);
1410		} else {
1411			dpage = alloc_page(GFP_HIGHUSER_MOVABLE | __GFP_NOFAIL);
1412			order = 0;
1413		}
1414
1415		/* TODO Support splitting here */
1416		lock_page(dpage);
1417		dst_pfns[i] = migrate_pfn(page_to_pfn(dpage));
1418		if (src_pfns[i] & MIGRATE_PFN_WRITE)
1419			dst_pfns[i] |= MIGRATE_PFN_WRITE;
1420		if (order)
1421			dst_pfns[i] |= MIGRATE_PFN_COMPOUND;
1422		folio_copy(page_folio(dpage), page_folio(spage));
1423	}
1424	migrate_device_pages(src_pfns, dst_pfns, npages);
1425	migrate_device_finalize(src_pfns, dst_pfns, npages);
1426	kvfree(src_pfns);
1427	kvfree(dst_pfns);
1428}
1429
1430/* Removes free pages from the free list so they can't be re-allocated */
1431static void dmirror_remove_free_pages(struct dmirror_chunk *devmem)
1432{
1433	struct dmirror_device *mdevice = devmem->mdevice;
1434	struct page *page;
1435	struct folio *folio;
1436
1437
1438	for (folio = mdevice->free_folios; folio; folio = folio_zone_device_data(folio))
1439		if (dmirror_page_to_chunk(folio_page(folio, 0)) == devmem)
1440			mdevice->free_folios = folio_zone_device_data(folio);
1441	for (page = mdevice->free_pages; page; page = page->zone_device_data)
1442		if (dmirror_page_to_chunk(page) == devmem)
1443			mdevice->free_pages = page->zone_device_data;
1444}
1445
1446static void dmirror_device_remove_chunks(struct dmirror_device *mdevice)
1447{
1448	unsigned int i;
1449
1450	mutex_lock(&mdevice->devmem_lock);
1451	if (mdevice->devmem_chunks) {
1452		for (i = 0; i < mdevice->devmem_count; i++) {
1453			struct dmirror_chunk *devmem =
1454				mdevice->devmem_chunks[i];
1455
1456			spin_lock(&mdevice->lock);
1457			devmem->remove = true;
1458			dmirror_remove_free_pages(devmem);
1459			spin_unlock(&mdevice->lock);
1460
1461			dmirror_device_evict_chunk(devmem);
1462			memunmap_pages(&devmem->pagemap);
1463			if (devmem->pagemap.type == MEMORY_DEVICE_PRIVATE)
1464				release_mem_region(devmem->pagemap.range.start,
1465						   range_len(&devmem->pagemap.range));
1466			kfree(devmem);
1467		}
1468		mdevice->devmem_count = 0;
1469		mdevice->devmem_capacity = 0;
1470		mdevice->free_pages = NULL;
1471		mdevice->free_folios = NULL;
1472		kfree(mdevice->devmem_chunks);
1473		mdevice->devmem_chunks = NULL;
1474	}
1475	mutex_unlock(&mdevice->devmem_lock);
1476}
1477
1478static long dmirror_fops_unlocked_ioctl(struct file *filp,
1479					unsigned int command,
1480					unsigned long arg)
1481{
1482	void __user *uarg = (void __user *)arg;
1483	struct hmm_dmirror_cmd cmd;
1484	struct dmirror *dmirror;
1485	int ret;
1486
1487	dmirror = filp->private_data;
1488	if (!dmirror)
1489		return -EINVAL;
1490
1491	if (copy_from_user(&cmd, uarg, sizeof(cmd)))
1492		return -EFAULT;
1493
1494	if (cmd.addr & ~PAGE_MASK)
1495		return -EINVAL;
1496	if (cmd.addr >= (cmd.addr + (cmd.npages << PAGE_SHIFT)))
1497		return -EINVAL;
1498
1499	cmd.cpages = 0;
1500	cmd.faults = 0;
1501
1502	switch (command) {
1503	case HMM_DMIRROR_READ:
1504		ret = dmirror_read(dmirror, &cmd);
1505		break;
1506
1507	case HMM_DMIRROR_WRITE:
1508		ret = dmirror_write(dmirror, &cmd);
1509		break;
1510
1511	case HMM_DMIRROR_MIGRATE_TO_DEV:
1512		ret = dmirror_migrate_to_device(dmirror, &cmd);
1513		break;
1514
1515	case HMM_DMIRROR_MIGRATE_TO_SYS:
1516		ret = dmirror_migrate_to_system(dmirror, &cmd);
1517		break;
1518
1519	case HMM_DMIRROR_EXCLUSIVE:
1520		ret = dmirror_exclusive(dmirror, &cmd);
1521		break;
1522
1523	case HMM_DMIRROR_CHECK_EXCLUSIVE:
1524		ret = dmirror_check_atomic(dmirror, cmd.addr,
1525					cmd.addr + (cmd.npages << PAGE_SHIFT));
1526		break;
1527
1528	case HMM_DMIRROR_SNAPSHOT:
1529		ret = dmirror_snapshot(dmirror, &cmd);
1530		break;
1531
1532	case HMM_DMIRROR_RELEASE:
1533		dmirror_device_remove_chunks(dmirror->mdevice);
1534		ret = 0;
1535		break;
1536	case HMM_DMIRROR_FLAGS:
1537		dmirror->flags = cmd.npages;
1538		ret = 0;
1539		break;
1540
1541	default:
1542		return -EINVAL;
1543	}
1544	if (ret)
1545		return ret;
1546
1547	if (copy_to_user(uarg, &cmd, sizeof(cmd)))
1548		return -EFAULT;
1549
1550	return 0;
1551}
1552
1553static int dmirror_fops_mmap(struct file *file, struct vm_area_struct *vma)
1554{
1555	unsigned long addr;
1556
1557	for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) {
1558		struct page *page;
1559		int ret;
1560
1561		page = alloc_page(GFP_KERNEL | __GFP_ZERO);
1562		if (!page)
1563			return -ENOMEM;
1564
1565		ret = vm_insert_page(vma, addr, page);
1566		if (ret) {
1567			__free_page(page);
1568			return ret;
1569		}
1570		put_page(page);
1571	}
1572
1573	return 0;
1574}
1575
1576static const struct file_operations dmirror_fops = {
1577	.open		= dmirror_fops_open,
1578	.release	= dmirror_fops_release,
1579	.mmap		= dmirror_fops_mmap,
1580	.unlocked_ioctl = dmirror_fops_unlocked_ioctl,
1581	.llseek		= default_llseek,
1582	.owner		= THIS_MODULE,
1583};
1584
1585static void dmirror_devmem_free(struct folio *folio)
1586{
1587	struct page *page = &folio->page;
1588	struct page *rpage = BACKING_PAGE(page);
1589	struct dmirror_device *mdevice;
1590	struct folio *rfolio = page_folio(rpage);
1591	unsigned int order = folio_order(rfolio);
1592
1593	if (rpage != page) {
1594		if (order)
1595			__free_pages(rpage, order);
1596		else
1597			__free_page(rpage);
1598		rpage = NULL;
1599	}
1600
1601	mdevice = dmirror_page_to_device(page);
1602	spin_lock(&mdevice->lock);
1603
1604	/* Return page to our allocator if not freeing the chunk */
1605	if (!dmirror_page_to_chunk(page)->remove) {
1606		mdevice->cfree += 1 << order;
1607		if (order) {
1608			page->zone_device_data = mdevice->free_folios;
1609			mdevice->free_folios = page_folio(page);
1610		} else {
1611			page->zone_device_data = mdevice->free_pages;
1612			mdevice->free_pages = page;
1613		}
1614	}
1615	spin_unlock(&mdevice->lock);
1616}
1617
1618static vm_fault_t dmirror_devmem_fault(struct vm_fault *vmf)
1619{
1620	struct migrate_vma args = { 0 };
1621	struct page *rpage;
1622	struct dmirror *dmirror;
1623	vm_fault_t ret = 0;
1624	unsigned int order, nr;
1625
1626	/*
1627	 * Normally, a device would use the page->zone_device_data to point to
1628	 * the mirror but here we use it to hold the page for the simulated
1629	 * device memory and that page holds the pointer to the mirror.
1630	 */
1631	rpage = folio_zone_device_data(page_folio(vmf->page));
1632	dmirror = rpage->zone_device_data;
1633
1634	/* FIXME demonstrate how we can adjust migrate range */
1635	order = folio_order(page_folio(vmf->page));
1636	nr = 1 << order;
1637
1638	/*
1639	 * When folios are partially mapped, we can't rely on the folio
1640	 * order of vmf->page as the folio might not be fully split yet
1641	 */
1642	if (vmf->pte) {
1643		order = 0;
1644		nr = 1;
1645	}
1646
1647	/*
1648	 * Consider a per-cpu cache of src and dst pfns, but with
1649	 * large number of cpus that might not scale well.
1650	 */
1651	args.start = ALIGN_DOWN(vmf->address, (PAGE_SIZE << order));
1652	args.vma = vmf->vma;
1653	args.end = args.start + (PAGE_SIZE << order);
1654
1655	nr = (args.end - args.start) >> PAGE_SHIFT;
1656	args.src = kcalloc(nr, sizeof(unsigned long), GFP_KERNEL);
1657	args.dst = kcalloc(nr, sizeof(unsigned long), GFP_KERNEL);
1658	args.pgmap_owner = dmirror->mdevice;
1659	args.flags = dmirror_select_device(dmirror);
1660	args.fault_page = vmf->page;
1661
1662	if (!args.src || !args.dst) {
1663		ret = VM_FAULT_OOM;
1664		goto err;
1665	}
1666
1667	if (order)
1668		args.flags |= MIGRATE_VMA_SELECT_COMPOUND;
1669
1670	if (migrate_vma_setup(&args))
1671		return VM_FAULT_SIGBUS;
1672
1673	ret = dmirror_devmem_fault_alloc_and_copy(&args, dmirror);
1674	if (ret)
1675		goto err;
1676	migrate_vma_pages(&args);
1677	/*
1678	 * No device finalize step is needed since
1679	 * dmirror_devmem_fault_alloc_and_copy() will have already
1680	 * invalidated the device page table.
1681	 */
1682	migrate_vma_finalize(&args);
1683err:
1684	kfree(args.src);
1685	kfree(args.dst);
1686	return ret;
1687}
1688
1689static void dmirror_devmem_folio_split(struct folio *head, struct folio *tail)
1690{
1691	struct page *rpage = BACKING_PAGE(folio_page(head, 0));
1692	struct page *rpage_tail;
1693	struct folio *rfolio;
1694	unsigned long offset = 0;
1695
1696	if (!rpage) {
1697		tail->page.zone_device_data = NULL;
1698		return;
1699	}
1700
1701	rfolio = page_folio(rpage);
1702
1703	if (tail == NULL) {
1704		folio_reset_order(rfolio);
1705		rfolio->mapping = NULL;
1706		folio_set_count(rfolio, 1);
1707		return;
1708	}
1709
1710	offset = folio_pfn(tail) - folio_pfn(head);
1711
1712	rpage_tail = folio_page(rfolio, offset);
1713	tail->page.zone_device_data = rpage_tail;
1714	rpage_tail->zone_device_data = rpage->zone_device_data;
1715	clear_compound_head(rpage_tail);
1716	rpage_tail->mapping = NULL;
1717
1718	folio_page(tail, 0)->mapping = folio_page(head, 0)->mapping;
1719	tail->pgmap = head->pgmap;
1720	folio_set_count(page_folio(rpage_tail), 1);
1721}
1722
1723static const struct dev_pagemap_ops dmirror_devmem_ops = {
1724	.folio_free	= dmirror_devmem_free,
1725	.migrate_to_ram	= dmirror_devmem_fault,
1726	.folio_split	= dmirror_devmem_folio_split,
1727};
1728
1729static int dmirror_device_init(struct dmirror_device *mdevice, int id)
1730{
1731	dev_t dev;
1732	int ret;
1733
1734	dev = MKDEV(MAJOR(dmirror_dev), id);
1735	mutex_init(&mdevice->devmem_lock);
1736	spin_lock_init(&mdevice->lock);
1737
1738	cdev_init(&mdevice->cdevice, &dmirror_fops);
1739	mdevice->cdevice.owner = THIS_MODULE;
1740	device_initialize(&mdevice->device);
1741	mdevice->device.devt = dev;
1742
1743	ret = dev_set_name(&mdevice->device, "hmm_dmirror%u", id);
1744	if (ret)
1745		goto put_device;
1746
1747	ret = cdev_device_add(&mdevice->cdevice, &mdevice->device);
1748	if (ret)
1749		goto put_device;
1750
1751	/* Build a list of free ZONE_DEVICE struct pages */
1752	return dmirror_allocate_chunk(mdevice, NULL, false);
1753
1754put_device:
1755	put_device(&mdevice->device);
1756	return ret;
1757}
1758
1759static void dmirror_device_remove(struct dmirror_device *mdevice)
1760{
1761	dmirror_device_remove_chunks(mdevice);
1762	cdev_device_del(&mdevice->cdevice, &mdevice->device);
1763	put_device(&mdevice->device);
1764}
1765
1766static int __init hmm_dmirror_init(void)
1767{
1768	int ret;
1769	int id = 0;
1770	int ndevices = 0;
1771
1772	ret = alloc_chrdev_region(&dmirror_dev, 0, DMIRROR_NDEVICES,
1773				  "HMM_DMIRROR");
1774	if (ret)
1775		goto err_unreg;
1776
1777	memset(dmirror_devices, 0, DMIRROR_NDEVICES * sizeof(dmirror_devices[0]));
1778	dmirror_devices[ndevices++].zone_device_type =
1779				HMM_DMIRROR_MEMORY_DEVICE_PRIVATE;
1780	dmirror_devices[ndevices++].zone_device_type =
1781				HMM_DMIRROR_MEMORY_DEVICE_PRIVATE;
1782	if (spm_addr_dev0 && spm_addr_dev1) {
1783		dmirror_devices[ndevices++].zone_device_type =
1784					HMM_DMIRROR_MEMORY_DEVICE_COHERENT;
1785		dmirror_devices[ndevices++].zone_device_type =
1786					HMM_DMIRROR_MEMORY_DEVICE_COHERENT;
1787	}
1788	for (id = 0; id < ndevices; id++) {
1789		ret = dmirror_device_init(dmirror_devices + id, id);
1790		if (ret)
1791			goto err_chrdev;
1792	}
1793
1794	pr_info("HMM test module loaded. This is only for testing HMM.\n");
1795	return 0;
1796
1797err_chrdev:
1798	while (--id >= 0)
1799		dmirror_device_remove(dmirror_devices + id);
1800	unregister_chrdev_region(dmirror_dev, DMIRROR_NDEVICES);
1801err_unreg:
1802	return ret;
1803}
1804
1805static void __exit hmm_dmirror_exit(void)
1806{
1807	int id;
1808
1809	for (id = 0; id < DMIRROR_NDEVICES; id++)
1810		if (dmirror_devices[id].zone_device_type)
1811			dmirror_device_remove(dmirror_devices + id);
1812	unregister_chrdev_region(dmirror_dev, DMIRROR_NDEVICES);
1813}
1814
1815module_init(hmm_dmirror_init);
1816module_exit(hmm_dmirror_exit);
1817MODULE_DESCRIPTION("HMM (Heterogeneous Memory Management) test module");
1818MODULE_LICENSE("GPL");
~/ Read-only file preview.