[ltt-dev] [PATCH urcu 3/4] Maintain list of struct call_rcu_data to keep valgrind happy.
Mathieu Desnoyers
compudj at krystal.dyndns.org
Tue Mar 8 21:50:47 EST 2011
* Paul E. McKenney (paulmck at linux.vnet.ibm.com) wrote:
> Signed-off-by: Paul E. McKenney <paulmck at linux.vnet.ibm.com>
Merged, thanks!
Mathieu
> ---
> urcu-call-rcu.c | 30 ++++++++++++++++++++++++++----
> urcu-call-rcu.h | 1 -
> 2 files changed, 26 insertions(+), 5 deletions(-)
>
> diff --git a/urcu-call-rcu.c b/urcu-call-rcu.c
> index 5c003aa..aa1324e 100644
> --- a/urcu-call-rcu.c
> +++ b/urcu-call-rcu.c
> @@ -36,6 +36,7 @@
> #include "urcu/wfqueue.h"
> #include "urcu-call-rcu.h"
> #include "urcu-pointer.h"
> +#include "urcu/list.h"
>
> /* Data structure that identifies a call_rcu thread. */
>
> @@ -46,8 +47,16 @@ struct call_rcu_data {
> pthread_cond_t cond;
> unsigned long qlen;
> pthread_t tid;
> + struct cds_list_head list;
> } __attribute__((aligned(CAA_CACHE_LINE_SIZE)));
>
> +/*
> + * List of all call_rcu_data structures to keep valgrind happy.
> + * Protected by call_rcu_mutex.
> + */
> +
> +CDS_LIST_HEAD(call_rcu_data_list);
> +
> /* Link a thread using call_rcu() to its call_rcu thread. */
>
> static __thread struct call_rcu_data *thread_call_rcu_data;
> @@ -197,10 +206,12 @@ static void *call_rcu_thread(void *arg)
>
> /*
> * Create both a call_rcu thread and the corresponding call_rcu_data
> - * structure, linking the structure in as specified.
> + * structure, linking the structure in as specified. Caller must hold
> + * call_rcu_mutex.
> */
>
> -void call_rcu_data_init(struct call_rcu_data **crdpp, unsigned long flags)
> +static void call_rcu_data_init(struct call_rcu_data **crdpp,
> + unsigned long flags)
> {
> struct call_rcu_data *crdp;
>
> @@ -221,6 +232,7 @@ void call_rcu_data_init(struct call_rcu_data **crdpp, unsigned long flags)
> exit(-1);
> }
> crdp->flags = flags | URCU_CALL_RCU_RUNNING;
> + cds_list_add(&crdp->list, &call_rcu_data_list);
> cmm_smp_mb(); /* Structure initialized before pointer is planted. */
> *crdpp = crdp;
> if (pthread_create(&crdp->tid, NULL, call_rcu_thread, crdp) != 0) {
> @@ -265,7 +277,7 @@ pthread_t get_call_rcu_thread(struct call_rcu_data *crdp)
> * Create a call_rcu_data structure (with thread) and return a pointer.
> */
>
> -struct call_rcu_data *create_call_rcu_data(unsigned long flags)
> +static struct call_rcu_data *__create_call_rcu_data(unsigned long flags)
> {
> struct call_rcu_data *crdp;
>
> @@ -273,6 +285,16 @@ struct call_rcu_data *create_call_rcu_data(unsigned long flags)
> return crdp;
> }
>
> +struct call_rcu_data *create_call_rcu_data(unsigned long flags)
> +{
> + struct call_rcu_data *crdp;
> +
> + call_rcu_lock(&call_rcu_mutex);
> + crdp = __create_call_rcu_data(flags);
> + call_rcu_unlock(&call_rcu_mutex);
> + return crdp;
> +}
> +
> /*
> * Set the specified CPU to use the specified call_rcu_data structure.
> */
> @@ -399,7 +421,7 @@ int create_all_cpu_call_rcu_data(unsigned long flags)
> call_rcu_unlock(&call_rcu_mutex);
> continue;
> }
> - crdp = create_call_rcu_data(flags);
> + crdp = __create_call_rcu_data(flags);
> if (crdp == NULL) {
> call_rcu_unlock(&call_rcu_mutex);
> errno = ENOMEM;
> diff --git a/urcu-call-rcu.h b/urcu-call-rcu.h
> index 2c13388..f965911 100644
> --- a/urcu-call-rcu.h
> +++ b/urcu-call-rcu.h
> @@ -60,7 +60,6 @@ struct rcu_head {
> /*
> * Exported functions
> */
> -void call_rcu_data_init(struct call_rcu_data **crdpp, unsigned long flags);
> struct call_rcu_data *get_cpu_call_rcu_data(int cpu);
> pthread_t get_call_rcu_thread(struct call_rcu_data *crdp);
> struct call_rcu_data *create_call_rcu_data(unsigned long flags);
> --
> 1.7.3.2
>
>
> _______________________________________________
> ltt-dev mailing list
> ltt-dev at lists.casi.polymtl.ca
> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
>
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list