|
|
|
|
|
|
|
|
|
|
xen-changelog
[Xen-changelog] [xen-unstable] x86: No need to take full reference when
# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1172751293 0
# Node ID 0de2f7d8d89f0bb134f60b5746ae7920503ff50d
# Parent 9d36026b1b431990163caf09da715cacdab7cae7
x86: No need to take full reference when doing mmu_update on a foreign
domain. Also fix a pre-existing race setting PGT_pinned versus
clearing it during domain_kill().
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
xen/arch/x86/mm.c | 19 +++++++++++--------
xen/include/xen/sched.h | 9 +++++++--
2 files changed, 18 insertions(+), 10 deletions(-)
diff -r 9d36026b1b43 -r 0de2f7d8d89f xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Mar 01 11:38:55 2007 +0000
+++ b/xen/arch/x86/mm.c Thu Mar 01 12:14:53 2007 +0000
@@ -1853,7 +1853,7 @@ static void process_deferred_ops(void)
if ( unlikely(info->foreign != NULL) )
{
- put_domain(info->foreign);
+ rcu_unlock_domain(info->foreign);
info->foreign = NULL;
}
}
@@ -1885,8 +1885,7 @@ static int set_foreigndom(domid_t domid)
switch ( domid )
{
case DOMID_IO:
- get_knownalive_domain(dom_io);
- info->foreign = dom_io;
+ info->foreign = rcu_lock_domain(dom_io);
break;
default:
MEM_LOG("Dom %u cannot set foreign dom", d->domain_id);
@@ -1896,18 +1895,16 @@ static int set_foreigndom(domid_t domid)
}
else
{
- info->foreign = e = get_domain_by_id(domid);
+ info->foreign = e = rcu_lock_domain_by_id(domid);
if ( e == NULL )
{
switch ( domid )
{
case DOMID_XEN:
- get_knownalive_domain(dom_xen);
- info->foreign = dom_xen;
+ info->foreign = rcu_lock_domain(dom_xen);
break;
case DOMID_IO:
- get_knownalive_domain(dom_io);
- info->foreign = dom_io;
+ info->foreign = rcu_lock_domain(dom_io);
break;
default:
MEM_LOG("Unknown domain '%u'", domid);
@@ -2043,6 +2040,12 @@ int do_mmuext_op(
/* A page is dirtied when its pin status is set. */
mark_dirty(d, mfn);
+ /* We can race domain destruction (domain_relinquish_resources). */
+ if ( unlikely(this_cpu(percpu_mm_info).foreign != NULL) &&
+ test_bit(_DOMF_dying, &FOREIGNDOM->domain_flags) &&
+ test_and_clear_bit(_PGT_pinned, &page->u.inuse.type_info) )
+ put_page_and_type(page);
+
break;
case MMUEXT_UNPIN_TABLE:
diff -r 9d36026b1b43 -r 0de2f7d8d89f xen/include/xen/sched.h
--- a/xen/include/xen/sched.h Thu Mar 01 11:38:55 2007 +0000
+++ b/xen/include/xen/sched.h Thu Mar 01 12:14:53 2007 +0000
@@ -292,10 +292,15 @@ static inline void rcu_unlock_domain(str
rcu_read_unlock(&domlist_read_lock);
}
+static inline struct domain *rcu_lock_domain(struct domain *d)
+{
+ rcu_read_lock(d);
+ return d;
+}
+
static inline struct domain *rcu_lock_current_domain(void)
{
- rcu_read_lock(&domlist_read_lock);
- return current->domain;
+ return rcu_lock_domain(current->domain);
}
struct domain *get_domain_by_id(domid_t dom);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] [xen-unstable] x86: No need to take full reference when doing mmu_update on a foreign,
Xen patchbot-unstable <=
|
|
|
|
|