[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20090623150434.22490.18824.stgit@localhost>
Date: Tue, 23 Jun 2009 17:04:34 +0200
From: Jesper Dangaard Brouer <hawk@...x.dk>
To: "David S. Miller" <davem@...emloft.net>
Cc: Jesper Dangaard Brouer <hawk@...x.dk>,
"Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>,
netdev@...r.kernel.org, linux-kernel@...r.kernel.org,
dougthompson@...ssion.com, bluesmoke-devel@...ts.sourceforge.net,
axboe@...nel.dk, "Patrick McHardy" <kaber@...sh.net>,
christine.caulfield@...glemail.com, Trond.Myklebust@...app.com,
linux-wireless@...r.kernel.org, johannes@...solutions.net,
yoshfuji@...ux-ipv6.org, shemminger@...ux-foundation.org,
linux-nfs@...r.kernel.org, bfields@...ldses.org, neilb@...e.de,
linux-ext4@...r.kernel.org, tytso@....edu, adilger@....com,
netfilter-devel@...r.kernel.org
Subject: [PATCH 08/10] edac_core: Uses call_rcu() and its own
wait_for_completion scheme.
Module edac_core.ko uses call_rcu() callbacks in edac_device.c, edac_mc.c
and edac_pci.c.
They all uses a wait_for_completion scheme, but this scheme it not 100%
safe on multiple CPUs. See the _rcu_barrier() implementation which explains
why extra precausion is needed.
The patch adds a comment about rcu_barrier() and as a precausion calls
rcu_barrier(). A maintainer needs to look at removing the wait_for_completion
code.
Signed-off-by: Jesper Dangaard Brouer <hawk@...x.dk>
---
drivers/edac/edac_device.c | 5 +++++
drivers/edac/edac_mc.c | 5 +++++
drivers/edac/edac_pci.c | 5 +++++
3 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c
index b02a6a6..5e831c9 100644
--- a/drivers/edac/edac_device.c
+++ b/drivers/edac/edac_device.c
@@ -373,6 +373,11 @@ static void del_edac_device_from_global_list(struct edac_device_ctl_info
init_completion(&edac_device->removal_complete);
call_rcu(&edac_device->rcu, complete_edac_device_list_del);
wait_for_completion(&edac_device->removal_complete);
+
+ /* hawk@...x.dk 2009-06-22: I think that rcu_barrier() should
+ * be used instead of wait_for_completion, because
+ * rcu_barrier() take multiple CPUs into account */
+ rcu_barrier();
}
/*
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c
index 335b7eb..edcce41 100644
--- a/drivers/edac/edac_mc.c
+++ b/drivers/edac/edac_mc.c
@@ -428,6 +428,11 @@ static void del_mc_from_global_list(struct mem_ctl_info *mci)
init_completion(&mci->complete);
call_rcu(&mci->rcu, complete_mc_list_del);
wait_for_completion(&mci->complete);
+
+ /* hawk@...x.dk 2009-06-22: I think that rcu_barrier() should
+ * be used instead of wait_for_completion, because
+ * rcu_barrier() take multiple CPUs into account */
+ rcu_barrier();
}
/**
diff --git a/drivers/edac/edac_pci.c b/drivers/edac/edac_pci.c
index 30b585b..d0eb8c9 100644
--- a/drivers/edac/edac_pci.c
+++ b/drivers/edac/edac_pci.c
@@ -188,6 +188,11 @@ static void del_edac_pci_from_global_list(struct edac_pci_ctl_info *pci)
init_completion(&pci->complete);
call_rcu(&pci->rcu, complete_edac_pci_list_del);
wait_for_completion(&pci->complete);
+
+ /* hawk@...x.dk 2009-06-22: I think that rcu_barrier() should
+ * be used instead of wait_for_completion, because
+ * rcu_barrier() take multiple CPUs into account */
+ rcu_barrier();
}
#if 0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists