summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonsta Hölttä <kholtta@nvidia.com>2021-06-02 10:33:38 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2021-06-24 11:09:34 -0400
commit2c441a83d44857b71a599acfe76395942ea936bf (patch)
tree44c367a4ac7bd0dc06afc46bd3a32010db45c169
parent511344da855c4a6fc06432fb478c42664519f93d (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.c5
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 }