/* Ktap Main Entry */ static int ktap_main(struct file *file, ktap_parm *parm) { unsigned long *buff = NULL; ktap_state *ks; ktap_closure *cl; int start_time, delta_time; int ret; if (atomic_inc_return(&kp_is_running) != 1) { atomic_dec(&kp_is_running); pr_info("only one ktap thread allow to run\n"); return -EBUSY; } start_time = gettimeofday_us(); ks = kp_newstate(parm, kp_dir_dentry); if (unlikely(!ks)) { ret = -ENOEXEC; goto out; } file->private_data = ks; ret = load_trunk(parm, &buff); if (ret) { pr_err("cannot load file\n"); goto out; } cl = kp_load(ks, (unsigned char *)buff); vfree(buff); if (cl) { /* optimize bytecode before excuting */ kp_optimize_code(ks, 0, cl->p); delta_time = gettimeofday_us() - start_time; kp_verbose_printf(ks, "booting time: %d (us)\n", delta_time); kp_call(ks, ks->top - 1, 0); } kp_final_exit(ks); out: atomic_dec(&kp_is_running); return ret; }
/* Ktap Main Entry */ static int ktap_main(struct file *file, ktap_parm *parm) { unsigned long *buff = NULL; ktap_state *ks; ktap_closure *cl; int start_time, delta_time; int ret; start_time = gettimeofday_us(); ks = kp_newstate(parm, kp_dir_dentry); if (unlikely(!ks)) return -ENOEXEC; file->private_data = ks; ret = load_trunk(parm, &buff); if (ret) { pr_err("cannot load file\n"); return ret; } cl = kp_load(ks, (unsigned char *)buff); vfree(buff); if (cl) { /* optimize bytecode before excuting */ kp_optimize_code(ks, 0, cl->p); delta_time = gettimeofday_us() - start_time; kp_verbose_printf(ks, "booting time: %d (us)\n", delta_time); kp_call(ks, ks->top - 1, 0); } kp_final_exit(ks); return ret; }
/* ktap mainthread initization, main entry for ktap */ ktap_state *kp_newstate(struct ktap_parm *parm, struct dentry *dir, char **argv) { ktap_state *ks; pid_t pid; int cpu; ks = kzalloc(sizeof(ktap_state) + sizeof(ktap_global_state), GFP_KERNEL); if (!ks) return NULL; ks->stack = kp_malloc(ks, KTAP_STACK_SIZE); G(ks) = (ktap_global_state *)(ks + 1); G(ks)->mainthread = ks; G(ks)->seed = 201236; /* todo: make more random in future */ G(ks)->task = current; G(ks)->verbose = parm->verbose; /* for debug use */ G(ks)->print_timestamp = parm->print_timestamp; G(ks)->workload = parm->workload; INIT_LIST_HEAD(&(G(ks)->timers)); INIT_LIST_HEAD(&(G(ks)->probe_events_head)); G(ks)->exit = 0; if (kp_transport_init(ks, dir)) goto out; pid = (pid_t)parm->trace_pid; if (pid != -1) { struct task_struct *task; rcu_read_lock(); task = pid_task(find_vpid(pid), PIDTYPE_PID); if (!task) { kp_error(ks, "cannot find pid %d\n", pid); rcu_read_unlock(); goto out; } G(ks)->trace_task = task; get_task_struct(task); rcu_read_unlock(); } if( !alloc_cpumask_var(&G(ks)->cpumask, GFP_KERNEL)) goto out; cpumask_copy(G(ks)->cpumask, cpu_online_mask); cpu = parm->trace_cpu; if (cpu != -1) { if (!cpu_online(cpu)) { printk(KERN_INFO "ktap: cpu %d is not online\n", cpu); goto out; } cpumask_clear(G(ks)->cpumask); cpumask_set_cpu(cpu, G(ks)->cpumask); } if (cfunction_cache_init(ks)) goto out; kp_tstring_resize(ks, 512); /* set inital string hashtable size */ ktap_init_state(ks); ktap_init_registry(ks); ktap_init_arguments(ks, parm->argc, argv); /* init library */ kp_init_baselib(ks); kp_init_kdebuglib(ks); kp_init_timerlib(ks); kp_init_ansilib(ks); if (alloc_kp_percpu_data()) goto out; if (kp_probe_init(ks)) goto out; return ks; out: G(ks)->exit = 1; kp_final_exit(ks); return NULL; }