@@ -203,6 +203,12 @@ void quarantine_put(struct kasan_free_meta *info, struct kmem_cache *cache)
qlist_move_all(q, &temp);
raw_spin_lock(&quarantine_lock);
+
+ pr_info("quarantine: PUT %zu to tail batch %d, whole sz %zu, batch sz %lu\n",
+ temp.bytes, quarantine_tail,
+ READ_ONCE(quarantine_size),
+ READ_ONCE(quarantine_batch_size));
+
WRITE_ONCE(quarantine_size, quarantine_size + temp.bytes);
qlist_move_all(&temp, &global_quarantine[quarantine_tail]);
if (global_quarantine[quarantine_tail].bytes >=
@@ -313,7 +319,22 @@ void quarantine_reduce(void)
quarantine_head = get_random_int() % QUARANTINE_BATCHES;
} while (quarantine_head == quarantine_tail);
qlist_move_random(&global_quarantine[quarantine_head], &to_free);
+ pr_info("quarantine: whole sz exceed max by %lu, REDUCE head batch %d by %zu, leave %zu\n",
+ quarantine_size - quarantine_max_size,
+ quarantine_head, to_free.bytes,
+ global_quarantine[quarantine_head].bytes);
WRITE_ONCE(quarantine_size, quarantine_size - to_free.bytes);
+
+ if (quarantine_head == 0) {
+ unsigned long i;
+
+ pr_info("quarantine: data level in batches:");
+ for (i = 0; i < QUARANTINE_BATCHES; i++) {
+ pr_info(" %lu - %lu%%\n",
+ i, global_quarantine[i].bytes *
+ 100 / quarantine_batch_size);
+ }
+ }
}
#endif
Add verbose debugging for deeper understanding of the heap quarantine inner workings (this patch is not for merge). Signed-off-by: Alexander Popov <alex.popov@linux.com> --- mm/kasan/quarantine.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)