diff options
author | Konsta Hölttä <kholtta@nvidia.com> | 2021-06-02 10:33:38 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2021-06-24 11:09:34 -0400 |
commit | 2c441a83d44857b71a599acfe76395942ea936bf (patch) | |
tree | 44c367a4ac7bd0dc06afc46bd3a32010db45c169 | |
parent | 511344da855c4a6fc06432fb478c42664519f93d (diff) |
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 e44ece25ba405505b7fd537b41bd0ad52f1250ce)
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>
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c | 5 |
1 files changed, 0 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c index b6cdffcb..841d345b 100644 --- a/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c +++ b/drivers/gpu/nvgpu/os/linux/ioctl_ctrl.c | |||
@@ -60,7 +60,6 @@ struct gk20a_ctrl_priv { | |||
60 | struct nvgpu_list_node list; | 60 | struct nvgpu_list_node list; |
61 | struct { | 61 | struct { |
62 | struct vm_area_struct *vma; | 62 | struct vm_area_struct *vma; |
63 | unsigned long flags; | ||
64 | bool vma_mapped; | 63 | bool vma_mapped; |
65 | } usermode_vma; | 64 | } usermode_vma; |
66 | }; | 65 | }; |
@@ -2040,7 +2039,6 @@ int gk20a_ctrl_dev_mmap(struct file *filp, struct vm_area_struct *vma) | |||
2040 | vma->vm_end - vma->vm_start, vma->vm_page_prot); | 2039 | vma->vm_end - vma->vm_start, vma->vm_page_prot); |
2041 | if (!err) { | 2040 | if (!err) { |
2042 | priv->usermode_vma.vma = vma; | 2041 | priv->usermode_vma.vma = vma; |
2043 | priv->usermode_vma.flags = vma->vm_flags; | ||
2044 | vma->vm_private_data = priv; | 2042 | vma->vm_private_data = priv; |
2045 | priv->usermode_vma.vma_mapped = true; | 2043 | priv->usermode_vma.vma_mapped = true; |
2046 | } | 2044 | } |
@@ -2089,19 +2087,16 @@ static int alter_usermode_mapping(struct gk20a *g, | |||
2089 | if (poweroff) { | 2087 | if (poweroff) { |
2090 | err = zap_vma_ptes(vma, vma->vm_start, SZ_4K); | 2088 | err = zap_vma_ptes(vma, vma->vm_start, SZ_4K); |
2091 | if (err == 0) { | 2089 | if (err == 0) { |
2092 | vma->vm_flags = VM_NONE; | ||
2093 | priv->usermode_vma.vma_mapped = false; | 2090 | priv->usermode_vma.vma_mapped = false; |
2094 | } else { | 2091 | } else { |
2095 | nvgpu_err(g, "can't remove usermode mapping"); | 2092 | nvgpu_err(g, "can't remove usermode mapping"); |
2096 | } | 2093 | } |
2097 | } else { | 2094 | } else { |
2098 | vma->vm_flags = priv->usermode_vma.flags; | ||
2099 | err = io_remap_pfn_range(vma, vma->vm_start, | 2095 | err = io_remap_pfn_range(vma, vma->vm_start, |
2100 | addr >> PAGE_SHIFT, | 2096 | addr >> PAGE_SHIFT, |
2101 | SZ_4K, vma->vm_page_prot); | 2097 | SZ_4K, vma->vm_page_prot); |
2102 | if (err != 0) { | 2098 | if (err != 0) { |
2103 | nvgpu_err(g, "can't restore usermode mapping"); | 2099 | nvgpu_err(g, "can't restore usermode mapping"); |
2104 | vma->vm_flags = VM_NONE; | ||
2105 | } else { | 2100 | } else { |
2106 | priv->usermode_vma.vma_mapped = true; | 2101 | priv->usermode_vma.vma_mapped = true; |
2107 | } | 2102 | } |