};
sspt_proc_write_lock();
- proc = sspt_proc_get_by_task(current);
+ proc = sspt_proc_get_by_task_no_lock(current);
if (proc) {
sspt_proc_on_each_ip(proc, func_uinst_creare, (void *)&cdata.head);
urinst_info_get_current_hlist(&cdata.rhead, false);
/* if the thread is killed we need to discard pending
* uretprobe instances which have not triggered yet */
sspt_proc_write_lock();
- proc = sspt_proc_get_by_task(task);
+ proc = sspt_proc_get_by_task_no_lock(task);
if (proc) {
urinst_info_get_current_hlist(&head, true);
}
sspt_proc_write_lock();
- proc = sspt_proc_get_by_task(task);
+ proc = sspt_proc_get_by_task_no_lock(task);
if (proc)
__remove_unmap_probes(proc, umd);
struct sspt_proc *proc;
sspt_proc_write_lock();
- proc = sspt_proc_get_by_task(task);
+ proc = sspt_proc_get_by_task_no_lock(task);
if (proc)
list_del(&proc->list);
sspt_proc_write_unlock();
#include <linux/list.h>
#include <us_manager/us_slot_manager.h>
-
static LIST_HEAD(proc_probes_list);
static DEFINE_RWLOCK(sspt_proc_rwlock);
}
}
+struct sspt_proc *sspt_proc_get_by_task(struct task_struct *task)
+{
+ struct sspt_proc *proc;
+
+ sspt_proc_read_lock();
+ proc = sspt_proc_get_by_task_no_lock(task);
+ sspt_proc_read_unlock();
+
+ return proc;
+}
+EXPORT_SYMBOL_GPL(sspt_proc_get_by_task);
+
/**
* @brief Get sspt_proc by task
*
* @param task Pointer on the task_struct struct
* @return Pointer on the sspt_proc struct
*/
-struct sspt_proc *sspt_proc_get_by_task(struct task_struct *task)
+struct sspt_proc *sspt_proc_get_by_task_no_lock(struct task_struct *task)
{
struct sspt_proc *proc, *tmp;
return NULL;
}
-EXPORT_SYMBOL_GPL(sspt_proc_get_by_task);
+EXPORT_SYMBOL_GPL(sspt_proc_get_by_task_no_lock);
/**
* @brief Call func() on each proc (no lock)
*/
struct sspt_proc *sspt_proc_get_by_task_or_new(struct task_struct *task)
{
- struct sspt_proc *proc = sspt_proc_get_by_task(task);
+ struct sspt_proc *proc;
+
+ sspt_proc_write_lock();
+ proc = sspt_proc_get_by_task_no_lock(task);
if (proc == NULL)
proc = sspt_proc_create(task);
+ sspt_proc_write_unlock();
return proc;
}
void on_each_proc(void (*func)(struct sspt_proc *, void *), void *data);
struct sspt_proc *sspt_proc_get_by_task(struct task_struct *task);
+struct sspt_proc *sspt_proc_get_by_task_no_lock(struct task_struct *task);
struct sspt_proc *sspt_proc_get_by_task_or_new(struct task_struct *task);
void sspt_proc_free_all(void);
{
struct sspt_proc *proc;
- proc = sspt_proc_get_by_task(task);
+ /* FIXME: add read lock (deadlock in sampler) */
+ proc = sspt_proc_get_by_task_no_lock(task);
if (proc)
return sspt_proc_is_send_event(proc);