<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.emulators.xen.devel">
    <title>gmane.comp.emulators.xen.devel</title>
    <link>http://blog.gmane.org/gmane.comp.emulators.xen.devel</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131648"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131647"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131637"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131629"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131626"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131624"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131616"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131609"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131607"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131604"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131593"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131589"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131588"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131587"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131586"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131571"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131568"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131561"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131559"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131556"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131648">
    <title>[xen-unstable test] 12975: tolerable FAIL</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131648</link>
    <description>&lt;pre&gt;flight 12975 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/12975/

Failures :-/ but no regressions.

Regressions which are regarded as allowable (not blocking):
 test-amd64-amd64-xl-qemuu-win7-amd64 12 guest-localmigrate/x10 fail like 12972

Tests which did not succeed, but are not blocking:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel 11 leak-check/check             fail never pass
 test-amd64-i386-qemuu-rhel6hvm-amd 11 leak-check/check         fail never pass
 test-amd64-i386-qemuu-rhel6hvm-intel 11 leak-check/check       fail never pass
 test-amd64-i386-xend-winxpsp3 16 leak-check/check             fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-xl-qemuu-winxpsp3 13 guest-stop                 fail never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-rhel6hvm-amd 11 leak-check/check             fail   never pass
 test-i386-i386-xl-winxpsp3   13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win7-amd64 13 guest-stop                   fail  never pass
 test-amd64-amd64-xl-qemuu-winxpsp3 13 guest-stop               fail never pass
 test-amd64-amd64-xl-winxpsp3 13 guest-stop                   fail   never pass
 test-amd64-i386-xl-winxpsp3-vcpus1 13 guest-stop               fail never pass
 test-amd64-amd64-xl-win7-amd64 13 guest-stop                   fail never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  53e0571f94e4
baseline version:
 xen                  53e0571f94e4

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-qemuu-rhel6hvm-amd                           fail    
 test-amd64-amd64-xl-qemuu-win7-amd64                         fail    
 test-amd64-amd64-xl-win7-amd64                               fail    
 test-amd64-i386-xl-win7-amd64                                fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-qemuu-rhel6hvm-intel                         fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-xl-sedf-pin                                 pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-i386-xl-winxpsp3-vcpus1                           fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    
 test-amd64-amd64-xl-qemuu-winxpsp3                           fail    
 test-i386-i386-xl-qemuu-winxpsp3                             fail    
 test-amd64-i386-xend-winxpsp3                                fail    
 test-amd64-amd64-xl-winxpsp3                                 fail    
 test-i386-i386-xl-winxpsp3                                   fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Published tested tree is already up to date.
&lt;/pre&gt;</description>
    <dc:creator>xen.org</dc:creator>
    <dc:date>2012-05-26T06:32:33</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131647">
    <title>[xen-unstable test] 12972: tolerable FAIL - PUSHED</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131647</link>
    <description>&lt;pre&gt;flight 12972 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/12972/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-i386-rhel6hvm-amd  7 redhat-install              fail pass in 12971
 test-amd64-amd64-pv           9 guest-start        fail in 12971 pass in 12972

Regressions which are regarded as allowable (not blocking):
 test-amd64-amd64-xl-qemuu-win7-amd64 12 guest-localmigrate/x10 fail like 12968

Tests which did not succeed, but are not blocking:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel 11 leak-check/check             fail never pass
 test-amd64-i386-qemuu-rhel6hvm-amd 11 leak-check/check         fail never pass
 test-amd64-i386-qemuu-rhel6hvm-intel 11 leak-check/check       fail never pass
 test-amd64-i386-xend-winxpsp3 16 leak-check/check             fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-xl-qemuu-winxpsp3 13 guest-stop                 fail never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-xl-winxpsp3   13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win7-amd64 13 guest-stop                   fail  never pass
 test-amd64-amd64-xl-qemuu-winxpsp3 13 guest-stop               fail never pass
 test-amd64-amd64-xl-winxpsp3 13 guest-stop                   fail   never pass
 test-amd64-i386-xl-winxpsp3-vcpus1 13 guest-stop               fail never pass
 test-amd64-amd64-xl-win7-amd64 13 guest-stop                   fail never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-rhel6hvm-amd 11 leak-check/check      fail in 12971 never pass
 test-amd64-amd64-xl-qemuu-win7-amd64 13 guest-stop    fail in 12971 never pass

version targeted for testing:
 xen                  53e0571f94e4
baseline version:
 xen                  69c3ae25bb1d

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-qemuu-rhel6hvm-amd                           fail    
 test-amd64-amd64-xl-qemuu-win7-amd64                         fail    
 test-amd64-amd64-xl-win7-amd64                               fail    
 test-amd64-i386-xl-win7-amd64                                fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-qemuu-rhel6hvm-intel                         fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-xl-sedf-pin                                 pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-i386-xl-winxpsp3-vcpus1                           fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    
 test-amd64-amd64-xl-qemuu-winxpsp3                           fail    
 test-i386-i386-xl-qemuu-winxpsp3                             fail    
 test-amd64-i386-xend-winxpsp3                                fail    
 test-amd64-amd64-xl-winxpsp3                                 fail    
 test-i386-i386-xl-winxpsp3                                   fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-unstable
+ revision=53e0571f94e4
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-unstable 53e0571f94e4
+ branch=xen-unstable
+ revision=53e0571f94e4
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ . cri-common
++ umask 002
+ select_xenbranch
+ case "$branch" in
+ tree=xen
+ xenbranch=xen-unstable
+ '[' xxen = xlinux ']'
+ linuxbranch=linux
+ : master
+ : tested/2.6.39.x
+ . ap-common
++ : xen&amp;lt; at &amp;gt;xenbits.xensource.com
++ : http://xenbits.xen.org/staging/xen-unstable.hg
++ : git://xenbits.xen.org/staging/qemu-xen-unstable.git
++ : git://git.kernel.org
++ : git://git.kernel.org/pub/scm/linux/kernel/git
++ : git
++ : git://xenbits.xen.org/linux-pvops.git
++ : master
++ : xen&amp;lt; at &amp;gt;xenbits.xensource.com:git/linux-pvops.git
++ : git://xenbits.xen.org/linux-pvops.git
++ : master
++ : git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git
++ : tested/2.6.39.x
++ : daily-cron.xen-unstable
++ : http://hg.uk.xensource.com/carbon/trunk/linux-2.6.27
++ : git://xenbits.xen.org/staging/qemu-upstream-unstable.git
++ : daily-cron.xen-unstable
+ TREE_LINUX=xen&amp;lt; at &amp;gt;xenbits.xensource.com:git/linux-pvops.git
+ TREE_QEMU_UPSTREAM=xen&amp;lt; at &amp;gt;xenbits.xensource.com:git/qemu-upstream-unstable.git
+ info_linux_tree xen-unstable
+ case $1 in
+ return 1
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-unstable.hg
+ hg push -r 53e0571f94e4 ssh://xen&amp;lt; at &amp;gt;xenbits.xensource.com/HG/xen-unstable.hg
pushing to ssh://xen&amp;lt; at &amp;gt;xenbits.xensource.com/HG/xen-unstable.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 2 changesets with 3 changes to 3 files
&lt;/pre&gt;</description>
    <dc:creator>xen.org</dc:creator>
    <dc:date>2012-05-26T00:23:06</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131637">
    <title>Xen Document Day: May 28th</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131637</link>
    <description>&lt;pre&gt;Hi,

everybody. A quick reminder that the next Xen DocumentDayis happening 
next Monday. More info on document days at 
http://wiki.xen.org/wiki/Xen_Document_Days

