From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752415AbbJFJr3 (ORCPT ); Tue, 6 Oct 2015 05:47:29 -0400 Received: from mga03.intel.com ([134.134.136.65]:35226 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752008AbbJFJr2 (ORCPT ); Tue, 6 Oct 2015 05:47:28 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,643,1437462000"; d="scan'208";a="820421825" From: Alexander Shishkin To: Greg Kroah-Hartman Cc: linux-kernel@vger.kernel.org, Alexander Shishkin Subject: [PATCH 1/2] stm class: Mark src::link __rcu Date: Tue, 6 Oct 2015 12:47:17 +0300 Message-Id: <1444124838-27049-2-git-send-email-alexander.shishkin@linux.intel.com> X-Mailer: git-send-email 2.6.0 In-Reply-To: <1444124838-27049-1-git-send-email-alexander.shishkin@linux.intel.com> References: <1444124838-27049-1-git-send-email-alexander.shishkin@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Source device's link is protected with srcu, mark it as such to have proper build-time validation of accesses to this field. The update side that's dereferencing it under an update lock also needs an accessor to dereference this field to keep sparse happy. Signed-off-by: Alexander Shishkin --- drivers/hwtracing/stm/core.c | 9 ++++++--- drivers/hwtracing/stm/stm.h | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c index b79c42c625..b6445d9e54 100644 --- a/drivers/hwtracing/stm/core.c +++ b/drivers/hwtracing/stm/core.c @@ -781,17 +781,20 @@ fail_detach: static void __stm_source_link_drop(struct stm_source_device *src, struct stm_device *stm) { + struct stm_device *link; + spin_lock(&src->link_lock); - if (WARN_ON_ONCE(src->link != stm)) { + link = srcu_dereference_check(src->link, &stm_source_srcu, 1); + if (WARN_ON_ONCE(link != stm)) { spin_unlock(&src->link_lock); return; } - stm_output_free(src->link, &src->output); + stm_output_free(link, &src->output); /* caller must hold stm::link_lock */ list_del_init(&src->link_entry); /* matches stm_find_device() from stm_source_link_store() */ - stm_put_device(src->link); + stm_put_device(link); rcu_assign_pointer(src->link, NULL); spin_unlock(&src->link_lock); diff --git a/drivers/hwtracing/stm/stm.h b/drivers/hwtracing/stm/stm.h index cf33bf976a..95ece0292c 100644 --- a/drivers/hwtracing/stm/stm.h +++ b/drivers/hwtracing/stm/stm.h @@ -74,7 +74,7 @@ struct stm_source_device { struct device dev; struct stm_source_data *data; spinlock_t link_lock; - struct stm_device *link; + struct stm_device __rcu *link; struct list_head link_entry; /* one output per stm_source device */ struct stp_policy_node *policy_node; -- 2.5.3