[systemd-devel] [PATCH 2/2] domain: grab the domain's parent lock only when needed
Daniel Mack
daniel at zonque.org
Thu Mar 20 02:58:21 PDT 2014
On 03/19/2014 09:24 PM, Djalal Harouni wrote:
> Signed-off-by: Djalal Harouni <tixxdz at opendz.org>
> ---
> domain.c | 13 +++++--------
> 1 file changed, 5 insertions(+), 8 deletions(-)
>
> diff --git a/domain.c b/domain.c
> index d27cad2..554b4fe 100644
> --- a/domain.c
> +++ b/domain.c
> @@ -183,12 +183,13 @@ struct kdbus_domain *kdbus_domain_unref(struct kdbus_domain *domain)
> return NULL;
> }
>
> -static struct kdbus_domain *kdbus_domain_find(struct kdbus_domain const *parent,
> +static struct kdbus_domain *kdbus_domain_find(struct kdbus_domain *parent,
> const char *name)
> {
> struct kdbus_domain *domain = NULL;
> struct kdbus_domain *n;
>
> + mutex_lock(&parent->lock);
> list_for_each_entry(n, &parent->domain_list, domain_entry) {
> if (strcmp(n->name, name))
> continue;
> @@ -196,6 +197,7 @@ static struct kdbus_domain *kdbus_domain_find(struct kdbus_domain const *parent,
> domain = kdbus_domain_ref(n);
> break;
> }
> + mutex_unlock(&parent->lock);
>
> return domain;
> }
> @@ -288,9 +290,6 @@ int kdbus_domain_new(struct kdbus_domain *parent, const char *name,
> atomic64_set(&d->msg_seq_last, 0);
> idr_init(&d->user_idr);
>
> - if (parent)
> - mutex_lock(&parent->lock);
> -
> mutex_lock(&kdbus_subsys_lock);
>
> /* compose name and path of base directory in /dev */
> @@ -340,21 +339,19 @@ int kdbus_domain_new(struct kdbus_domain *parent, const char *name,
>
> /* link into parent domain */
> if (parent) {
What if 'parent' was already unrefed at this point? That can happen any
time as soon we give up the lock.
kdbus_domain_unref() calls kdbus_domain_disconnect(), wihch grabs
domain->lock, so we're only safe as long as we hold the lock across all
operations on the object, right?
Daniel
More information about the systemd-devel
mailing list