diff options
Diffstat (limited to 'drivers/misc/cxl/context.c')
-rw-r--r-- | drivers/misc/cxl/context.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/misc/cxl/context.c b/drivers/misc/cxl/context.c index 2a4c80ac322a..1287148629c0 100644 --- a/drivers/misc/cxl/context.c +++ b/drivers/misc/cxl/context.c | |||
@@ -113,11 +113,11 @@ static int cxl_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
113 | 113 | ||
114 | if (ctx->afu->current_mode == CXL_MODE_DEDICATED) { | 114 | if (ctx->afu->current_mode == CXL_MODE_DEDICATED) { |
115 | area = ctx->afu->psn_phys; | 115 | area = ctx->afu->psn_phys; |
116 | if (offset > ctx->afu->adapter->ps_size) | 116 | if (offset >= ctx->afu->adapter->ps_size) |
117 | return VM_FAULT_SIGBUS; | 117 | return VM_FAULT_SIGBUS; |
118 | } else { | 118 | } else { |
119 | area = ctx->psn_phys; | 119 | area = ctx->psn_phys; |
120 | if (offset > ctx->psn_size) | 120 | if (offset >= ctx->psn_size) |
121 | return VM_FAULT_SIGBUS; | 121 | return VM_FAULT_SIGBUS; |
122 | } | 122 | } |
123 | 123 | ||
@@ -145,8 +145,16 @@ static const struct vm_operations_struct cxl_mmap_vmops = { | |||
145 | */ | 145 | */ |
146 | int cxl_context_iomap(struct cxl_context *ctx, struct vm_area_struct *vma) | 146 | int cxl_context_iomap(struct cxl_context *ctx, struct vm_area_struct *vma) |
147 | { | 147 | { |
148 | u64 start = vma->vm_pgoff << PAGE_SHIFT; | ||
148 | u64 len = vma->vm_end - vma->vm_start; | 149 | u64 len = vma->vm_end - vma->vm_start; |
149 | len = min(len, ctx->psn_size); | 150 | |
151 | if (ctx->afu->current_mode == CXL_MODE_DEDICATED) { | ||
152 | if (start + len > ctx->afu->adapter->ps_size) | ||
153 | return -EINVAL; | ||
154 | } else { | ||
155 | if (start + len > ctx->psn_size) | ||
156 | return -EINVAL; | ||
157 | } | ||
150 | 158 | ||
151 | if (ctx->afu->current_mode != CXL_MODE_DEDICATED) { | 159 | if (ctx->afu->current_mode != CXL_MODE_DEDICATED) { |
152 | /* make sure there is a valid per process space for this AFU */ | 160 | /* make sure there is a valid per process space for this AFU */ |