<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linux-kvm.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=HollisBlanchard</id>
	<title>KVM - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://linux-kvm.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=HollisBlanchard"/>
	<link rel="alternate" type="text/html" href="https://linux-kvm.org/page/Special:Contributions/HollisBlanchard"/>
	<updated>2026-04-21T16:57:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://linux-kvm.org/index.php?title=PowerPC_Exittimings&amp;diff=3097</id>
		<title>PowerPC Exittimings</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=PowerPC_Exittimings&amp;diff=3097"/>
		<updated>2010-07-15T17:28:14Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: kvmppc_timing.py was never imported from the old wiki; it&amp;#039;s gone now&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About exit timing ==&lt;br /&gt;
&lt;br /&gt;
PowerPC KVM exports information to debugfs about the exits caused by virtualization and the time consumed by them. This data can typically be found as &amp;lt;code&amp;gt;/sys/kernel/debug/kvm/vm*_vcpu*_timing&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because the PowerPC hardware currently supported by KVM has no hardware virtualization support, the guest must run in non-privileged mode. When the guest executes a privileged instruction, the KVM host must emulate its behavior, and this emulation time is accounted for as EMULINST. (It can be expected that upcoming hardware extension reduce most of these emulation exits as the guest can then run in privileged mode.)&lt;br /&gt;
&lt;br /&gt;
Another frequent exit reason is caused by the memory/TLB management. Because a guest can not be allowed to program the real TLB (privileged commands and it would be an isolation violation anyway), the host has to track the state of the guest TLB and recover TLB faults caused because the guest is virtualized. Such a kind of TLB interrupts caused by virtualization is called [DI]TLBVIRT in the exit statistics. If the guest TLB tracked by the host does not have a mapping for the address reported by a TLB exception it is delivered to the guest as it is done on bare metal. This appears as [DI]TLBREAL in the exit statistics.&lt;br /&gt;
&lt;br /&gt;
When the guest idles, it will enter &amp;quot;wait mode&amp;quot; until an interrupt is delivered. This time is accounted for by exit type of WAIT.&lt;br /&gt;
&lt;br /&gt;
The other exits are less frequent like MMIO, DCR and SIGNAL which need to exit to kvm-userspace to be handled. The only value not really being an exit is the TIMEINGUEST which is the time in the guest.&lt;br /&gt;
&lt;br /&gt;
The timing statistic itself tracks exit and reenter time as well as the type of the exit. Then the duration exit -&amp;gt; enter is accounted for the specific exit type while enter -&amp;gt; exit is accounted for the TIMEINGUEST values.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; All times are in usec&#039;s.&lt;br /&gt;
&lt;br /&gt;
== workloads and performance expectations ==&lt;br /&gt;
&lt;br /&gt;
It can be expected that loads causing a high number of exits have a high overhead while loads that run in guest with only a few interceptions should be fine. Those loads with high exit ratios can be for example a guest booting and initializing all its virtual hardware (EMULINST), as well as load that creates memory pressure and therefore causes a lot of virtual TLB misses ([DI]TLBVIRT).&lt;br /&gt;
&lt;br /&gt;
The following measurements are taken on a 440epx (Sequoia) board. Thins means running an unmodified guests on Hardware without virtualization support. therefore a lot of overhead can be expected. The following statistics give you an idea which exit reasons are frequent dependeing on the workload. And as mentioned above you can think what happens once you run that on virtualization powerpc Hardware coming with Power ISA 2.06 (http://en.wikipedia.org/wiki/Power_Architecture#Power_ISA_v.2.06).&lt;br /&gt;
&lt;br /&gt;
The following sections describe the workloads shown on this page.&lt;br /&gt;
[[Image:workload_classification.gif]]&lt;br /&gt;
&lt;br /&gt;
=== boot guest ===&lt;br /&gt;
&lt;br /&gt;
The workload traces a guest from the initialization until you see a boot prompt. Although being simple, this workload is useful to get a load with a high amount of privileged instructions.&lt;br /&gt;
&lt;br /&gt;
=== Hashes ===&lt;br /&gt;
This is a custom written small program calculating a lot of hashes. It uses the hash algorithm used in the Berkley db and calculates hash of hash of and so on.&lt;br /&gt;
This program represents a workload that has only a few I/O and privileged instructions and therefore has only a low virtualization overhead.&lt;br /&gt;
attachment:foohash.c&lt;br /&gt;
To execute it just call the binary without options:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   ./foohash&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fhourstone ===&lt;br /&gt;
The Fhourstone benchmark (http://homepages.cwi.nl/~tromp/c4/fhour.html) uses a 64Mb transposition table to solve positions of the game connect-4. In a small environment as the sequoia board is this is a high amount of memory pressure and therefore it is expected that it causes a lot of TLB exits. After compiling the sources you get a binary called SearchGame and a file called &amp;quot;inputs&amp;quot; which represents the workload. The benchmark is invoked with:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SearchGame &amp;lt; inputs&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lame ===&lt;br /&gt;
Lame (http://lame.sourceforge.net/) is the known mp3 encoder and in the workload testcase used to convert a file in very high quality (option --preset insane). This workload has to do some I/O, as well as a lot of calculations that should not exit to the hypervisor. Therefore it can be expected that lame is a good example of average workload.&lt;br /&gt;
The wav file used is from a free sample page in the web (http://bellatrix.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html). We used the M1F1-int32-AFsp.wav from that page using the &amp;quot;insane&amp;quot; preset to get a max quality mp3.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   lame --preset insane M1F1-int32-AFsp.wav M1F1-int32-AFsp.mp3&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== find ===&lt;br /&gt;
&lt;br /&gt;
At last using find to find a file and search for it all over the disk is a simple workload using only a few CPU calculations but requiring a lot of I/O.&lt;br /&gt;
As testcase find is executed on root to search for the wav file we use in the Lame testcase, but with a wildcard. The disk we have is the ELDK ramdisk plus the files for the workloads listed here. To be fair and use the same file system the bare metal test mounts the same as loop device.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   cd /&lt;br /&gt;
   time find -name &amp;quot;*.wav*&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance results ==&lt;br /&gt;
This Section lists at which % of the native bare metal speed these tests run on the current kvmppc implementation. As described below there are alerady known options for improvement like paravirtualization. The tests are run on the source level on 11. November 2008 which included some new performance improvements in memory management, interrupt delivery as well as several minor improvements.&lt;br /&gt;
The tests are run on a Host and Guest with 64k page size. The Host uses a nfs mount as root file system while the guest is using virtio to access a disk image placed on the host root nfs mount.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&#039;&#039;&#039;workload&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;% of bae metal speed&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| hashes &lt;br /&gt;
| 96.49% &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| lame &lt;br /&gt;
| 84.47% &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| boot &lt;br /&gt;
| ~80% &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| find &lt;br /&gt;
| 6.11% &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| fhourstone &lt;br /&gt;
| 5.96% &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; network latency after the virtio indirection might be a big issue for the find testcase so treat the numbers unfinished until we verified that number it on e.g. a local usb stick.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; the time accounted for MMIO is the time a guest exits and KVM prepares the mmio until it returns to the guest. It is not the time until the IO arrives and is ready for the guest. Additional IO performance data may be obtained by running blktrace on the virtio disk inside the guest.&lt;br /&gt;
&lt;br /&gt;
== Timings results ==&lt;br /&gt;
&lt;br /&gt;
The following tables show the results of the exit timing analysis using the 5 different workloads mentioned above.&lt;br /&gt;
&lt;br /&gt;
=== boot guest ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 8309940&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:     9402       44     1997      1697610         180.5584      155.768 20.43&lt;br /&gt;
         DCR:      680       41       99        32096          47.2000        7.008  0.39&lt;br /&gt;
      SIGNAL:        1       98       98           98          98.0000        0.000  0.00&lt;br /&gt;
    ITLBREAL:      926        8       14         7810           8.4341        0.658  0.09&lt;br /&gt;
    ITLBVIRT:     3595       18      202        76185          21.1919        4.954  0.92&lt;br /&gt;
    DTLBREAL:      950        8       16         8891           9.3589        1.427  0.11&lt;br /&gt;
    DTLBVIRT:     6695       18      282       156727          23.4096       13.781  1.89&lt;br /&gt;
     SYSCALL:     1801        6       59        11372           6.3143        2.575  0.14&lt;br /&gt;
         ISI:      116        6        8          764           6.5862        0.588  0.01&lt;br /&gt;
         DSI:       43        6        7          292           6.7907        0.407  0.00&lt;br /&gt;
    EMULINST:    65247        7       96       484081           7.4192        1.818  5.83&lt;br /&gt;
   EMUL_WAIT:      801      659     9200      3721789        4646.4282     1687.218 44.79&lt;br /&gt;
   EMUL_CORE:    66806        7       86       540053           8.0839        1.895  6.50&lt;br /&gt;
  EMUL_MTSPR:    13415        8       62       111358           8.3010        2.583  1.34&lt;br /&gt;
  EMUL_MFSPR:     7635        8       61        62772           8.2216        1.921  0.76&lt;br /&gt;
  EMUL_MTMSR:     5678        8       59        45704           8.0493        1.434  0.55&lt;br /&gt;
  EMUL_MFMSR:    32853        7       67       267603           8.1455        1.875  3.22&lt;br /&gt;
  EMUL_TLBSX:      354        9       60         3745          10.5791        3.919  0.05&lt;br /&gt;
  EMUL_TLBWE:     6403        9      112        99522          15.5430        7.668  1.20&lt;br /&gt;
    EMUL_RFI:     9515        7       57        71420           7.5060        2.108  0.86&lt;br /&gt;
         DEC:      290       49      161        15786          54.4345        9.708  0.19&lt;br /&gt;
      EXTINT:        7       74       75          522          74.5714        0.495  0.01&lt;br /&gt;
 TIMEINGUEST:   233213        0     3954       893740           3.8323       65.837 10.76&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hashes ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 21576367&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:      827       49     6700       224632         271.6227      259.231  1.04&lt;br /&gt;
         DCR:      161       42       94         7468          46.3851        4.314  0.03&lt;br /&gt;
      SIGNAL:        2      291     1214         1505         752.5000      461.500  0.01&lt;br /&gt;
    ITLBREAL:       53        8       12          445           8.3962        0.682  0.00&lt;br /&gt;
    ITLBVIRT:      216       19       68         4566          21.1389        3.346  0.02&lt;br /&gt;
    DTLBREAL:       44        9       16          420           9.5455        1.738  0.00&lt;br /&gt;
    DTLBVIRT:      407       19       73         8706          21.3907        3.687  0.04&lt;br /&gt;
     SYSCALL:       66        6        7          428           6.4848        0.500  0.00&lt;br /&gt;
         ISI:        5        6        8           34           6.8000        0.748  0.00&lt;br /&gt;
         DSI:        1        7        7            7           7.0000        0.000  0.00&lt;br /&gt;
    EMULINST:    67009        6       97       508311           7.5857        1.247  2.36&lt;br /&gt;
   EMUL_WAIT:      231     1254     8902      1074304        4650.6667     1699.150  4.98&lt;br /&gt;
   EMUL_CORE:    32964        7       59       262866           7.9743        0.622  1.22&lt;br /&gt;
  EMUL_MTSPR:     9201        8       14        74751           8.1242        0.339  0.35&lt;br /&gt;
  EMUL_MFSPR:      379        8       60         3134           8.2691        2.686  0.01&lt;br /&gt;
  EMUL_MTMSR:     4749        8        9        37996           8.0008        0.029  0.18&lt;br /&gt;
  EMUL_MFMSR:    14257        7       55       114282           8.0159        0.776  0.53&lt;br /&gt;
  EMUL_TLBSX:       18        9       15          185          10.2778        1.193  0.00&lt;br /&gt;
  EMUL_TLBWE:      393        9       69         5477          13.9364        6.905  0.03&lt;br /&gt;
    EMUL_RFI:     9006        7       57        67271           7.4696        0.722  0.31&lt;br /&gt;
         DEC:     5065       49      269       267567          52.8267       13.544  1.24&lt;br /&gt;
      EXTINT:        2       77      451          528         264.0000      187.000  0.00&lt;br /&gt;
 TIMEINGUEST:   145056        0     3954     18911484         130.3737      678.943 87.65&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lame ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 6592939&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:     1827       48    18883       550073         301.0799      772.936  8.34&lt;br /&gt;
         DCR:      392       42     1074        22162          56.5357       83.884  0.34&lt;br /&gt;
      SIGNAL:        1     1812     1812         1812        1812.0000        0.000  0.03&lt;br /&gt;
    ITLBREAL:      142        8       13         1200           8.4507        0.623  0.02&lt;br /&gt;
    ITLBVIRT:     1860       18      118        39336          21.1484        4.514  0.60&lt;br /&gt;
    DTLBREAL:      164        8       66         1707          10.4085        4.885  0.03&lt;br /&gt;
    DTLBVIRT:     2724       18     1039        63063          23.1509       23.705  0.96&lt;br /&gt;
     SYSCALL:      255        6        8         1626           6.3765        0.531  0.02&lt;br /&gt;
         ISI:       17        6        8          114           6.7059        0.570  0.00&lt;br /&gt;
         DSI:        1        7        7            7           7.0000        0.000  0.00&lt;br /&gt;
    EMULINST:    26682        6      161       203151           7.6138        2.885  3.08&lt;br /&gt;
   EMUL_WAIT:      261      501     7683      1211114        4640.2835     1683.305 18.37&lt;br /&gt;
   EMUL_CORE:    19247        7      161       158089           8.2137        4.052  2.40&lt;br /&gt;
  EMUL_MTSPR:     4309        8      161        35697           8.2843        2.371  0.54&lt;br /&gt;
  EMUL_MFSPR:     1238        8       61        10395           8.3966        3.510  0.16&lt;br /&gt;
  EMUL_MTMSR:     2098        8       61        17045           8.1244        2.403  0.26&lt;br /&gt;
  EMUL_MFMSR:     9158        7      163        75613           8.2565        3.392  1.15&lt;br /&gt;
  EMUL_TLBSX:       36        9       13          364          10.1111        0.698  0.01&lt;br /&gt;
  EMUL_TLBWE:     1062        9       75        17011          16.0179        7.539  0.26&lt;br /&gt;
    EMUL_RFI:     3736        7      142        28230           7.5562        2.974  0.43&lt;br /&gt;
         DEC:     1109       49      263        61117          55.1100       15.174  0.93&lt;br /&gt;
      EXTINT:       36       52     1377        12085         335.6944      308.306  0.18&lt;br /&gt;
 TIMEINGUEST:    76355        0     3954      4081928          53.4599      415.345 61.91&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fhourstone ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 7483768&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:      818       47     9565       221609         270.9156      501.827  2.96&lt;br /&gt;
         DCR:      301       40      473        14408          47.8671       29.403  0.19&lt;br /&gt;
      SIGNAL:        1     2521     2521         2521        2521.0000        0.000  0.03&lt;br /&gt;
    ITLBREAL:      322        8       58         2665           8.2764        2.810  0.04&lt;br /&gt;
    ITLBVIRT:     5773       18     1360       120111          20.8056       18.569  1.60&lt;br /&gt;
    DTLBREAL:    16433        8       73       184196          11.2089        3.709  2.46&lt;br /&gt;
    DTLBVIRT:    19913       18     1845       500349          25.1268       23.006  6.69&lt;br /&gt;
     SYSCALL:       91        6        7          579           6.3626        0.481  0.01&lt;br /&gt;
         ISI:        5        6        8           33           6.6000        0.800  0.00&lt;br /&gt;
         DSI:        1        7        7            7           7.0000        0.000  0.00&lt;br /&gt;
    EMULINST:   127113        6      102       949687           7.4712        2.244 12.69&lt;br /&gt;
   EMUL_WAIT:       76     3526     7578       354928        4670.1053     1679.367  4.74&lt;br /&gt;
   EMUL_CORE:    16733        7      159       134306           8.0264        1.701  1.79&lt;br /&gt;
  EMUL_MTSPR:    71886        8      149       594618           8.2717        2.595  7.95&lt;br /&gt;
  EMUL_MFSPR:    83877        8       93       689016           8.2146        2.580  9.21&lt;br /&gt;
  EMUL_MTMSR:     3166        8       57        25438           8.0347        1.220  0.34&lt;br /&gt;
  EMUL_MFMSR:     7392        7       61        59415           8.0377        1.294  0.79&lt;br /&gt;
  EMUL_TLBSX:       19        9       11          192          10.1053        0.640  0.00&lt;br /&gt;
  EMUL_TLBWE:    47187        9     2757      1131527          23.9796       13.359 15.12&lt;br /&gt;
    EMUL_RFI:    21782        7      132       172428           7.9161        2.323  2.30&lt;br /&gt;
         DEC:      715       50      224        42155          58.9580       15.052  0.56&lt;br /&gt;
      EXTINT:        2      142      161          303         151.5000        9.500  0.00&lt;br /&gt;
 TIMEINGUEST:   423606        0      499      2283277           5.3901       25.629 30.51&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== find ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 3426052&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:      222       49      413        48228         217.2432      141.096  1.41&lt;br /&gt;
         DCR:       91       43       93         4239          46.5824        5.285  0.12&lt;br /&gt;
      SIGNAL:        3      476     5651         7952        2650.6667     2191.871  0.23&lt;br /&gt;
    ITLBREAL:       77        8       13          665           8.6364        0.754  0.02&lt;br /&gt;
    ITLBVIRT:     1341       18      120        28340          21.1335        4.968  0.83&lt;br /&gt;
    DTLBREAL:       59        8       16          573           9.7119        2.042  0.02&lt;br /&gt;
    DTLBVIRT:     2253       19      214        48630          21.5846        7.083  1.42&lt;br /&gt;
     SYSCALL:     4590        6       57        29503           6.4277        2.114  0.86&lt;br /&gt;
         ISI:       11        6        8           72           6.5455        0.656  0.00&lt;br /&gt;
         DSI:        1        7        7            7           7.0000        0.000  0.00&lt;br /&gt;
    EMULINST:    71560        6       77       525976           7.3501        1.945 15.35&lt;br /&gt;
   EMUL_WAIT:      374      184     9384      1724701        4611.5000     1752.946 50.34&lt;br /&gt;
   EMUL_CORE:    32646        7      100       262449           8.0392        1.792  7.66&lt;br /&gt;
  EMUL_MTSPR:     6668        8       78        54829           8.2227        2.213  1.60&lt;br /&gt;
  EMUL_MFSPR:      538        8       61         4507           8.3773        3.181  0.13&lt;br /&gt;
  EMUL_MTMSR:     5829        8       58        47036           8.0693        1.765  1.37&lt;br /&gt;
  EMUL_MFMSR:    15805        7       92       127426           8.0624        1.774  3.72&lt;br /&gt;
  EMUL_TLBSX:       29        9       14          297          10.2414        0.857  0.01&lt;br /&gt;
  EMUL_TLBWE:      462        9       27         6717          14.5390        6.606  0.20&lt;br /&gt;
    EMUL_RFI:    10855        7       57        81776           7.5335        2.132  2.39&lt;br /&gt;
         DEC:      160       50      403         9244          57.7750       32.861  0.27&lt;br /&gt;
      EXTINT:        4      427     1410         2991         747.7500      387.275  0.09&lt;br /&gt;
 TIMEINGUEST:   153578        0      762       409894           2.6690        6.322 11.96&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paravirtualization improvement ==&lt;br /&gt;
&lt;br /&gt;
As mentioned above improvements to all these overhead statistics are already known. On one hand the hardware virtualization support specified in the Power ISA 2.06, on the other hand on older hardware paravirtualization can be an option. For KVMPPC we wrote a simple paravirtualization interface to test hypercalls and measure some benefits from such implementations.&lt;br /&gt;
In the concept measured here the hypervisor tells the guest that it supports special paravirtualization features if the guest (hyper)calls him passing a guest virtual and guest physical address and an amount of x (4096byte in the example) of ram big. This is a very basic, but also flexible interface as the hypervisor can now use this guest addressable memory to do all kind of things. In the example the hypervisor rewrites guest code to replace privileged instructions mfspr (SPRG1-3, ESR, DEAR) mtspr ((SPRG1-3, ESR, DEAR) and mfmsr. The hypervisor keeps the guest copies of these values updated in the memory area provided by the guest and rewrites the privileged instructions to simple non trapping load/store instructions. That save a lot of EMULINST exits while running the guest and has shown around 35-50% improvement for workloads with a high amount of EMULINST instructions (e.g. the boot workload)&lt;br /&gt;
&lt;br /&gt;
The net benefit of that improvement is high while the &amp;quot;guest invasiveness&amp;quot; is very low (The guest only has to donate a small amount of ram and virtual address space, all the other things can be done by the hypervisor transparently). And remember this is just one simple example of pv extensions, there are a lot other areas e.g. collaborative guest/host TLB management that can improve performance significantly (could be as easy as telling the guest to program more virtual TLB entries in the guest TLB to allow the host fix more misses directly).&lt;br /&gt;
&lt;br /&gt;
The following numbers show the improvement comparing the same workload with/without this paravirtualization feature. The workload used in this test is the boot workload, but using a more complex guest and Host environment (Ubuntu instead of ELDK) and it also uses an older version of our kernel and userspace code (also containing an older version of that exit timing and therefore not being directly comparable with the measurements above).&lt;br /&gt;
&lt;br /&gt;
=== No paravirtualization ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 144837890 =&amp;gt; ~2:24 runtime&lt;br /&gt;
                count  min    max       sum     avg   stddev      %&lt;br /&gt;
        MMIO    10105   46   1534   2952467  292.17  295.933   2.04&lt;br /&gt;
         DCR     5428   40    209    246168   45.35    6.758   0.17&lt;br /&gt;
      SIGNAL      695   65   3755     89767  129.16  314.421   0.06&lt;br /&gt;
    ITLBREAL    80045   13    108   1063127   13.28    2.338   0.73&lt;br /&gt;
    ITLBVIRT  1000585   21 264827  24300596   24.28  264.753  16.78&lt;br /&gt;
    DTLBREAL    91206   13     69   1285214   14.09    2.225   0.89&lt;br /&gt;
    DTLBVIRT   977434   21   1446  24007008   24.56    4.426  16.58&lt;br /&gt;
     SYSCALL    10460   11     55    116447   11.13    1.929   0.08&lt;br /&gt;
         ISI    11724   11     61    130007   11.08    1.929   0.09&lt;br /&gt;
         DSI    20737   11     57    230009   11.09    1.914   0.16&lt;br /&gt;
    EMULINST  5683356   11   3778  79339467   13.96   50.275  54.78&lt;br /&gt;
         DEC    13079   50    826    732712   56.02   22.382   0.51&lt;br /&gt;
      EXTINT       55   30   1478     10996  199.92  238.150   0.01&lt;br /&gt;
  FP_UNAVAIL      280   11     53      3163   11.29    3.495   0.00&lt;br /&gt;
 TIMEINGUEST  7905189    0   3688  10330742    1.30    8.970   7.13&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== paravirtualization ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 92206510 =&amp;gt; ~1:32 runtime (~37% net improvement)&lt;br /&gt;
                count  min    max       sum     avg   stddev      %&lt;br /&gt;
        MMIO    12505   46   3087   3693782  295.38  260.788   4.01&lt;br /&gt;
         DCR     5595   40    706    273578   48.89   31.305   0.30&lt;br /&gt;
      SIGNAL      654   65   4132    300027  458.75  571.130   0.33&lt;br /&gt;
    ITLBREAL    71711   13    104    943053   13.15    2.360   1.02&lt;br /&gt;
    ITLBVIRT   750649   21   1503  18178245   24.21    7.335  19.71&lt;br /&gt;
    DTLBREAL    83356   13    102   1146242   13.75    2.406   1.24&lt;br /&gt;
      DTLBPV    30086   20    237    653556   21.72    4.639   0.71&lt;br /&gt;
    DTLBVIRT   772811   21    713  19079477   24.68    6.593  20.69&lt;br /&gt;
     SYSCALL     7647   11     57     84821   11.09    1.897   0.09&lt;br /&gt;
       HCALL        1   19     19        19   19.00    0.000   0.00&lt;br /&gt;
         ISI     9895   11     73    109667   11.08    1.904   0.12&lt;br /&gt;
         DSI    17974   10     57    199504   11.09    2.046   0.22&lt;br /&gt;
    EMULINST  2567245   11   4212  40501314   15.77   65.673  43.92&lt;br /&gt;
         DEC     7488   51    641    426813   56.99   23.893   0.46&lt;br /&gt;
      EXTINT     2215   31   1677    297495  134.30  116.219   0.32&lt;br /&gt;
  FP_UNAVAIL      258   11     11      2838   11.00    0.000   0.00&lt;br /&gt;
 TIMEINGUEST  4340090    0   3850   6316079    1.45   12.599   6.85&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More Results ==&lt;br /&gt;
This should actually just be an overview and is already huge, some more results can be found in all kind of timing and improvement discussions on kvm-ppc@vger.kernel.org &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Category:PowerPC]]&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=PowerPC_Exittimings&amp;diff=3096</id>
		<title>PowerPC Exittimings</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=PowerPC_Exittimings&amp;diff=3096"/>
		<updated>2010-07-15T17:26:57Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: replace MoinMoin &amp;quot;smiley&amp;quot; formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About exit timing ==&lt;br /&gt;
&lt;br /&gt;
PowerPC KVM exports information to debugfs about the exits caused by virtualization and the time consumed by them. This data can typically be found as &amp;lt;code&amp;gt;/sys/kernel/debug/kvm/vm*_vcpu*_timing&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Because the PowerPC hardware currently supported by KVM has no hardware virtualization support, the guest must run in non-privileged mode. When the guest executes a privileged instruction, the KVM host must emulate its behavior, and this emulation time is accounted for as EMULINST. (It can be expected that upcoming hardware extension reduce most of these emulation exits as the guest can then run in privileged mode.)&lt;br /&gt;
&lt;br /&gt;
Another frequent exit reason is caused by the memory/TLB management. Because a guest can not be allowed to program the real TLB (privileged commands and it would be an isolation violation anyway), the host has to track the state of the guest TLB and recover TLB faults caused because the guest is virtualized. Such a kind of TLB interrupts caused by virtualization is called [DI]TLBVIRT in the exit statistics. If the guest TLB tracked by the host does not have a mapping for the address reported by a TLB exception it is delivered to the guest as it is done on bare metal. This appears as [DI]TLBREAL in the exit statistics.&lt;br /&gt;
&lt;br /&gt;
When the guest idles, it will enter &amp;quot;wait mode&amp;quot; until an interrupt is delivered. This time is accounted for by exit type of WAIT.&lt;br /&gt;
&lt;br /&gt;
The other exits are less frequent like MMIO, DCR and SIGNAL which need to exit to kvm-userspace to be handled. The only value not really being an exit is the TIMEINGUEST which is the time in the guest.&lt;br /&gt;
&lt;br /&gt;
The timing statistic itself tracks exit and reenter time as well as the type of the exit. Then the duration exit -&amp;gt; enter is accounted for the specific exit type while enter -&amp;gt; exit is accounted for the TIMEINGUEST values.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; All times are in usec&#039;s.&lt;br /&gt;
&lt;br /&gt;
== workloads and performance expectations ==&lt;br /&gt;
&lt;br /&gt;
It can be expected that loads causing a high number of exits have a high overhead while loads that run in guest with only a few interceptions should be fine. Those loads with high exit ratios can be for example a guest booting and initializing all its virtual hardware (EMULINST), as well as load that creates memory pressure and therefore causes a lot of virtual TLB misses ([DI]TLBVIRT).&lt;br /&gt;
&lt;br /&gt;
The following measurements are taken on a 440epx (Sequoia) board. Thins means running an unmodified guests on Hardware without virtualization support. therefore a lot of overhead can be expected. The following statistics give you an idea which exit reasons are frequent dependeing on the workload. And as mentioned above you can think what happens once you run that on virtualization powerpc Hardware coming with Power ISA 2.06 (http://en.wikipedia.org/wiki/Power_Architecture#Power_ISA_v.2.06).&lt;br /&gt;
&lt;br /&gt;
The following sections describe the workloads shown on this page.&lt;br /&gt;
[[Image:workload_classification.gif]]&lt;br /&gt;
&lt;br /&gt;
=== boot guest ===&lt;br /&gt;
&lt;br /&gt;
The workload traces a guest from the initialization until you see a boot prompt. Although being simple, this workload is useful to get a load with a high amount of privileged instructions.&lt;br /&gt;
&lt;br /&gt;
=== Hashes ===&lt;br /&gt;
This is a custom written small program calculating a lot of hashes. It uses the hash algorithm used in the Berkley db and calculates hash of hash of and so on.&lt;br /&gt;
This program represents a workload that has only a few I/O and privileged instructions and therefore has only a low virtualization overhead.&lt;br /&gt;
attachment:foohash.c&lt;br /&gt;
To execute it just call the binary without options:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   ./foohash&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fhourstone ===&lt;br /&gt;
The Fhourstone benchmark (http://homepages.cwi.nl/~tromp/c4/fhour.html) uses a 64Mb transposition table to solve positions of the game connect-4. In a small environment as the sequoia board is this is a high amount of memory pressure and therefore it is expected that it causes a lot of TLB exits. After compiling the sources you get a binary called SearchGame and a file called &amp;quot;inputs&amp;quot; which represents the workload. The benchmark is invoked with:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SearchGame &amp;lt; inputs&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lame ===&lt;br /&gt;
Lame (http://lame.sourceforge.net/) is the known mp3 encoder and in the workload testcase used to convert a file in very high quality (option --preset insane). This workload has to do some I/O, as well as a lot of calculations that should not exit to the hypervisor. Therefore it can be expected that lame is a good example of average workload.&lt;br /&gt;
The wav file used is from a free sample page in the web (http://bellatrix.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html). We used the M1F1-int32-AFsp.wav from that page using the &amp;quot;insane&amp;quot; preset to get a max quality mp3.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   lame --preset insane M1F1-int32-AFsp.wav M1F1-int32-AFsp.mp3&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== find ===&lt;br /&gt;
&lt;br /&gt;
At last using find to find a file and search for it all over the disk is a simple workload using only a few CPU calculations but requiring a lot of I/O.&lt;br /&gt;
As testcase find is executed on root to search for the wav file we use in the Lame testcase, but with a wildcard. The disk we have is the ELDK ramdisk plus the files for the workloads listed here. To be fair and use the same file system the bare metal test mounts the same as loop device.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   cd /&lt;br /&gt;
   time find -name &amp;quot;*.wav*&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance results ==&lt;br /&gt;
This Section lists at which % of the native bare metal speed these tests run on the current kvmppc implementation. As described below there are alerady known options for improvement like paravirtualization. The tests are run on the source level on 11. November 2008 which included some new performance improvements in memory management, interrupt delivery as well as several minor improvements.&lt;br /&gt;
The tests are run on a Host and Guest with 64k page size. The Host uses a nfs mount as root file system while the guest is using virtio to access a disk image placed on the host root nfs mount.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&#039;&#039;&#039;workload&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;% of bae metal speed&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| hashes &lt;br /&gt;
| 96.49% &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| lame &lt;br /&gt;
| 84.47% &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| boot &lt;br /&gt;
| ~80% &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| find &lt;br /&gt;
| 6.11% &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| fhourstone &lt;br /&gt;
| 5.96% &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; network latency after the virtio indirection might be a big issue for the find testcase so treat the numbers unfinished until we verified that number it on e.g. a local usb stick.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; the time accounted for MMIO is the time a guest exits and KVM prepares the mmio until it returns to the guest. It is not the time until the IO arrives and is ready for the guest. Additional IO performance data may be obtained by running blktrace on the virtio disk inside the guest.&lt;br /&gt;
&lt;br /&gt;
== Timings results ==&lt;br /&gt;
&lt;br /&gt;
The following tables show the results of the exit timing analysis using the 5 different workloads mentioned above.&lt;br /&gt;
You can get similar postprocessed reports when using this script (attachment:kvmppc_timing.py) with the data reported by the debugfs interface.&lt;br /&gt;
&lt;br /&gt;
=== boot guest ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 8309940&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:     9402       44     1997      1697610         180.5584      155.768 20.43&lt;br /&gt;
         DCR:      680       41       99        32096          47.2000        7.008  0.39&lt;br /&gt;
      SIGNAL:        1       98       98           98          98.0000        0.000  0.00&lt;br /&gt;
    ITLBREAL:      926        8       14         7810           8.4341        0.658  0.09&lt;br /&gt;
    ITLBVIRT:     3595       18      202        76185          21.1919        4.954  0.92&lt;br /&gt;
    DTLBREAL:      950        8       16         8891           9.3589        1.427  0.11&lt;br /&gt;
    DTLBVIRT:     6695       18      282       156727          23.4096       13.781  1.89&lt;br /&gt;
     SYSCALL:     1801        6       59        11372           6.3143        2.575  0.14&lt;br /&gt;
         ISI:      116        6        8          764           6.5862        0.588  0.01&lt;br /&gt;
         DSI:       43        6        7          292           6.7907        0.407  0.00&lt;br /&gt;
    EMULINST:    65247        7       96       484081           7.4192        1.818  5.83&lt;br /&gt;
   EMUL_WAIT:      801      659     9200      3721789        4646.4282     1687.218 44.79&lt;br /&gt;
   EMUL_CORE:    66806        7       86       540053           8.0839        1.895  6.50&lt;br /&gt;
  EMUL_MTSPR:    13415        8       62       111358           8.3010        2.583  1.34&lt;br /&gt;
  EMUL_MFSPR:     7635        8       61        62772           8.2216        1.921  0.76&lt;br /&gt;
  EMUL_MTMSR:     5678        8       59        45704           8.0493        1.434  0.55&lt;br /&gt;
  EMUL_MFMSR:    32853        7       67       267603           8.1455        1.875  3.22&lt;br /&gt;
  EMUL_TLBSX:      354        9       60         3745          10.5791        3.919  0.05&lt;br /&gt;
  EMUL_TLBWE:     6403        9      112        99522          15.5430        7.668  1.20&lt;br /&gt;
    EMUL_RFI:     9515        7       57        71420           7.5060        2.108  0.86&lt;br /&gt;
         DEC:      290       49      161        15786          54.4345        9.708  0.19&lt;br /&gt;
      EXTINT:        7       74       75          522          74.5714        0.495  0.01&lt;br /&gt;
 TIMEINGUEST:   233213        0     3954       893740           3.8323       65.837 10.76&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hashes ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 21576367&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:      827       49     6700       224632         271.6227      259.231  1.04&lt;br /&gt;
         DCR:      161       42       94         7468          46.3851        4.314  0.03&lt;br /&gt;
      SIGNAL:        2      291     1214         1505         752.5000      461.500  0.01&lt;br /&gt;
    ITLBREAL:       53        8       12          445           8.3962        0.682  0.00&lt;br /&gt;
    ITLBVIRT:      216       19       68         4566          21.1389        3.346  0.02&lt;br /&gt;
    DTLBREAL:       44        9       16          420           9.5455        1.738  0.00&lt;br /&gt;
    DTLBVIRT:      407       19       73         8706          21.3907        3.687  0.04&lt;br /&gt;
     SYSCALL:       66        6        7          428           6.4848        0.500  0.00&lt;br /&gt;
         ISI:        5        6        8           34           6.8000        0.748  0.00&lt;br /&gt;
         DSI:        1        7        7            7           7.0000        0.000  0.00&lt;br /&gt;
    EMULINST:    67009        6       97       508311           7.5857        1.247  2.36&lt;br /&gt;
   EMUL_WAIT:      231     1254     8902      1074304        4650.6667     1699.150  4.98&lt;br /&gt;
   EMUL_CORE:    32964        7       59       262866           7.9743        0.622  1.22&lt;br /&gt;
  EMUL_MTSPR:     9201        8       14        74751           8.1242        0.339  0.35&lt;br /&gt;
  EMUL_MFSPR:      379        8       60         3134           8.2691        2.686  0.01&lt;br /&gt;
  EMUL_MTMSR:     4749        8        9        37996           8.0008        0.029  0.18&lt;br /&gt;
  EMUL_MFMSR:    14257        7       55       114282           8.0159        0.776  0.53&lt;br /&gt;
  EMUL_TLBSX:       18        9       15          185          10.2778        1.193  0.00&lt;br /&gt;
  EMUL_TLBWE:      393        9       69         5477          13.9364        6.905  0.03&lt;br /&gt;
    EMUL_RFI:     9006        7       57        67271           7.4696        0.722  0.31&lt;br /&gt;
         DEC:     5065       49      269       267567          52.8267       13.544  1.24&lt;br /&gt;
      EXTINT:        2       77      451          528         264.0000      187.000  0.00&lt;br /&gt;
 TIMEINGUEST:   145056        0     3954     18911484         130.3737      678.943 87.65&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Lame ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 6592939&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:     1827       48    18883       550073         301.0799      772.936  8.34&lt;br /&gt;
         DCR:      392       42     1074        22162          56.5357       83.884  0.34&lt;br /&gt;
      SIGNAL:        1     1812     1812         1812        1812.0000        0.000  0.03&lt;br /&gt;
    ITLBREAL:      142        8       13         1200           8.4507        0.623  0.02&lt;br /&gt;
    ITLBVIRT:     1860       18      118        39336          21.1484        4.514  0.60&lt;br /&gt;
    DTLBREAL:      164        8       66         1707          10.4085        4.885  0.03&lt;br /&gt;
    DTLBVIRT:     2724       18     1039        63063          23.1509       23.705  0.96&lt;br /&gt;
     SYSCALL:      255        6        8         1626           6.3765        0.531  0.02&lt;br /&gt;
         ISI:       17        6        8          114           6.7059        0.570  0.00&lt;br /&gt;
         DSI:        1        7        7            7           7.0000        0.000  0.00&lt;br /&gt;
    EMULINST:    26682        6      161       203151           7.6138        2.885  3.08&lt;br /&gt;
   EMUL_WAIT:      261      501     7683      1211114        4640.2835     1683.305 18.37&lt;br /&gt;
   EMUL_CORE:    19247        7      161       158089           8.2137        4.052  2.40&lt;br /&gt;
  EMUL_MTSPR:     4309        8      161        35697           8.2843        2.371  0.54&lt;br /&gt;
  EMUL_MFSPR:     1238        8       61        10395           8.3966        3.510  0.16&lt;br /&gt;
  EMUL_MTMSR:     2098        8       61        17045           8.1244        2.403  0.26&lt;br /&gt;
  EMUL_MFMSR:     9158        7      163        75613           8.2565        3.392  1.15&lt;br /&gt;
  EMUL_TLBSX:       36        9       13          364          10.1111        0.698  0.01&lt;br /&gt;
  EMUL_TLBWE:     1062        9       75        17011          16.0179        7.539  0.26&lt;br /&gt;
    EMUL_RFI:     3736        7      142        28230           7.5562        2.974  0.43&lt;br /&gt;
         DEC:     1109       49      263        61117          55.1100       15.174  0.93&lt;br /&gt;
      EXTINT:       36       52     1377        12085         335.6944      308.306  0.18&lt;br /&gt;
 TIMEINGUEST:    76355        0     3954      4081928          53.4599      415.345 61.91&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fhourstone ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 7483768&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:      818       47     9565       221609         270.9156      501.827  2.96&lt;br /&gt;
         DCR:      301       40      473        14408          47.8671       29.403  0.19&lt;br /&gt;
      SIGNAL:        1     2521     2521         2521        2521.0000        0.000  0.03&lt;br /&gt;
    ITLBREAL:      322        8       58         2665           8.2764        2.810  0.04&lt;br /&gt;
    ITLBVIRT:     5773       18     1360       120111          20.8056       18.569  1.60&lt;br /&gt;
    DTLBREAL:    16433        8       73       184196          11.2089        3.709  2.46&lt;br /&gt;
    DTLBVIRT:    19913       18     1845       500349          25.1268       23.006  6.69&lt;br /&gt;
     SYSCALL:       91        6        7          579           6.3626        0.481  0.01&lt;br /&gt;
         ISI:        5        6        8           33           6.6000        0.800  0.00&lt;br /&gt;
         DSI:        1        7        7            7           7.0000        0.000  0.00&lt;br /&gt;
    EMULINST:   127113        6      102       949687           7.4712        2.244 12.69&lt;br /&gt;
   EMUL_WAIT:       76     3526     7578       354928        4670.1053     1679.367  4.74&lt;br /&gt;
   EMUL_CORE:    16733        7      159       134306           8.0264        1.701  1.79&lt;br /&gt;
  EMUL_MTSPR:    71886        8      149       594618           8.2717        2.595  7.95&lt;br /&gt;
  EMUL_MFSPR:    83877        8       93       689016           8.2146        2.580  9.21&lt;br /&gt;
  EMUL_MTMSR:     3166        8       57        25438           8.0347        1.220  0.34&lt;br /&gt;
  EMUL_MFMSR:     7392        7       61        59415           8.0377        1.294  0.79&lt;br /&gt;
  EMUL_TLBSX:       19        9       11          192          10.1053        0.640  0.00&lt;br /&gt;
  EMUL_TLBWE:    47187        9     2757      1131527          23.9796       13.359 15.12&lt;br /&gt;
    EMUL_RFI:    21782        7      132       172428           7.9161        2.323  2.30&lt;br /&gt;
         DEC:      715       50      224        42155          58.9580       15.052  0.56&lt;br /&gt;
      EXTINT:        2      142      161          303         151.5000        9.500  0.00&lt;br /&gt;
 TIMEINGUEST:   423606        0      499      2283277           5.3901       25.629 30.51&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== find ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 3426052&lt;br /&gt;
         type    count      min      max          sum              avg       stddev     %&lt;br /&gt;
        MMIO:      222       49      413        48228         217.2432      141.096  1.41&lt;br /&gt;
         DCR:       91       43       93         4239          46.5824        5.285  0.12&lt;br /&gt;
      SIGNAL:        3      476     5651         7952        2650.6667     2191.871  0.23&lt;br /&gt;
    ITLBREAL:       77        8       13          665           8.6364        0.754  0.02&lt;br /&gt;
    ITLBVIRT:     1341       18      120        28340          21.1335        4.968  0.83&lt;br /&gt;
    DTLBREAL:       59        8       16          573           9.7119        2.042  0.02&lt;br /&gt;
    DTLBVIRT:     2253       19      214        48630          21.5846        7.083  1.42&lt;br /&gt;
     SYSCALL:     4590        6       57        29503           6.4277        2.114  0.86&lt;br /&gt;
         ISI:       11        6        8           72           6.5455        0.656  0.00&lt;br /&gt;
         DSI:        1        7        7            7           7.0000        0.000  0.00&lt;br /&gt;
    EMULINST:    71560        6       77       525976           7.3501        1.945 15.35&lt;br /&gt;
   EMUL_WAIT:      374      184     9384      1724701        4611.5000     1752.946 50.34&lt;br /&gt;
   EMUL_CORE:    32646        7      100       262449           8.0392        1.792  7.66&lt;br /&gt;
  EMUL_MTSPR:     6668        8       78        54829           8.2227        2.213  1.60&lt;br /&gt;
  EMUL_MFSPR:      538        8       61         4507           8.3773        3.181  0.13&lt;br /&gt;
  EMUL_MTMSR:     5829        8       58        47036           8.0693        1.765  1.37&lt;br /&gt;
  EMUL_MFMSR:    15805        7       92       127426           8.0624        1.774  3.72&lt;br /&gt;
  EMUL_TLBSX:       29        9       14          297          10.2414        0.857  0.01&lt;br /&gt;
  EMUL_TLBWE:      462        9       27         6717          14.5390        6.606  0.20&lt;br /&gt;
    EMUL_RFI:    10855        7       57        81776           7.5335        2.132  2.39&lt;br /&gt;
         DEC:      160       50      403         9244          57.7750       32.861  0.27&lt;br /&gt;
      EXTINT:        4      427     1410         2991         747.7500      387.275  0.09&lt;br /&gt;
 TIMEINGUEST:   153578        0      762       409894           2.6690        6.322 11.96&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paravirtualization improvement ==&lt;br /&gt;
&lt;br /&gt;
As mentioned above improvements to all these overhead statistics are already known. On one hand the hardware virtualization support specified in the Power ISA 2.06, on the other hand on older hardware paravirtualization can be an option. For KVMPPC we wrote a simple paravirtualization interface to test hypercalls and measure some benefits from such implementations.&lt;br /&gt;
In the concept measured here the hypervisor tells the guest that it supports special paravirtualization features if the guest (hyper)calls him passing a guest virtual and guest physical address and an amount of x (4096byte in the example) of ram big. This is a very basic, but also flexible interface as the hypervisor can now use this guest addressable memory to do all kind of things. In the example the hypervisor rewrites guest code to replace privileged instructions mfspr (SPRG1-3, ESR, DEAR) mtspr ((SPRG1-3, ESR, DEAR) and mfmsr. The hypervisor keeps the guest copies of these values updated in the memory area provided by the guest and rewrites the privileged instructions to simple non trapping load/store instructions. That save a lot of EMULINST exits while running the guest and has shown around 35-50% improvement for workloads with a high amount of EMULINST instructions (e.g. the boot workload)&lt;br /&gt;
&lt;br /&gt;
The net benefit of that improvement is high while the &amp;quot;guest invasiveness&amp;quot; is very low (The guest only has to donate a small amount of ram and virtual address space, all the other things can be done by the hypervisor transparently). And remember this is just one simple example of pv extensions, there are a lot other areas e.g. collaborative guest/host TLB management that can improve performance significantly (could be as easy as telling the guest to program more virtual TLB entries in the guest TLB to allow the host fix more misses directly).&lt;br /&gt;
&lt;br /&gt;
The following numbers show the improvement comparing the same workload with/without this paravirtualization feature. The workload used in this test is the boot workload, but using a more complex guest and Host environment (Ubuntu instead of ELDK) and it also uses an older version of our kernel and userspace code (also containing an older version of that exit timing and therefore not being directly comparable with the measurements above).&lt;br /&gt;
&lt;br /&gt;
=== No paravirtualization ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 144837890 =&amp;gt; ~2:24 runtime&lt;br /&gt;
                count  min    max       sum     avg   stddev      %&lt;br /&gt;
        MMIO    10105   46   1534   2952467  292.17  295.933   2.04&lt;br /&gt;
         DCR     5428   40    209    246168   45.35    6.758   0.17&lt;br /&gt;
      SIGNAL      695   65   3755     89767  129.16  314.421   0.06&lt;br /&gt;
    ITLBREAL    80045   13    108   1063127   13.28    2.338   0.73&lt;br /&gt;
    ITLBVIRT  1000585   21 264827  24300596   24.28  264.753  16.78&lt;br /&gt;
    DTLBREAL    91206   13     69   1285214   14.09    2.225   0.89&lt;br /&gt;
    DTLBVIRT   977434   21   1446  24007008   24.56    4.426  16.58&lt;br /&gt;
     SYSCALL    10460   11     55    116447   11.13    1.929   0.08&lt;br /&gt;
         ISI    11724   11     61    130007   11.08    1.929   0.09&lt;br /&gt;
         DSI    20737   11     57    230009   11.09    1.914   0.16&lt;br /&gt;
    EMULINST  5683356   11   3778  79339467   13.96   50.275  54.78&lt;br /&gt;
         DEC    13079   50    826    732712   56.02   22.382   0.51&lt;br /&gt;
      EXTINT       55   30   1478     10996  199.92  238.150   0.01&lt;br /&gt;
  FP_UNAVAIL      280   11     53      3163   11.29    3.495   0.00&lt;br /&gt;
 TIMEINGUEST  7905189    0   3688  10330742    1.30    8.970   7.13&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== paravirtualization ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sum of time 92206510 =&amp;gt; ~1:32 runtime (~37% net improvement)&lt;br /&gt;
                count  min    max       sum     avg   stddev      %&lt;br /&gt;
        MMIO    12505   46   3087   3693782  295.38  260.788   4.01&lt;br /&gt;
         DCR     5595   40    706    273578   48.89   31.305   0.30&lt;br /&gt;
      SIGNAL      654   65   4132    300027  458.75  571.130   0.33&lt;br /&gt;
    ITLBREAL    71711   13    104    943053   13.15    2.360   1.02&lt;br /&gt;
    ITLBVIRT   750649   21   1503  18178245   24.21    7.335  19.71&lt;br /&gt;
    DTLBREAL    83356   13    102   1146242   13.75    2.406   1.24&lt;br /&gt;
      DTLBPV    30086   20    237    653556   21.72    4.639   0.71&lt;br /&gt;
    DTLBVIRT   772811   21    713  19079477   24.68    6.593  20.69&lt;br /&gt;
     SYSCALL     7647   11     57     84821   11.09    1.897   0.09&lt;br /&gt;
       HCALL        1   19     19        19   19.00    0.000   0.00&lt;br /&gt;
         ISI     9895   11     73    109667   11.08    1.904   0.12&lt;br /&gt;
         DSI    17974   10     57    199504   11.09    2.046   0.22&lt;br /&gt;
    EMULINST  2567245   11   4212  40501314   15.77   65.673  43.92&lt;br /&gt;
         DEC     7488   51    641    426813   56.99   23.893   0.46&lt;br /&gt;
      EXTINT     2215   31   1677    297495  134.30  116.219   0.32&lt;br /&gt;
  FP_UNAVAIL      258   11     11      2838   11.00    0.000   0.00&lt;br /&gt;
 TIMEINGUEST  4340090    0   3850   6316079    1.45   12.599   6.85&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More Results ==&lt;br /&gt;
This should actually just be an overview and is already huge, some more results can be found in all kind of timing and improvement discussions on kvm-ppc@vger.kernel.org &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Category:PowerPC]]&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=PowerPC_Run&amp;diff=2658</id>
		<title>PowerPC Run</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=PowerPC_Run&amp;diff=2658"/>
		<updated>2009-10-30T16:54:13Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: replace moinmoin smileys&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Run ==&lt;br /&gt;
&lt;br /&gt;
Log in to target and run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./qemu-system-ppcemb --enable-kvm \&lt;br /&gt;
   -nographic \&lt;br /&gt;
   -m 128 \&lt;br /&gt;
   -M bamboo \&lt;br /&gt;
   -kernel uImage.bamboo \&lt;br /&gt;
   -L . \&lt;br /&gt;
   -append &amp;quot;your guest kernel command line&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The location specified with -L must contain the &amp;lt;code&amp;gt;bamboo.dtb&amp;lt;/code&amp;gt; device tree file.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&#039;&#039;&#039;Note:&#039;&#039;&#039; Consult the [http://bellard.org/qemu/qemu-doc.html QEMU documentation] for a more complete list and explanation of these options.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== virtio ==&lt;br /&gt;
In the case that virtio is activated in the guest kernel, you can add virtio devices at the qemu command line.&lt;br /&gt;
&lt;br /&gt;
Examples (nothing special for ppc):&lt;br /&gt;
&lt;br /&gt;
=== network ===&lt;br /&gt;
&lt;br /&gt;
This adds a virtio network device visible to the guest and the external network:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  ./qemu-system-ppcemb [...] -net nic,model=virtio -net tap &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&#039;&#039;&#039;Note:&#039;&#039;&#039; You must have CONFIG_VIRTIO_NET=y in your guest kernel .config.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&#039;&#039;&#039;Note:&#039;&#039;&#039; You must have Qemu networking configured to use a &amp;lt;code&amp;gt;tap&amp;lt;/code&amp;gt; device. See [[Networking]] for details.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== disk ===&lt;br /&gt;
&lt;br /&gt;
This adds a virtio disk device:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  ./qemu-system-ppcemb [...] -drive file=pathtoyourfile.img,if=virtio &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The device appears as &amp;lt;code&amp;gt;/dev/vda&amp;lt;/code&amp;gt; in the guest.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&#039;&#039;&#039;Note:&#039;&#039;&#039; You must have CONFIG_VIRTIO_BLK=y in your guest kernel .config.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Known Pitfalls ==&lt;br /&gt;
=== no guest console ===&lt;br /&gt;
Specifying a console in the guest kernel parameters might let the guest output fail. If you think your output is missing try without any &amp;quot;console=&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
=== virtio net requirements ===&lt;br /&gt;
You will need to enable tap and bridge support in the host kernel.&lt;br /&gt;
&lt;br /&gt;
You may also need to download and install bridge-utils (use &amp;lt;code&amp;gt;configure --host=i386-linux --target=ppc-linux&amp;lt;/code&amp;gt; and all other cross build stuff you need).&lt;br /&gt;
&lt;br /&gt;
Usually embedded boards use a nfs root device, this may conflict with the need to ifdown the device you want to bridge, but you might use the second ethernet device in that case.&lt;br /&gt;
You need to edit /etc/qemu-ifup to your needs here is an example that creates bridge br0 on demand and uses eth1 as external device on that bridge:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 bridge=br0&lt;br /&gt;
 netdev=eth1&lt;br /&gt;
 guestdev=$1&lt;br /&gt;
 &lt;br /&gt;
 if [ ! -c /dev/net/tun ]&lt;br /&gt;
 then&lt;br /&gt;
 	echo &amp;quot;network init failed - /dev/net/tun does not exist&amp;quot;&lt;br /&gt;
 	exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 echo &amp;quot;test for existing bridge $bridge&amp;quot;&lt;br /&gt;
 brctl showmacs $bridge&lt;br /&gt;
 &lt;br /&gt;
 if [ $? -eq 0 ]&lt;br /&gt;
 then&lt;br /&gt;
 	echo &amp;quot;ok - bridge $bridge already available&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 	echo &amp;quot;need to create bridge $bridge&amp;quot;&lt;br /&gt;
 	ifconfig $netdev down&lt;br /&gt;
 	brctl addbr $bridge&lt;br /&gt;
 	ifconfig $bridge up&lt;br /&gt;
 	ifconfig $netdev up&lt;br /&gt;
 	brctl addif $bridge $netdev&lt;br /&gt;
 	echo &amp;quot;created bridge $bridge&amp;quot;&lt;br /&gt;
 	brctl show&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 ifconfig $guestdev up&lt;br /&gt;
 brctl addif $bridge $guestdev&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Category:PowerPC]]&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=PowerPC_Host_Userspace&amp;diff=2545</id>
		<title>PowerPC Host Userspace</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=PowerPC_Host_Userspace&amp;diff=2545"/>
		<updated>2009-08-26T16:48:28Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: remove obsolete configure option&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What You Need ==&lt;br /&gt;
&lt;br /&gt;
# A copy of the [http://savannah.nongnu.org/git/?group=qemu qemu development source tree].&lt;br /&gt;
# A copy of the Linux kernel source tree. Note: &amp;lt;code&amp;gt;qemu.git&amp;lt;/code&amp;gt; will not build with Linux 2.6.28 or earlier.&lt;br /&gt;
# An installed copy of [http://git.jdl.com/gitweb/?p=dtc.git;a=summary libfdt], built for PowerPC.&lt;br /&gt;
&lt;br /&gt;
If you are cross-compiling from a non-PowerPC host, you also need:&lt;br /&gt;
&lt;br /&gt;
# A cross-compiler, such as one built by [http://kegel.com/crosstool crosstool].&lt;br /&gt;
# An installed copy of the [http://zlib.net/ zlib] library, built for PowerPC.&lt;br /&gt;
&lt;br /&gt;
=== Where to install the libraries ===&lt;br /&gt;
&lt;br /&gt;
Before building qemu, you install the &amp;lt;code&amp;gt;libfdt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;zlib&amp;lt;/code&amp;gt; libraries where your toolchain will find them. If you are not cross-compiling, skip this section (because your toolchain will find them in the usual /usr/lib).&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;cpp -v&amp;lt;/code&amp;gt; to find your toolchain&#039;s built-in prefix. For example, if your toolchain was created by [http://kegel.com/crosstool crosstool], cpp will say something like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % powerpc-440-linux-gnu-cpp -v&lt;br /&gt;
 ...&lt;br /&gt;
 #include &amp;quot;...&amp;quot; search starts here:&lt;br /&gt;
 #include &amp;lt;...&amp;gt; search starts here:&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/include&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/../../../../powerpc-440-linux-gnu/sys-include&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/../../../../powerpc-440-linux-gnu/include&lt;br /&gt;
 End of search list.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The prefix here is &amp;lt;code&amp;gt;/opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/powerpc-440-linux-gnu&amp;lt;/code&amp;gt;. (Basically pick the last &amp;quot;.../include&amp;quot; path and go up one directory.) Use that prefix to install &amp;lt;code&amp;gt;zlib&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libfdt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Building Qemu for PowerPC KVM ==&lt;br /&gt;
&lt;br /&gt;
Here is an example for the configure script at the top level of the kvm-userspace repository:&lt;br /&gt;
&lt;br /&gt;
If cross-compiling, run this first:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cross=powerpc-440-linux-gnu-&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./configure \&lt;br /&gt;
        --disable-sdl \&lt;br /&gt;
        --target-list=ppcemb-softmmu \&lt;br /&gt;
        --cross-prefix=&amp;quot;$cross&amp;quot; \&lt;br /&gt;
        --kerneldir=&amp;quot;/home/hollisb/source/kvmppc-dev.hg&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; will produce &amp;lt;code&amp;gt;qemu/ppcemb-softmmu/qemu-system-ppcemb&amp;lt;/code&amp;gt;. You must transfer that executable and &amp;lt;code&amp;gt;qemu/pc-bios/bamboo.dtb&amp;lt;/code&amp;gt; to the target.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Category:PowerPC]]&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=Documents&amp;diff=2373</id>
		<title>Documents</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=Documents&amp;diff=2373"/>
		<updated>2009-07-09T00:01:25Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: fix wiki markup (linkify Forum pages)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Documents =&lt;br /&gt;
                                                                         &lt;br /&gt;
== User/Admin documentation ==&lt;br /&gt;
* [[HOWTO]]&lt;br /&gt;
* [http://www.nongnu.org/qemu/qemu-doc.html QEMU user manual]&lt;br /&gt;
== Presentations ==&lt;br /&gt;
* Presentations on many aspects of KVM were made at [[KvmForum2007]] (Aug 2007).&lt;br /&gt;
* Presentations from the [[KvmForum2008]] (June 2008)&lt;br /&gt;
* Avi Kivity&#039;s presentation from the [http://ols.108.redhat.com/2007/Reprints/kivity-Reprint.pdf Ottawa Linux Symposium 2007] (Jun 2007).&lt;br /&gt;
* TPR patching [attachment:kvm-tpr-patching.odp overview] (Avi Kivity, Oct 2008)&lt;br /&gt;
* [http://markmc.fedorapeople.org/virtio-code-review/VirtioCodeReview.pdf Virtio code walkthrough], [http://markmc.fedorapeople.org/virtio-code-review/virtio-talk.txt notes], [http://blogs.gnome.org/markmc/2008/05/28/checksums-scatter-gather-io-and-segmentation-offload/ GSO background] (Mark McLoughlin, Oct 2008), and [http://portal.acm.org/citation.cfm?id=1400097.1400108 ACM pdf about virtio by Rusty Russell]&lt;br /&gt;
== White papers: ==&lt;br /&gt;
* Qumranet&#039;s [http://www.qumranet.com/files/white_papers/KVM_Whitepaper.pdf KVM Whitepaper]&lt;br /&gt;
== Magazine Articles ==&lt;br /&gt;
* [http://www.linux-magazine.com/issues/2008/86/kernel_tricks Linux Magazine]&lt;br /&gt;
* [http://www.linuxplanet.com/linuxplanet/reports/6490/4/ KVM for Embedded] at Linux Planet&lt;br /&gt;
== Benchmarks ==&lt;br /&gt;
* [http://www.phoronix.com/scan.php?page=article&amp;amp;item=ubuntu_virt_benchmarks&amp;amp;num=1 Phoronix - Ubuntu 8.04 KVM Benchmarks]&lt;br /&gt;
* [http://www.phoronix.com/scan.php?page=article&amp;amp;item=intel_corei7_virt&amp;amp;num=1 Phoronix - Intel Core i7 Virtualization Performance]&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [[small_look_inside|small look inside(kvm-54)]]&lt;br /&gt;
* [[buildup|qemu kvm buildup]]&lt;br /&gt;
* [[vl_runthrough|qemu-system-x86_64 startup (kvm-57)]]&lt;br /&gt;
* [[initialization|initialization (kvm-57)]]&lt;br /&gt;
* [[file_layout_in_kernel|file layout in kernel (~kvm-58)]]&lt;br /&gt;
== KVM Doxygen Documentation ==&lt;br /&gt;
* [http://kvmapi.ath.cx kvm doxygen documentation]&lt;br /&gt;
== Tools ==&lt;br /&gt;
* [[tools|Tools]]&lt;br /&gt;
== Supported cpus ==&lt;br /&gt;
* [[processor_support|cpus]]&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=PowerPC_Host_Userspace&amp;diff=2305</id>
		<title>PowerPC Host Userspace</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=PowerPC_Host_Userspace&amp;diff=2305"/>
		<updated>2009-05-13T21:03:56Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: link text with URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What You Need ==&lt;br /&gt;
&lt;br /&gt;
# A copy of the [http://savannah.nongnu.org/git/?group=qemu qemu development source tree].&lt;br /&gt;
# A copy of the Linux kernel source tree. Note: &amp;lt;code&amp;gt;qemu.git&amp;lt;/code&amp;gt; will not build with Linux 2.6.28 or earlier.&lt;br /&gt;
# An installed copy of [http://git.jdl.com/gitweb/?p=dtc.git;a=summary libfdt], built for PowerPC.&lt;br /&gt;
&lt;br /&gt;
If you are cross-compiling from a non-PowerPC host, you also need:&lt;br /&gt;
&lt;br /&gt;
# A cross-compiler, such as one built by [http://kegel.com/crosstool crosstool].&lt;br /&gt;
# An installed copy of the [http://zlib.net/ zlib] library, built for PowerPC.&lt;br /&gt;
&lt;br /&gt;
=== Where to install the libraries ===&lt;br /&gt;
&lt;br /&gt;
Before building qemu, you install the &amp;lt;code&amp;gt;libfdt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;zlib&amp;lt;/code&amp;gt; libraries where your toolchain will find them. If you are not cross-compiling, skip this section (because your toolchain will find them in the usual /usr/lib).&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;cpp -v&amp;lt;/code&amp;gt; to find your toolchain&#039;s built-in prefix. For example, if your toolchain was created by [http://kegel.com/crosstool crosstool], cpp will say something like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % powerpc-440-linux-gnu-cpp -v&lt;br /&gt;
 ...&lt;br /&gt;
 #include &amp;quot;...&amp;quot; search starts here:&lt;br /&gt;
 #include &amp;lt;...&amp;gt; search starts here:&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/include&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/../../../../powerpc-440-linux-gnu/sys-include&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/../../../../powerpc-440-linux-gnu/include&lt;br /&gt;
 End of search list.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The prefix here is &amp;lt;code&amp;gt;/opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/powerpc-440-linux-gnu&amp;lt;/code&amp;gt;. (Basically pick the last &amp;quot;.../include&amp;quot; path and go up one directory.) Use that prefix to install &amp;lt;code&amp;gt;zlib&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libfdt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Building Qemu for PowerPC KVM ==&lt;br /&gt;
&lt;br /&gt;
Here is an example for the configure script at the top level of the kvm-userspace repository:&lt;br /&gt;
&lt;br /&gt;
If cross-compiling, run this first:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cross=powerpc-440-linux-gnu-&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./configure \&lt;br /&gt;
        --disable-sdl \&lt;br /&gt;
        --disable-gfx-check \&lt;br /&gt;
        --target-list=ppcemb-softmmu \&lt;br /&gt;
        --cross-prefix=&amp;quot;$cross&amp;quot; \&lt;br /&gt;
        --kerneldir=&amp;quot;/home/hollisb/source/kvmppc-dev.hg&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; will produce &amp;lt;code&amp;gt;qemu/ppcemb-softmmu/qemu-system-ppcemb&amp;lt;/code&amp;gt;. You must transfer that executable and &amp;lt;code&amp;gt;qemu/pc-bios/bamboo.dtb&amp;lt;/code&amp;gt; to the target.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Category:PowerPC]]&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=PowerPC_Host_Userspace&amp;diff=2304</id>
		<title>PowerPC Host Userspace</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=PowerPC_Host_Userspace&amp;diff=2304"/>
		<updated>2009-05-13T20:55:38Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: update qemu.git URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What You Need ==&lt;br /&gt;
&lt;br /&gt;
# A copy of the qemu development source tree (http://savannah.nongnu.org/git/?group=qemu).&lt;br /&gt;
# A copy of the Linux kernel source tree. Note: &amp;lt;code&amp;gt;qemu.git&amp;lt;/code&amp;gt; will not build with Linux 2.6.28 or earlier.&lt;br /&gt;
# An installed copy of [http://git.jdl.com/gitweb/?p=dtc.git;a=summary libfdt], built for PowerPC.&lt;br /&gt;
&lt;br /&gt;
If you are cross-compiling from a non-PowerPC host, you also need:&lt;br /&gt;
&lt;br /&gt;
# A cross-compiler, such as one built by [http://kegel.com/crosstool crosstool].&lt;br /&gt;
# An installed copy of the [http://zlib.net/ zlib] library, built for PowerPC.&lt;br /&gt;
&lt;br /&gt;
=== Where to install the libraries ===&lt;br /&gt;
&lt;br /&gt;
Before building qemu, you install the &amp;lt;code&amp;gt;libfdt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;zlib&amp;lt;/code&amp;gt; libraries where your toolchain will find them. If you are not cross-compiling, skip this section (because your toolchain will find them in the usual /usr/lib).&lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;code&amp;gt;cpp -v&amp;lt;/code&amp;gt; to find your toolchain&#039;s built-in prefix. For example, if your toolchain was created by [http://kegel.com/crosstool crosstool], cpp will say something like this:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 % powerpc-440-linux-gnu-cpp -v&lt;br /&gt;
 ...&lt;br /&gt;
 #include &amp;quot;...&amp;quot; search starts here:&lt;br /&gt;
 #include &amp;lt;...&amp;gt; search starts here:&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/include&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/../../../../powerpc-440-linux-gnu/sys-include&lt;br /&gt;
 /opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/lib/gcc/powerpc-440-linux-gnu/3.4.5/../../../../powerpc-440-linux-gnu/include&lt;br /&gt;
 End of search list.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The prefix here is &amp;lt;code&amp;gt;/opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-440-linux-gnu/powerpc-440-linux-gnu&amp;lt;/code&amp;gt;. (Basically pick the last &amp;quot;.../include&amp;quot; path and go up one directory.) Use that prefix to install &amp;lt;code&amp;gt;zlib&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;libfdt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Building Qemu for PowerPC KVM ==&lt;br /&gt;
&lt;br /&gt;
Here is an example for the configure script at the top level of the kvm-userspace repository:&lt;br /&gt;
&lt;br /&gt;
If cross-compiling, run this first:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 cross=powerpc-440-linux-gnu-&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ./configure \&lt;br /&gt;
        --disable-sdl \&lt;br /&gt;
        --disable-gfx-check \&lt;br /&gt;
        --target-list=ppcemb-softmmu \&lt;br /&gt;
        --cross-prefix=&amp;quot;$cross&amp;quot; \&lt;br /&gt;
        --kerneldir=&amp;quot;/home/hollisb/source/kvmppc-dev.hg&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Build ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; will produce &amp;lt;code&amp;gt;qemu/ppcemb-softmmu/qemu-system-ppcemb&amp;lt;/code&amp;gt;. You must transfer that executable and &amp;lt;code&amp;gt;qemu/pc-bios/bamboo.dtb&amp;lt;/code&amp;gt; to the target.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Category:PowerPC]]&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=Virtio&amp;diff=1738</id>
		<title>Virtio</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=Virtio&amp;diff=1738"/>
		<updated>2008-03-24T17:14:40Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Paravirtualized drivers for kvm/Linux =&lt;br /&gt;
* Virtio was chosen to be the main platform for IO virtualization in KVM&lt;br /&gt;
* The idea behind it is to have a common framework for hypervisors for IO virtualization&lt;br /&gt;
* More information (although not uptodate) can be found in kvm [http://kvm.qumranet.com/kvmwiki/KvmForum2007?action=[[AttachFile]]&amp;amp;do=get&amp;amp;target=kvm_pv_drv.pdf pv driver] &lt;br /&gt;
* At the moment network/block/balloon devices are suported for kvm&lt;br /&gt;
* The host implementation is in userspace - qemu, so no driver is needed in the host.&lt;br /&gt;
&lt;br /&gt;
= How to use Virtio =&lt;br /&gt;
* Get kvm version &amp;gt;= 60&lt;br /&gt;
* Get Linux kernel with virtio drivers for the guest&lt;br /&gt;
** Get Kernel &amp;gt;= 2.6.25 and activate (modules should also work, but take care of initramdisk)&lt;br /&gt;
*** CONFIG_VIRTIO_PCI=y (Virtualization -&amp;gt; PCI driver for virtio devices)&lt;br /&gt;
*** CONFIG_VIRTIO_BALLOON=y (Virtualization -&amp;gt; Virtio balloon driver)&lt;br /&gt;
*** CONFIG_VIRTIO_BLK=y (Device Drivers -&amp;gt; Block -&amp;gt;  Virtio block driver)&lt;br /&gt;
*** CONFIG_VIRTIO_NET=y  (Device Drivers -&amp;gt; Network device support -&amp;gt; Virtio network driver)&lt;br /&gt;
*** CONFIG_VIRTIO=y  (automatically selected)&lt;br /&gt;
*** CONFIG_VIRTIO_RING=y (automatically selected)&lt;br /&gt;
*** CONFIG_HIGH_RES_TIMERS=y (Processor type and features -&amp;gt; High Resolution Timer Support **optional**)&lt;br /&gt;
*** you can safely disable SATA/SCSI and also all other nic drivers if you only use VIRTIO (disk/nic)&lt;br /&gt;
* Either build it around Rusty&#039;s tree [http://ozlabs.org/~rusty/kernel/hg/ repo]&lt;br /&gt;
** Or git clone git://kvm.qumranet.com/home/dor/src/linux-2.6-nv use branch rusty&lt;br /&gt;
** Soon an official repository will be released&lt;br /&gt;
** As an alternative one can use a standard guest kernel for the guest &amp;gt; 2.6.18 and make use sync backward compatibility option&lt;br /&gt;
** Backport and instructions can be found in Anthony Liguori&#039;s [http://codemonkey.ws/virtio-ext-modules virtio-ext-modules]&lt;br /&gt;
** At the moment it&#039;s broken since the guest got developed, soon update&lt;br /&gt;
* Use model=virtio for the network devices and if=virtio for disk&lt;br /&gt;
** Example&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
qemu/x86_64-softmmu/qemu-system-x86_64 -boot c -drive file=/images/xpbase.qcow2,if=virtio,boot=on -m 384 -net nic,model=virtio -net tap,script=/etc/kvm/qemu-ifup&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* -hd[ab] for disk won&#039;t work, use -drive&lt;br /&gt;
* Disk will show up as /dev/vd[a-z][1-9], if you migrate you need to change &amp;quot;root=&amp;quot; in Lilo/GRUB config&lt;br /&gt;
* At the moment the kernel modules are automatically loaded in the guest but the interface should be started manually (dhclient/ifconfig)&lt;br /&gt;
* Currently performance is much better when using a host kernel configured with CONFIG_HIGH_RES_TIMERS. Another option is use HPET/RTC and -clock= qemu option.&lt;br /&gt;
* Expected performance&lt;br /&gt;
** Performance varies from host to host, kernel to kernel&lt;br /&gt;
** On my laptop I measured 1.1Gbps rx throughput using 2.6.23, 850Mbps tx.&lt;br /&gt;
** Ping latency is 300-500 usec&lt;br /&gt;
* Enjoy, more to come :)&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
	<entry>
		<id>https://linux-kvm.org/index.php?title=KVM_Forum_2007&amp;diff=1769</id>
		<title>KVM Forum 2007</title>
		<link rel="alternate" type="text/html" href="https://linux-kvm.org/index.php?title=KVM_Forum_2007&amp;diff=1769"/>
		<updated>2007-09-12T16:30:43Z</updated>

		<summary type="html">&lt;p&gt;HollisBlanchard: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.qumranet.com/images/kvm_logo.gif]&lt;br /&gt;
&lt;br /&gt;
= Information on the recently-concluded KVM Forum 2007 =&lt;br /&gt;
== Agenda ==&lt;br /&gt;
==== Wednesday August 29th ====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
| &amp;lt;b&amp;gt;Time&amp;lt;/b&amp;gt; &lt;br /&gt;
| &amp;lt;b&amp;gt;Session Topic&amp;lt;/b&amp;gt; &lt;br /&gt;
| &amp;lt;b&amp;gt;Speaker&amp;lt;/b&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 8:45 AM - 9:40 AM &lt;br /&gt;
| [attachment:kf2007-keynote.pdf KVM, One Year On] &lt;br /&gt;
| Avi Kivity, Qumranet &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 9:40 AM - 10:30 AM &lt;br /&gt;
| The future of virtualization - KVM &lt;br /&gt;
| Sunil Saxena, Intel &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 10:45 AM - 11:50 AM &lt;br /&gt;
| KVM Security &lt;br /&gt;
| Hadi Nahari, Montavista &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 1:35 PM - 2:30 PM &lt;br /&gt;
| KVM &amp;amp; S390 &lt;br /&gt;
| Carsten Otte, IBM &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 2:30 PM - 3:30 PM &lt;br /&gt;
| KVM Lite, No Hardware Support, Fewer Calories &lt;br /&gt;
| Rusty Russell, IBM &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 4:00 PM - 5:00 PM &lt;br /&gt;
| VT Roadmap, Hybrid Virtualization, Power Management, Fat vs Thin Hypervisor &lt;br /&gt;
| Jun Nakajima, Intel &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
==== Thursday August 30th ====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
| &amp;lt;b&amp;gt;Time&amp;lt;/b&amp;gt; &lt;br /&gt;
| &amp;lt;b&amp;gt;Session Topic&amp;lt;/b&amp;gt; &lt;br /&gt;
| &amp;lt;b&amp;gt;Speaker&amp;lt;/b&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 9:00 AM - 9:50 AM &lt;br /&gt;
| [attachment:kvm_pv_drv.pdf KVM Para-Virtualized Guest Drivers] &lt;br /&gt;
| Dor Laor, Qumranet &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 9:50 AM - 10:50 AM &lt;br /&gt;
| [attachment:AMD_Extended_Migration-KVMForum-ElsieWahlig.pdf KVM Support for the AMD DEV] &lt;br /&gt;
| Elsie Wahlig, AMD &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 9:50 AM - 10:50 AM &lt;br /&gt;
| [attachment:kvm_iommu_talk.pdf A KVM friendly IOMMU API for Linux] &lt;br /&gt;
| Joerg Roedel, AMD &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 10:50 AM - 11:45 AM &lt;br /&gt;
| [attachment:KVMForum07_Liguori.pdf Automating VM Installation Testing] &lt;br /&gt;
| Anthony Liguori, IBM &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 1:35 PM - 2:30 PM &lt;br /&gt;
| [attachment:CIM4KVM.pdf Standards Based Systems Management Solution for KVM] &lt;br /&gt;
| Anthony Liguori, IBM &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 2:35 PM - 3:30 PM &lt;br /&gt;
| [attachment:KVM-tuning-testing-SMP2.pdf KVM Performance, SMP and in kernel PIC/APIC, KVM Validation] &lt;br /&gt;
| Eddie Dong, Yungen Zhao, Xin Lin, Intel &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 4:00 PM - 5:35 PM &lt;br /&gt;
| Open Session Panel &lt;br /&gt;
| Avi Kivity, Qumranet &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
==== Friday August 31st ====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
| &amp;lt;b&amp;gt;Time&amp;lt;/b&amp;gt; &lt;br /&gt;
| &amp;lt;b&amp;gt;Session Topic&amp;lt;/b&amp;gt; &lt;br /&gt;
| &amp;lt;b&amp;gt;Speaker&amp;lt;/b&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 9:00 AM - 9:45 AM &lt;br /&gt;
| [attachment:Kvm_Live_Migration_Forum_2007.pdf KVM Live Migration] &lt;br /&gt;
| Anthony Liguori, IBM &amp;amp; Uri Lubin, Qumranet &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 9:50 AM - 10:35 AM &lt;br /&gt;
| [attachment:shadowy-depths-of-the-kvm-mmu.pdf The Shadowy Depths of the KVM MMU] &lt;br /&gt;
| Avi Kivity, Qumranet &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 10:50 AM - 11:45 AM &lt;br /&gt;
| [attachment:KVM-IA64_forum_083107.pdf KVM for IPF (ia64)] &lt;br /&gt;
| Anthony Xu, Intel &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 11:50 AM -12:45 PM &lt;br /&gt;
| [attachment:KVM_Forum_-_Embedded_PowerPC.pdf Implementing KVM for Embedded PowerPC] &lt;br /&gt;
| Hollis Blanchard, IBM &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 12:45 PM - 1.30 PM &lt;br /&gt;
| [attachment:KVM_Forum_Concluding_Keynote.pdf Concluding Keynote] &lt;br /&gt;
| Benny Schnaider, Qumranet &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
== Presentations ==&lt;br /&gt;
== Blogs ==&lt;br /&gt;
== Pictures ==&lt;br /&gt;
* (from [[AmitShah]]) Pictures from the Pima Air and Space Museum and the Loews Ventana Canyon Resort: http://travel.webshots.com/album/560535651amWFjh&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>HollisBlanchard</name></author>
	</entry>
</feed>