Implement DAMON core internal data structure for queuing received data attribute reports. Initialize the queue for up to 1,000 reports, inside the DAMON init routine. Also update damon_initialized() to return false for the setup failure of the queue. Signed-off-by: SJ Park --- mm/damon/core.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/mm/damon/core.c b/mm/damon/core.c index 0a056949604f9..3f87a7eec442e 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -2334,6 +2334,25 @@ int damos_walk(struct damon_ctx *ctx, struct damos_walk_control *control) return 0; } +/* + * struct damon_report_queue - &struct damon_report queue. + * + * @lock: Represent if this queue is being used by someone. + * @head: Head of the queue. + * @tail: Tail of the queue. + * @size: Size of the queue. + * @reports: Array of &struct damon_report. + */ +struct damon_report_queue { + atomic_t lock; + unsigned int tail; + unsigned int size; + unsigned int nr_reports; + struct damon_report *reports; +}; + +struct damon_report_queue damon_report_queue; + /* * Reset the aggregated monitoring results ('nr_accesses' of each region). */ @@ -4308,7 +4327,7 @@ void damon_update_region_access_rate(struct damon_region *r, bool accessed) */ bool damon_initialized(void) { - return damon_region_cache != NULL; + return damon_region_cache && damon_report_queue.reports; } static int __init damon_init(void) @@ -4319,6 +4338,14 @@ static int __init damon_init(void) return -ENOMEM; } + damon_report_queue.size = 1000; + damon_report_queue.reports = kmalloc_objs(*damon_report_queue.reports, + 1000, GFP_KERNEL); + if (!damon_report_queue.reports) { + pr_err("report queue alloc fail\n"); + return -ENOMEM; + } + return 0; } -- 2.47.3