Commit dc55daff authored by Mark Rutland's avatar Mark Rutland Committed by Linus Torvalds
Browse files

kcov: prefault the kcov_area

On many architectures the vmalloc area is lazily faulted in upon first
access.  This is problematic for KCOV, as __sanitizer_cov_trace_pc
accesses the (vmalloc'd) kcov_area, and fault handling code may be
instrumented.  If an access to kcov_area faults, this will result in
mutual recursion through the fault handling code and
__sanitizer_cov_trace_pc(), eventually leading to stack corruption
and/or overflow.

We can avoid this by faulting in the kcov_area before
__sanitizer_cov_trace_pc() is permitted to access it.  Once it has been
faulted in, it will remain present in the process page tables, and will
not fault again.

[ code cleanup]
[ add comment explaining kcov_fault_in_area()]
[ fancier code comment from Mark]

Signed-off-by: Mark Rutland's avatarMark Rutland <>
Acked-by: default avatarAndrey Ryabinin <>
Cc: Dmitry Vyukov <>
Cc: Ingo Molnar <>
Cc: Peter Zijlstra <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent c9484b98
......@@ -324,6 +324,21 @@ static int kcov_close(struct inode *inode, struct file *filep)
return 0;
* Fault in a lazily-faulted vmalloc area before it can be used by
* __santizer_cov_trace_pc(), to avoid recursion issues if any code on the
* vmalloc fault handling path is instrumented.
static void kcov_fault_in_area(struct kcov *kcov)
unsigned long stride = PAGE_SIZE / sizeof(unsigned long);
unsigned long *area = kcov->area;
unsigned long offset;
for (offset = 0; offset < kcov->size; offset += stride)
static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd,
unsigned long arg)
......@@ -372,6 +387,7 @@ static int kcov_ioctl_locked(struct kcov *kcov, unsigned int cmd,
return -EINVAL;
/* Cache in task struct for performance. */
t->kcov_size = kcov->size;
t->kcov_area = kcov->area;
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment