[PATCH 1/1] pgo: Fix allocate_node() handling of non-vmlinux nodes.

Jarmo Tiitto
2021-06-02T01:03:08Z

Currently allocate_node() will reserve nodes even if *p
doesn't point into __llvm_prf_data_start - __llvm_prf_data_end
range.

Fix it by checking if p points into vmlinux range
and otherwise return NULL.

Signed-off-by: Jarmo Tiitto <jarmo.tiitto@gmail.com>
---
kernel/pgo/instrument.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/kernel/pgo/instrument.c b/kernel/pgo/instrument.c
index 0e07ee1b17d9..9bca535dfa91 100644
--- a/kernel/pgo/instrument.c
+++ b/kernel/pgo/instrument.c
@@ -55,6 +55,10 @@ void prf_unlock(unsigned long flags)
static struct llvm_prf_value_node *allocate_node(struct llvm_prf_data *p,
u32 index, u64 value)
{
+ /* check if p points into vmlinux. If not, don't allocate. */
+ if (p < __llvm_prf_data_start || p >= __llvm_prf_data_end)
+ return NULL;
+
if (&__llvm_prf_vnds_start[current_node + 1] >= __llvm_prf_vnds_end)
return NULL; /* Out of nodes */

--
2.31.1