162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Common Primitives for DAMON Modules
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: SeongJae Park <sjpark@amazon.de>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/damon.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "modules-common.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci * Allocate, set, and return a DAMON context for the physical address space.
1462306a36Sopenharmony_ci * @ctxp:	Pointer to save the point to the newly created context
1562306a36Sopenharmony_ci * @targetp:	Pointer to save the point to the newly created target
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ciint damon_modules_new_paddr_ctx_target(struct damon_ctx **ctxp,
1862306a36Sopenharmony_ci		struct damon_target **targetp)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	struct damon_ctx *ctx;
2162306a36Sopenharmony_ci	struct damon_target *target;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	ctx = damon_new_ctx();
2462306a36Sopenharmony_ci	if (!ctx)
2562306a36Sopenharmony_ci		return -ENOMEM;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	if (damon_select_ops(ctx, DAMON_OPS_PADDR)) {
2862306a36Sopenharmony_ci		damon_destroy_ctx(ctx);
2962306a36Sopenharmony_ci		return -EINVAL;
3062306a36Sopenharmony_ci	}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	target = damon_new_target();
3362306a36Sopenharmony_ci	if (!target) {
3462306a36Sopenharmony_ci		damon_destroy_ctx(ctx);
3562306a36Sopenharmony_ci		return -ENOMEM;
3662306a36Sopenharmony_ci	}
3762306a36Sopenharmony_ci	damon_add_target(ctx, target);
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	*ctxp = ctx;
4062306a36Sopenharmony_ci	*targetp = target;
4162306a36Sopenharmony_ci	return 0;
4262306a36Sopenharmony_ci}
43