2 * webprobe/webprobe_prof.c
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 * Copyright (C) Samsung Electronics, 2015
19 * 2015 Anastasia Lyupa <a.lyupa@samsung.com>
23 #include <linux/module.h>
24 #include <linux/slab.h>
25 #include <linux/version.h>
27 #include <us_manager/pf/pf_group.h>
28 #include <us_manager/probes/probes.h>
29 #include <us_manager/probes/probe_info_new.h>
31 #include "webprobe_prof.h"
33 static DEFINE_MUTEX(mutex_enable);
35 struct web_prof_data {
36 struct dentry *app_dentry;
37 struct dentry *lib_dentry;
40 struct probe_desc *inspserver;
42 struct probe_desc *tick_probe;
43 enum web_prof_state_t enabled;
46 static const char *CHROMIUM_EWK = "/usr/lib/libchromium-ewk.so";
47 static struct web_prof_data *web_data;
49 u64 *web_prof_addr_ptr(enum web_prof_addr_t type)
54 case INSPSERVER_START:
55 addr_ptr = &web_data->inspserver_addr;
58 addr_ptr = &web_data->tick_addr;
61 pr_err("ERROR: WEB_PROF_ADDR_PTR_TYPE=0x%x\n", type);
68 unsigned long web_prof_addr(enum web_prof_addr_t type)
73 case INSPSERVER_START:
74 addr = web_data->inspserver_addr;
77 addr = web_data->tick_addr;
80 pr_err("ERROR: WEB_PROF_ADDR_TYPE=0x%x\n", type);
87 static struct probe_desc *web_func_inst_add(unsigned long addr)
90 struct probe_desc *probe = NULL;
92 probe = kmalloc(sizeof(*probe), GFP_KERNEL);
97 memset(probe, 0, sizeof(*probe));
98 probe->type = SWAP_WEBPROBE;
100 ret = pf_register_probe(web_data->pfg, web_data->lib_dentry,
106 static int __web_func_inst_remove(unsigned long addr, struct probe_desc *pd)
113 /* FIXME: check that address needs removing */
114 ret = pf_unregister_probe(web_data->pfg, web_data->lib_dentry,
120 int web_func_inst_remove(enum web_prof_addr_t type)
122 unsigned long addr = 0;
123 struct probe_desc *pd = NULL;
126 case INSPSERVER_START:
127 addr = web_data->inspserver_addr;
128 pd = web_data->inspserver;
131 addr = web_data->tick_addr;
132 pd = web_data->tick_probe;
135 pr_err("ERROR: WEB_PROF_ADDR_TYPE=0x%x\n", type);
138 return __web_func_inst_remove(addr, pd);
141 int web_prof_data_set(char *app_path, char *app_id)
143 web_data->app_dentry = dentry_by_path(app_path);
144 if (!web_data->app_dentry)
147 web_data->lib_dentry = dentry_by_path(CHROMIUM_EWK);
148 if (!web_data->lib_dentry)
152 put_pf_group(web_data->pfg);
154 web_data->pfg = get_pf_group_by_comm(app_id, web_data->app_dentry);
161 struct dentry *web_prof_lib_dentry(void)
163 return web_data->lib_dentry;
166 enum web_prof_state_t web_prof_enabled(void)
168 return web_data->enabled;
171 int web_prof_enable(void)
175 mutex_lock(&mutex_enable);
176 if (web_data->enabled != PROF_OFF) {
177 pr_err("ERROR: Web profiling is already enabled\n");
181 web_data->enabled = PROF_ON;
183 if (web_data->inspserver_addr) {
184 web_data->inspserver =
185 web_func_inst_add(web_data->inspserver_addr);
188 if (web_data->tick_addr) {
189 web_data->tick_probe =
190 web_func_inst_add(web_data->tick_addr);
194 mutex_unlock(&mutex_enable);
199 int web_prof_disable(void)
203 mutex_lock(&mutex_enable);
204 if (web_data->enabled != PROF_ON) {
205 pr_err("ERROR: Web profiling is already disabled\n");
210 web_data->enabled = PROF_OFF;
212 if (web_data->inspserver_addr) {
213 if (!__web_func_inst_remove(web_data->inspserver_addr,
214 web_data->inspserver)) {
215 kfree(web_data->inspserver);
216 web_data->inspserver = NULL;
220 if (web_data->tick_addr) {
221 if (!__web_func_inst_remove(web_data->tick_addr,
222 web_data->tick_probe)) {
223 kfree(web_data->tick_probe);
224 web_data->tick_probe = NULL;
229 mutex_unlock(&mutex_enable);
234 int web_prof_init(void)
236 web_data = kmalloc(sizeof(*web_data), GFP_KERNEL);
240 memset(web_data, 0, sizeof(struct web_prof_data));
242 web_data->enabled = PROF_OFF;
247 void web_prof_exit(void)
250 put_pf_group(web_data->pfg);
252 kfree(web_data->inspserver);
253 kfree(web_data->tick_probe);