Skip to content

Commit 15706ee

Browse files
author
Fox Snowpatch
committed
1 parent 2dd0957 commit 15706ee

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

arch/powerpc/platforms/book3s/vas-api.c

+36
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,43 @@ static vm_fault_t vas_mmap_fault(struct vm_fault *vmf)
464464
return VM_FAULT_SIGBUS;
465465
}
466466

467+
/*
468+
* During mmap() paste address, mapping VMA is saved in VAS window
469+
* struct which is used to unmap during migration if the window is
470+
* still open. But the user space can remove this mapping with
471+
* munmap() before closing the window and the VMA address will
472+
* be invalid. Set VAS window VMA to NULL in this function which
473+
* is called before VMA free.
474+
*/
475+
static void vas_mmap_close(struct vm_area_struct *vma)
476+
{
477+
struct file *fp = vma->vm_file;
478+
struct coproc_instance *cp_inst = fp->private_data;
479+
struct vas_window *txwin;
480+
481+
/* Should not happen */
482+
if (!cp_inst || !cp_inst->txwin) {
483+
pr_err("No attached VAS window for the paste address mmap\n");
484+
return;
485+
}
486+
487+
txwin = cp_inst->txwin;
488+
/*
489+
* task_ref.vma is set in coproc_mmap() during mmap paste
490+
* address. So it has to be the same VMA that is getting freed.
491+
*/
492+
if (WARN_ON(txwin->task_ref.vma != vma)) {
493+
pr_err("Invalid paste address mmaping\n");
494+
return;
495+
}
496+
497+
mutex_lock(&txwin->task_ref.mmap_mutex);
498+
txwin->task_ref.vma = NULL;
499+
mutex_unlock(&txwin->task_ref.mmap_mutex);
500+
}
501+
467502
static const struct vm_operations_struct vas_vm_ops = {
503+
.close = vas_mmap_close,
468504
.fault = vas_mmap_fault,
469505
};
470506

0 commit comments

Comments
 (0)