|
@@ -2918,7 +2918,7 @@ static const struct vm_operations_struct special_mapping_vmops = {
|
|
* The array pointer and the pages it points to are assumed to stay alive
|
|
* The array pointer and the pages it points to are assumed to stay alive
|
|
* for as long as this mapping might exist.
|
|
* for as long as this mapping might exist.
|
|
*/
|
|
*/
|
|
-int install_special_mapping(struct mm_struct *mm,
|
|
|
|
|
|
+struct vm_area_struct *_install_special_mapping(struct mm_struct *mm,
|
|
unsigned long addr, unsigned long len,
|
|
unsigned long addr, unsigned long len,
|
|
unsigned long vm_flags, struct page **pages)
|
|
unsigned long vm_flags, struct page **pages)
|
|
{
|
|
{
|
|
@@ -2927,7 +2927,7 @@ int install_special_mapping(struct mm_struct *mm,
|
|
|
|
|
|
vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
|
|
vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
|
|
if (unlikely(vma == NULL))
|
|
if (unlikely(vma == NULL))
|
|
- return -ENOMEM;
|
|
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
INIT_LIST_HEAD(&vma->anon_vma_chain);
|
|
INIT_LIST_HEAD(&vma->anon_vma_chain);
|
|
vma->vm_mm = mm;
|
|
vma->vm_mm = mm;
|
|
@@ -2948,11 +2948,23 @@ int install_special_mapping(struct mm_struct *mm,
|
|
|
|
|
|
perf_event_mmap(vma);
|
|
perf_event_mmap(vma);
|
|
|
|
|
|
- return 0;
|
|
|
|
|
|
+ return vma;
|
|
|
|
|
|
out:
|
|
out:
|
|
kmem_cache_free(vm_area_cachep, vma);
|
|
kmem_cache_free(vm_area_cachep, vma);
|
|
- return ret;
|
|
|
|
|
|
+ return ERR_PTR(ret);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int install_special_mapping(struct mm_struct *mm,
|
|
|
|
+ unsigned long addr, unsigned long len,
|
|
|
|
+ unsigned long vm_flags, struct page **pages)
|
|
|
|
+{
|
|
|
|
+ struct vm_area_struct *vma = _install_special_mapping(mm,
|
|
|
|
+ addr, len, vm_flags, pages);
|
|
|
|
+
|
|
|
|
+ if (IS_ERR(vma))
|
|
|
|
+ return PTR_ERR(vma);
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static DEFINE_MUTEX(mm_all_locks_mutex);
|
|
static DEFINE_MUTEX(mm_all_locks_mutex);
|