#define _LGPL_SOURCE
#include <urcu-bp.h>
+#include <urcu/hlist.h>
//extern struct tracepoint __start___tracepoints[] __attribute__((visibility("hidden")));
//extern struct tracepoint __stop___tracepoints[] __attribute__((visibility("hidden")));
static const int tracepoint_debug;
/* libraries that contain tracepoints (struct tracepoint_lib) */
-static LIST_HEAD(libs);
+static CDS_LIST_HEAD(libs);
/*
* tracepoints_mutex nests inside module_mutex. Tracepoints mutex protects the
*/
#define TRACEPOINT_HASH_BITS 6
#define TRACEPOINT_TABLE_SIZE (1 << TRACEPOINT_HASH_BITS)
-static struct hlist_head tracepoint_table[TRACEPOINT_TABLE_SIZE];
+static struct cds_hlist_head tracepoint_table[TRACEPOINT_TABLE_SIZE];
/*
* Note about RCU :
* Tracepoint entries modifications are protected by the tracepoints_mutex.
*/
struct tracepoint_entry {
- struct hlist_node hlist;
+ struct cds_hlist_node hlist;
struct probe *probes;
int refcount; /* Number of times armed. 0 if disarmed. */
char name[0];
struct tp_probes {
union {
//ust// struct rcu_head rcu;
- struct list_head list;
+ struct cds_list_head list;
} u;
struct probe probes[0];
};
static inline void *allocate_probes(int count)
{
- struct tp_probes *p = malloc(count * sizeof(struct probe)
+ struct tp_probes *p = zmalloc(count * sizeof(struct probe)
+ sizeof(struct tp_probes));
return p == NULL ? NULL : p->probes;
}
static inline void release_probes(void *old)
{
if (old) {
- struct tp_probes *tp_probes = container_of(old,
+ struct tp_probes *tp_probes = _ust_container_of(old,
struct tp_probes, probes[0]);
//ust// call_rcu_sched(&tp_probes->u.rcu, rcu_free_old_probes);
synchronize_rcu();
debug_print_probes(entry);
/* (N -> M), (N > 1, M >= 0) probes */
for (nr_probes = 0; old[nr_probes].func; nr_probes++) {
- if ((!probe ||
- old[nr_probes].func == probe &&
+ if (!probe ||
+ (old[nr_probes].func == probe &&
old[nr_probes].data == data))
nr_del++;
}
*/
static struct tracepoint_entry *get_tracepoint(const char *name)
{
- struct hlist_head *head;
- struct hlist_node *node;
+ struct cds_hlist_head *head;
+ struct cds_hlist_node *node;
struct tracepoint_entry *e;
u32 hash = jhash(name, strlen(name), 0);
head = &tracepoint_table[hash & (TRACEPOINT_TABLE_SIZE - 1)];
- hlist_for_each_entry(e, node, head, hlist) {
+ cds_hlist_for_each_entry(e, node, head, hlist) {
if (!strcmp(name, e->name))
return e;
}
*/
static struct tracepoint_entry *add_tracepoint(const char *name)
{
- struct hlist_head *head;
- struct hlist_node *node;
+ struct cds_hlist_head *head;
+ struct cds_hlist_node *node;
struct tracepoint_entry *e;
size_t name_len = strlen(name) + 1;
u32 hash = jhash(name, name_len-1, 0);
head = &tracepoint_table[hash & (TRACEPOINT_TABLE_SIZE - 1)];
- hlist_for_each_entry(e, node, head, hlist) {
+ cds_hlist_for_each_entry(e, node, head, hlist) {
if (!strcmp(name, e->name)) {
DBG("tracepoint %s busy", name);
return ERR_PTR(-EEXIST); /* Already there */
}
}
/*
- * Using kmalloc here to allocate a variable length element. Could
+ * Using zmalloc here to allocate a variable length element. Could
* cause some memory fragmentation if overused.
*/
- e = malloc(sizeof(struct tracepoint_entry) + name_len);
+ e = zmalloc(sizeof(struct tracepoint_entry) + name_len);
if (!e)
return ERR_PTR(-ENOMEM);
memcpy(&e->name[0], name, name_len);
e->probes = NULL;
e->refcount = 0;
- hlist_add_head(&e->hlist, head);
+ cds_hlist_add_head(&e->hlist, head);
return e;
}
*/
static inline void remove_tracepoint(struct tracepoint_entry *e)
{
- hlist_del(&e->hlist);
+ cds_hlist_del(&e->hlist);
free(e);
}
WARN_ON(strcmp((*entry)->name, elem->name) != 0);
/*
- * rcu_assign_pointer has a smp_wmb() which makes sure that the new
+ * rcu_assign_pointer has a cmm_smp_wmb() which makes sure that the new
* probe callbacks array is consistent before setting a pointer to it.
* This array is referenced by __DO_TRACE from
- * include/linux/tracepoints.h. A matching smp_read_barrier_depends()
+ * include/linux/tracepoints.h. A matching cmm_smp_read_barrier_depends()
* is used.
*/
rcu_assign_pointer(elem->probes, (*entry)->probes);
*
* Updates the probe callback corresponding to a range of tracepoints.
*/
-void tracepoint_update_probe_range(struct tracepoint *begin,
- struct tracepoint *end)
+void tracepoint_update_probe_range(struct tracepoint * const *begin,
+ struct tracepoint * const *end)
{
- struct tracepoint *iter;
+ struct tracepoint * const *iter;
struct tracepoint_entry *mark_entry;
pthread_mutex_lock(&tracepoints_mutex);
for (iter = begin; iter < end; iter++) {
- if (!iter->name) {
- disable_tracepoint(iter);
+ if (!(*iter)->name) {
+ disable_tracepoint(*iter);
continue;
}
- mark_entry = get_tracepoint(iter->name);
+ mark_entry = get_tracepoint((*iter)->name);
if (mark_entry) {
- set_tracepoint(&mark_entry, iter,
+ set_tracepoint(&mark_entry, *iter,
!!mark_entry->refcount);
} else {
- disable_tracepoint(iter);
+ disable_tracepoint(*iter);
}
}
pthread_mutex_unlock(&tracepoints_mutex);
struct tracepoint_lib *lib;
//ust// pthread_mutex_lock(&module_mutex);
- list_for_each_entry(lib, &libs, list)
+ cds_list_for_each_entry(lib, &libs, list)
tracepoint_update_probe_range(lib->tracepoints_start,
lib->tracepoints_start + lib->tracepoints_count);
//ust// pthread_mutex_unlock(&module_mutex);
}
//ust// EXPORT_SYMBOL_GPL(tracepoint_probe_unregister);
-static LIST_HEAD(old_probes);
+static CDS_LIST_HEAD(old_probes);
static int need_update;
static void tracepoint_add_old_probes(void *old)
{
need_update = 1;
if (old) {
- struct tp_probes *tp_probes = container_of(old,
+ struct tp_probes *tp_probes = _ust_container_of(old,
struct tp_probes, probes[0]);
- list_add(&tp_probes->u.list, &old_probes);
+ cds_list_add(&tp_probes->u.list, &old_probes);
}
}
*/
void tracepoint_probe_update_all(void)
{
- LIST_HEAD(release_probes);
+ CDS_LIST_HEAD(release_probes);
struct tp_probes *pos, *next;
pthread_mutex_lock(&tracepoints_mutex);
pthread_mutex_unlock(&tracepoints_mutex);
return;
}
- if (!list_empty(&old_probes))
- list_replace_init(&old_probes, &release_probes);
+ if (!cds_list_empty(&old_probes))
+ cds_list_replace_init(&old_probes, &release_probes);
need_update = 0;
pthread_mutex_unlock(&tracepoints_mutex);
tracepoint_update_probes();
- list_for_each_entry_safe(pos, next, &release_probes, u.list) {
- list_del(&pos->u.list);
+ cds_list_for_each_entry_safe(pos, next, &release_probes, u.list) {
+ cds_list_del(&pos->u.list);
//ust// call_rcu_sched(&pos->u.rcu, rcu_free_old_probes);
synchronize_rcu();
free(pos);
int found = 0;
//ust// pthread_mutex_lock(&module_mutex);
- list_for_each_entry(iter_lib, &libs, list) {
+ cds_list_for_each_entry(iter_lib, &libs, list) {
if (iter_lib < iter->lib)
continue;
else if (iter_lib > iter->lib)
* Will return the first tracepoint in the range if the input tracepoint is
* NULL.
*/
-int tracepoint_get_iter_range(struct tracepoint **tracepoint,
- struct tracepoint *begin, struct tracepoint *end)
+int tracepoint_get_iter_range(struct tracepoint * const **tracepoint,
+ struct tracepoint * const *begin, struct tracepoint * const *end)
{
if (!*tracepoint && begin != end) {
*tracepoint = begin;
new_tracepoint_cb = cb;
}
-static void new_tracepoints(struct tracepoint *start, struct tracepoint *end)
+static void new_tracepoints(struct tracepoint * const *start, struct tracepoint * const *end)
{
- if(new_tracepoint_cb) {
- struct tracepoint *t;
+ if (new_tracepoint_cb) {
+ struct tracepoint * const *t;
for(t=start; t < end; t++) {
- new_tracepoint_cb(t);
+ new_tracepoint_cb(*t);
}
}
}
-int tracepoint_register_lib(struct tracepoint *tracepoints_start, int tracepoints_count)
+int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, int tracepoints_count)
{
struct tracepoint_lib *pl;
- pl = (struct tracepoint_lib *) malloc(sizeof(struct tracepoint_lib));
+ pl = (struct tracepoint_lib *) zmalloc(sizeof(struct tracepoint_lib));
pl->tracepoints_start = tracepoints_start;
pl->tracepoints_count = tracepoints_count;
/* FIXME: maybe protect this with its own mutex? */
pthread_mutex_lock(&tracepoints_mutex);
- list_add(&pl->list, &libs);
+ cds_list_add(&pl->list, &libs);
pthread_mutex_unlock(&tracepoints_mutex);
new_tracepoints(tracepoints_start, tracepoints_start + tracepoints_count);
return 0;
}
-int tracepoint_unregister_lib(struct tracepoint *tracepoints_start)
+int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_start)
{
struct tracepoint_lib *lib;
pthread_mutex_lock(&tracepoints_mutex);
- list_for_each_entry(lib, &libs, list) {
- if(lib->tracepoints_start == tracepoints_start) {
+ cds_list_for_each_entry(lib, &libs, list) {
+ if (lib->tracepoints_start == tracepoints_start) {
struct tracepoint_lib *lib2free = lib;
- list_del(&lib->list);
+ cds_list_del(&lib->list);
free(lib2free);
break;
}