From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel List <xen-devel@lists.xen.org>,
Keir Fraser <keir@xen.org>, Jan Beulich <JBeulich@suse.com>,
Tim Deegan <tim@xen.org>
Subject: Problems with spin_lock_irqsave() and for_each_online_cpu()
Date: Thu, 17 Oct 2013 20:34:41 +0100 [thread overview]
Message-ID: <52603BD1.40901@citrix.com> (raw)
Hello,
I was triaging a Coverity issue (1055455) which was complaining about
spinlock inbalance in common/trace.c:424.
First of all, there is a latent bug here using "int flags" in a
irqsave/irqrestore. It will be safe until bit 31 of RFLAGS is defined,
but will introduce subtle corruption thereafter.
This bug was not caught by the compiler because of the
spin_lock_irqsave() macro which has slightly non-function-like
semantics. Would it be acceptable to change spin_lock_irqsave() into a
static inline so can be properly typed? (This would come with a huge
amount of code churn as the function would have to take flags by pointer)
As for the spinlocks, while I as the programmer am fairly sure that
"&per_cpu(t_lock, i)" is unlikely to change, coverity takes into account
that updates to __per_cpu_offset[i] have no protection. Because of
RELOC_HIDE(), gcc can't hoist the per_cpu() calculation, but will run
from register cached values of per_cpu__t_lock and __per_cpu_offset[i],
so is guaranteed to find the same lock both times even if
__per_cpu_offset[i] changes.
However, it occurs to me that there is no protection between
for_each_online_cpu() finding a bit set in the cpu_online_map and safely
using per_cpu() to poke at another cpus data. One solution seems to be
to make use of {get,put}_cpu_maps() but this seems overkill especially
as the innards of a for_each_online_cpu() loop only care about one
particular pcpu not disappearing under its feet.
Would it be sensible to have RW locks for each pcpu (specifically not a
per_cpu lock - array of size nr_cpu_ids probably) specifically for the
purpose of playing with another pcpus data? Hopefully this shouldn't
cause too much overhead, but there are a large number of
for_each_online_cpu() calls which would need protecting.
~Andrew
next reply other threads:[~2013-10-17 19:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-17 19:34 Andrew Cooper [this message]
2013-10-18 4:57 ` Problems with spin_lock_irqsave() and for_each_online_cpu() Keir Fraser
2013-10-18 8:19 ` Jan Beulich
2013-10-18 14:55 ` Andrew Cooper
2013-10-18 15:00 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52603BD1.40901@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=JBeulich@suse.com \
--cc=keir@xen.org \
--cc=tim@xen.org \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.