gpu: nvgpu: keep usermode region flags on railgate

When the gpu is railgated, the usermode region mappings must be cleared.
This is already done with zap_vma_ptes() but as an extra measure the vm
flags are also zeroed. That is an oversight, so delete that code; in
particular the VM_DONTCOPY flag is important so that the mapping does
not follow fork, as the design does not allow that.

Bug 200726443

Change-Id: I84ed4e38b7de1f0c8cbf4cca6276abfa2409ac3b
Signed-off-by: Konsta Hölttä <kholtta@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2538481
(cherry picked from commit e44ece25ba)
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2548631
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: Debarshi Dutta <ddutta@nvidia.com>
Reviewed-by: Sagar Kamble <skamble@nvidia.com>
Reviewed-by: Bibek Basu <bbasu@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
GVS: Gerrit_Virtual_Submit
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Konsta Hölttä
2021-06-02 17:33:38 +03:00
committed by mobile promotions
parent 511344da85
commit 2c441a83d4

View File

@@ -60,7 +60,6 @@ struct gk20a_ctrl_priv {
struct nvgpu_list_node list; struct nvgpu_list_node list;
struct { struct {
struct vm_area_struct *vma; struct vm_area_struct *vma;
unsigned long flags;
bool vma_mapped; bool vma_mapped;
} usermode_vma; } usermode_vma;
}; };
@@ -2040,7 +2039,6 @@ int gk20a_ctrl_dev_mmap(struct file *filp, struct vm_area_struct *vma)
vma->vm_end - vma->vm_start, vma->vm_page_prot); vma->vm_end - vma->vm_start, vma->vm_page_prot);
if (!err) { if (!err) {
priv->usermode_vma.vma = vma; priv->usermode_vma.vma = vma;
priv->usermode_vma.flags = vma->vm_flags;
vma->vm_private_data = priv; vma->vm_private_data = priv;
priv->usermode_vma.vma_mapped = true; priv->usermode_vma.vma_mapped = true;
} }
@@ -2089,19 +2087,16 @@ static int alter_usermode_mapping(struct gk20a *g,
if (poweroff) { if (poweroff) {
err = zap_vma_ptes(vma, vma->vm_start, SZ_4K); err = zap_vma_ptes(vma, vma->vm_start, SZ_4K);
if (err == 0) { if (err == 0) {
vma->vm_flags = VM_NONE;
priv->usermode_vma.vma_mapped = false; priv->usermode_vma.vma_mapped = false;
} else { } else {
nvgpu_err(g, "can't remove usermode mapping"); nvgpu_err(g, "can't remove usermode mapping");
} }
} else { } else {
vma->vm_flags = priv->usermode_vma.flags;
err = io_remap_pfn_range(vma, vma->vm_start, err = io_remap_pfn_range(vma, vma->vm_start,
addr >> PAGE_SHIFT, addr >> PAGE_SHIFT,
SZ_4K, vma->vm_page_prot); SZ_4K, vma->vm_page_prot);
if (err != 0) { if (err != 0) {
nvgpu_err(g, "can't restore usermode mapping"); nvgpu_err(g, "can't restore usermode mapping");
vma->vm_flags = VM_NONE;
} else { } else {
priv->usermode_vma.vma_mapped = true; priv->usermode_vma.vma_mapped = true;
} }