ANDROID: mm: add vendor hook to return error on madvise failure

Add vendor hook to return error on madvise failure

Bug: 351175506
Change-Id: I7359b79e409a7de33e3372cb25da97e2fe3c0adc
Signed-off-by: Sooyong Suk <s.suk@samsung.corp-partner.google.com>
This commit is contained in:
Sooyong Suk
2024-07-17 17:00:54 +09:00
committed by Suren Baghdasaryan
parent f966514ece
commit 4ac77992ba
3 changed files with 24 additions and 3 deletions
+2
View File
@@ -331,3 +331,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_use_vm_swappiness);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_scan_control);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exit_signal);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_process_madvise_bypass);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_pageout_return_error);
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_process_madvise_return_error);
+6
View File
@@ -11,6 +11,12 @@ DECLARE_RESTRICTED_HOOK(android_rvh_process_madvise_bypass,
TP_PROTO(int pidfd, const struct iovec __user *vec, size_t vlen,
int behavior, unsigned int flags, ssize_t *ret, bool *bypass),
TP_ARGS(pidfd, vec, vlen, behavior, flags, ret, bypass), 1);
DECLARE_HOOK(android_vh_madvise_pageout_return_error,
TP_PROTO(int ret, bool *return_error),
TP_ARGS(ret, return_error));
DECLARE_HOOK(android_vh_process_madvise_return_error,
TP_PROTO(int behavior, int ret, bool *return_error),
TP_ARGS(behavior, ret, return_error));
#endif
+16 -3
View File
@@ -599,7 +599,7 @@ static long madvise_cold(struct vm_area_struct *vma,
return 0;
}
static void madvise_pageout_page_range(struct mmu_gather *tlb,
static int madvise_pageout_page_range(struct mmu_gather *tlb,
struct vm_area_struct *vma,
unsigned long addr, unsigned long end)
{
@@ -607,10 +607,13 @@ static void madvise_pageout_page_range(struct mmu_gather *tlb,
.pageout = true,
.tlb = tlb,
};
int ret;
tlb_start_vma(tlb, vma);
walk_page_range(vma->vm_mm, addr, end, &cold_walk_ops, &walk_private);
ret = walk_page_range(vma->vm_mm, addr, end, &cold_walk_ops, &walk_private);
tlb_end_vma(tlb, vma);
return ret;
}
static long madvise_pageout(struct vm_area_struct *vma,
@@ -619,6 +622,8 @@ static long madvise_pageout(struct vm_area_struct *vma,
{
struct mm_struct *mm = vma->vm_mm;
struct mmu_gather tlb;
int ret;
bool return_error = false;
*prev = vma;
if (!can_madv_lru_vma(vma))
@@ -636,9 +641,13 @@ static long madvise_pageout(struct vm_area_struct *vma,
lru_add_drain();
tlb_gather_mmu(&tlb, mm);
madvise_pageout_page_range(&tlb, vma, start_addr, end_addr);
ret = madvise_pageout_page_range(&tlb, vma, start_addr, end_addr);
tlb_finish_mmu(&tlb);
trace_android_vh_madvise_pageout_return_error(ret, &return_error);
if (return_error)
return (long)ret;
return 0;
}
@@ -1492,6 +1501,7 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
size_t total_len;
unsigned int f_flags;
bool bypass = false;
bool return_error = false;
trace_android_rvh_process_madvise_bypass(pidfd, vec,
vlen, behavior, flags, &ret, &bypass);
@@ -1547,6 +1557,9 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
break;
iov_iter_advance(&iter, iter_iov_len(&iter));
}
trace_android_vh_process_madvise_return_error(behavior, ret, &return_error);
if (return_error)
goto release_mm;
ret = (total_len - iov_iter_count(&iter)) ? : ret;