Hope to see you on IRC! Feel free to add stuff to the TODO list 
(http://wiki.xen.org/wiki/Xen_Document_Days/TODO) or put your name 
besides an item if you intend to work on it.

Best Regards
Lars

*********************
* Xen Document Days *
*********************

We have another Xen document day come up next Monday. Xen Document Days 
are for people who care about Xen Documentation and want to improve it. 
We introduced Documentation Days, because working on documentation in 
parallel with like minded-people, is just more fun than working alone! 
Everybody who can contribute is welcome to join!

For a list of items that need work, check out the community maintained 
TODO list (http://wiki.xen.org/wiki/Xen_Document_Days/TODO 
&amp;lt;http://wiki.xen.org/wiki/Xen_Document_Days/TODO&amp;gt;). Of course, you can 
work on anything you like: the list just provides suggestions.

How do I participate?
=====================

- Join us on IRC: freenode channel #xendocs
- Tell people what you intend to work on (to avoid doing something somebody
   else is already working on)
- Fix some documentation
- Help others
- And above all: have fun!
&lt;/pre&gt;</description>
    <dc:creator>Lars Kurth</dc:creator>
    <dc:date>2012-05-25T21:13:23</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131629">
    <title>Xen Document Day: May 28th</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131629</link>
    <description>&lt;pre&gt;Hi,

everybody. A quick reminder that the next Xen Document Day is happening
next Monday. More info on document days at
http://wiki.xen.org/wiki/Xen_Document_Days

Hope to see you on IRC! Feel free to add stuff to the TODO list (
http://wiki.xen.org/wiki/Xen_Document_Days/TODO) or put your name besides
an item if you intend to work on it.

Best Regards
Lars

*********************
* Xen Document Days *
*********************

We have another Xen document day come up next Monday. Xen Document Days are
for people who care about Xen Documentation and want to improve it. We
introduced Documentation Days, because working on documentation in parallel
with like minded-people, is just more fun than working alone! Everybody who
can contribute is welcome to join!

For a list of items that need work, check out the community maintained TODO
list (http://wiki.xen.org/wiki/Xen_Document_Days/TODO&amp;lt;http://wiki.xen.org/wiki/Xen_Document_Days/TODO&amp;gt;).
Of course, you can work on anything you like: the list just provides
suggestions.

How do I participate?
=====================

- Join us on IRC: freenode channel #xendocs
- Tell people what you intend to work on (to avoid doing something somebody
  else is already working on)
- Fix some documentation
- Help others
- And above all: have fun!
_______________________________________________
Xen-devel mailing list
Xen-devel&amp;lt; at &amp;gt;lists.xen.org
http://lists.xen.org/xen-devel
&lt;/pre&gt;</description>
    <dc:creator>Lars Kurth</dc:creator>
    <dc:date>2012-05-25T20:36:05</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131626">
    <title>Compile error for libxl on centos 5</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131626</link>
    <description>&lt;pre&gt;I am getting libxenlight.so and xl link failures, complaining about
missing login_tty and opentty symbols. The patch below fixes this for me,
in a quick &amp;amp; dirty manner.

FYI, not proposing this for the tree. I'm not sure to which extent you
want to support an oldish distro, whether libutil is universally necessary
and/or available.

Andres

diff -r 69c3ae25bb1d tools/libxl/Makefile
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,7 +60,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; ifeq ($(BISON),)
          scanners, please install it an rerun configure)
 endif

-LIBXL_LIBS += -lyajl
+LIBXL_LIBS += -lyajl -lutil

 LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \
            libxl_dom.o libxl_exec.o libxl_xshelp.o libxl_device.o \
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -154,7 +154,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; libxlutil.a: $(LIBXLU_OBJS)
    $(AR) rcs libxlutil.a $^

 xl: $(XL_OBJS) libxlutil.so libxenlight.so
-   $(CC) $(LDFLAGS) -o $&amp;lt; at &amp;gt; $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight)
$(LDLIBS_libxenctrl) -lyajl $(APPEND_LDFLAGS)
+   $(CC) $(LDFLAGS) -o $&amp;lt; at &amp;gt; $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight)
$(LDLIBS_libxenctrl) -lyajl -lutil $(APPEND_LDFLAGS)

 testidl: testidl.o libxlutil.so libxenlight.so
    $(CC) $(LDFLAGS) -o $&amp;lt; at &amp;gt; testidl.o libxlutil.so $(LDLIBS_libxenlight)
$(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
&lt;/pre&gt;</description>
    <dc:creator>Andres Lagar-Cavilla</dc:creator>
    <dc:date>2012-05-25T20:27:31</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131624">
    <title>[xen-unstable test] 12971: regressions - FAIL</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131624</link>
    <description>&lt;pre&gt;flight 12971 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/12971/

Regressions :-(

Tests which did not succeed and are blocking,
including tests which could not be run:
 test-amd64-amd64-pv           9 guest-start               fail REGR. vs. 12969

Tests which did not succeed, but are not blocking:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel 11 leak-check/check             fail never pass
 test-amd64-i386-qemuu-rhel6hvm-amd 11 leak-check/check         fail never pass
 test-amd64-i386-qemuu-rhel6hvm-intel 11 leak-check/check       fail never pass
 test-amd64-i386-xend-winxpsp3 16 leak-check/check             fail  never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-xl-qemuu-winxpsp3 13 guest-stop                 fail never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-rhel6hvm-amd 11 leak-check/check             fail   never pass
 test-i386-i386-xl-winxpsp3   13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win7-amd64 13 guest-stop                   fail  never pass
 test-amd64-amd64-xl-qemuu-winxpsp3 13 guest-stop               fail never pass
 test-amd64-amd64-xl-winxpsp3 13 guest-stop                   fail   never pass
 test-amd64-i386-xl-winxpsp3-vcpus1 13 guest-stop               fail never pass
 test-amd64-amd64-xl-win7-amd64 13 guest-stop                   fail never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-qemuu-win7-amd64 13 guest-stop             fail never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  53e0571f94e4
baseline version:
 xen                  69c3ae25bb1d

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-qemuu-rhel6hvm-amd                           fail    
 test-amd64-amd64-xl-qemuu-win7-amd64                         fail    
 test-amd64-amd64-xl-win7-amd64                               fail    
 test-amd64-i386-xl-win7-amd64                                fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-qemuu-rhel6hvm-intel                         fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-xl-sedf-pin                                 pass    
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-i386-xl-winxpsp3-vcpus1                           fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    
 test-amd64-amd64-xl-qemuu-winxpsp3                           fail    
 test-i386-i386-xl-qemuu-winxpsp3                             fail    
 test-amd64-i386-xend-winxpsp3                                fail    
 test-amd64-amd64-xl-winxpsp3                                 fail    
 test-i386-i386-xl-winxpsp3                                   fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Not pushing.
&lt;/pre&gt;</description>
    <dc:creator>xen.org</dc:creator>
    <dc:date>2012-05-25T19:30:39</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131616">
    <title>[PATCH] libxl: When checking BDF of existing slots, function should be decimal, not hex</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131616</link>
    <description>&lt;pre&gt;# HG changeset patch
# User George Dunlap &amp;lt;george.dunlap&amp;lt; at &amp;gt;eu.citrix.com&amp;gt;
# Date 1337961666 0
# Node ID 1c28051020488782f1277dd60a2418324580297e
# Parent  69c3ae25bb1ddcb0ea44b7566d36d34e9d6a70aa
libxl: When checking BDF of existing slots, function should be decimal, not hex

Spotted-by: Konrad Wilk &amp;lt;konrad.wilk&amp;lt; at &amp;gt;oracle.com&amp;gt;
Signed-off-by: George Dunlap &amp;lt;george.dunlap&amp;lt; at &amp;gt;eu.citrix.com&amp;gt;

diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -480,7 +480,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int pciback_dev_has_slot(libxl__g
         return ERROR_FAIL;
     }
 
-    while(fscanf(f, "%x:%x:%x.%x\n", &amp;amp;dom, &amp;amp;bus, &amp;amp;dev, &amp;amp;func)==4) {
+    while(fscanf(f, "%x:%x:%x.%d\n", &amp;amp;dom, &amp;amp;bus, &amp;amp;dev, &amp;amp;func)==4) {
         if(dom == pcidev-&amp;gt;domain
            &amp;amp;&amp;amp; bus == pcidev-&amp;gt;bus
            &amp;amp;&amp;amp; dev == pcidev-&amp;gt;dev
&lt;/pre&gt;</description>
    <dc:creator>George Dunlap</dc:creator>
    <dc:date>2012-05-25T16:34:17</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131609">
    <title>[PATCH v4 0/6] xen/arm: event channels and shared_infopage</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131609</link>
    <description>&lt;pre&gt;Hi all,
this patch series implements support for injecting event channels into
the guest and enables a wider range of hypercalls for ARM guests.

In order to allow more flexibility I modified the hypercall protocol, in
particular the hypercall number is not passed as imm to hvc anymore,
because we might not always know it at compile time.
The hypercall number is now passed on the r12 register.

With this patch series and using the following Linux tree:

git://xenbits.xen.org/people/sstabellini/linux-pvhvm.git vexpress-dt-privcmd-2

I am able to boot dom0, start xenstored and run basic xl commands, like
"xl list" and "xl uptime".
I have added at the beginning of this series few patches that were
previously sent separately (in particular "arm: support fewer LR
registers than virtual irqs").


Changes in v4:

- drop all the patches that have already been committed;

- rebase on "amd iommu: improve parse_event_log_entry()";

- move the initialization of gic.lr_pending and gic.lr_mask to gic_init;

- pass 0 as memflags to alloc_xenheap_pages in arch_domain_create.


Changes in v3:

- several fixes to "support fewer LR registers than virtual irqs";

- many more comments to the gic and vgic IRQ queues;

- merge Ian's patch into "shared_info page allocation and mapping";

- do not alloc the shared_info page for the idle domain;

- added "handle dom0_max_vcpus=0 case properly" by Ian, removed the
corresponding patch in my series;

- move XEN_HYPERCALL_TAG to a public header;

- clobber register in the debug build;

- document calling convention;

- check if arm_hypercall_table[regs-&amp;gt;r12] != NULL;

- use a PPI for events injection (IRQ 31) and do not request maintenance
interrupts for it whenever possible.


Changes in v2:

- fixed tabs/spaces problem.



Stefano Stabellini (6):
      arm: support fewer LR registers than virtual irqs
      arm: replace list_del and INIT_LIST_HEAD with list_del_init
      arm: shared_info page allocation and mapping
      arm: implement flush_tlb_all_local and flush_tlb_local
      arm: remove VGIC_SOFTIRQ
      arm: implement event injection

 xen/arch/arm/domain.c          |   22 ++++++
 xen/arch/arm/dummy.S           |    1 -
 xen/arch/arm/gic.c             |  152 +++++++++++++++++++++++++++++++++-------
 xen/arch/arm/gic.h             |    7 ++-
 xen/arch/arm/mm.c              |   98 +++++++++++++++++++++++++-
 xen/arch/arm/p2m.c             |   26 +++++++-
 xen/arch/arm/traps.c           |    4 +-
 xen/arch/arm/vgic.c            |   15 ----
 xen/include/asm-arm/config.h   |    2 +
 xen/include/asm-arm/domain.h   |   10 +++
 xen/include/asm-arm/flushtlb.h |   23 ++++++-
 xen/include/asm-arm/mm.h       |    4 +
 xen/include/asm-arm/p2m.h      |    9 +++
 xen/include/asm-arm/paging.h   |    3 +
 xen/include/asm-arm/softirq.h  |    3 +-
 15 files changed, 326 insertions(+), 53 deletions(-)



A git branch is available here:

git://xenbits.xen.org/people/sstabellini/xen-unstable.git events-4

Cheers,

Stefano
&lt;/pre&gt;</description>
    <dc:creator>Stefano Stabellini</dc:creator>
    <dc:date>2012-05-25T16:21:43</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131607">
    <title>[xen-4.1-testing test] 12970: tolerable FAIL - PUSHED</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131607</link>
    <description>&lt;pre&gt;flight 12970 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/12970/

Failures :-/ but no regressions.

Regressions which are regarded as allowable (not blocking):
 test-amd64-amd64-xl-pcipt-intel  8 debian-fixup           fail REGR. vs. 12886
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail   like 12886
 test-amd64-i386-xl-winxpsp3-vcpus1  7 windows-install     fail REGR. vs. 12886

Tests which did not succeed, but are not blocking:
 test-amd64-i386-qemuu-rhel6hvm-amd 11 leak-check/check         fail never pass
 test-amd64-i386-rhel6hvm-amd 11 leak-check/check             fail   never pass
 test-amd64-i386-rhel6hvm-intel 11 leak-check/check             fail never pass
 test-amd64-i386-qemuu-rhel6hvm-intel 11 leak-check/check       fail never pass
 test-amd64-amd64-xl-qemuu-winxpsp3 13 guest-stop               fail never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-i386-xend-winxpsp3 16 leak-check/check             fail  never pass
 test-amd64-amd64-xl-winxpsp3 13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-win7-amd64 13 guest-stop                   fail never pass
 test-amd64-amd64-xl-qemuu-win7-amd64 13 guest-stop             fail never pass
 test-amd64-i386-xl-win7-amd64 13 guest-stop                   fail  never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-i386-i386-xl-winxpsp3   13 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-xl-qemuu-winxpsp3 13 guest-stop                 fail never pass

version targeted for testing:
 xen                  435493696053
baseline version:
 xen                  35248be669e7

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-qemuu-rhel6hvm-amd                           fail    
 test-amd64-amd64-xl-qemuu-win7-amd64                         fail    
 test-amd64-amd64-xl-win7-amd64                               fail    
 test-amd64-i386-xl-win7-amd64                                fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-qemuu-rhel6hvm-intel                         fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-xl-sedf-pin                                 pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     fail    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-i386-xl-winxpsp3-vcpus1                           fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    
 test-amd64-amd64-xl-qemuu-winxpsp3                           fail    
 test-i386-i386-xl-qemuu-winxpsp3                             fail    
 test-amd64-i386-xend-winxpsp3                                fail    
 test-amd64-amd64-xl-winxpsp3                                 fail    
 test-i386-i386-xl-winxpsp3                                   fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Pushing revision :

+ branch=xen-4.1-testing
+ revision=435493696053
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x '!=' x/export/home/osstest/repos/lock ']'
++ OSSTEST_REPOS_LOCK_LOCKED=/export/home/osstest/repos/lock
++ exec with-lock-ex -w /export/home/osstest/repos/lock ./ap-push xen-4.1-testing 435493696053
+ branch=xen-4.1-testing
+ revision=435493696053
+ . cri-lock-repos
++ . cri-common
+++ umask 002
+++ getconfig Repos
+++ perl -e '
                use Osstest;
                readconfigonly();
                print $c{Repos} or die $!;
        '
++ repos=/export/home/osstest/repos
++ repos_lock=/export/home/osstest/repos/lock
++ '[' x/export/home/osstest/repos/lock '!=' x/export/home/osstest/repos/lock ']'
+ . cri-common
++ umask 002
+ select_xenbranch
+ case "$branch" in
+ tree=xen
+ xenbranch=xen-4.1-testing
+ '[' xxen = xlinux ']'
+ linuxbranch=linux
+ : master
+ : tested/2.6.39.x
+ . ap-common
++ : xen&amp;lt; at &amp;gt;xenbits.xensource.com
++ : http://xenbits.xen.org/staging/xen-4.1-testing.hg
++ : git://xenbits.xen.org/staging/qemu-xen-4.1-testing.git
++ : git://git.kernel.org
++ : git://git.kernel.org/pub/scm/linux/kernel/git
++ : git
++ : git://xenbits.xen.org/linux-pvops.git
++ : master
++ : xen&amp;lt; at &amp;gt;xenbits.xensource.com:git/linux-pvops.git
++ : git://xenbits.xen.org/linux-pvops.git
++ : master
++ : git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git
++ : tested/2.6.39.x
++ : daily-cron.xen-4.1-testing
++ : http://hg.uk.xensource.com/carbon/trunk/linux-2.6.27
++ : git://xenbits.xen.org/staging/qemu-upstream-4.1-testing.git
++ : daily-cron.xen-4.1-testing
+ TREE_LINUX=xen&amp;lt; at &amp;gt;xenbits.xensource.com:git/linux-pvops.git
+ TREE_QEMU_UPSTREAM=xen&amp;lt; at &amp;gt;xenbits.xensource.com:git/qemu-upstream-4.1-testing.git
+ info_linux_tree xen-4.1-testing
+ case $1 in
+ return 1
+ case "$branch" in
+ cd /export/home/osstest/repos/xen-4.1-testing.hg
+ hg push -r 435493696053 ssh://xen&amp;lt; at &amp;gt;xenbits.xensource.com/HG/xen-4.1-testing.hg
pushing to ssh://xen&amp;lt; at &amp;gt;xenbits.xensource.com/HG/xen-4.1-testing.hg
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
&lt;/pre&gt;</description>
    <dc:creator>xen.org</dc:creator>
    <dc:date>2012-05-25T15:27:42</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131604">
    <title>kernel 3.4.0 dom0 oops</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131604</link>
    <description>&lt;pre&gt;Hello,

With kernel 3.4.0 as a dom0 and a 3.3.6 as a domU, i get the following
oops on the dom0 kernel when I rsync  / to a filesystem mounted on a
loop device:
http://77.36.72.222/P5230845.JPG

The domU config:
ierdnac-hp ~ # cat /mnt/gentoo/xen 
kernel = "/boot/vmlinuz-3.3.6-pf-c241.old"
name="gentoo"
memory = 2048
vcpus = 1
pae  = 1
acpi = 1
apic = 1
stdvga=0
serial='pty'
usbdevice='tablet'
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
vnc=1
vncviewer=1
vncconsole=1
sdl=0
vfb = [ 'type=vnc' ]
disk   = ['file:/mnt/gentoo/ierdnac-hp.bak,sdd1,w']
root   = "root=/dev/xvdd1 ro"

If you are interested in the kernels .config file I can provide them.
&lt;/pre&gt;</description>
    <dc:creator>Andrei Popa</dc:creator>
    <dc:date>2012-05-23T17:15:43</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131593">
    <title>The Xenoprof results</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131593</link>
    <description>&lt;pre&gt;Hi, All:
The dom0 kernel is centos5.5, and the Hypervisor is xen-4.1.2. The domU
kernel is centos5.5, which is installed through the virt-install command (I
think it belongs to HVM).
Then I use xenoprof to collect the cycle, retired instruction number, LLC
access number and LLC miss number information when running spec cpu 2006
benchmarks.

*I collected data for the whole system, and I only compared the speccpu
process. For xenoprof, I use active domain method, and collect data on both
dom0 and domU. But only domU has the performance information about speccpu
in VM.*
*Furthermore, there are a 30x difference with regard to the  retired
instruction number which are shown in the following. I wonder what is the
reason? I think it is due to xen virtulization. Thank you!*

PM

Cycles

Insts

MISSES

REFS

CPI

MissRate

gromacs_base.i386

6198401

4458151

106

8865

1.390352413

0.011957135

sjeng_base.i386

2848717

3031079

911

2724

0.939835946

33.4%

VM

gromacs_base.i386

295398087

151265683

33934

329494

1.952842714

0.102988218

sjeng_base.i386

167443975

106367653

52282

195747

1.574200147

0.267089662

PM













Cycles

Insts

MISSES

REFS

CPI

MissRate

soplex_base.i386

922165

760142

2594

13903

1.213148333

0.186578436

mcf_base.i386

 50646

8478

276

451

5.973814579

0.611973392

VM

   soplex_base.i386

41082192

23311208

57588

284211

1.762336469

0.202624107

mcf_base.i386

 81967004

39434857

147411

778654

2.078541936

0.189315152
_______________________________________________
Xen-devel mailing list
Xen-devel&amp;lt; at &amp;gt;lists.xen.org
http://lists.xen.org/xen-devel
&lt;/pre&gt;</description>
    <dc:creator>suixiufeng</dc:creator>
    <dc:date>2012-05-25T13:31:31</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131589">
    <title>[PATCH 3/3] gnttab: cleanup</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131589</link>
    <description>&lt;pre&gt;- introduce local variables (shortcuts for frequently used &amp;lt;dom&amp;gt;-&amp;gt;grant_table)
- adjust first parameter of mapcount()
- drop lock acquisition from gnttab_get_version()
- remove hard tabs and adjust formatting

Signed-off-by: Jan Beulich &amp;lt;jbeulich&amp;lt; at &amp;gt;suse.com&amp;gt;
Tested-by: Andrew Thomas &amp;lt;andrew.thomas&amp;lt; at &amp;gt;oracle.com&amp;gt;

--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -444,18 +444,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int _set_status(unsigned gt_versi
 }
 
 static void mapcount(
-    struct domain *ld, struct domain *rd, unsigned long mfn,
+    struct grant_table *lgt, struct domain *rd, unsigned long mfn,
     unsigned int *wrc, unsigned int *rdc)
 {
-    struct grant_table *gt = ld-&amp;gt;grant_table;
     struct grant_mapping *map;
     grant_handle_t handle;
 
     *wrc = *rdc = 0;
 
-    for ( handle = 0; handle &amp;lt; gt-&amp;gt;maptrack_limit; handle++ )
+    for ( handle = 0; handle &amp;lt; lgt-&amp;gt;maptrack_limit; handle++ )
     {
-        map = &amp;amp;maptrack_entry(gt, handle);
+        map = &amp;amp;maptrack_entry(lgt, handle);
         if ( !(map-&amp;gt;flags &amp;amp; (GNTMAP_device_map|GNTMAP_host_map)) ||
              map-&amp;gt;domid != rd-&amp;gt;domain_id )
             continue;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -476,6 +475,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
     struct gnttab_map_grant_ref *op)
 {
     struct domain *ld, *rd, *owner = NULL;
+    struct grant_table *lgt, *rgt;
     struct vcpu   *led;
     int            handle;
     unsigned long  frame = 0, nr_gets = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -525,7 +525,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         return;
     }
 
-    if ( unlikely((handle = get_maptrack_handle(ld-&amp;gt;grant_table)) == -1) )
+    lgt = ld-&amp;gt;grant_table;
+    if ( unlikely((handle = get_maptrack_handle(lgt)) == -1) )
     {
         rcu_unlock_domain(rd);
         gdprintk(XENLOG_INFO, "Failed to obtain maptrack handle.\n");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -533,26 +534,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         return;
     }
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    rgt = rd-&amp;gt;grant_table;
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 0 )
+    if ( rgt-&amp;gt;gt_version == 0 )
         PIN_FAIL(unlock_out, GNTST_general_error,
                  "remote grant table not yet set up");
 
     /* Bounds check on the grant ref */
-    if ( unlikely(op-&amp;gt;ref &amp;gt;= nr_grant_entries(rd-&amp;gt;grant_table)))
+    if ( unlikely(op-&amp;gt;ref &amp;gt;= nr_grant_entries(rgt)))
         PIN_FAIL(unlock_out, GNTST_bad_gntref, "Bad ref (%d).\n", op-&amp;gt;ref);
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;ref);
-    shah = shared_entry_header(rd-&amp;gt;grant_table, op-&amp;gt;ref);
-    if (rd-&amp;gt;grant_table-&amp;gt;gt_version == 1) {
-        sha1 = &amp;amp;shared_entry_v1(rd-&amp;gt;grant_table, op-&amp;gt;ref);
+    act = &amp;amp;active_entry(rgt, op-&amp;gt;ref);
+    shah = shared_entry_header(rgt, op-&amp;gt;ref);
+    if (rgt-&amp;gt;gt_version == 1) {
+        sha1 = &amp;amp;shared_entry_v1(rgt, op-&amp;gt;ref);
         sha2 = NULL;
         status = &amp;amp;shah-&amp;gt;flags;
     } else {
-        sha2 = &amp;amp;shared_entry_v2(rd-&amp;gt;grant_table, op-&amp;gt;ref);
+        sha2 = &amp;amp;shared_entry_v2(rgt, op-&amp;gt;ref);
         sha1 = NULL;
-        status = &amp;amp;status_entry(rd-&amp;gt;grant_table, op-&amp;gt;ref);
+        status = &amp;amp;status_entry(rgt, op-&amp;gt;ref);
     }
 
     /* If already pinned, check the active domid and avoid refcnt overflow. */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -568,8 +570,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
          (!(op-&amp;gt;flags &amp;amp; GNTMAP_readonly) &amp;amp;&amp;amp;
           !(act-&amp;gt;pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask))) )
     {
-        if ( (rc = _set_status(rd-&amp;gt;grant_table-&amp;gt;gt_version,
-                               ld-&amp;gt;domain_id, op-&amp;gt;flags &amp;amp; GNTMAP_readonly,
+        if ( (rc = _set_status(rgt-&amp;gt;gt_version, ld-&amp;gt;domain_id,
+                               op-&amp;gt;flags &amp;amp; GNTMAP_readonly,
                                1, shah, act, status) ) != GNTST_okay )
              goto unlock_out;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -606,7 +608,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
 
     cache_flags = (shah-&amp;gt;flags &amp;amp; (GTF_PAT | GTF_PWT | GTF_PCD) );
 
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
 
     /* pg may be set, with a refcount included, from __get_paged_frame */
     if ( !pg )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -679,7 +681,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         goto undo_out;
     }
 
-    double_gt_lock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+    double_gt_lock(lgt, rgt);
 
     if ( !is_hvm_domain(ld) &amp;amp;&amp;amp; need_iommu(ld) )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -689,7 +691,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         BUG_ON(paging_mode_translate(ld));
         /* We're not translated, so we know that gmfns and mfns are
            the same things, so the IOMMU entry is always 1-to-1. */
-        mapcount(ld, rd, frame, &amp;amp;wrc, &amp;amp;rdc);
+        mapcount(lgt, rd, frame, &amp;amp;wrc, &amp;amp;rdc);
         if ( (act_pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask)) &amp;amp;&amp;amp;
              !(old_pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
         {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -704,7 +706,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         }
         if ( err )
         {
-            double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+            double_gt_unlock(lgt, rgt);
             rc = GNTST_general_error;
             goto undo_out;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -712,12 +714,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
 
     TRACE_1D(TRC_MEM_PAGE_GRANT_MAP, op-&amp;gt;dom);
 
-    mt = &amp;amp;maptrack_entry(ld-&amp;gt;grant_table, handle);
+    mt = &amp;amp;maptrack_entry(lgt, handle);
     mt-&amp;gt;domid = op-&amp;gt;dom;
     mt-&amp;gt;ref   = op-&amp;gt;ref;
     mt-&amp;gt;flags = op-&amp;gt;flags;
 
-    double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+    double_gt_unlock(lgt, rgt);
 
     op-&amp;gt;dev_bus_addr = (u64)frame &amp;lt;&amp;lt; PAGE_SHIFT;
     op-&amp;gt;handle       = handle;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -740,10 +742,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         put_page(pg);
     }
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;ref);
-    shah = shared_entry_header(rd-&amp;gt;grant_table, op-&amp;gt;ref);
+    act = &amp;amp;active_entry(rgt, op-&amp;gt;ref);
+    shah = shared_entry_header(rgt, op-&amp;gt;ref);
 
     if ( op-&amp;gt;flags &amp;amp; GNTMAP_device_map )
         act-&amp;gt;pin -= (op-&amp;gt;flags &amp;amp; GNTMAP_readonly) ?
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -761,9 +763,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         gnttab_clear_flag(_GTF_reading, status);
 
  unlock_out:
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
     op-&amp;gt;status = rc;
-    put_maptrack_handle(ld-&amp;gt;grant_table, handle);
+    put_maptrack_handle(lgt, handle);
     rcu_unlock_domain(rd);
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -794,33 +796,35 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
 {
     domid_t          dom;
     struct domain   *ld, *rd;
+    struct grant_table *lgt, *rgt;
     struct active_grant_entry *act;
     s16              rc = 0;
 
     ld = current-&amp;gt;domain;
+    lgt = ld-&amp;gt;grant_table;
 
     op-&amp;gt;frame = (unsigned long)(op-&amp;gt;dev_bus_addr &amp;gt;&amp;gt; PAGE_SHIFT);
 
-    if ( unlikely(op-&amp;gt;handle &amp;gt;= ld-&amp;gt;grant_table-&amp;gt;maptrack_limit) )
+    if ( unlikely(op-&amp;gt;handle &amp;gt;= lgt-&amp;gt;maptrack_limit) )
     {
         gdprintk(XENLOG_INFO, "Bad handle (%d).\n", op-&amp;gt;handle);
         op-&amp;gt;status = GNTST_bad_handle;
         return;
     }
 
-    op-&amp;gt;map = &amp;amp;maptrack_entry(ld-&amp;gt;grant_table, op-&amp;gt;handle);
-    spin_lock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
+    op-&amp;gt;map = &amp;amp;maptrack_entry(lgt, op-&amp;gt;handle);
+    spin_lock(&amp;amp;lgt-&amp;gt;lock);
 
     if ( unlikely(!op-&amp;gt;map-&amp;gt;flags) )
     {
-        spin_unlock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
+        spin_unlock(&amp;amp;lgt-&amp;gt;lock);
         gdprintk(XENLOG_INFO, "Zero flags for handle (%d).\n", op-&amp;gt;handle);
         op-&amp;gt;status = GNTST_bad_handle;
         return;
     }
 
     dom = op-&amp;gt;map-&amp;gt;domid;
-    spin_unlock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;lgt-&amp;gt;lock);
 
     if ( unlikely((rd = rcu_lock_domain_by_id(dom)) == NULL) )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -840,7 +844,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
 
     TRACE_1D(TRC_MEM_PAGE_GRANT_UNMAP, dom);
 
-    double_gt_lock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+    rgt = rd-&amp;gt;grant_table;
+    double_gt_lock(lgt, rgt);
 
     op-&amp;gt;flags = op-&amp;gt;map-&amp;gt;flags;
     if ( unlikely(!op-&amp;gt;flags) || unlikely(op-&amp;gt;map-&amp;gt;domid != dom) )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -851,7 +856,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
     }
 
     op-&amp;gt;rd = rd;
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
+    act = &amp;amp;active_entry(rgt, op-&amp;gt;map-&amp;gt;ref);
 
     if ( op-&amp;gt;frame == 0 )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -894,7 +899,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
         unsigned int wrc, rdc;
         int err = 0;
         BUG_ON(paging_mode_translate(ld));
-        mapcount(ld, rd, op-&amp;gt;frame, &amp;amp;wrc, &amp;amp;rdc);
+        mapcount(lgt, rd, op-&amp;gt;frame, &amp;amp;wrc, &amp;amp;rdc);
         if ( (wrc + rdc) == 0 )
             err = iommu_unmap_page(ld, op-&amp;gt;frame);
         else if ( wrc == 0 )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -911,7 +916,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
          gnttab_mark_dirty(rd, op-&amp;gt;frame);
 
  unmap_out:
-    double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+    double_gt_unlock(lgt, rgt);
     op-&amp;gt;status = rc;
     rcu_unlock_domain(rd);
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -919,15 +924,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
 static void
 __gnttab_unmap_common_complete(struct gnttab_unmap_common *op)
 {
-    struct domain   *ld, *rd;
+    struct domain *ld, *rd = op-&amp;gt;rd;
+    struct grant_table *rgt;
     struct active_grant_entry *act;
     grant_entry_header_t *sha;
     struct page_info *pg;
     uint16_t *status;
     bool_t put_handle = 0;
 
-    rd = op-&amp;gt;rd;
-
     if ( rd == NULL )
     { 
         /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -941,18 +945,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
     ld = current-&amp;gt;domain;
 
     rcu_lock_domain(rd);
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    rgt = rd-&amp;gt;grant_table;
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 0 )
+    if ( rgt-&amp;gt;gt_version == 0 )
         goto unmap_out;
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
-    sha = shared_entry_header(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
+    act = &amp;amp;active_entry(rgt, op-&amp;gt;map-&amp;gt;ref);
+    sha = shared_entry_header(rgt, op-&amp;gt;map-&amp;gt;ref);
 
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 1 )
+    if ( rgt-&amp;gt;gt_version == 1 )
         status = &amp;amp;sha-&amp;gt;flags;
     else
-        status = &amp;amp;status_entry(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
+        status = &amp;amp;status_entry(rgt, op-&amp;gt;map-&amp;gt;ref);
 
     if ( unlikely(op-&amp;gt;frame != act-&amp;gt;frame) ) 
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1006,7 +1011,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
         gnttab_clear_flag(_GTF_reading, status);
 
  unmap_out:
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
     if ( put_handle )
     {
         op-&amp;gt;map-&amp;gt;flags = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1020,7 +1025,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_grant_ref(
     struct gnttab_unmap_grant_ref *op,
     struct gnttab_unmap_common *common)
 {
-common-&amp;gt;host_addr = op-&amp;gt;host_addr;
+    common-&amp;gt;host_addr = op-&amp;gt;host_addr;
     common-&amp;gt;dev_bus_addr = op-&amp;gt;dev_bus_addr;
     common-&amp;gt;handle = op-&amp;gt;handle;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1083,9 +1088,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_and_replace(
     struct gnttab_unmap_and_replace *op,
     struct gnttab_unmap_common *common)
 {
-common-&amp;gt;host_addr = op-&amp;gt;host_addr;
-common-&amp;gt;new_addr = op-&amp;gt;new_addr;
-common-&amp;gt;handle = op-&amp;gt;handle;
+    common-&amp;gt;host_addr = op-&amp;gt;host_addr;
+    common-&amp;gt;new_addr = op-&amp;gt;new_addr;
+    common-&amp;gt;handle = op-&amp;gt;handle;
     
     /* Intialise these in case common contains old state */
     common-&amp;gt;dev_bus_addr = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1253,6 +1258,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_setup_table(
 {
     struct gnttab_setup_table op;
     struct domain *d;
+    struct grant_table *gt;
     int            i;
     unsigned long  gmfn;
     domid_t        dom;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1302,22 +1308,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_setup_table(
         goto out2;
     }
 
-    spin_lock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
+    gt = d-&amp;gt;grant_table;
+    spin_lock(&amp;amp;gt-&amp;gt;lock);
 
-    if ( d-&amp;gt;grant_table-&amp;gt;gt_version == 0 )
-        d-&amp;gt;grant_table-&amp;gt;gt_version = 1;
+    if ( gt-&amp;gt;gt_version == 0 )
+        gt-&amp;gt;gt_version = 1;
 
-    if ( (op.nr_frames &amp;gt; nr_grant_frames(d-&amp;gt;grant_table) ||
-          ( (d-&amp;gt;grant_table-&amp;gt;gt_version &amp;gt; 1 ) &amp;amp;&amp;amp;
-            (grant_to_status_frames(op.nr_frames) &amp;gt;
-             nr_status_frames(d-&amp;gt;grant_table))  )  ) &amp;amp;&amp;amp;
+    if ( (op.nr_frames &amp;gt; nr_grant_frames(gt) ||
+          ((gt-&amp;gt;gt_version &amp;gt; 1) &amp;amp;&amp;amp;
+           (grant_to_status_frames(op.nr_frames) &amp;gt; nr_status_frames(gt)))) &amp;amp;&amp;amp;
          !gnttab_grow_table(d, op.nr_frames) )
     {
         gdprintk(XENLOG_INFO,
-                "Expand grant table to %d failed. Current: %d Max: %d.\n",
-                op.nr_frames,
-                nr_grant_frames(d-&amp;gt;grant_table),
-                max_nr_grant_frames);
+                 "Expand grant table to %u failed. Current: %u Max: %u\n",
+                 op.nr_frames, nr_grant_frames(gt), max_nr_grant_frames);
         op.status = GNTST_general_error;
         goto out3;
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1325,14 +1329,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_setup_table(
     op.status = GNTST_okay;
     for ( i = 0; i &amp;lt; op.nr_frames; i++ )
     {
-        gmfn = gnttab_shared_gmfn(d, d-&amp;gt;grant_table, i);
+        gmfn = gnttab_shared_gmfn(d, gt, i);
         /* Grant tables cannot be shared */
         BUG_ON(SHARED_M2P(gmfn));
         (void)copy_to_guest_offset(op.frame_list, i, &amp;amp;gmfn, 1);
     }
 
  out3:
-    spin_unlock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;gt-&amp;gt;lock);
  out2:
     rcu_unlock_domain(d);
  out1:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1430,7 +1434,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_prepare_for_transfer(
         goto fail;
     }
 
-    if ( unlikely(ref &amp;gt;= nr_grant_entries(rd-&amp;gt;grant_table)) )
+    if ( unlikely(ref &amp;gt;= nr_grant_entries(rgt)) )
     {
         gdprintk(XENLOG_INFO,
                 "Bad grant reference (%d) for transfer to domain(%d).\n",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1673,6 +1677,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void
 __release_grant_for_copy(
     struct domain *rd, unsigned long gref, int readonly)
 {
+    struct grant_table *rgt = rd-&amp;gt;grant_table;
     grant_entry_header_t *sha;
     struct active_grant_entry *act;
     unsigned long r_frame;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1685,13 +1690,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __release_grant_for_copy(
     released_read = 0;
     released_write = 0;
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, gref);
-    sha = shared_entry_header(rd-&amp;gt;grant_table, gref);
+    act = &amp;amp;active_entry(rgt, gref);
+    sha = shared_entry_header(rgt, gref);
     r_frame = act-&amp;gt;frame;
 
-    if (rd-&amp;gt;grant_table-&amp;gt;gt_version == 1)
+    if (rgt-&amp;gt;gt_version == 1)
     {
         status = &amp;amp;sha-&amp;gt;flags;
         td = rd;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1699,7 +1704,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __release_grant_for_copy(
     }
     else
     {
-        status = &amp;amp;status_entry(rd-&amp;gt;grant_table, gref);
+        status = &amp;amp;status_entry(rgt, gref);
         td = act-&amp;gt;trans_domain;
         trans_gref = act-&amp;gt;trans_gref;
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1726,7 +1731,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __release_grant_for_copy(
         released_read = 1;
     }
 
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
 
     if ( td != rd )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1737,7 +1742,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __release_grant_for_copy(
         else if ( released_read )
             __release_grant_for_copy(td, trans_gref, 1);
 
-rcu_unlock_domain(td);
+        rcu_unlock_domain(td);
     }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1762,10 +1767,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void __fixup_status_for_pin(const
    If there is any error, *page = NULL, no ref taken. */
 static int
 __acquire_grant_for_copy(
-    struct domain *rd, unsigned long gref, struct domain *ld, int readonly,
+    struct domain *rd, unsigned long gref, domid_t ldom, int readonly,
     unsigned long *frame, struct page_info **page, 
     unsigned *page_off, unsigned *length, unsigned allow_transitive)
 {
+    struct grant_table *rgt = rd-&amp;gt;grant_table;
     grant_entry_v1_t *sha1;
     grant_entry_v2_t *sha2;
     grant_entry_header_t *shah;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1783,45 +1789,42 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
 
     *page = NULL;
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 0 )
+    if ( rgt-&amp;gt;gt_version == 0 )
         PIN_FAIL(unlock_out, GNTST_general_error,
                  "remote grant table not ready\n");
 
-    if ( unlikely(gref &amp;gt;= nr_grant_entries(rd-&amp;gt;grant_table)) )
+    if ( unlikely(gref &amp;gt;= nr_grant_entries(rgt)) )
         PIN_FAIL(unlock_out, GNTST_bad_gntref,
                  "Bad grant reference %ld\n", gref);
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, gref);
-    shah = shared_entry_header(rd-&amp;gt;grant_table, gref);
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 1 )
+    act = &amp;amp;active_entry(rgt, gref);
+    shah = shared_entry_header(rgt, gref);
+    if ( rgt-&amp;gt;gt_version == 1 )
     {
-        sha1 = &amp;amp;shared_entry_v1(rd-&amp;gt;grant_table, gref);
+        sha1 = &amp;amp;shared_entry_v1(rgt, gref);
         sha2 = NULL;
         status = &amp;amp;shah-&amp;gt;flags;
     }
     else
     {
         sha1 = NULL;
-        sha2 = &amp;amp;shared_entry_v2(rd-&amp;gt;grant_table, gref);
-        status = &amp;amp;status_entry(rd-&amp;gt;grant_table, gref);
+        sha2 = &amp;amp;shared_entry_v2(rgt, gref);
+        status = &amp;amp;status_entry(rgt, gref);
     }
 
     /* If already pinned, check the active domid and avoid refcnt overflow. */
-    if ( act-&amp;gt;pin &amp;amp;&amp;amp;
-         ((act-&amp;gt;domid != ld-&amp;gt;domain_id) ||
-          (act-&amp;gt;pin &amp;amp; 0x80808080U) != 0) )
+    if ( act-&amp;gt;pin &amp;amp;&amp;amp; ((act-&amp;gt;domid != ldom) || (act-&amp;gt;pin &amp;amp; 0x80808080U) != 0) )
         PIN_FAIL(unlock_out, GNTST_general_error,
                  "Bad domain (%d != %d), or risk of counter overflow %08x\n",
-                 act-&amp;gt;domid, ld-&amp;gt;domain_id, act-&amp;gt;pin);
+                 act-&amp;gt;domid, ldom, act-&amp;gt;pin);
 
     old_pin = act-&amp;gt;pin;
     if ( !act-&amp;gt;pin ||
          (!readonly &amp;amp;&amp;amp; !(act-&amp;gt;pin &amp;amp; (GNTPIN_devw_mask|GNTPIN_hstw_mask))) )
     {
-        if ( (rc = _set_status(rd-&amp;gt;grant_table-&amp;gt;gt_version,
-                               ld-&amp;gt;domain_id,
+        if ( (rc = _set_status(rgt-&amp;gt;gt_version, ldom,
                                readonly, 0, shah, act,
                                status) ) != GNTST_okay )
              goto unlock_out;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1842,7 +1845,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
                 PIN_FAIL(unlock_out, GNTST_general_error,
                          "transitive grants cannot be self-referential\n");
 
-            /* We allow the trans_domid == ld-&amp;gt;domain_id case, which
+            /* We allow the trans_domid == ldom case, which
                corresponds to a grant being issued by one domain, sent
                to another one, and then transitively granted back to
                the original domain.  Allowing it is easy, and means
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1855,17 +1858,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
                 PIN_FAIL(unlock_out, GNTST_general_error,
                          "transitive grant referenced bad domain %d\n",
                          trans_domid);
-            spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+            spin_unlock(&amp;amp;rgt-&amp;gt;lock);
 
-            rc = __acquire_grant_for_copy(td, trans_gref, rd,
+            rc = __acquire_grant_for_copy(td, trans_gref, rd-&amp;gt;domain_id,
                                           readonly, &amp;amp;grant_frame, page,
                                           &amp;amp;trans_page_off, &amp;amp;trans_length, 0);
 
-            spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+            spin_lock(&amp;amp;rgt-&amp;gt;lock);
             if ( rc != GNTST_okay ) {
                 __fixup_status_for_pin(act, status);
                 rcu_unlock_domain(td);
-                spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+                spin_unlock(&amp;amp;rgt-&amp;gt;lock);
                 return rc;
             }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1877,9 +1880,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
             {
                 __fixup_status_for_pin(act, status);
                 rcu_unlock_domain(td);
-                spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+                spin_unlock(&amp;amp;rgt-&amp;gt;lock);
                 put_page(*page);
-                return __acquire_grant_for_copy(rd, gref, ld, readonly,
+                return __acquire_grant_for_copy(rd, gref, ldom, readonly,
                                                 frame, page, page_off, length,
                                                 allow_transitive);
             }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1923,7 +1926,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
 
         if ( !act-&amp;gt;pin )
         {
-            act-&amp;gt;domid = ld-&amp;gt;domain_id;
+            act-&amp;gt;domid = ldom;
             act-&amp;gt;is_sub_page = is_sub_page;
             act-&amp;gt;start = trans_page_off;
             act-&amp;gt;length = trans_length;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1946,7 +1949,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
     *frame = act-&amp;gt;frame;
 
  unlock_out:
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
     return rc;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1996,8 +1999,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_copy(
     if ( src_is_gref )
     {
         unsigned source_off, source_len;
-        rc = __acquire_grant_for_copy(sd, op-&amp;gt;source.u.ref, current-&amp;gt;domain, 1,
-                                      &amp;amp;s_frame, &amp;amp;s_pg, &amp;amp;source_off, &amp;amp;source_len, 1);
+        rc = __acquire_grant_for_copy(sd, op-&amp;gt;source.u.ref,
+                                      current-&amp;gt;domain-&amp;gt;domain_id, 1,
+                                      &amp;amp;s_frame, &amp;amp;s_pg,
+                                      &amp;amp;source_off, &amp;amp;source_len, 1);
         if ( rc != GNTST_okay )
             goto error_out;
         have_s_grant = 1;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2019,7 +2024,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_copy(
     if ( dest_is_gref )
     {
         unsigned dest_off, dest_len;
-        rc = __acquire_grant_for_copy(dd, op-&amp;gt;dest.u.ref, current-&amp;gt;domain, 0,
+        rc = __acquire_grant_for_copy(dd, op-&amp;gt;dest.u.ref,
+                                      current-&amp;gt;domain-&amp;gt;domain_id, 0,
                                       &amp;amp;d_frame, &amp;amp;d_pg, &amp;amp;dest_off, &amp;amp;dest_len, 1);
         if ( rc != GNTST_okay )
             goto error_out;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2267,11 +2273,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_get_status_frames(XEN_GUEST_HANDL
 
     for ( i = 0; i &amp;lt; op.nr_frames; i++ )
     {
-        gmfn = gnttab_status_gmfn(d, d-&amp;gt;grant_table, i);
-        if (copy_to_guest_offset(op.frame_list,
-                                 i,
-                                 &amp;amp;gmfn,
-                                 1))
+        gmfn = gnttab_status_gmfn(d, gt, i);
+        if (copy_to_guest_offset(op.frame_list, i, &amp;amp;gmfn, 1))
             op.status = GNTST_bad_virt_addr;
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2305,9 +2308,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_get_version(XEN_GUEST_HANDLE(gntt
         return -EPERM;
     }
 
-    spin_lock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
     op.version = d-&amp;gt;grant_table-&amp;gt;gt_version;
-    spin_unlock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
 
     rcu_unlock_domain(d);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2320,52 +2321,46 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_get_version(XEN_GUEST_HANDLE(gntt
 static s16
 __gnttab_swap_grant_ref(grant_ref_t ref_a, grant_ref_t ref_b)
 {
-    struct domain *d;
+    struct domain *d = rcu_lock_current_domain();
+    struct grant_table *gt = d-&amp;gt;grant_table;
     struct active_grant_entry *act;
     s16 rc = GNTST_okay;
 
-    d = rcu_lock_current_domain();
-
-    spin_lock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
+    spin_lock(&amp;amp;gt-&amp;gt;lock);
 
-    act = &amp;amp;active_entry(d-&amp;gt;grant_table, ref_a);
+    act = &amp;amp;active_entry(gt, ref_a);
     if ( act-&amp;gt;pin )
         PIN_FAIL(out, GNTST_eagain, "ref a %ld busy\n", (long)ref_a);
 
-    act = &amp;amp;active_entry(d-&amp;gt;grant_table, ref_b);
+    act = &amp;amp;active_entry(gt, ref_b);
     if ( act-&amp;gt;pin )
         PIN_FAIL(out, GNTST_eagain, "ref b %ld busy\n", (long)ref_b);
 
-    if ( d-&amp;gt;grant_table-&amp;gt;gt_version == 1 )
+    if ( gt-&amp;gt;gt_version == 1 )
     {
         grant_entry_v1_t shared;
 
-        shared = shared_entry_v1(d-&amp;gt;grant_table, ref_a);
-
-        shared_entry_v1(d-&amp;gt;grant_table, ref_a) =
-            shared_entry_v1(d-&amp;gt;grant_table, ref_b);
-
-        shared_entry_v1(d-&amp;gt;grant_table, ref_b) = shared;
+        shared = shared_entry_v1(gt, ref_a);
+        shared_entry_v1(gt, ref_a) = shared_entry_v1(gt, ref_b);
+        shared_entry_v1(gt, ref_b) = shared;
     }
     else
     {
         grant_entry_v2_t shared;
         grant_status_t status;
 
-        shared = shared_entry_v2(d-&amp;gt;grant_table, ref_a);
-        status = status_entry(d-&amp;gt;grant_table, ref_a);
+        shared = shared_entry_v2(gt, ref_a);
+        status = status_entry(gt, ref_a);
 
-        shared_entry_v2(d-&amp;gt;grant_table, ref_a) =
-            shared_entry_v2(d-&amp;gt;grant_table, ref_b);
-        status_entry(d-&amp;gt;grant_table, ref_a) =
-            status_entry(d-&amp;gt;grant_table, ref_b);
+        shared_entry_v2(gt, ref_a) = shared_entry_v2(gt, ref_b);
+        status_entry(gt, ref_a) = status_entry(gt, ref_b);
 
-        shared_entry_v2(d-&amp;gt;grant_table, ref_b) = shared;
-        status_entry(d-&amp;gt;grant_table, ref_b) = status;
+        shared_entry_v2(gt, ref_b) = shared;
+        status_entry(gt, ref_b) = status;
     }
 
 out:
-    spin_unlock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;gt-&amp;gt;lock);
 
     rcu_unlock_domain(d);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2632,7 +2627,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void
 gnttab_release_mappings(
     struct domain *d)
 {
-    struct grant_table   *gt = d-&amp;gt;grant_table;
+    struct grant_table   *gt = d-&amp;gt;grant_table, *rgt;
     struct grant_mapping *map;
     grant_ref_t           ref;
     grant_handle_t        handle;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2664,14 +2659,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_release_mappings(
             continue;
         }
 
-        spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+        rgt = rd-&amp;gt;grant_table;
+        spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-        act = &amp;amp;active_entry(rd-&amp;gt;grant_table, ref);
-        sha = shared_entry_header(rd-&amp;gt;grant_table, ref);
-        if (rd-&amp;gt;grant_table-&amp;gt;gt_version == 1)
+        act = &amp;amp;active_entry(rgt, ref);
+        sha = shared_entry_header(rgt, ref);
+        if (rgt-&amp;gt;gt_version == 1)
             status = &amp;amp;sha-&amp;gt;flags;
         else
-            status = &amp;amp;status_entry(rd-&amp;gt;grant_table, ref);
+            status = &amp;amp;status_entry(rgt, ref);
 
         pg = mfn_to_page(act-&amp;gt;frame);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2724,7 +2720,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_release_mappings(
         if ( act-&amp;gt;pin == 0 )
             gnttab_clear_flag(_GTF_reading, status);
 
-        spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+        spin_unlock(&amp;amp;rgt-&amp;gt;lock);
 
         rcu_unlock_domain(rd);
 


gnttab: cleanup

- introduce local variables (shortcuts for frequently used &amp;lt;dom&amp;gt;-&amp;gt;grant_table)
- adjust first parameter of mapcount()
- drop lock acquisition from gnttab_get_version()
- remove hard tabs and adjust formatting

Signed-off-by: Jan Beulich &amp;lt;jbeulich&amp;lt; at &amp;gt;suse.com&amp;gt;
Tested-by: Andrew Thomas &amp;lt;andrew.thomas&amp;lt; at &amp;gt;oracle.com&amp;gt;

--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -444,18 +444,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int _set_status(unsigned gt_versi
 }
 
 static void mapcount(
-    struct domain *ld, struct domain *rd, unsigned long mfn,
+    struct grant_table *lgt, struct domain *rd, unsigned long mfn,
     unsigned int *wrc, unsigned int *rdc)
 {
-    struct grant_table *gt = ld-&amp;gt;grant_table;
     struct grant_mapping *map;
     grant_handle_t handle;
 
     *wrc = *rdc = 0;
 
-    for ( handle = 0; handle &amp;lt; gt-&amp;gt;maptrack_limit; handle++ )
+    for ( handle = 0; handle &amp;lt; lgt-&amp;gt;maptrack_limit; handle++ )
     {
-        map = &amp;amp;maptrack_entry(gt, handle);
+        map = &amp;amp;maptrack_entry(lgt, handle);
         if ( !(map-&amp;gt;flags &amp;amp; (GNTMAP_device_map|GNTMAP_host_map)) ||
              map-&amp;gt;domid != rd-&amp;gt;domain_id )
             continue;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -476,6 +475,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
     struct gnttab_map_grant_ref *op)
 {
     struct domain *ld, *rd, *owner = NULL;
+    struct grant_table *lgt, *rgt;
     struct vcpu   *led;
     int            handle;
     unsigned long  frame = 0, nr_gets = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -525,7 +525,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         return;
     }
 
-    if ( unlikely((handle = get_maptrack_handle(ld-&amp;gt;grant_table)) == -1) )
+    lgt = ld-&amp;gt;grant_table;
+    if ( unlikely((handle = get_maptrack_handle(lgt)) == -1) )
     {
         rcu_unlock_domain(rd);
         gdprintk(XENLOG_INFO, "Failed to obtain maptrack handle.\n");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -533,26 +534,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         return;
     }
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    rgt = rd-&amp;gt;grant_table;
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 0 )
+    if ( rgt-&amp;gt;gt_version == 0 )
         PIN_FAIL(unlock_out, GNTST_general_error,
                  "remote grant table not yet set up");
 
     /* Bounds check on the grant ref */
-    if ( unlikely(op-&amp;gt;ref &amp;gt;= nr_grant_entries(rd-&amp;gt;grant_table)))
+    if ( unlikely(op-&amp;gt;ref &amp;gt;= nr_grant_entries(rgt)))
         PIN_FAIL(unlock_out, GNTST_bad_gntref, "Bad ref (%d).\n", op-&amp;gt;ref);
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;ref);
-    shah = shared_entry_header(rd-&amp;gt;grant_table, op-&amp;gt;ref);
-    if (rd-&amp;gt;grant_table-&amp;gt;gt_version == 1) {
-        sha1 = &amp;amp;shared_entry_v1(rd-&amp;gt;grant_table, op-&amp;gt;ref);
+    act = &amp;amp;active_entry(rgt, op-&amp;gt;ref);
+    shah = shared_entry_header(rgt, op-&amp;gt;ref);
+    if (rgt-&amp;gt;gt_version == 1) {
+        sha1 = &amp;amp;shared_entry_v1(rgt, op-&amp;gt;ref);
         sha2 = NULL;
         status = &amp;amp;shah-&amp;gt;flags;
     } else {
-        sha2 = &amp;amp;shared_entry_v2(rd-&amp;gt;grant_table, op-&amp;gt;ref);
+        sha2 = &amp;amp;shared_entry_v2(rgt, op-&amp;gt;ref);
         sha1 = NULL;
-        status = &amp;amp;status_entry(rd-&amp;gt;grant_table, op-&amp;gt;ref);
+        status = &amp;amp;status_entry(rgt, op-&amp;gt;ref);
     }
 
     /* If already pinned, check the active domid and avoid refcnt overflow. */
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -568,8 +570,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
          (!(op-&amp;gt;flags &amp;amp; GNTMAP_readonly) &amp;amp;&amp;amp;
           !(act-&amp;gt;pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask))) )
     {
-        if ( (rc = _set_status(rd-&amp;gt;grant_table-&amp;gt;gt_version,
-                               ld-&amp;gt;domain_id, op-&amp;gt;flags &amp;amp; GNTMAP_readonly,
+        if ( (rc = _set_status(rgt-&amp;gt;gt_version, ld-&amp;gt;domain_id,
+                               op-&amp;gt;flags &amp;amp; GNTMAP_readonly,
                                1, shah, act, status) ) != GNTST_okay )
              goto unlock_out;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -606,7 +608,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
 
     cache_flags = (shah-&amp;gt;flags &amp;amp; (GTF_PAT | GTF_PWT | GTF_PCD) );
 
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
 
     /* pg may be set, with a refcount included, from __get_paged_frame */
     if ( !pg )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -679,7 +681,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         goto undo_out;
     }
 
-    double_gt_lock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+    double_gt_lock(lgt, rgt);
 
     if ( !is_hvm_domain(ld) &amp;amp;&amp;amp; need_iommu(ld) )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -689,7 +691,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         BUG_ON(paging_mode_translate(ld));
         /* We're not translated, so we know that gmfns and mfns are
            the same things, so the IOMMU entry is always 1-to-1. */
-        mapcount(ld, rd, frame, &amp;amp;wrc, &amp;amp;rdc);
+        mapcount(lgt, rd, frame, &amp;amp;wrc, &amp;amp;rdc);
         if ( (act_pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask)) &amp;amp;&amp;amp;
              !(old_pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
         {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -704,7 +706,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         }
         if ( err )
         {
-            double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+            double_gt_unlock(lgt, rgt);
             rc = GNTST_general_error;
             goto undo_out;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -712,12 +714,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
 
     TRACE_1D(TRC_MEM_PAGE_GRANT_MAP, op-&amp;gt;dom);
 
-    mt = &amp;amp;maptrack_entry(ld-&amp;gt;grant_table, handle);
+    mt = &amp;amp;maptrack_entry(lgt, handle);
     mt-&amp;gt;domid = op-&amp;gt;dom;
     mt-&amp;gt;ref   = op-&amp;gt;ref;
     mt-&amp;gt;flags = op-&amp;gt;flags;
 
-    double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+    double_gt_unlock(lgt, rgt);
 
     op-&amp;gt;dev_bus_addr = (u64)frame &amp;lt;&amp;lt; PAGE_SHIFT;
     op-&amp;gt;handle       = handle;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -740,10 +742,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         put_page(pg);
     }
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;ref);
-    shah = shared_entry_header(rd-&amp;gt;grant_table, op-&amp;gt;ref);
+    act = &amp;amp;active_entry(rgt, op-&amp;gt;ref);
+    shah = shared_entry_header(rgt, op-&amp;gt;ref);
 
     if ( op-&amp;gt;flags &amp;amp; GNTMAP_device_map )
         act-&amp;gt;pin -= (op-&amp;gt;flags &amp;amp; GNTMAP_readonly) ?
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -761,9 +763,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         gnttab_clear_flag(_GTF_reading, status);
 
  unlock_out:
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
     op-&amp;gt;status = rc;
-    put_maptrack_handle(ld-&amp;gt;grant_table, handle);
+    put_maptrack_handle(lgt, handle);
     rcu_unlock_domain(rd);
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -794,33 +796,35 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
 {
     domid_t          dom;
     struct domain   *ld, *rd;
+    struct grant_table *lgt, *rgt;
     struct active_grant_entry *act;
     s16              rc = 0;
 
     ld = current-&amp;gt;domain;
+    lgt = ld-&amp;gt;grant_table;
 
     op-&amp;gt;frame = (unsigned long)(op-&amp;gt;dev_bus_addr &amp;gt;&amp;gt; PAGE_SHIFT);
 
-    if ( unlikely(op-&amp;gt;handle &amp;gt;= ld-&amp;gt;grant_table-&amp;gt;maptrack_limit) )
+    if ( unlikely(op-&amp;gt;handle &amp;gt;= lgt-&amp;gt;maptrack_limit) )
     {
         gdprintk(XENLOG_INFO, "Bad handle (%d).\n", op-&amp;gt;handle);
         op-&amp;gt;status = GNTST_bad_handle;
         return;
     }
 
-    op-&amp;gt;map = &amp;amp;maptrack_entry(ld-&amp;gt;grant_table, op-&amp;gt;handle);
-    spin_lock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
+    op-&amp;gt;map = &amp;amp;maptrack_entry(lgt, op-&amp;gt;handle);
+    spin_lock(&amp;amp;lgt-&amp;gt;lock);
 
     if ( unlikely(!op-&amp;gt;map-&amp;gt;flags) )
     {
-        spin_unlock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
+        spin_unlock(&amp;amp;lgt-&amp;gt;lock);
         gdprintk(XENLOG_INFO, "Zero flags for handle (%d).\n", op-&amp;gt;handle);
         op-&amp;gt;status = GNTST_bad_handle;
         return;
     }
 
     dom = op-&amp;gt;map-&amp;gt;domid;
-    spin_unlock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;lgt-&amp;gt;lock);
 
     if ( unlikely((rd = rcu_lock_domain_by_id(dom)) == NULL) )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -840,7 +844,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
 
     TRACE_1D(TRC_MEM_PAGE_GRANT_UNMAP, dom);
 
-    double_gt_lock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+    rgt = rd-&amp;gt;grant_table;
+    double_gt_lock(lgt, rgt);
 
     op-&amp;gt;flags = op-&amp;gt;map-&amp;gt;flags;
     if ( unlikely(!op-&amp;gt;flags) || unlikely(op-&amp;gt;map-&amp;gt;domid != dom) )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -851,7 +856,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
     }
 
     op-&amp;gt;rd = rd;
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
+    act = &amp;amp;active_entry(rgt, op-&amp;gt;map-&amp;gt;ref);
 
     if ( op-&amp;gt;frame == 0 )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -894,7 +899,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
         unsigned int wrc, rdc;
         int err = 0;
         BUG_ON(paging_mode_translate(ld));
-        mapcount(ld, rd, op-&amp;gt;frame, &amp;amp;wrc, &amp;amp;rdc);
+        mapcount(lgt, rd, op-&amp;gt;frame, &amp;amp;wrc, &amp;amp;rdc);
         if ( (wrc + rdc) == 0 )
             err = iommu_unmap_page(ld, op-&amp;gt;frame);
         else if ( wrc == 0 )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -911,7 +916,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
          gnttab_mark_dirty(rd, op-&amp;gt;frame);
 
  unmap_out:
-    double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+    double_gt_unlock(lgt, rgt);
     op-&amp;gt;status = rc;
     rcu_unlock_domain(rd);
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -919,15 +924,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
 static void
 __gnttab_unmap_common_complete(struct gnttab_unmap_common *op)
 {
-    struct domain   *ld, *rd;
+    struct domain *ld, *rd = op-&amp;gt;rd;
+    struct grant_table *rgt;
     struct active_grant_entry *act;
     grant_entry_header_t *sha;
     struct page_info *pg;
     uint16_t *status;
     bool_t put_handle = 0;
 
-    rd = op-&amp;gt;rd;
-
     if ( rd == NULL )
     { 
         /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -941,18 +945,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
     ld = current-&amp;gt;domain;
 
     rcu_lock_domain(rd);
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    rgt = rd-&amp;gt;grant_table;
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 0 )
+    if ( rgt-&amp;gt;gt_version == 0 )
         goto unmap_out;
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
-    sha = shared_entry_header(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
+    act = &amp;amp;active_entry(rgt, op-&amp;gt;map-&amp;gt;ref);
+    sha = shared_entry_header(rgt, op-&amp;gt;map-&amp;gt;ref);
 
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 1 )
+    if ( rgt-&amp;gt;gt_version == 1 )
         status = &amp;amp;sha-&amp;gt;flags;
     else
-        status = &amp;amp;status_entry(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
+        status = &amp;amp;status_entry(rgt, op-&amp;gt;map-&amp;gt;ref);
 
     if ( unlikely(op-&amp;gt;frame != act-&amp;gt;frame) ) 
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1006,7 +1011,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
         gnttab_clear_flag(_GTF_reading, status);
 
  unmap_out:
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
     if ( put_handle )
     {
         op-&amp;gt;map-&amp;gt;flags = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1020,7 +1025,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_grant_ref(
     struct gnttab_unmap_grant_ref *op,
     struct gnttab_unmap_common *common)
 {
-common-&amp;gt;host_addr = op-&amp;gt;host_addr;
+    common-&amp;gt;host_addr = op-&amp;gt;host_addr;
     common-&amp;gt;dev_bus_addr = op-&amp;gt;dev_bus_addr;
     common-&amp;gt;handle = op-&amp;gt;handle;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1083,9 +1088,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_and_replace(
     struct gnttab_unmap_and_replace *op,
     struct gnttab_unmap_common *common)
 {
-common-&amp;gt;host_addr = op-&amp;gt;host_addr;
-common-&amp;gt;new_addr = op-&amp;gt;new_addr;
-common-&amp;gt;handle = op-&amp;gt;handle;
+    common-&amp;gt;host_addr = op-&amp;gt;host_addr;
+    common-&amp;gt;new_addr = op-&amp;gt;new_addr;
+    common-&amp;gt;handle = op-&amp;gt;handle;
     
     /* Intialise these in case common contains old state */
     common-&amp;gt;dev_bus_addr = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1253,6 +1258,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_setup_table(
 {
     struct gnttab_setup_table op;
     struct domain *d;
+    struct grant_table *gt;
     int            i;
     unsigned long  gmfn;
     domid_t        dom;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1302,22 +1308,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_setup_table(
         goto out2;
     }
 
-    spin_lock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
+    gt = d-&amp;gt;grant_table;
+    spin_lock(&amp;amp;gt-&amp;gt;lock);
 
-    if ( d-&amp;gt;grant_table-&amp;gt;gt_version == 0 )
-        d-&amp;gt;grant_table-&amp;gt;gt_version = 1;
+    if ( gt-&amp;gt;gt_version == 0 )
+        gt-&amp;gt;gt_version = 1;
 
-    if ( (op.nr_frames &amp;gt; nr_grant_frames(d-&amp;gt;grant_table) ||
-          ( (d-&amp;gt;grant_table-&amp;gt;gt_version &amp;gt; 1 ) &amp;amp;&amp;amp;
-            (grant_to_status_frames(op.nr_frames) &amp;gt;
-             nr_status_frames(d-&amp;gt;grant_table))  )  ) &amp;amp;&amp;amp;
+    if ( (op.nr_frames &amp;gt; nr_grant_frames(gt) ||
+          ((gt-&amp;gt;gt_version &amp;gt; 1) &amp;amp;&amp;amp;
+           (grant_to_status_frames(op.nr_frames) &amp;gt; nr_status_frames(gt)))) &amp;amp;&amp;amp;
          !gnttab_grow_table(d, op.nr_frames) )
     {
         gdprintk(XENLOG_INFO,
-                "Expand grant table to %d failed. Current: %d Max: %d.\n",
-                op.nr_frames,
-                nr_grant_frames(d-&amp;gt;grant_table),
-                max_nr_grant_frames);
+                 "Expand grant table to %u failed. Current: %u Max: %u\n",
+                 op.nr_frames, nr_grant_frames(gt), max_nr_grant_frames);
         op.status = GNTST_general_error;
         goto out3;
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1325,14 +1329,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_setup_table(
     op.status = GNTST_okay;
     for ( i = 0; i &amp;lt; op.nr_frames; i++ )
     {
-        gmfn = gnttab_shared_gmfn(d, d-&amp;gt;grant_table, i);
+        gmfn = gnttab_shared_gmfn(d, gt, i);
         /* Grant tables cannot be shared */
         BUG_ON(SHARED_M2P(gmfn));
         (void)copy_to_guest_offset(op.frame_list, i, &amp;amp;gmfn, 1);
     }
 
  out3:
-    spin_unlock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;gt-&amp;gt;lock);
  out2:
     rcu_unlock_domain(d);
  out1:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1430,7 +1434,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_prepare_for_transfer(
         goto fail;
     }
 
-    if ( unlikely(ref &amp;gt;= nr_grant_entries(rd-&amp;gt;grant_table)) )
+    if ( unlikely(ref &amp;gt;= nr_grant_entries(rgt)) )
     {
         gdprintk(XENLOG_INFO,
                 "Bad grant reference (%d) for transfer to domain(%d).\n",
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1673,6 +1677,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void
 __release_grant_for_copy(
     struct domain *rd, unsigned long gref, int readonly)
 {
+    struct grant_table *rgt = rd-&amp;gt;grant_table;
     grant_entry_header_t *sha;
     struct active_grant_entry *act;
     unsigned long r_frame;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1685,13 +1690,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __release_grant_for_copy(
     released_read = 0;
     released_write = 0;
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, gref);
-    sha = shared_entry_header(rd-&amp;gt;grant_table, gref);
+    act = &amp;amp;active_entry(rgt, gref);
+    sha = shared_entry_header(rgt, gref);
     r_frame = act-&amp;gt;frame;
 
-    if (rd-&amp;gt;grant_table-&amp;gt;gt_version == 1)
+    if (rgt-&amp;gt;gt_version == 1)
     {
         status = &amp;amp;sha-&amp;gt;flags;
         td = rd;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1699,7 +1704,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __release_grant_for_copy(
     }
     else
     {
-        status = &amp;amp;status_entry(rd-&amp;gt;grant_table, gref);
+        status = &amp;amp;status_entry(rgt, gref);
         td = act-&amp;gt;trans_domain;
         trans_gref = act-&amp;gt;trans_gref;
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1726,7 +1731,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __release_grant_for_copy(
         released_read = 1;
     }
 
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
 
     if ( td != rd )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1737,7 +1742,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __release_grant_for_copy(
         else if ( released_read )
             __release_grant_for_copy(td, trans_gref, 1);
 
-rcu_unlock_domain(td);
+        rcu_unlock_domain(td);
     }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1762,10 +1767,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void __fixup_status_for_pin(const
    If there is any error, *page = NULL, no ref taken. */
 static int
 __acquire_grant_for_copy(
-    struct domain *rd, unsigned long gref, struct domain *ld, int readonly,
+    struct domain *rd, unsigned long gref, domid_t ldom, int readonly,
     unsigned long *frame, struct page_info **page, 
     unsigned *page_off, unsigned *length, unsigned allow_transitive)
 {
+    struct grant_table *rgt = rd-&amp;gt;grant_table;
     grant_entry_v1_t *sha1;
     grant_entry_v2_t *sha2;
     grant_entry_header_t *shah;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1783,45 +1789,42 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
 
     *page = NULL;
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 0 )
+    if ( rgt-&amp;gt;gt_version == 0 )
         PIN_FAIL(unlock_out, GNTST_general_error,
                  "remote grant table not ready\n");
 
-    if ( unlikely(gref &amp;gt;= nr_grant_entries(rd-&amp;gt;grant_table)) )
+    if ( unlikely(gref &amp;gt;= nr_grant_entries(rgt)) )
         PIN_FAIL(unlock_out, GNTST_bad_gntref,
                  "Bad grant reference %ld\n", gref);
 
-    act = &amp;amp;active_entry(rd-&amp;gt;grant_table, gref);
-    shah = shared_entry_header(rd-&amp;gt;grant_table, gref);
-    if ( rd-&amp;gt;grant_table-&amp;gt;gt_version == 1 )
+    act = &amp;amp;active_entry(rgt, gref);
+    shah = shared_entry_header(rgt, gref);
+    if ( rgt-&amp;gt;gt_version == 1 )
     {
-        sha1 = &amp;amp;shared_entry_v1(rd-&amp;gt;grant_table, gref);
+        sha1 = &amp;amp;shared_entry_v1(rgt, gref);
         sha2 = NULL;
         status = &amp;amp;shah-&amp;gt;flags;
     }
     else
     {
         sha1 = NULL;
-        sha2 = &amp;amp;shared_entry_v2(rd-&amp;gt;grant_table, gref);
-        status = &amp;amp;status_entry(rd-&amp;gt;grant_table, gref);
+        sha2 = &amp;amp;shared_entry_v2(rgt, gref);
+        status = &amp;amp;status_entry(rgt, gref);
     }
 
     /* If already pinned, check the active domid and avoid refcnt overflow. */
-    if ( act-&amp;gt;pin &amp;amp;&amp;amp;
-         ((act-&amp;gt;domid != ld-&amp;gt;domain_id) ||
-          (act-&amp;gt;pin &amp;amp; 0x80808080U) != 0) )
+    if ( act-&amp;gt;pin &amp;amp;&amp;amp; ((act-&amp;gt;domid != ldom) || (act-&amp;gt;pin &amp;amp; 0x80808080U) != 0) )
         PIN_FAIL(unlock_out, GNTST_general_error,
                  "Bad domain (%d != %d), or risk of counter overflow %08x\n",
-                 act-&amp;gt;domid, ld-&amp;gt;domain_id, act-&amp;gt;pin);
+                 act-&amp;gt;domid, ldom, act-&amp;gt;pin);
 
     old_pin = act-&amp;gt;pin;
     if ( !act-&amp;gt;pin ||
          (!readonly &amp;amp;&amp;amp; !(act-&amp;gt;pin &amp;amp; (GNTPIN_devw_mask|GNTPIN_hstw_mask))) )
     {
-        if ( (rc = _set_status(rd-&amp;gt;grant_table-&amp;gt;gt_version,
-                               ld-&amp;gt;domain_id,
+        if ( (rc = _set_status(rgt-&amp;gt;gt_version, ldom,
                                readonly, 0, shah, act,
                                status) ) != GNTST_okay )
              goto unlock_out;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1842,7 +1845,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
                 PIN_FAIL(unlock_out, GNTST_general_error,
                          "transitive grants cannot be self-referential\n");
 
-            /* We allow the trans_domid == ld-&amp;gt;domain_id case, which
+            /* We allow the trans_domid == ldom case, which
                corresponds to a grant being issued by one domain, sent
                to another one, and then transitively granted back to
                the original domain.  Allowing it is easy, and means
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1855,17 +1858,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
                 PIN_FAIL(unlock_out, GNTST_general_error,
                          "transitive grant referenced bad domain %d\n",
                          trans_domid);
-            spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+            spin_unlock(&amp;amp;rgt-&amp;gt;lock);
 
-            rc = __acquire_grant_for_copy(td, trans_gref, rd,
+            rc = __acquire_grant_for_copy(td, trans_gref, rd-&amp;gt;domain_id,
                                           readonly, &amp;amp;grant_frame, page,
                                           &amp;amp;trans_page_off, &amp;amp;trans_length, 0);
 
-            spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+            spin_lock(&amp;amp;rgt-&amp;gt;lock);
             if ( rc != GNTST_okay ) {
                 __fixup_status_for_pin(act, status);
                 rcu_unlock_domain(td);
-                spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+                spin_unlock(&amp;amp;rgt-&amp;gt;lock);
                 return rc;
             }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1877,9 +1880,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
             {
                 __fixup_status_for_pin(act, status);
                 rcu_unlock_domain(td);
-                spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+                spin_unlock(&amp;amp;rgt-&amp;gt;lock);
                 put_page(*page);
-                return __acquire_grant_for_copy(rd, gref, ld, readonly,
+                return __acquire_grant_for_copy(rd, gref, ldom, readonly,
                                                 frame, page, page_off, length,
                                                 allow_transitive);
             }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1923,7 +1926,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
 
         if ( !act-&amp;gt;pin )
         {
-            act-&amp;gt;domid = ld-&amp;gt;domain_id;
+            act-&amp;gt;domid = ldom;
             act-&amp;gt;is_sub_page = is_sub_page;
             act-&amp;gt;start = trans_page_off;
             act-&amp;gt;length = trans_length;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1946,7 +1949,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __acquire_grant_for_copy(
     *frame = act-&amp;gt;frame;
 
  unlock_out:
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;rgt-&amp;gt;lock);
     return rc;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1996,8 +1999,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_copy(
     if ( src_is_gref )
     {
         unsigned source_off, source_len;
-        rc = __acquire_grant_for_copy(sd, op-&amp;gt;source.u.ref, current-&amp;gt;domain, 1,
-                                      &amp;amp;s_frame, &amp;amp;s_pg, &amp;amp;source_off, &amp;amp;source_len, 1);
+        rc = __acquire_grant_for_copy(sd, op-&amp;gt;source.u.ref,
+                                      current-&amp;gt;domain-&amp;gt;domain_id, 1,
+                                      &amp;amp;s_frame, &amp;amp;s_pg,
+                                      &amp;amp;source_off, &amp;amp;source_len, 1);
         if ( rc != GNTST_okay )
             goto error_out;
         have_s_grant = 1;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2019,7 +2024,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_copy(
     if ( dest_is_gref )
     {
         unsigned dest_off, dest_len;
-        rc = __acquire_grant_for_copy(dd, op-&amp;gt;dest.u.ref, current-&amp;gt;domain, 0,
+        rc = __acquire_grant_for_copy(dd, op-&amp;gt;dest.u.ref,
+                                      current-&amp;gt;domain-&amp;gt;domain_id, 0,
                                       &amp;amp;d_frame, &amp;amp;d_pg, &amp;amp;dest_off, &amp;amp;dest_len, 1);
         if ( rc != GNTST_okay )
             goto error_out;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2267,11 +2273,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_get_status_frames(XEN_GUEST_HANDL
 
     for ( i = 0; i &amp;lt; op.nr_frames; i++ )
     {
-        gmfn = gnttab_status_gmfn(d, d-&amp;gt;grant_table, i);
-        if (copy_to_guest_offset(op.frame_list,
-                                 i,
-                                 &amp;amp;gmfn,
-                                 1))
+        gmfn = gnttab_status_gmfn(d, gt, i);
+        if (copy_to_guest_offset(op.frame_list, i, &amp;amp;gmfn, 1))
             op.status = GNTST_bad_virt_addr;
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2305,9 +2308,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_get_version(XEN_GUEST_HANDLE(gntt
         return -EPERM;
     }
 
-    spin_lock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
     op.version = d-&amp;gt;grant_table-&amp;gt;gt_version;
-    spin_unlock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
 
     rcu_unlock_domain(d);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2320,52 +2321,46 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_get_version(XEN_GUEST_HANDLE(gntt
 static s16
 __gnttab_swap_grant_ref(grant_ref_t ref_a, grant_ref_t ref_b)
 {
-    struct domain *d;
+    struct domain *d = rcu_lock_current_domain();
+    struct grant_table *gt = d-&amp;gt;grant_table;
     struct active_grant_entry *act;
     s16 rc = GNTST_okay;
 
-    d = rcu_lock_current_domain();
-
-    spin_lock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
+    spin_lock(&amp;amp;gt-&amp;gt;lock);
 
-    act = &amp;amp;active_entry(d-&amp;gt;grant_table, ref_a);
+    act = &amp;amp;active_entry(gt, ref_a);
     if ( act-&amp;gt;pin )
         PIN_FAIL(out, GNTST_eagain, "ref a %ld busy\n", (long)ref_a);
 
-    act = &amp;amp;active_entry(d-&amp;gt;grant_table, ref_b);
+    act = &amp;amp;active_entry(gt, ref_b);
     if ( act-&amp;gt;pin )
         PIN_FAIL(out, GNTST_eagain, "ref b %ld busy\n", (long)ref_b);
 
-    if ( d-&amp;gt;grant_table-&amp;gt;gt_version == 1 )
+    if ( gt-&amp;gt;gt_version == 1 )
     {
         grant_entry_v1_t shared;
 
-        shared = shared_entry_v1(d-&amp;gt;grant_table, ref_a);
-
-        shared_entry_v1(d-&amp;gt;grant_table, ref_a) =
-            shared_entry_v1(d-&amp;gt;grant_table, ref_b);
-
-        shared_entry_v1(d-&amp;gt;grant_table, ref_b) = shared;
+        shared = shared_entry_v1(gt, ref_a);
+        shared_entry_v1(gt, ref_a) = shared_entry_v1(gt, ref_b);
+        shared_entry_v1(gt, ref_b) = shared;
     }
     else
     {
         grant_entry_v2_t shared;
         grant_status_t status;
 
-        shared = shared_entry_v2(d-&amp;gt;grant_table, ref_a);
-        status = status_entry(d-&amp;gt;grant_table, ref_a);
+        shared = shared_entry_v2(gt, ref_a);
+        status = status_entry(gt, ref_a);
 
-        shared_entry_v2(d-&amp;gt;grant_table, ref_a) =
-            shared_entry_v2(d-&amp;gt;grant_table, ref_b);
-        status_entry(d-&amp;gt;grant_table, ref_a) =
-            status_entry(d-&amp;gt;grant_table, ref_b);
+        shared_entry_v2(gt, ref_a) = shared_entry_v2(gt, ref_b);
+        status_entry(gt, ref_a) = status_entry(gt, ref_b);
 
-        shared_entry_v2(d-&amp;gt;grant_table, ref_b) = shared;
-        status_entry(d-&amp;gt;grant_table, ref_b) = status;
+        shared_entry_v2(gt, ref_b) = shared;
+        status_entry(gt, ref_b) = status;
     }
 
 out:
-    spin_unlock(&amp;amp;d-&amp;gt;grant_table-&amp;gt;lock);
+    spin_unlock(&amp;amp;gt-&amp;gt;lock);
 
     rcu_unlock_domain(d);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2632,7 +2627,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void
 gnttab_release_mappings(
     struct domain *d)
 {
-    struct grant_table   *gt = d-&amp;gt;grant_table;
+    struct grant_table   *gt = d-&amp;gt;grant_table, *rgt;
     struct grant_mapping *map;
     grant_ref_t           ref;
     grant_handle_t        handle;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2664,14 +2659,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_release_mappings(
             continue;
         }
 
-        spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+        rgt = rd-&amp;gt;grant_table;
+        spin_lock(&amp;amp;rgt-&amp;gt;lock);
 
-        act = &amp;amp;active_entry(rd-&amp;gt;grant_table, ref);
-        sha = shared_entry_header(rd-&amp;gt;grant_table, ref);
-        if (rd-&amp;gt;grant_table-&amp;gt;gt_version == 1)
+        act = &amp;amp;active_entry(rgt, ref);
+        sha = shared_entry_header(rgt, ref);
+        if (rgt-&amp;gt;gt_version == 1)
             status = &amp;amp;sha-&amp;gt;flags;
         else
-            status = &amp;amp;status_entry(rd-&amp;gt;grant_table, ref);
+            status = &amp;amp;status_entry(rgt, ref);
 
         pg = mfn_to_page(act-&amp;gt;frame);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2724,7 +2720,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gnttab_release_mappings(
         if ( act-&amp;gt;pin == 0 )
             gnttab_clear_flag(_GTF_reading, status);
 
-        spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+        spin_unlock(&amp;amp;rgt-&amp;gt;lock);
 
         rcu_unlock_domain(rd);
 
_______________________________________________
Xen-devel mailing list
Xen-devel&amp;lt; at &amp;gt;lists.xen.org
http://lists.xen.org/xen-devel
&lt;/pre&gt;</description>
    <dc:creator>Jan Beulich</dc:creator>
    <dc:date>2012-05-25T12:52:17</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131588">
    <title>[PATCH 2/3] gnttab: mark maptrack free list tail with an explicit terminator</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131588</link>
    <description>&lt;pre&gt;... instead of using the mutable current limit.

This also addresses an apparent off-by-one mistake when checking for
exhaustion of the maptrack table.

Signed-off-by: Jan Beulich &amp;lt;jbeulich&amp;lt; at &amp;gt;suse.com&amp;gt;
Tested-by: Andrew Thomas &amp;lt;andrew.thomas&amp;lt; at &amp;gt;oracle.com&amp;gt;

--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,6 +107,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static unsigned inline int max_nr_maptra
     return (max_nr_grant_frames * MAX_MAPTRACK_TO_GRANTS_RATIO);
 }
 
+#define MAPTRACK_TAIL (~0u)
+
 #define SHGNT_PER_PAGE_V1 (PAGE_SIZE / sizeof(grant_entry_v1_t))
 #define shared_entry_v1(t, e) \
     ((t)-&amp;gt;shared_v1[(e)/SHGNT_PER_PAGE_V1][(e)%SHGNT_PER_PAGE_V1])
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -198,7 +200,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __get_maptrack_handle(
     struct grant_table *t)
 {
     unsigned int h;
-    if ( unlikely((h = t-&amp;gt;maptrack_head) == (t-&amp;gt;maptrack_limit - 1)) )
+    if ( unlikely((h = t-&amp;gt;maptrack_head) == MAPTRACK_TAIL) )
         return -1;
     t-&amp;gt;maptrack_head = maptrack_entry(t, h).ref;
     return h;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -239,8 +241,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; get_maptrack_handle(
 
         new_mt_limit = lgt-&amp;gt;maptrack_limit + MAPTRACK_PER_PAGE;
 
-        for ( i = lgt-&amp;gt;maptrack_limit; i &amp;lt; new_mt_limit; i++ )
-            new_mt[i % MAPTRACK_PER_PAGE].ref = i + 1;
+        for ( i = 1; i &amp;lt; MAPTRACK_PER_PAGE; i++ )
+            new_mt[i - 1].ref = lgt-&amp;gt;maptrack_limit + i;
+        new_mt[i - 1].ref = lgt-&amp;gt;maptrack_head;
+        lgt-&amp;gt;maptrack_head = lgt-&amp;gt;maptrack_limit;
 
         lgt-&amp;gt;maptrack[nr_frames] = new_mt;
         smp_wmb();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2577,9 +2581,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; grant_table_create(
     if ( (t-&amp;gt;maptrack[0] = alloc_xenheap_page()) == NULL )
         goto no_mem_3;
     clear_page(t-&amp;gt;maptrack[0]);
-    t-&amp;gt;maptrack_limit = PAGE_SIZE / sizeof(struct grant_mapping);
-    for ( i = 0; i &amp;lt; t-&amp;gt;maptrack_limit; i++ )
-        t-&amp;gt;maptrack[0][i].ref = i+1;
+    t-&amp;gt;maptrack_limit = MAPTRACK_PER_PAGE;
+    for ( i = 1; i &amp;lt; MAPTRACK_PER_PAGE; i++ )
+        t-&amp;gt;maptrack[0][i - 1].ref = i;
+    t-&amp;gt;maptrack[0][i - 1].ref = MAPTRACK_TAIL;
 
     /* Shared grant table. */
     if ( (t-&amp;gt;shared_raw = xzalloc_array(void *, max_nr_grant_frames)) == NULL )



gnttab: mark maptrack free list tail with an explicit terminator

... instead of using the mutable current limit.

This also addresses an apparent off-by-one mistake when checking for
exhaustion of the maptrack table.

Signed-off-by: Jan Beulich &amp;lt;jbeulich&amp;lt; at &amp;gt;suse.com&amp;gt;
Tested-by: Andrew Thomas &amp;lt;andrew.thomas&amp;lt; at &amp;gt;oracle.com&amp;gt;

--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -107,6 +107,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static unsigned inline int max_nr_maptra
     return (max_nr_grant_frames * MAX_MAPTRACK_TO_GRANTS_RATIO);
 }
 
+#define MAPTRACK_TAIL (~0u)
+
 #define SHGNT_PER_PAGE_V1 (PAGE_SIZE / sizeof(grant_entry_v1_t))
 #define shared_entry_v1(t, e) \
     ((t)-&amp;gt;shared_v1[(e)/SHGNT_PER_PAGE_V1][(e)%SHGNT_PER_PAGE_V1])
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -198,7 +200,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __get_maptrack_handle(
     struct grant_table *t)
 {
     unsigned int h;
-    if ( unlikely((h = t-&amp;gt;maptrack_head) == (t-&amp;gt;maptrack_limit - 1)) )
+    if ( unlikely((h = t-&amp;gt;maptrack_head) == MAPTRACK_TAIL) )
         return -1;
     t-&amp;gt;maptrack_head = maptrack_entry(t, h).ref;
     return h;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -239,8 +241,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; get_maptrack_handle(
 
         new_mt_limit = lgt-&amp;gt;maptrack_limit + MAPTRACK_PER_PAGE;
 
-        for ( i = lgt-&amp;gt;maptrack_limit; i &amp;lt; new_mt_limit; i++ )
-            new_mt[i % MAPTRACK_PER_PAGE].ref = i + 1;
+        for ( i = 1; i &amp;lt; MAPTRACK_PER_PAGE; i++ )
+            new_mt[i - 1].ref = lgt-&amp;gt;maptrack_limit + i;
+        new_mt[i - 1].ref = lgt-&amp;gt;maptrack_head;
+        lgt-&amp;gt;maptrack_head = lgt-&amp;gt;maptrack_limit;
 
         lgt-&amp;gt;maptrack[nr_frames] = new_mt;
         smp_wmb();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2577,9 +2581,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; grant_table_create(
     if ( (t-&amp;gt;maptrack[0] = alloc_xenheap_page()) == NULL )
         goto no_mem_3;
     clear_page(t-&amp;gt;maptrack[0]);
-    t-&amp;gt;maptrack_limit = PAGE_SIZE / sizeof(struct grant_mapping);
-    for ( i = 0; i &amp;lt; t-&amp;gt;maptrack_limit; i++ )
-        t-&amp;gt;maptrack[0][i].ref = i+1;
+    t-&amp;gt;maptrack_limit = MAPTRACK_PER_PAGE;
+    for ( i = 1; i &amp;lt; MAPTRACK_PER_PAGE; i++ )
+        t-&amp;gt;maptrack[0][i - 1].ref = i;
+    t-&amp;gt;maptrack[0][i - 1].ref = MAPTRACK_TAIL;
 
     /* Shared grant table. */
     if ( (t-&amp;gt;shared_raw = xzalloc_array(void *, max_nr_grant_frames)) == NULL )
_______________________________________________
Xen-devel mailing list
Xen-devel&amp;lt; at &amp;gt;lists.xen.org
http://lists.xen.org/xen-devel
&lt;/pre&gt;</description>
    <dc:creator>Jan Beulich</dc:creator>
    <dc:date>2012-05-25T12:51:30</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131587">
    <title>[PATCH 1/3] gnttab: don't use domain lock forserialization</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131587</link>
    <description>&lt;pre&gt;Instead use the affected domain's grant table lock, at once reducing
the scopes during which locks are being held and hence allowing
significantly better parallelism.

Signed-off-by: Jan Beulich &amp;lt;jbeulich&amp;lt; at &amp;gt;suse.com&amp;gt;
Tested-by: Andrew Thomas &amp;lt;andrew.thomas&amp;lt; at &amp;gt;oracle.com&amp;gt;

--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3727,8 +3727,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int create_grant_pte_mapping(
     l1_pgentry_t ol1e;
     struct domain *d = v-&amp;gt;domain;
 
-    ASSERT(domain_is_locked(d));
-
     adjust_guest_l1e(nl1e, d);
 
     gmfn = pte_addr &amp;gt;&amp;gt; PAGE_SHIFT;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3855,8 +3853,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int create_grant_va_mapping(
     struct page_info *l1pg;
     int okay;
     
-    ASSERT(domain_is_locked(d));
-
     adjust_guest_l1e(nl1e, d);
 
     pl1e = guest_map_l1e(v, va, &amp;amp;gl1mfn);
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -169,6 +169,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __get_paged_frame(unsigned lo
     return rc;
 }
 
+static inline void
+double_gt_lock(struct grant_table *lgt, struct grant_table *rgt)
+{
+    if ( lgt &amp;lt; rgt )
+    {
+        spin_lock(&amp;amp;lgt-&amp;gt;lock);
+        spin_lock(&amp;amp;rgt-&amp;gt;lock);
+    }
+    else
+    {
+        if ( lgt != rgt )
+            spin_lock(&amp;amp;rgt-&amp;gt;lock);
+        spin_lock(&amp;amp;lgt-&amp;gt;lock);
+    }
+}
+
+static inline void
+double_gt_unlock(struct grant_table *lgt, struct grant_table *rgt)
+{
+    spin_unlock(&amp;amp;lgt-&amp;gt;lock);
+    if ( lgt != rgt )
+        spin_unlock(&amp;amp;rgt-&amp;gt;lock);
+}
+
 static inline int
 __get_maptrack_handle(
     struct grant_table *t)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -184,8 +208,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static inline void
 put_maptrack_handle(
     struct grant_table *t, int handle)
 {
+    spin_lock(&amp;amp;t-&amp;gt;lock);
     maptrack_entry(t, handle).ref = t-&amp;gt;maptrack_head;
     t-&amp;gt;maptrack_head = handle;
+    spin_unlock(&amp;amp;t-&amp;gt;lock);
 }
 
 static inline int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -197,46 +223,35 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; get_maptrack_handle(
     struct grant_mapping *new_mt;
     unsigned int          new_mt_limit, nr_frames;
 
-    if ( unlikely((handle = __get_maptrack_handle(lgt)) == -1) )
+    spin_lock(&amp;amp;lgt-&amp;gt;lock);
+
+    while ( unlikely((handle = __get_maptrack_handle(lgt)) == -1) )
     {
-        spin_lock(&amp;amp;lgt-&amp;gt;lock);
+        nr_frames = nr_maptrack_frames(lgt);
+        if ( nr_frames &amp;gt;= max_nr_maptrack_frames() )
+            break;
 
-        if ( unlikely((handle = __get_maptrack_handle(lgt)) == -1) )
-        {
-            nr_frames = nr_maptrack_frames(lgt);
-            if ( nr_frames &amp;gt;= max_nr_maptrack_frames() )
-            {
-                spin_unlock(&amp;amp;lgt-&amp;gt;lock);
-                return -1;
-            }
+        new_mt = alloc_xenheap_page();
+        if ( !new_mt )
+            break;
 
-            new_mt = alloc_xenheap_page();
-            if ( new_mt == NULL )
-            {
-                spin_unlock(&amp;amp;lgt-&amp;gt;lock);
-                return -1;
-            }
+        clear_page(new_mt);
 
-            clear_page(new_mt);
+        new_mt_limit = lgt-&amp;gt;maptrack_limit + MAPTRACK_PER_PAGE;
 
-            new_mt_limit = lgt-&amp;gt;maptrack_limit + MAPTRACK_PER_PAGE;
+        for ( i = lgt-&amp;gt;maptrack_limit; i &amp;lt; new_mt_limit; i++ )
+            new_mt[i % MAPTRACK_PER_PAGE].ref = i + 1;
 
-            for ( i = lgt-&amp;gt;maptrack_limit; i &amp;lt; new_mt_limit; i++ )
-            {
-                new_mt[i % MAPTRACK_PER_PAGE].ref = i+1;
-                new_mt[i % MAPTRACK_PER_PAGE].flags = 0;
-            }
+        lgt-&amp;gt;maptrack[nr_frames] = new_mt;
+        smp_wmb();
+        lgt-&amp;gt;maptrack_limit      = new_mt_limit;
 
-            lgt-&amp;gt;maptrack[nr_frames] = new_mt;
-            lgt-&amp;gt;maptrack_limit      = new_mt_limit;
+        gdprintk(XENLOG_INFO, "Increased maptrack size to %u frames\n",
+                 nr_frames + 1);
+    }
 
-            gdprintk(XENLOG_INFO,
-                    "Increased maptrack size to %u frames.\n", nr_frames + 1);
-            handle = __get_maptrack_handle(lgt);
-        }
+    spin_unlock(&amp;amp;lgt-&amp;gt;lock);
 
-        spin_unlock(&amp;amp;lgt-&amp;gt;lock);
-    }
     return handle;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -425,25 +440,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int _set_status(unsigned gt_versi
 }
 
 static void mapcount(
-    struct domain *ld, unsigned long mfn,
+    struct domain *ld, struct domain *rd, unsigned long mfn,
     unsigned int *wrc, unsigned int *rdc)
 {
     struct grant_table *gt = ld-&amp;gt;grant_table;
     struct grant_mapping *map;
     grant_handle_t handle;
-    struct domain *rd;
 
     *wrc = *rdc = 0;
 
     for ( handle = 0; handle &amp;lt; gt-&amp;gt;maptrack_limit; handle++ )
     {
         map = &amp;amp;maptrack_entry(gt, handle);
-        if ( !(map-&amp;gt;flags &amp;amp; (GNTMAP_device_map|GNTMAP_host_map)) )
+        if ( !(map-&amp;gt;flags &amp;amp; (GNTMAP_device_map|GNTMAP_host_map)) ||
+             map-&amp;gt;domid != rd-&amp;gt;domain_id )
             continue;
-        rd = rcu_lock_domain_by_id(map-&amp;gt;domid);
         if ( active_entry(rd-&amp;gt;grant_table, map-&amp;gt;ref).frame == mfn )
             (map-&amp;gt;flags &amp;amp; GNTMAP_readonly) ? (*rdc)++ : (*wrc)++;
-        rcu_unlock_domain(rd);
     }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -662,6 +675,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         goto undo_out;
     }
 
+    double_gt_lock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+
     if ( !is_hvm_domain(ld) &amp;amp;&amp;amp; need_iommu(ld) )
     {
         unsigned int wrc, rdc;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -670,7 +685,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         BUG_ON(paging_mode_translate(ld));
         /* We're not translated, so we know that gmfns and mfns are
            the same things, so the IOMMU entry is always 1-to-1. */
-        mapcount(ld, frame, &amp;amp;wrc, &amp;amp;rdc);
+        mapcount(ld, rd, frame, &amp;amp;wrc, &amp;amp;rdc);
         if ( (act_pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask)) &amp;amp;&amp;amp;
              !(old_pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
         {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -685,6 +700,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         }
         if ( err )
         {
+            double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
             rc = GNTST_general_error;
             goto undo_out;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -697,6 +713,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
     mt-&amp;gt;ref   = op-&amp;gt;ref;
     mt-&amp;gt;flags = op-&amp;gt;flags;
 
+    double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+
     op-&amp;gt;dev_bus_addr = (u64)frame &amp;lt;&amp;lt; PAGE_SHIFT;
     op-&amp;gt;handle       = handle;
     op-&amp;gt;status       = GNTST_okay;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -787,18 +805,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
     }
 
     op-&amp;gt;map = &amp;amp;maptrack_entry(ld-&amp;gt;grant_table, op-&amp;gt;handle);
+    spin_lock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
 
     if ( unlikely(!op-&amp;gt;map-&amp;gt;flags) )
     {
+        spin_unlock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
         gdprintk(XENLOG_INFO, "Zero flags for handle (%d).\n", op-&amp;gt;handle);
         op-&amp;gt;status = GNTST_bad_handle;
         return;
     }
 
-    dom   = op-&amp;gt;map-&amp;gt;domid;
-    op-&amp;gt;flags = op-&amp;gt;map-&amp;gt;flags;
+    dom = op-&amp;gt;map-&amp;gt;domid;
+    spin_unlock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
 
-    if ( unlikely((op-&amp;gt;rd = rd = rcu_lock_domain_by_id(dom)) == NULL) )
+    if ( unlikely((rd = rcu_lock_domain_by_id(dom)) == NULL) )
     {
         /* This can happen when a grant is implicitly unmapped. */
         gdprintk(XENLOG_INFO, "Could not find domain %d\n", dom);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -816,8 +836,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
 
     TRACE_1D(TRC_MEM_PAGE_GRANT_UNMAP, dom);
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    double_gt_lock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+
+    op-&amp;gt;flags = op-&amp;gt;map-&amp;gt;flags;
+    if ( unlikely(!op-&amp;gt;flags) || unlikely(op-&amp;gt;map-&amp;gt;domid != dom) )
+    {
+        gdprintk(XENLOG_WARNING, "Unstable handle %u\n", op-&amp;gt;handle);
+        rc = GNTST_bad_handle;
+        goto unmap_out;
+    }
 
+    op-&amp;gt;rd = rd;
     act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
 
     if ( op-&amp;gt;frame == 0 )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -861,7 +890,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
         unsigned int wrc, rdc;
         int err = 0;
         BUG_ON(paging_mode_translate(ld));
-        mapcount(ld, op-&amp;gt;frame, &amp;amp;wrc, &amp;amp;rdc);
+        mapcount(ld, rd, op-&amp;gt;frame, &amp;amp;wrc, &amp;amp;rdc);
         if ( (wrc + rdc) == 0 )
             err = iommu_unmap_page(ld, op-&amp;gt;frame);
         else if ( wrc == 0 )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -878,8 +907,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
          gnttab_mark_dirty(rd, op-&amp;gt;frame);
 
  unmap_out:
+    double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
     op-&amp;gt;status = rc;
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
     rcu_unlock_domain(rd);
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -891,6 +920,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
     grant_entry_header_t *sha;
     struct page_info *pg;
     uint16_t *status;
+    bool_t put_handle = 0;
 
     rd = op-&amp;gt;rd;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -962,10 +992,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
     }
 
     if ( (op-&amp;gt;map-&amp;gt;flags &amp;amp; (GNTMAP_device_map|GNTMAP_host_map)) == 0 )
-    {
-        op-&amp;gt;map-&amp;gt;flags = 0;
-        put_maptrack_handle(ld-&amp;gt;grant_table, op-&amp;gt;handle);
-    }
+        put_handle = 1;
 
     if ( ((act-&amp;gt;pin &amp;amp; (GNTPIN_devw_mask|GNTPIN_hstw_mask)) == 0) &amp;amp;&amp;amp;
          !(op-&amp;gt;flags &amp;amp; GNTMAP_readonly) )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -976,6 +1003,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
 
  unmap_out:
     spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    if ( put_handle )
+    {
+        op-&amp;gt;map-&amp;gt;flags = 0;
+        put_maptrack_handle(ld-&amp;gt;grant_table, op-&amp;gt;handle);
+    }
     rcu_unlock_domain(rd);
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2361,13 +2393,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE(void) uop, unsigned int count)
 {
     long rc;
-    struct domain *d = current-&amp;gt;domain;
     
     if ( (int)count &amp;lt; 0 )
         return -EINVAL;
     
-    domain_lock(d);
-    
     rc = -EFAULT;
     switch ( cmd )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2494,8 +2523,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_grant_table_op(
     }
     
   out:
-    domain_unlock(d);
-
     if ( rc &amp;gt; 0 )
     {
         ASSERT(rc &amp;lt; count);


gnttab: don't use domain lock for serialization

Instead use the affected domain's grant table lock, at once reducing
the scopes during which locks are being held and hence allowing
significantly better parallelism.

Signed-off-by: Jan Beulich &amp;lt;jbeulich&amp;lt; at &amp;gt;suse.com&amp;gt;
Tested-by: Andrew Thomas &amp;lt;andrew.thomas&amp;lt; at &amp;gt;oracle.com&amp;gt;

--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3727,8 +3727,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int create_grant_pte_mapping(
     l1_pgentry_t ol1e;
     struct domain *d = v-&amp;gt;domain;
 
-    ASSERT(domain_is_locked(d));
-
     adjust_guest_l1e(nl1e, d);
 
     gmfn = pte_addr &amp;gt;&amp;gt; PAGE_SHIFT;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3855,8 +3853,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int create_grant_va_mapping(
     struct page_info *l1pg;
     int okay;
     
-    ASSERT(domain_is_locked(d));
-
     adjust_guest_l1e(nl1e, d);
 
     pl1e = guest_map_l1e(v, va, &amp;amp;gl1mfn);
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -169,6 +169,30 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int __get_paged_frame(unsigned lo
     return rc;
 }
 
+static inline void
+double_gt_lock(struct grant_table *lgt, struct grant_table *rgt)
+{
+    if ( lgt &amp;lt; rgt )
+    {
+        spin_lock(&amp;amp;lgt-&amp;gt;lock);
+        spin_lock(&amp;amp;rgt-&amp;gt;lock);
+    }
+    else
+    {
+        if ( lgt != rgt )
+            spin_lock(&amp;amp;rgt-&amp;gt;lock);
+        spin_lock(&amp;amp;lgt-&amp;gt;lock);
+    }
+}
+
+static inline void
+double_gt_unlock(struct grant_table *lgt, struct grant_table *rgt)
+{
+    spin_unlock(&amp;amp;lgt-&amp;gt;lock);
+    if ( lgt != rgt )
+        spin_unlock(&amp;amp;rgt-&amp;gt;lock);
+}
+
 static inline int
 __get_maptrack_handle(
     struct grant_table *t)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -184,8 +208,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static inline void
 put_maptrack_handle(
     struct grant_table *t, int handle)
 {
+    spin_lock(&amp;amp;t-&amp;gt;lock);
     maptrack_entry(t, handle).ref = t-&amp;gt;maptrack_head;
     t-&amp;gt;maptrack_head = handle;
+    spin_unlock(&amp;amp;t-&amp;gt;lock);
 }
 
 static inline int
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -197,46 +223,35 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; get_maptrack_handle(
     struct grant_mapping *new_mt;
     unsigned int          new_mt_limit, nr_frames;
 
-    if ( unlikely((handle = __get_maptrack_handle(lgt)) == -1) )
+    spin_lock(&amp;amp;lgt-&amp;gt;lock);
+
+    while ( unlikely((handle = __get_maptrack_handle(lgt)) == -1) )
     {
-        spin_lock(&amp;amp;lgt-&amp;gt;lock);
+        nr_frames = nr_maptrack_frames(lgt);
+        if ( nr_frames &amp;gt;= max_nr_maptrack_frames() )
+            break;
 
-        if ( unlikely((handle = __get_maptrack_handle(lgt)) == -1) )
-        {
-            nr_frames = nr_maptrack_frames(lgt);
-            if ( nr_frames &amp;gt;= max_nr_maptrack_frames() )
-            {
-                spin_unlock(&amp;amp;lgt-&amp;gt;lock);
-                return -1;
-            }
+        new_mt = alloc_xenheap_page();
+        if ( !new_mt )
+            break;
 
-            new_mt = alloc_xenheap_page();
-            if ( new_mt == NULL )
-            {
-                spin_unlock(&amp;amp;lgt-&amp;gt;lock);
-                return -1;
-            }
+        clear_page(new_mt);
 
-            clear_page(new_mt);
+        new_mt_limit = lgt-&amp;gt;maptrack_limit + MAPTRACK_PER_PAGE;
 
-            new_mt_limit = lgt-&amp;gt;maptrack_limit + MAPTRACK_PER_PAGE;
+        for ( i = lgt-&amp;gt;maptrack_limit; i &amp;lt; new_mt_limit; i++ )
+            new_mt[i % MAPTRACK_PER_PAGE].ref = i + 1;
 
-            for ( i = lgt-&amp;gt;maptrack_limit; i &amp;lt; new_mt_limit; i++ )
-            {
-                new_mt[i % MAPTRACK_PER_PAGE].ref = i+1;
-                new_mt[i % MAPTRACK_PER_PAGE].flags = 0;
-            }
+        lgt-&amp;gt;maptrack[nr_frames] = new_mt;
+        smp_wmb();
+        lgt-&amp;gt;maptrack_limit      = new_mt_limit;
 
-            lgt-&amp;gt;maptrack[nr_frames] = new_mt;
-            lgt-&amp;gt;maptrack_limit      = new_mt_limit;
+        gdprintk(XENLOG_INFO, "Increased maptrack size to %u frames\n",
+                 nr_frames + 1);
+    }
 
-            gdprintk(XENLOG_INFO,
-                    "Increased maptrack size to %u frames.\n", nr_frames + 1);
-            handle = __get_maptrack_handle(lgt);
-        }
+    spin_unlock(&amp;amp;lgt-&amp;gt;lock);
 
-        spin_unlock(&amp;amp;lgt-&amp;gt;lock);
-    }
     return handle;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -425,25 +440,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int _set_status(unsigned gt_versi
 }
 
 static void mapcount(
-    struct domain *ld, unsigned long mfn,
+    struct domain *ld, struct domain *rd, unsigned long mfn,
     unsigned int *wrc, unsigned int *rdc)
 {
     struct grant_table *gt = ld-&amp;gt;grant_table;
     struct grant_mapping *map;
     grant_handle_t handle;
-    struct domain *rd;
 
     *wrc = *rdc = 0;
 
     for ( handle = 0; handle &amp;lt; gt-&amp;gt;maptrack_limit; handle++ )
     {
         map = &amp;amp;maptrack_entry(gt, handle);
-        if ( !(map-&amp;gt;flags &amp;amp; (GNTMAP_device_map|GNTMAP_host_map)) )
+        if ( !(map-&amp;gt;flags &amp;amp; (GNTMAP_device_map|GNTMAP_host_map)) ||
+             map-&amp;gt;domid != rd-&amp;gt;domain_id )
             continue;
-        rd = rcu_lock_domain_by_id(map-&amp;gt;domid);
         if ( active_entry(rd-&amp;gt;grant_table, map-&amp;gt;ref).frame == mfn )
             (map-&amp;gt;flags &amp;amp; GNTMAP_readonly) ? (*rdc)++ : (*wrc)++;
-        rcu_unlock_domain(rd);
     }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -662,6 +675,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         goto undo_out;
     }
 
+    double_gt_lock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+
     if ( !is_hvm_domain(ld) &amp;amp;&amp;amp; need_iommu(ld) )
     {
         unsigned int wrc, rdc;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -670,7 +685,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         BUG_ON(paging_mode_translate(ld));
         /* We're not translated, so we know that gmfns and mfns are
            the same things, so the IOMMU entry is always 1-to-1. */
-        mapcount(ld, frame, &amp;amp;wrc, &amp;amp;rdc);
+        mapcount(ld, rd, frame, &amp;amp;wrc, &amp;amp;rdc);
         if ( (act_pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask)) &amp;amp;&amp;amp;
              !(old_pin &amp;amp; (GNTPIN_hstw_mask|GNTPIN_devw_mask)) )
         {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -685,6 +700,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
         }
         if ( err )
         {
+            double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
             rc = GNTST_general_error;
             goto undo_out;
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -697,6 +713,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_map_grant_ref(
     mt-&amp;gt;ref   = op-&amp;gt;ref;
     mt-&amp;gt;flags = op-&amp;gt;flags;
 
+    double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+
     op-&amp;gt;dev_bus_addr = (u64)frame &amp;lt;&amp;lt; PAGE_SHIFT;
     op-&amp;gt;handle       = handle;
     op-&amp;gt;status       = GNTST_okay;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -787,18 +805,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
     }
 
     op-&amp;gt;map = &amp;amp;maptrack_entry(ld-&amp;gt;grant_table, op-&amp;gt;handle);
+    spin_lock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
 
     if ( unlikely(!op-&amp;gt;map-&amp;gt;flags) )
     {
+        spin_unlock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
         gdprintk(XENLOG_INFO, "Zero flags for handle (%d).\n", op-&amp;gt;handle);
         op-&amp;gt;status = GNTST_bad_handle;
         return;
     }
 
-    dom   = op-&amp;gt;map-&amp;gt;domid;
-    op-&amp;gt;flags = op-&amp;gt;map-&amp;gt;flags;
+    dom = op-&amp;gt;map-&amp;gt;domid;
+    spin_unlock(&amp;amp;ld-&amp;gt;grant_table-&amp;gt;lock);
 
-    if ( unlikely((op-&amp;gt;rd = rd = rcu_lock_domain_by_id(dom)) == NULL) )
+    if ( unlikely((rd = rcu_lock_domain_by_id(dom)) == NULL) )
     {
         /* This can happen when a grant is implicitly unmapped. */
         gdprintk(XENLOG_INFO, "Could not find domain %d\n", dom);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -816,8 +836,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
 
     TRACE_1D(TRC_MEM_PAGE_GRANT_UNMAP, dom);
 
-    spin_lock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    double_gt_lock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
+
+    op-&amp;gt;flags = op-&amp;gt;map-&amp;gt;flags;
+    if ( unlikely(!op-&amp;gt;flags) || unlikely(op-&amp;gt;map-&amp;gt;domid != dom) )
+    {
+        gdprintk(XENLOG_WARNING, "Unstable handle %u\n", op-&amp;gt;handle);
+        rc = GNTST_bad_handle;
+        goto unmap_out;
+    }
 
+    op-&amp;gt;rd = rd;
     act = &amp;amp;active_entry(rd-&amp;gt;grant_table, op-&amp;gt;map-&amp;gt;ref);
 
     if ( op-&amp;gt;frame == 0 )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -861,7 +890,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
         unsigned int wrc, rdc;
         int err = 0;
         BUG_ON(paging_mode_translate(ld));
-        mapcount(ld, op-&amp;gt;frame, &amp;amp;wrc, &amp;amp;rdc);
+        mapcount(ld, rd, op-&amp;gt;frame, &amp;amp;wrc, &amp;amp;rdc);
         if ( (wrc + rdc) == 0 )
             err = iommu_unmap_page(ld, op-&amp;gt;frame);
         else if ( wrc == 0 )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -878,8 +907,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common(
          gnttab_mark_dirty(rd, op-&amp;gt;frame);
 
  unmap_out:
+    double_gt_unlock(ld-&amp;gt;grant_table, rd-&amp;gt;grant_table);
     op-&amp;gt;status = rc;
-    spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
     rcu_unlock_domain(rd);
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -891,6 +920,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
     grant_entry_header_t *sha;
     struct page_info *pg;
     uint16_t *status;
+    bool_t put_handle = 0;
 
     rd = op-&amp;gt;rd;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -962,10 +992,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
     }
 
     if ( (op-&amp;gt;map-&amp;gt;flags &amp;amp; (GNTMAP_device_map|GNTMAP_host_map)) == 0 )
-    {
-        op-&amp;gt;map-&amp;gt;flags = 0;
-        put_maptrack_handle(ld-&amp;gt;grant_table, op-&amp;gt;handle);
-    }
+        put_handle = 1;
 
     if ( ((act-&amp;gt;pin &amp;amp; (GNTPIN_devw_mask|GNTPIN_hstw_mask)) == 0) &amp;amp;&amp;amp;
          !(op-&amp;gt;flags &amp;amp; GNTMAP_readonly) )
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -976,6 +1003,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; __gnttab_unmap_common_complete(struct gn
 
  unmap_out:
     spin_unlock(&amp;amp;rd-&amp;gt;grant_table-&amp;gt;lock);
+    if ( put_handle )
+    {
+        op-&amp;gt;map-&amp;gt;flags = 0;
+        put_maptrack_handle(ld-&amp;gt;grant_table, op-&amp;gt;handle);
+    }
     rcu_unlock_domain(rd);
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2361,13 +2393,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE(void) uop, unsigned int count)
 {
     long rc;
-    struct domain *d = current-&amp;gt;domain;
     
     if ( (int)count &amp;lt; 0 )
         return -EINVAL;
     
-    domain_lock(d);
-    
     rc = -EFAULT;
     switch ( cmd )
     {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2494,8 +2523,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; do_grant_table_op(
     }
     
   out:
-    domain_unlock(d);
-
     if ( rc &amp;gt; 0 )
     {
         ASSERT(rc &amp;lt; count);
_______________________________________________
Xen-devel mailing list
Xen-devel&amp;lt; at &amp;gt;lists.xen.org
http://lists.xen.org/xen-devel
&lt;/pre&gt;</description>
    <dc:creator>Jan Beulich</dc:creator>
    <dc:date>2012-05-25T12:50:41</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131586">
    <title>[PATCH 0/3] gnttab: drop use of domain lock and cleanup</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131586</link>
    <description>&lt;pre&gt;These three patches aren't really related to one another, but need
to be applied in order.

1: gnttab: don't use domain lock for serialization
2: gnttab: mark maptrack free list tail with an explicit terminator
3: gnttab: cleanup

Signed-off-by: Jan Beulich &amp;lt;jbeulich&amp;lt; at &amp;gt;suse.com&amp;gt;
Tested-by: Andrew Thomas &amp;lt;andrew.thomas&amp;lt; at &amp;gt;oracle.com&amp;gt;
&lt;/pre&gt;</description>
    <dc:creator>Jan Beulich</dc:creator>
    <dc:date>2012-05-25T12:49:55</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131571">
    <title>[PATCH] libxl: introduce libxl_vcpuinfo_list_free</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131571</link>
    <description>&lt;pre&gt;And fix a leak due to it being missing.

Signed-off-by: Dario Faggioli &amp;lt;dario.faggioli&amp;lt; at &amp;gt;citrix.com&amp;gt;

diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -797,6 +797,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; libxl_cputopology *libxl_get_cpu_topolog
 void libxl_cputopology_list_free(libxl_cputopology *, int nr);
 libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx, uint32_t domid,
                                        int *nb_vcpu, int *nrcpus);
+void libxl_vcpuinfo_list_free(libxl_vcpuinfo *, int nr);
 int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid,
                            libxl_cpumap *cpumap);
 int libxl_set_vcpuaffinity_all(libxl_ctx *ctx, uint32_t domid,
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -558,6 +558,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void libxl_cputopology_list_free(libxl_c
     free(list);
 }
 
+void libxl_vcpuinfo_list_free(libxl_vcpuinfo *list, int nr)
+{
+    int i;
+    for (i = 0; i &amp;lt; nr; i++)
+        libxl_vcpuinfo_dispose(&amp;amp;list[i]);
+    free(list);
+}
+
 int libxl__sendmsg_fds(libxl__gc *gc, int carrier,
                        const void *data, size_t datalen,
                        int nfds, const int fds[], const char *what) {
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3972,10 +3972,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void print_domain_vcpuinfo(uint32
 
     for (i = 0; i &amp;lt; nb_vcpu; i++) {
         print_vcpuinfo(domid, &amp;amp;vcpuinfo[i], nr_cpus);
-        libxl_vcpuinfo_dispose(&amp;amp;vcpuinfo[i]);
-    }
-
-    free(vcpuinfo);
+    }
+
+    libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu);
 }
 
 static void vcpulist(int argc, char **argv)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4063,11 +4062,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void vcpupin(const char *d, const
             fprintf(stderr, "libxl_list_vcpu failed.\n");
             goto vcpupin_out1;
         }
-        for (; nb_vcpu &amp;gt; 0; --nb_vcpu, ++vcpuinfo) {
-            if (libxl_set_vcpuaffinity(ctx, domid, vcpuinfo-&amp;gt;vcpuid, &amp;amp;cpumap) == -1) {
-                fprintf(stderr, "libxl_set_vcpuaffinity failed on vcpu `%u'.\n", vcpuinfo-&amp;gt;vcpuid);
+        for (i = 0; i &amp;lt; nb_vcpu; i++) {
+            if (libxl_set_vcpuaffinity(ctx, domid, vcpuinfo[i].vcpuid,
+                                       &amp;amp;cpumap) == -1) {
+                fprintf(stderr, "libxl_set_vcpuaffinity failed"
+                                " on vcpu `%u'.\n", vcpuinfo[i].vcpuid);
             }
         }
+        libxl_vcpuinfo_list_free(vcpuinfo, nb_vcpu);
     }
   vcpupin_out1:
     libxl_cpumap_dispose(&amp;amp;cpumap);
&lt;/pre&gt;</description>
    <dc:creator>Dario Faggioli</dc:creator>
    <dc:date>2012-05-25T09:44:29</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131568">
    <title>[PATCH] libxc: do not "panic" if a kernel is not abzImage</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131568</link>
    <description>&lt;pre&gt;# HG changeset patch
# User Ian Campbell &amp;lt;ian.campbell&amp;lt; at &amp;gt;citrix.com&amp;gt;
# Date 1337937866 -3600
# Node ID 42b4ca522057ecf3bf48250bf964d12e1a9e865c
# Parent  b68bb5eb0503bcec053de4422212a33fa6be9698
libxc: do not "panic" if a kernel is not a bzImage.

Up until the point where we think this is a bzImage there is no point in
printing panicy messages -- some other loader will have a go (probably the
compressed ELF one)

Signed-off-by: Ian Campbell &amp;lt;ian.campbell&amp;lt; at &amp;gt;citrix.com&amp;gt;

diff -r b68bb5eb0503 -r 42b4ca522057 tools/libxc/xc_dom_bzimageloader.c
--- a/tools/libxc/xc_dom_bzimageloader.cFri May 25 10:19:45 2012 +0100
+++ b/tools/libxc/xc_dom_bzimageloader.cFri May 25 10:24:26 2012 +0100
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -575,8 +575,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int xc_dom_probe_bzimage_kernel(s
 
     if ( dom-&amp;gt;kernel_size &amp;lt; sizeof(struct setup_header) )
     {
-        xc_dom_panic(dom-&amp;gt;xch, XC_INTERNAL_ERROR,
-                     "%s: kernel image too small", __FUNCTION__);
+        xc_dom_printf(dom-&amp;gt;xch, "%s: kernel image too small", __FUNCTION__);
         return -EINVAL;
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -584,8 +583,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int xc_dom_probe_bzimage_kernel(s
 
     if ( memcmp(&amp;amp;hdr-&amp;gt;header, HDR_MAGIC, HDR_MAGIC_SZ) != 0 )
     {
-        xc_dom_panic(dom-&amp;gt;xch, XC_INVALID_KERNEL,
-                     "%s: kernel is not a bzImage", __FUNCTION__);
+        xc_dom_printf(dom-&amp;gt;xch, "%s: kernel is not a bzImage", __FUNCTION__);
         return -EINVAL;
     }
&lt;/pre&gt;</description>
    <dc:creator>Ian Campbell</dc:creator>
    <dc:date>2012-05-25T09:24:52</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131561">
    <title>[xen-unstable test] 12969: tolerable FAIL</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131561</link>
    <description>&lt;pre&gt;flight 12969 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/12969/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-qemuu-win7-amd64  7 windows-install     fail pass in 12968
 test-amd64-amd64-xl-sedf     10 guest-saverestore  fail in 12968 pass in 12969
 test-amd64-amd64-xl-qemuu-win7-amd64 12 guest-localmigrate/x10 fail in 12968 pass in 12967

Tests which did not succeed, but are not blocking:
 test-amd64-amd64-xl-pcipt-intel  9 guest-start                 fail never pass
 test-amd64-i386-rhel6hvm-intel 11 leak-check/check             fail never pass
 test-amd64-i386-qemuu-rhel6hvm-amd 11 leak-check/check         fail never pass
 test-amd64-i386-qemuu-rhel6hvm-intel 11 leak-check/check       fail never pass
 test-amd64-i386-xend-winxpsp3 16 leak-check/check             fail  never pass
 test-i386-i386-xl-qemuu-winxpsp3 13 guest-stop                 fail never pass
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop                   fail  never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-rhel6hvm-amd 11 leak-check/check             fail   never pass
 test-i386-i386-xl-winxpsp3   13 guest-stop                   fail   never pass
 test-amd64-i386-xl-win7-amd64 13 guest-stop                   fail  never pass
 test-amd64-amd64-xl-qemuu-winxpsp3 13 guest-stop               fail never pass
 test-amd64-amd64-xl-winxpsp3 13 guest-stop                   fail   never pass
 test-amd64-i386-xl-winxpsp3-vcpus1 13 guest-stop               fail never pass
 test-amd64-amd64-xl-win7-amd64 13 guest-stop                   fail never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop                   fail   never pass
 test-amd64-amd64-xl-qemuu-win7-amd64 13 guest-stop    fail in 12967 never pass

version targeted for testing:
 xen                  69c3ae25bb1d
baseline version:
 xen                  69c3ae25bb1d

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            pass    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          pass    
 test-amd64-i386-xl                                           pass    
 test-i386-i386-xl                                            pass    
 test-amd64-i386-rhel6hvm-amd                                 fail    
 test-amd64-i386-qemuu-rhel6hvm-amd                           fail    
 test-amd64-amd64-xl-qemuu-win7-amd64                         fail    
 test-amd64-amd64-xl-win7-amd64                               fail    
 test-amd64-i386-xl-win7-amd64                                fail    
 test-amd64-i386-xl-credit2                                   pass    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-qemuu-rhel6hvm-intel                         fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        pass    
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          pass    
 test-amd64-amd64-xl-sedf-pin                                 pass    
 test-amd64-amd64-pv                                          pass    
 test-amd64-i386-pv                                           pass    
 test-i386-i386-pv                                            pass    
 test-amd64-amd64-xl-sedf                                     pass    
 test-amd64-i386-win-vcpus1                                   fail    
 test-amd64-i386-xl-win-vcpus1                                fail    
 test-amd64-i386-xl-winxpsp3-vcpus1                           fail    
 test-amd64-amd64-win                                         fail    
 test-amd64-i386-win                                          fail    
 test-i386-i386-win                                           fail    
 test-amd64-amd64-xl-win                                      fail    
 test-i386-i386-xl-win                                        fail    
 test-amd64-amd64-xl-qemuu-winxpsp3                           fail    
 test-i386-i386-xl-qemuu-winxpsp3                             fail    
 test-amd64-i386-xend-winxpsp3                                fail    
 test-amd64-amd64-xl-winxpsp3                                 fail    
 test-i386-i386-xl-winxpsp3                                   fail    


------------------------------------------------------------
sg-report-flight on woking.cam.xci-test.com
logs: /home/xc_osstest/logs
images: /home/xc_osstest/images

Logs, config files, etc. are available at
    http://www.chiark.greenend.org.uk/~xensrcts/logs

Test harness code can be found at
    http://xenbits.xensource.com/gitweb?p=osstest.git;a=summary


Published tested tree is already up to date.
&lt;/pre&gt;</description>
    <dc:creator>xen.org</dc:creator>
    <dc:date>2012-05-25T06:31:09</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131559">
    <title>[PATCH 3/3] libxc: add instruction length for injecttrap in userspace</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131559</link>
    <description>&lt;pre&gt;Add a parameter to represent instruction length in function
xc_hvm_inject_trap(), user should set this value when this
function is called.

Signed-off-by: Xudong Hao &amp;lt;xudong.hao&amp;lt; at &amp;gt;intel.com&amp;gt;
Signed-off-by: Xiantao Zhang &amp;lt;xiantao.zhang&amp;lt; at &amp;gt;intel.com&amp;gt;
---
 tools/libxc/xc_misc.c               |    5 +++--
 tools/libxc/xenctrl.h               |    4 ++--
 tools/tests/xen-access/xen-access.c |    2 +-
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c
index a029d79..2989a62 100644
--- a/tools/libxc/xc_misc.c
+++ b/tools/libxc/xc_misc.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -602,8 +602,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int xc_hvm_get_mem_access(
 }
 
 int xc_hvm_inject_trap(
-    xc_interface *xch, domid_t dom, int vcpu, uint32_t trap, uint32_t error_code, 
-    uint64_t cr2)
+    xc_interface *xch, domid_t dom, int vcpu, uint32_t trap, uint32_t inslen, 
+    uint32_t error_code, uint64_t cr2)
 {
     DECLARE_HYPERCALL;
     DECLARE_HYPERCALL_BUFFER(struct xen_hvm_inject_trap, arg);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -619,6 +619,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int xc_hvm_inject_trap(
     arg-&amp;gt;domid       = dom;
     arg-&amp;gt;vcpuid      = vcpu;
     arg-&amp;gt;trap        = trap;
+    arg-&amp;gt;inslen      = inslen;
     arg-&amp;gt;error_code  = error_code;
     arg-&amp;gt;cr2         = cr2;
 
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index 3bbc827..7ed4c64 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1578,8 +1578,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int xc_hvm_get_mem_access(
  * resumes. 
  */
 int xc_hvm_inject_trap(
-    xc_interface *xch, domid_t dom, int vcpu, uint32_t trap, uint32_t error_code, 
-    uint64_t cr2);
+    xc_interface *xch, domid_t dom, int vcpu, uint32_t trap, uint32_t inslen, 
+    uint32_t error_code, uint64_t cr2);
 
 /*
  *  LOGGING AND ERROR REPORTING
diff --git a/tools/tests/xen-access/xen-access.c b/tools/tests/xen-access/xen-access.c
index 906f46f..98332b0 100644
--- a/tools/tests/xen-access/xen-access.c
+++ b/tools/tests/xen-access/xen-access.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -662,7 +662,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int main(int argc, char *argv[])
                        req.vcpu_id);
 
                 /* Reinject */
-                rc = xc_hvm_inject_trap(xch, domain_id, req.vcpu_id, 3, -1, 0);
+                rc = xc_hvm_inject_trap(xch, domain_id, req.vcpu_id, 3, 1, -1, 0);
                 if (rc &amp;lt; 0)
                 {
                     ERROR("Error %d injecting int3\n", rc);
&lt;/pre&gt;</description>
    <dc:creator>Xudong Hao</dc:creator>
    <dc:date>2012-05-24T19:07:34</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131556">
    <title>[PATCH 0/3] XEN: fix vmx exception mistake</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131556</link>
    <description>&lt;pre&gt;This series of patches fix the mistake for debug exception(#DB), overflow
exception(#OF) and INT3(#BP), INTn instruction emulation. 

Introduce new function vmx_inject_sw_exception() which deliver the software
excetion, software interrupt and privileged software exception. Split hardware
exception as a seperate function(old function vmx_inject_hw_exception()).

Also Passed down intruction length to exception emulation handler function.

And supply a interface for userspace to inject trap.


PATCH 1: Pass the instruction length field down to exception emulation,
  by changing hypercall parameter and adding a parameter in fucntion
  hvm_inject_exception(), so that exception emulation can set correct
  instruction length.

PATCH 2: Fix the mistake for debug exception(#DB), overflow exception(#OF) and
  INT3(#BP), INTn instruction emulation.

  Introduce new function vmx_inject_sw_exception() which deliver the software
  excetion, software interrupt and privileged software exception. Split hardware
  exception as a seperate function(old function vmx_inject_hw_exception()).

PATCH 3: Add a parameter to represent instruction length in function
  xc_hvm_inject_trap(), user should set this value when this
  function is called.
&lt;/pre&gt;</description>
    <dc:creator>Xudong Hao</dc:creator>
    <dc:date>2012-05-24T19:06:23</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.emulators.xen.devel/131547">
    <title>PV multiconsole bug during resume.</title>
    <link>http://comments.gmane.org/gmane.comp.emulators.xen.devel/131547</link>
    <description>&lt;pre&gt;So .. we used to have in the event.c a spin_lock to protect the
irq_mapping_update_lock, but with git commit  773659483685d652970583384a0294948e57f8b3
"xen/irq: Alter the locking to use a mutex instead of a spinlock."
I changed it to a mutex b/c we keept on getting WARNs.

But now I get this when I resume a PVHVM guest:

Grant tables using version 2 layout.
BUG: sleeping function called from invalid context at /home/konrad/ssd/linux/kernel/mutex.c:85
in_atomic(): 1, irqs_disabled(): 1, pid: 6, name: migration/0
Pid: 6, comm: migration/0 Tainted: G           O 3.4.0upstream-00113-g598ff45-dirty #1
Call Trace:
 [&amp;lt;ffffffff8109830a&amp;gt;] __might_sleep+0xda/0x100
 [&amp;lt;ffffffff815a47f7&amp;gt;] mutex_lock+0x27/0x50
 [&amp;lt;ffffffff81311ea6&amp;gt;] rebind_evtchn_irq+0x36/0x90
 [&amp;lt;ffffffff81341bfc&amp;gt;] xen_console_resume+0x5c/0x60
 [&amp;lt;ffffffff81313fea&amp;gt;] xen_suspend+0x8a/0xb0
 [&amp;lt;ffffffff810d42f3&amp;gt;] stop_machine_cpu_stop+0xa3/0xf0
 [&amp;lt;ffffffff810d4250&amp;gt;] ? stop_one_cpu_nowait+0x50/0x50
 [&amp;lt;ffffffff810d3f81&amp;gt;] cpu_stopper_thread+0xf1/0x1c0
 [&amp;lt;ffffffff815a5be6&amp;gt;] ? __schedule+0x3c6/0x760
 [&amp;lt;ffffffff815a6bb9&amp;gt;] ? _raw_spin_unlock_irqrestore+0x19/0x30
 [&amp;lt;ffffffff810d3e90&amp;gt;] ? res_counter_charge+0x150/0x150
 [&amp;lt;ffffffff8108e636&amp;gt;] kthread+0x96/0xa0
 [&amp;lt;ffffffff815aeb24&amp;gt;] kernel_thread_helper+0x4/0x10
 [&amp;lt;ffffffff815a7138&amp;gt;] ? retint_restore_args+0x5/0x6
 [&amp;lt;ffffffff815aeb20&amp;gt;] ? gs_change+0x13/0x13
PM: noirq restore of devices complete after 0.163 msecs


Any ideas?
&lt;/pre&gt;</description>
    <dc:creator>Konrad Rzeszutek Wilk</dc:creator>
    <dc:date>2012-05-24T19:37:14</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.emulators.xen.devel">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.emulators.xen.devel</link>
  </textinput>
</rdf:RDF>

