msm_sysstats: define callback to get the kgsl memory stats

Define a callback filled that will be registered by the kgsl driver
which will be called by the msm-systats to know about the kgsl allocated
memory in the system or for a process.

Change-Id: I557213800a73ff73d5852a6db7e655013cf025e1
Signed-off-by: Charan Teja Kalla <quic_charante@quicinc.com>
This commit is contained in:
Charan Teja Kalla 2022-07-12 16:31:29 +05:30 committed by Chris Goldsworthy
parent ab732a554c
commit ffcc41a593
2 changed files with 51 additions and 0 deletions

View File

@ -0,0 +1,23 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef _MSM_SYSSTATS_H_
#define _MSM_SYSSTATS_H_
#include <uapi/linux/msm_sysstats.h>
#if IS_ENABLED(CONFIG_MSM_SYSSTATS)
extern void sysstats_register_kgsl_stats_cb(u64 (*cb)(pid_t pid));
extern void sysstats_unregister_kgsl_stats_cb(void);
#else
static inline void sysstats_register_kgsl_stats_cb(u64 (*cb)(pid_t pid))
{
}
static inline void sysstats_unregister_kgsl_stats_cb(void)
{
}
#endif
#endif /* _MSM_SYSSTATS_H_ */

View File

@ -27,12 +27,34 @@ struct tgid_iter {
static struct genl_family family;
static u64 (*sysstats_kgsl_get_stats)(pid_t pid);
static DEFINE_PER_CPU(__u32, sysstats_seqnum);
#define SYSSTATS_CMD_ATTR_MAX 3
static const struct nla_policy sysstats_cmd_get_policy[SYSSTATS_CMD_ATTR_MAX + 1] = {
[SYSSTATS_TASK_CMD_ATTR_PID] = { .type = NLA_U32 },
[SYSSTATS_TASK_CMD_ATTR_FOREACH] = { .type = NLA_U32 },
[SYSSTATS_TASK_CMD_ATTR_PIDS_OF_NAME] = { .type = NLA_NUL_STRING}};
/*
* The below dummy function is a means to get rid of calling
* callbacks with out any external sync.
*/
static u64 sysstats_kgsl_stats(pid_t pid)
{
return 0;
}
void sysstats_register_kgsl_stats_cb(u64 (*cb)(pid_t pid))
{
sysstats_kgsl_get_stats = cb;
}
EXPORT_SYMBOL(sysstats_register_kgsl_stats_cb);
void sysstats_unregister_kgsl_stats_cb(void)
{
sysstats_kgsl_get_stats = sysstats_kgsl_stats;
}
EXPORT_SYMBOL(sysstats_unregister_kgsl_stats_cb);
static int sysstats_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
struct genl_info *info)
@ -191,6 +213,9 @@ static unsigned long get_system_unreclaimble_info(void)
}
rcu_read_unlock();
/* Account the kgsl information. */
size += sysstats_kgsl_get_stats(-1) >> PAGE_SHIFT;
return size;
}
static char *nla_strdup_cust(const struct nlattr *nla, gfp_t flags)
@ -267,6 +292,8 @@ static int sysstats_task_cmd_attr_pid(struct genl_info *info)
task_unlock(p);
}
stats->unreclaimable += sysstats_kgsl_get_stats(stats->pid) >> 10;
task_cputime(tsk, &utime, &stime);
stats->utime = div_u64(utime, NSEC_PER_USEC);
stats->stime = div_u64(stime, NSEC_PER_USEC);
@ -639,6 +666,7 @@ static int __init sysstats_init(void)
if (rc)
return rc;
sysstats_register_kgsl_stats_cb(sysstats_kgsl_stats);
pr_info("registered sysstats version %d\n", SYSSTATS_GENL_VERSION);
return 0;
}