* Re: I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice?
2013-05-24 9:55 ` Ian Campbell
@ 2013-05-24 15:06 ` Santosh Jodh
2013-05-29 15:55 ` Dario Faggioli
1 sibling, 0 replies; 7+ messages in thread
From: Santosh Jodh @ 2013-05-24 15:06 UTC (permalink / raw)
To: Ian Campbell, Pankaj Biswas
Cc: Konrad Rzeszutek Wilk, xen-devel@lists.xen.org
[-- Attachment #1: Type: text/plain, Size: 1646 bytes --]
Hey Pankaj,
I wrote a script sometime back that uses ACPI tables to determine IO proximity for PCI devices using _PXM and SRAT tables. I am attaching the scripts.
It expect acpidump, acpixtract and iasl on the system. This was written to run in a XenServer dom0 which does not have iasl - it expects iasl binary in the script directory. If you have iasl in the path, you can tweak run.sh to modify path for iasl.
Let me know if this provides useful information and any comments/feedback or if you have trouble running it.
Regards,
Santosh
-----Original Message-----
From: xen-devel-bounces@lists.xen.org [mailto:xen-devel-bounces@lists.xen.org] On Behalf Of Ian Campbell
Sent: Friday, May 24, 2013 2:56 AM
To: Pankaj Biswas
Cc: xen-devel@lists.xen.org; Konrad Rzeszutek Wilk
Subject: Re: [Xen-devel] I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice?
On Fri, 2013-05-24 at 15:21 +0530, Pankaj Biswas wrote:
Please don't top-post and please don't post HTML emails to the list, plain text only please.
> A good first task might be to write a "Xen driver" which can work out
> it is on Xen and use the topology hypercalls to gain the same
> information.
You can use libxenctrl to make the Xen topology hypercalls. You do not need a special driver.
> So trying and geting hwloc working under Xen will solve this purpose.
> Can you please guide me here?
I have no idea what hwloc requires.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
[-- Attachment #2: numa_info.py --]
[-- Type: application/octet-stream, Size: 37950 bytes --]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<link rel="icon" href="/carbon/trunk/support.hg/static/hgicon.png" type="image/png" />
<meta name="robots" content="index, nofollow" />
<link rel="stylesheet" href="/carbon/trunk/support.hg/static/style-paper.css" type="text/css" />
<script type="text/javascript" src="/carbon/trunk/support.hg/static/mercurial.js"></script>
<title>/carbon/trunk/support: a66685b5d147 numa/src/numa_info.py</title>
</head>
<body>
<div class="container">
<div class="menu">
<div class="logo">
<a href="http://mercurial.selenic.com/">
<img src="/carbon/trunk/support.hg/static/hglogo.png" alt="mercurial" /></a>
</div>
<ul>
<li><a href="/carbon/trunk/support.hg/shortlog/a66685b5d147">log</a></li>
<li><a href="/carbon/trunk/support.hg/graph/a66685b5d147">graph</a></li>
<li><a href="/carbon/trunk/support.hg/tags">tags</a></li>
<li><a href="/carbon/trunk/support.hg/branches">branches</a></li>
</ul>
<ul>
<li><a href="/carbon/trunk/support.hg/rev/a66685b5d147">changeset</a></li>
<li><a href="/carbon/trunk/support.hg/file/a66685b5d147/numa/src/">browse</a></li>
</ul>
<ul>
<li class="active">file</li>
<li><a href="/carbon/trunk/support.hg/file/tip/numa/src/numa_info.py">latest</a></li>
<li><a href="/carbon/trunk/support.hg/diff/a66685b5d147/numa/src/numa_info.py">diff</a></li>
<li><a href="/carbon/trunk/support.hg/annotate/a66685b5d147/numa/src/numa_info.py">annotate</a></li>
<li><a href="/carbon/trunk/support.hg/log/a66685b5d147/numa/src/numa_info.py">file log</a></li>
<li><a href="/carbon/trunk/support.hg/raw-file/a66685b5d147/numa/src/numa_info.py">raw</a></li>
</ul>
<ul>
<li><a href="/carbon/trunk/support.hg/help">help</a></li>
</ul>
</div>
<div class="main">
<h2><a href="/carbon/trunk/support.hg/">/carbon/trunk/support</a></h2>
<h3>view numa/src/numa_info.py @ 355:a66685b5d147</h3>
<form class="search" action="/carbon/trunk/support.hg/log">
<p><input name="rev" id="search1" type="text" size="30" /></p>
<div id="hint">find changesets by author, revision,
files, or words in the commit message</div>
</form>
<div class="description">Add README for NUMA tool.</div>
<table id="changesetEntry">
<tr>
<th class="author">author</th>
<td class="author">Santosh Jodh <santosh.jodh@citrix.com></td>
</tr>
<tr>
<th class="date">date</th>
<td class="date age">Thu, 02 May 2013 19:35:00 -0700</td>
</tr>
<tr>
<th class="author">parents</th>
<td class="author"></td>
</tr>
<tr>
<th class="author">children</th>
<td class="author"></td>
</tr>
</table>
<div class="overflow">
<div class="sourcefirst"> line source</div>
<div class="parity0 source"><a href="#l1" id="l1"> 1</a> #!/usr/bin/python
</div>
<div class="parity1 source"><a href="#l2" id="l2"> 2</a>
</div>
<div class="parity0 source"><a href="#l3" id="l3"> 3</a> import sys
</div>
<div class="parity1 source"><a href="#l4" id="l4"> 4</a> import os
</div>
<div class="parity0 source"><a href="#l5" id="l5"> 5</a> import re
</div>
<div class="parity1 source"><a href="#l6" id="l6"> 6</a>
</div>
<div class="parity0 source"><a href="#l7" id="l7"> 7</a> HEX='0-9a-fA-F'
</div>
<div class="parity1 source"><a href="#l8" id="l8"> 8</a>
</div>
<div class="parity0 source"><a href="#l9" id="l9"> 9</a> PCI_PATH_PATTERN=r"^[%s]{2}:[%s]{2}.[0-9]{1}" % (HEX,HEX)
</div>
<div class="parity1 source"><a href="#l10" id="l10"> 10</a> PCI_BUS_PATTERN=r"^[%s]{2}:" % (HEX)
</div>
<div class="parity0 source"><a href="#l11" id="l11"> 11</a>
</div>
<div class="parity1 source"><a href="#l12" id="l12"> 12</a> PCI_PATH_REGEX=re.compile(PCI_PATH_PATTERN)
</div>
<div class="parity0 source"><a href="#l13" id="l13"> 13</a> PCI_BUS_REGEX=re.compile(PCI_BUS_PATTERN)
</div>
<div class="parity1 source"><a href="#l14" id="l14"> 14</a>
</div>
<div class="parity0 source"><a href="#l15" id="l15"> 15</a> class DEVICE_NODE:
</div>
<div class="parity1 source"><a href="#l16" id="l16"> 16</a> """A base class for a device node in a tree"""
</div>
<div class="parity0 source"><a href="#l17" id="l17"> 17</a> def __init__(self, name):
</div>
<div class="parity1 source"><a href="#l18" id="l18"> 18</a> self.name=name
</div>
<div class="parity0 source"><a href="#l19" id="l19"> 19</a> self.parent=None # Parent device
</div>
<div class="parity1 source"><a href="#l20" id="l20"> 20</a> self.children=[] # List of child devices
</div>
<div class="parity0 source"><a href="#l21" id="l21"> 21</a> def add_child(self, child):
</div>
<div class="parity1 source"><a href="#l22" id="l22"> 22</a> self.children.append(child)
</div>
<div class="parity0 source"><a href="#l23" id="l23"> 23</a> child.parent=self
</div>
<div class="parity1 source"><a href="#l24" id="l24"> 24</a> def dump(self, indent):
</div>
<div class="parity0 source"><a href="#l25" id="l25"> 25</a> self.dump_one(indent)
</div>
<div class="parity1 source"><a href="#l26" id="l26"> 26</a> for child in self.children:
</div>
<div class="parity0 source"><a href="#l27" id="l27"> 27</a> child.dump(indent+2)
</div>
<div class="parity1 source"><a href="#l28" id="l28"> 28</a>
</div>
<div class="parity0 source"><a href="#l29" id="l29"> 29</a> class PCI_DEVICE(DEVICE_NODE):
</div>
<div class="parity1 source"><a href="#l30" id="l30"> 30</a> """Class to represent a PCI device (including PCIe ports) in the system"""
</div>
<div class="parity0 source"><a href="#l31" id="l31"> 31</a> def __init__(self, name):
</div>
<div class="parity1 source"><a href="#l32" id="l32"> 32</a> DEVICE_NODE.__init__(self, name) # domain:bus:device.function
</div>
<div class="parity0 source"><a href="#l33" id="l33"> 33</a> self.secondary=None # seconday bus if PCIe port
</div>
<div class="parity1 source"><a href="#l34" id="l34"> 34</a> self.firmware_node_path=None # ACPI path if any
</div>
<div class="parity0 source"><a href="#l35" id="l35"> 35</a> def set_secondary(self, secondary):
</div>
<div class="parity1 source"><a href="#l36" id="l36"> 36</a> self.secondary=secondary
</div>
<div class="parity0 source"><a href="#l37" id="l37"> 37</a> def set_firmware_node_path(self, firmware_node_path):
</div>
<div class="parity1 source"><a href="#l38" id="l38"> 38</a> self.firmware_node_path=firmware_node_path
</div>
<div class="parity0 source"><a href="#l39" id="l39"> 39</a> def get_bus(self):
</div>
<div class="parity1 source"><a href="#l40" id="l40"> 40</a> return self.name[0:2]
</div>
<div class="parity0 source"><a href="#l41" id="l41"> 41</a> def get_firmware_node_path(self):
</div>
<div class="parity1 source"><a href="#l42" id="l42"> 42</a> if not self.firmware_node_path is None:
</div>
<div class="parity0 source"><a href="#l43" id="l43"> 43</a> return self.firmware_node_path
</div>
<div class="parity1 source"><a href="#l44" id="l44"> 44</a> if not self.parent is None:
</div>
<div class="parity0 source"><a href="#l45" id="l45"> 45</a> return self.parent.get_firmware_node_path()
</div>
<div class="parity1 source"><a href="#l46" id="l46"> 46</a> return None
</div>
<div class="parity0 source"><a href="#l47" id="l47"> 47</a> def is_proximity(self, acpi_tree, proximity):
</div>
<div class="parity1 source"><a href="#l48" id="l48"> 48</a> fnp=self.get_firmware_node_path()
</div>
<div class="parity0 source"><a href="#l49" id="l49"> 49</a> if not fnp is None:
</div>
<div class="parity1 source"><a href="#l50" id="l50"> 50</a> if proximity == get_acpi_proximity_by_path(acpi_tree, fnp):
</div>
<div class="parity0 source"><a href="#l51" id="l51"> 51</a> return 1
</div>
<div class="parity1 source"><a href="#l52" id="l52"> 52</a> return 0
</div>
<div class="parity0 source"><a href="#l53" id="l53"> 53</a> def get_devices_with_proximity(self, acpi_tree, proximity, devices):
</div>
<div class="parity1 source"><a href="#l54" id="l54"> 54</a> if self.is_proximity(acpi_tree, proximity):
</div>
<div class="parity0 source"><a href="#l55" id="l55"> 55</a> devices.append(self)
</div>
<div class="parity1 source"><a href="#l56" id="l56"> 56</a> for device in self.children:
</div>
<div class="parity0 source"><a href="#l57" id="l57"> 57</a> device.get_devices_with_proximity(acpi_tree, proximity, devices)
</div>
<div class="parity1 source"><a href="#l58" id="l58"> 58</a> def dump_with(self, tag):
</div>
<div class="parity0 source"><a href="#l59" id="l59"> 59</a> if not self.secondary is None:
</div>
<div class="parity1 source"><a href="#l60" id="l60"> 60</a> print "%s: %s" % (tag, self.secondary)
</div>
<div class="parity0 source"><a href="#l61" id="l61"> 61</a> def dump_one(self, indent):
</div>
<div class="parity1 source"><a href="#l62" id="l62"> 62</a> s=self.name
</div>
<div class="parity0 source"><a href="#l63" id="l63"> 63</a> if not self.secondary is None:
</div>
<div class="parity1 source"><a href="#l64" id="l64"> 64</a> s+="(bus="+str(self.secondary)+")"
</div>
<div class="parity0 source"><a href="#l65" id="l65"> 65</a> print " " * indent + s
</div>
<div class="parity1 source"><a href="#l66" id="l66"> 66</a>
</div>
<div class="parity0 source"><a href="#l67" id="l67"> 67</a> class ACPI_SCOPE:
</div>
<div class="parity1 source"><a href="#l68" id="l68"> 68</a> def __init__(self, name):
</div>
<div class="parity0 source"><a href="#l69" id="l69"> 69</a> self.name=name
</div>
<div class="parity1 source"><a href="#l70" id="l70"> 70</a> self.level=0
</div>
<div class="parity0 source"><a href="#l71" id="l71"> 71</a> def enter(self):
</div>
<div class="parity1 source"><a href="#l72" id="l72"> 72</a> self.level=self.level+1
</div>
<div class="parity0 source"><a href="#l73" id="l73"> 73</a> return self.level
</div>
<div class="parity1 source"><a href="#l74" id="l74"> 74</a> def leave(self):
</div>
<div class="parity0 source"><a href="#l75" id="l75"> 75</a> self.level=self.level-1
</div>
<div class="parity1 source"><a href="#l76" id="l76"> 76</a> return self.level
</div>
<div class="parity0 source"><a href="#l77" id="l77"> 77</a>
</div>
<div class="parity1 source"><a href="#l78" id="l78"> 78</a> class ACPI_DEVICE(DEVICE_NODE):
</div>
<div class="parity0 source"><a href="#l79" id="l79"> 79</a> """ACPI device/scope/processor in DSDT ASL"""
</div>
<div class="parity1 source"><a href="#l80" id="l80"> 80</a> def __init__(self, name):
</div>
<div class="parity0 source"><a href="#l81" id="l81"> 81</a> n=name
</div>
<div class="parity1 source"><a href="#l82" id="l82"> 82</a> for i in range(len(name),4):
</div>
<div class="parity0 source"><a href="#l83" id="l83"> 83</a> n+="_"
</div>
<div class="parity1 source"><a href="#l84" id="l84"> 84</a> DEVICE_NODE.__init__(self, n)
</div>
<div class="parity0 source"><a href="#l85" id="l85"> 85</a> self.proximity=None
</div>
<div class="parity1 source"><a href="#l86" id="l86"> 86</a> def is_matching(self, name):
</div>
<div class="parity0 source"><a href="#l87" id="l87"> 87</a> if name.rstrip('_').lstrip('_') == self.name.rstrip('_').lstrip('_'):
</div>
<div class="parity1 source"><a href="#l88" id="l88"> 88</a> return 1
</div>
<div class="parity0 source"><a href="#l89" id="l89"> 89</a> return 0
</div>
<div class="parity1 source"><a href="#l90" id="l90"> 90</a> def set_proximity(self, proximity):
</div>
<div class="parity0 source"><a href="#l91" id="l91"> 91</a> self.proximity=proximity
</div>
<div class="parity1 source"><a href="#l92" id="l92"> 92</a> def get_proximity(self):
</div>
<div class="parity0 source"><a href="#l93" id="l93"> 93</a> if not self.proximity is None:
</div>
<div class="parity1 source"><a href="#l94" id="l94"> 94</a> return self.proximity
</div>
<div class="parity0 source"><a href="#l95" id="l95"> 95</a> if not self.parent is None:
</div>
<div class="parity1 source"><a href="#l96" id="l96"> 96</a> return self.parent.get_proximity()
</div>
<div class="parity0 source"><a href="#l97" id="l97"> 97</a> return None
</div>
<div class="parity1 source"><a href="#l98" id="l98"> 98</a> def get_child(self, name):
</div>
<div class="parity0 source"><a href="#l99" id="l99"> 99</a> for child in self.children:
</div>
<div class="parity1 source"><a href="#l100" id="l100"> 100</a> if child.is_matching(name):
</div>
<div class="parity0 source"><a href="#l101" id="l101"> 101</a> return child
</div>
<div class="parity1 source"><a href="#l102" id="l102"> 102</a> child=ACPI_DEVICE(name)
</div>
<div class="parity0 source"><a href="#l103" id="l103"> 103</a> self.add_child(child)
</div>
<div class="parity1 source"><a href="#l104" id="l104"> 104</a> return child
</div>
<div class="parity0 source"><a href="#l105" id="l105"> 105</a> def dump_one(self, indent):
</div>
<div class="parity1 source"><a href="#l106" id="l106"> 106</a> s=self.name
</div>
<div class="parity0 source"><a href="#l107" id="l107"> 107</a> if not self.proximity is None:
</div>
<div class="parity1 source"><a href="#l108" id="l108"> 108</a> s+="(_PXM=" + str(self.proximity) + ")"
</div>
<div class="parity0 source"><a href="#l109" id="l109"> 109</a> print " " * indent+s
</div>
<div class="parity1 source"><a href="#l110" id="l110"> 110</a>
</div>
<div class="parity0 source"><a href="#l111" id="l111"> 111</a> class PROCESSOR_AFFINITY:
</div>
<div class="parity1 source"><a href="#l112" id="l112"> 112</a> def __init__(self):
</div>
<div class="parity0 source"><a href="#l113" id="l113"> 113</a> self.apics=[]
</div>
<div class="parity1 source"><a href="#l114" id="l114"> 114</a> def add_apic(self, apic):
</div>
<div class="parity0 source"><a href="#l115" id="l115"> 115</a> self.apics.append(apic)
</div>
<div class="parity1 source"><a href="#l116" id="l116"> 116</a> def dump(self):
</div>
<div class="parity0 source"><a href="#l117" id="l117"> 117</a> print " APIC: %s" % ', '.join(map(str, self.apics))
</div>
<div class="parity1 source"><a href="#l118" id="l118"> 118</a>
</div>
<div class="parity0 source"><a href="#l119" id="l119"> 119</a> class MEMORY_AFFINITY:
</div>
<div class="parity1 source"><a href="#l120" id="l120"> 120</a> def __init__(self):
</div>
<div class="parity0 source"><a href="#l121" id="l121"> 121</a> self.ranges=[]
</div>
<div class="parity1 source"><a href="#l122" id="l122"> 122</a> def add_range(self, range):
</div>
<div class="parity0 source"><a href="#l123" id="l123"> 123</a> self.ranges.append(range)
</div>
<div class="parity1 source"><a href="#l124" id="l124"> 124</a> def dump(self):
</div>
<div class="parity0 source"><a href="#l125" id="l125"> 125</a> print " Memory: %s" % ', '.join('0x%X-0x%X' % x for x in self.ranges)
</div>
<div class="parity1 source"><a href="#l126" id="l126"> 126</a>
</div>
<div class="parity0 source"><a href="#l127" id="l127"> 127</a> class NUMA_NODE:
</div>
<div class="parity1 source"><a href="#l128" id="l128"> 128</a> def __init__(self, id):
</div>
<div class="parity0 source"><a href="#l129" id="l129"> 129</a> self.id = id
</div>
<div class="parity1 source"><a href="#l130" id="l130"> 130</a> self.affinities=[]
</div>
<div class="parity0 source"><a href="#l131" id="l131"> 131</a> def add_affinity(self, affinity):
</div>
<div class="parity1 source"><a href="#l132" id="l132"> 132</a> self.affinities.append(affinity)
</div>
<div class="parity0 source"><a href="#l133" id="l133"> 133</a> def dump(self):
</div>
<div class="parity1 source"><a href="#l134" id="l134"> 134</a> print "NUMA Node: %d" % (self.id)
</div>
<div class="parity0 source"><a href="#l135" id="l135"> 135</a> for a in self.affinities:
</div>
<div class="parity1 source"><a href="#l136" id="l136"> 136</a> a.dump()
</div>
<div class="parity0 source"><a href="#l137" id="l137"> 137</a>
</div>
<div class="parity1 source"><a href="#l138" id="l138"> 138</a> def get_pcie_port_firmware_node_path(pcie_port_sysfs):
</div>
<div class="parity0 source"><a href="#l139" id="l139"> 139</a> fn=os.path.join(pcie_port_sysfs, "firmware_node")
</div>
<div class="parity1 source"><a href="#l140" id="l140"> 140</a> fp=os.path.join(fn, "path")
</div>
<div class="parity0 source"><a href="#l141" id="l141"> 141</a> try:
</div>
<div class="parity1 source"><a href="#l142" id="l142"> 142</a> f=open(fp, "r")
</div>
<div class="parity0 source"><a href="#l143" id="l143"> 143</a> firmware_node_path=f.read().strip()
</div>
<div class="parity1 source"><a href="#l144" id="l144"> 144</a> f.close()
</div>
<div class="parity0 source"><a href="#l145" id="l145"> 145</a> except IOError:
</div>
<div class="parity1 source"><a href="#l146" id="l146"> 146</a> firmware_node_path=None
</div>
<div class="parity0 source"><a href="#l147" id="l147"> 147</a> return firmware_node_path
</div>
<div class="parity1 source"><a href="#l148" id="l148"> 148</a>
</div>
<div class="parity0 source"><a href="#l149" id="l149"> 149</a> def get_pci_tree(lspciout):
</div>
<div class="parity1 source"><a href="#l150" id="l150"> 150</a> pci_devices={}
</div>
<div class="parity0 source"><a href="#l151" id="l151"> 151</a> pci_buses={}
</div>
<div class="parity1 source"><a href="#l152" id="l152"> 152</a> pcie_port_sysfs="/sys/bus/pci/drivers/pcieport"
</div>
<div class="parity0 source"><a href="#l153" id="l153"> 153</a> lspci=open(lspciout, "r")
</div>
<div class="parity1 source"><a href="#l154" id="l154"> 154</a> bus_summary=0
</div>
<div class="parity0 source"><a href="#l155" id="l155"> 155</a> for line in lspci:
</div>
<div class="parity1 source"><a href="#l156" id="l156"> 156</a> if bus_summary:
</div>
<div class="parity0 source"><a href="#l157" id="l157"> 157</a> match=PCI_BUS_REGEX.search(line)
</div>
<div class="parity1 source"><a href="#l158" id="l158"> 158</a> if match:
</div>
<div class="parity0 source"><a href="#l159" id="l159"> 159</a> desc=PCI_BUS_REGEX.split(line)[1]
</div>
<div class="parity1 source"><a href="#l160" id="l160"> 160</a> bus=match.group(0)[0:2]
</div>
<div class="parity0 source"><a href="#l161" id="l161"> 161</a> if "Entered via" in desc:
</div>
<div class="parity1 source"><a href="#l162" id="l162"> 162</a> device=desc.split()[2]
</div>
<div class="parity0 source"><a href="#l163" id="l163"> 163</a> pci_devices[device].set_secondary(bus)
</div>
<div class="parity1 source"><a href="#l164" id="l164"> 164</a> pci_buses[bus]=pci_devices[device]
</div>
<div class="parity0 source"><a href="#l165" id="l165"> 165</a> port_path=os.path.join(pcie_port_sysfs, "0000:"+device)
</div>
<div class="parity1 source"><a href="#l166" id="l166"> 166</a> if os.path.exists(port_path):
</div>
<div class="parity0 source"><a href="#l167" id="l167"> 167</a> fnp=get_pcie_port_firmware_node_path(port_path)
</div>
<div class="parity1 source"><a href="#l168" id="l168"> 168</a> pci_devices[device].set_firmware_node_path(fnp)
</div>
<div class="parity0 source"><a href="#l169" id="l169"> 169</a> else:
</div>
<div class="parity1 source"><a href="#l170" id="l170"> 170</a> match=PCI_PATH_REGEX.search(line)
</div>
<div class="parity0 source"><a href="#l171" id="l171"> 171</a> if match:
</div>
<div class="parity1 source"><a href="#l172" id="l172"> 172</a> name=match.group(0)
</div>
<div class="parity0 source"><a href="#l173" id="l173"> 173</a> pci_devices[name]=PCI_DEVICE(name)
</div>
<div class="parity1 source"><a href="#l174" id="l174"> 174</a> continue
</div>
<div class="parity0 source"><a href="#l175" id="l175"> 175</a> if "Summary of buses:" in line:
</div>
<div class="parity1 source"><a href="#l176" id="l176"> 176</a> bus_summary=1
</div>
<div class="parity0 source"><a href="#l177" id="l177"> 177</a> continue
</div>
<div class="parity1 source"><a href="#l178" id="l178"> 178</a> root=PCI_DEVICE("ROOT")
</div>
<div class="parity0 source"><a href="#l179" id="l179"> 179</a> for name in sorted(pci_devices.iterkeys()):
</div>
<div class="parity1 source"><a href="#l180" id="l180"> 180</a> device=pci_devices[name]
</div>
<div class="parity0 source"><a href="#l181" id="l181"> 181</a> bus=device.get_bus()
</div>
<div class="parity1 source"><a href="#l182" id="l182"> 182</a> if bus in pci_buses:
</div>
<div class="parity0 source"><a href="#l183" id="l183"> 183</a> pci_buses[bus].add_child(device)
</div>
<div class="parity1 source"><a href="#l184" id="l184"> 184</a> else:
</div>
<div class="parity0 source"><a href="#l185" id="l185"> 185</a> root.add_child(device)
</div>
<div class="parity1 source"><a href="#l186" id="l186"> 186</a> return root
</div>
<div class="parity0 source"><a href="#l187" id="l187"> 187</a>
</div>
<div class="parity1 source"><a href="#l188" id="l188"> 188</a> def get_numa_nodes(asl):
</div>
<div class="parity0 source"><a href="#l189" id="l189"> 189</a> srat=open(asl, "r")
</div>
<div class="parity1 source"><a href="#l190" id="l190"> 190</a> numa_nodes={}
</div>
<div class="parity0 source"><a href="#l191" id="l191"> 191</a> build_node=None
</div>
<div class="parity1 source"><a href="#l192" id="l192"> 192</a> type=None
</div>
<div class="parity0 source"><a href="#l193" id="l193"> 193</a> for line in srat:
</div>
<div class="parity1 source"><a href="#l194" id="l194"> 194</a> #
</div>
<div class="parity0 source"><a href="#l195" id="l195"> 195</a> # Determine affinity type
</div>
<div class="parity1 source"><a href="#l196" id="l196"> 196</a> #
</div>
<div class="parity0 source"><a href="#l197" id="l197"> 197</a> if "Subtable Type" in line:
</div>
<div class="parity1 source"><a href="#l198" id="l198"> 198</a> if "Processor" in line:
</div>
<div class="parity0 source"><a href="#l199" id="l199"> 199</a> affinity=PROCESSOR_AFFINITY()
</div>
<div class="parity1 source"><a href="#l200" id="l200"> 200</a> type=0
</div>
<div class="parity0 source"><a href="#l201" id="l201"> 201</a> if "Memory" in line:
</div>
<div class="parity1 source"><a href="#l202" id="l202"> 202</a> affinity=MEMORY_AFFINITY()
</div>
<div class="parity0 source"><a href="#l203" id="l203"> 203</a> type=1
</div>
<div class="parity1 source"><a href="#l204" id="l204"> 204</a> if type is None:
</div>
<div class="parity0 source"><a href="#l205" id="l205"> 205</a> continue
</div>
<div class="parity1 source"><a href="#l206" id="l206"> 206</a> #
</div>
<div class="parity0 source"><a href="#l207" id="l207"> 207</a> # Only include enabled entries
</div>
<div class="parity1 source"><a href="#l208" id="l208"> 208</a> #
</div>
<div class="parity0 source"><a href="#l209" id="l209"> 209</a> if "Enabled" in line:
</div>
<div class="parity1 source"><a href="#l210" id="l210"> 210</a> enabled=int(line.split(":")[1].strip(),16)
</div>
<div class="parity0 source"><a href="#l211" id="l211"> 211</a> if enabled == 1 and type == 1:
</div>
<div class="parity1 source"><a href="#l212" id="l212"> 212</a> build_node=1
</div>
<div class="parity0 source"><a href="#l213" id="l213"> 213</a> #
</div>
<div class="parity1 source"><a href="#l214" id="l214"> 214</a> # Processor Affinity
</div>
<div class="parity0 source"><a href="#l215" id="l215"> 215</a> #
</div>
<div class="parity1 source"><a href="#l216" id="l216"> 216</a> if type == 0:
</div>
<div class="parity0 source"><a href="#l217" id="l217"> 217</a> if "Proximity Domain Low" in line:
</div>
<div class="parity1 source"><a href="#l218" id="l218"> 218</a> domain_low_8=int(line.split(":")[1].strip(),16)
</div>
<div class="parity0 source"><a href="#l219" id="l219"> 219</a> if "Apic ID" in line:
</div>
<div class="parity1 source"><a href="#l220" id="l220"> 220</a> apic_id=int(line.split(":")[1].strip(),16)
</div>
<div class="parity0 source"><a href="#l221" id="l221"> 221</a> affinity.add_apic(apic_id)
</div>
<div class="parity1 source"><a href="#l222" id="l222"> 222</a> if "Proximity Domain High" in line:
</div>
<div class="parity0 source"><a href="#l223" id="l223"> 223</a> domain_high_24=int(line.split(":")[1].strip(),16)
</div>
<div class="parity1 source"><a href="#l224" id="l224"> 224</a> domain=domain_high_24*256+domain_low_8
</div>
<div class="parity0 source"><a href="#l225" id="l225"> 225</a> if enabled == 1:
</div>
<div class="parity1 source"><a href="#l226" id="l226"> 226</a> build_node=1
</div>
<div class="parity0 source"><a href="#l227" id="l227"> 227</a> #
</div>
<div class="parity1 source"><a href="#l228" id="l228"> 228</a> # Memory Affinity
</div>
<div class="parity0 source"><a href="#l229" id="l229"> 229</a> #
</div>
<div class="parity1 source"><a href="#l230" id="l230"> 230</a> if type == 1:
</div>
<div class="parity0 source"><a href="#l231" id="l231"> 231</a> if "Proximity Domain" in line:
</div>
<div class="parity1 source"><a href="#l232" id="l232"> 232</a> domain=int(line.split(":")[1].strip(),16)
</div>
<div class="parity0 source"><a href="#l233" id="l233"> 233</a> if "Base Address" in line:
</div>
<div class="parity1 source"><a href="#l234" id="l234"> 234</a> address=int(line.split(":")[1].strip(),16)
</div>
<div class="parity0 source"><a href="#l235" id="l235"> 235</a> if "Address Length" in line:
</div>
<div class="parity1 source"><a href="#l236" id="l236"> 236</a> length=int(line.split(":")[1].strip(),16)
</div>
<div class="parity0 source"><a href="#l237" id="l237"> 237</a> affinity.add_range((address, address+length))
</div>
<div class="parity1 source"><a href="#l238" id="l238"> 238</a>
</div>
<div class="parity0 source"><a href="#l239" id="l239"> 239</a> if not build_node is None:
</div>
<div class="parity1 source"><a href="#l240" id="l240"> 240</a> if not domain in numa_nodes:
</div>
<div class="parity0 source"><a href="#l241" id="l241"> 241</a> numa_nodes[domain]=NUMA_NODE(domain)
</div>
<div class="parity1 source"><a href="#l242" id="l242"> 242</a> numa_nodes[domain].add_affinity(affinity)
</div>
<div class="parity0 source"><a href="#l243" id="l243"> 243</a> affinity=None
</div>
<div class="parity1 source"><a href="#l244" id="l244"> 244</a> build_node=None
</div>
<div class="parity0 source"><a href="#l245" id="l245"> 245</a> return numa_nodes
</div>
<div class="parity1 source"><a href="#l246" id="l246"> 246</a>
</div>
<div class="parity0 source"><a href="#l247" id="l247"> 247</a> def get_acpi_proximity_by_path(acpi_root, path):
</div>
<div class="parity1 source"><a href="#l248" id="l248"> 248</a> device=get_acpi_device(acpi_root, path)
</div>
<div class="parity0 source"><a href="#l249" id="l249"> 249</a> proximity=device.get_proximity()
</div>
<div class="parity1 source"><a href="#l250" id="l250"> 250</a> return proximity
</div>
<div class="parity0 source"><a href="#l251" id="l251"> 251</a>
</div>
<div class="parity1 source"><a href="#l252" id="l252"> 252</a> def get_acpi_device(acpi_root, path):
</div>
<div class="parity0 source"><a href="#l253" id="l253"> 253</a> device=acpi_root
</div>
<div class="parity1 source"><a href="#l254" id="l254"> 254</a> path=path[1:]
</div>
<div class="parity0 source"><a href="#l255" id="l255"> 255</a> if path != "":
</div>
<div class="parity1 source"><a href="#l256" id="l256"> 256</a> parts=path.split(".")
</div>
<div class="parity0 source"><a href="#l257" id="l257"> 257</a> for i in range(0,len(parts)):
</div>
<div class="parity1 source"><a href="#l258" id="l258"> 258</a> device=device.get_child(parts[i])
</div>
<div class="parity0 source"><a href="#l259" id="l259"> 259</a> return device
</div>
<div class="parity1 source"><a href="#l260" id="l260"> 260</a>
</div>
<div class="parity0 source"><a href="#l261" id="l261"> 261</a> def get_acpi_path(scope, stack):
</div>
<div class="parity1 source"><a href="#l262" id="l262"> 262</a> if scope.name.startswith('\\'):
</div>
<div class="parity0 source"><a href="#l263" id="l263"> 263</a> path=scope.name
</div>
<div class="parity1 source"><a href="#l264" id="l264"> 264</a> else:
</div>
<div class="parity0 source"><a href="#l265" id="l265"> 265</a> path=scope.name
</div>
<div class="parity1 source"><a href="#l266" id="l266"> 266</a> for s in reversed(stack):
</div>
<div class="parity0 source"><a href="#l267" id="l267"> 267</a> if s.name == "\\":
</div>
<div class="parity1 source"><a href="#l268" id="l268"> 268</a> path=s.name+path
</div>
<div class="parity0 source"><a href="#l269" id="l269"> 269</a> else:
</div>
<div class="parity1 source"><a href="#l270" id="l270"> 270</a> path=s.name+"."+path
</div>
<div class="parity0 source"><a href="#l271" id="l271"> 271</a> if path.startswith('\\'):
</div>
<div class="parity1 source"><a href="#l272" id="l272"> 272</a> break
</div>
<div class="parity0 source"><a href="#l273" id="l273"> 273</a> return path
</div>
<div class="parity1 source"><a href="#l274" id="l274"> 274</a>
</div>
<div class="parity0 source"><a href="#l275" id="l275"> 275</a> def get_acpi_tree(asl):
</div>
<div class="parity1 source"><a href="#l276" id="l276"> 276</a> dsdt=open(asl, "r")
</div>
<div class="parity0 source"><a href="#l277" id="l277"> 277</a> root=ACPI_DEVICE("\\")
</div>
<div class="parity1 source"><a href="#l278" id="l278"> 278</a> scope_stack=[]
</div>
<div class="parity0 source"><a href="#l279" id="l279"> 279</a> current=ACPI_SCOPE("\\")
</div>
<div class="parity1 source"><a href="#l280" id="l280"> 280</a> for line in dsdt:
</div>
<div class="parity0 source"><a href="#l281" id="l281"> 281</a> new_scope=0
</div>
<div class="parity1 source"><a href="#l282" id="l282"> 282</a> match=re.search(r"Scope \(|Device \(|Processor \(", line)
</div>
<div class="parity0 source"><a href="#l283" id="l283"> 283</a> if not match is None:
</div>
<div class="parity1 source"><a href="#l284" id="l284"> 284</a> new_scope=1
</div>
<div class="parity0 source"><a href="#l285" id="l285"> 285</a> if new_scope:
</div>
<div class="parity1 source"><a href="#l286" id="l286"> 286</a> name=line.split('(')[1].split(')')[0]
</div>
<div class="parity0 source"><a href="#l287" id="l287"> 287</a> if "," in name:
</div>
<div class="parity1 source"><a href="#l288" id="l288"> 288</a> name=name.split(',')[0]
</div>
<div class="parity0 source"><a href="#l289" id="l289"> 289</a> scope=ACPI_SCOPE(name)
</div>
<div class="parity1 source"><a href="#l290" id="l290"> 290</a> scope_stack.append(current)
</div>
<div class="parity0 source"><a href="#l291" id="l291"> 291</a> current=scope
</div>
<div class="parity1 source"><a href="#l292" id="l292"> 292</a> path=get_acpi_path(current, scope_stack)
</div>
<div class="parity0 source"><a href="#l293" id="l293"> 293</a> device=get_acpi_device(root, path)
</div>
<div class="parity1 source"><a href="#l294" id="l294"> 294</a> if "{" in line:
</div>
<div class="parity0 source"><a href="#l295" id="l295"> 295</a> current.enter()
</div>
<div class="parity1 source"><a href="#l296" id="l296"> 296</a> if "}" in line:
</div>
<div class="parity0 source"><a href="#l297" id="l297"> 297</a> if current.leave() == 0:
</div>
<div class="parity1 source"><a href="#l298" id="l298"> 298</a> if len(scope_stack):
</div>
<div class="parity0 source"><a href="#l299" id="l299"> 299</a> current=scope_stack.pop()
</div>
<div class="parity1 source"><a href="#l300" id="l300"> 300</a> if "_PXM" in line:
</div>
<div class="parity0 source"><a href="#l301" id="l301"> 301</a> proximity=line.split(',')[1].split(')')[0].strip()
</div>
<div class="parity1 source"><a href="#l302" id="l302"> 302</a> if proximity == "Zero":
</div>
<div class="parity0 source"><a href="#l303" id="l303"> 303</a> proximity="0"
</div>
<div class="parity1 source"><a href="#l304" id="l304"> 304</a> if proximity == "One":
</div>
<div class="parity0 source"><a href="#l305" id="l305"> 305</a> proximity="1"
</div>
<div class="parity1 source"><a href="#l306" id="l306"> 306</a> p=int(proximity, 16)
</div>
<div class="parity0 source"><a href="#l307" id="l307"> 307</a> path=get_acpi_path(current, scope_stack)
</div>
<div class="parity1 source"><a href="#l308" id="l308"> 308</a> device=get_acpi_device(root, path)
</div>
<div class="parity0 source"><a href="#l309" id="l309"> 309</a> device.set_proximity(p)
</div>
<div class="parity1 source"><a href="#l310" id="l310"> 310</a> return root
</div>
<div class="parity0 source"><a href="#l311" id="l311"> 311</a>
</div>
<div class="parity1 source"><a href="#l312" id="l312"> 312</a> def main(argv):
</div>
<div class="parity0 source"><a href="#l313" id="l313"> 313</a> acpi_tree=get_acpi_tree(argv[2])
</div>
<div class="parity1 source"><a href="#l314" id="l314"> 314</a> print "\nACPI device tree"
</div>
<div class="parity0 source"><a href="#l315" id="l315"> 315</a> acpi_tree.dump(0)
</div>
<div class="parity1 source"><a href="#l316" id="l316"> 316</a>
</div>
<div class="parity0 source"><a href="#l317" id="l317"> 317</a> pci_tree=get_pci_tree(argv[3])
</div>
<div class="parity1 source"><a href="#l318" id="l318"> 318</a> print "\nPCI device tree"
</div>
<div class="parity0 source"><a href="#l319" id="l319"> 319</a> pci_tree.dump(0)
</div>
<div class="parity1 source"><a href="#l320" id="l320"> 320</a>
</div>
<div class="parity0 source"><a href="#l321" id="l321"> 321</a> numa_nodes=get_numa_nodes(argv[1])
</div>
<div class="parity1 source"><a href="#l322" id="l322"> 322</a> print "\nSystem NUMA nodes"
</div>
<div class="parity0 source"><a href="#l323" id="l323"> 323</a> for id, node in numa_nodes.iteritems():
</div>
<div class="parity1 source"><a href="#l324" id="l324"> 324</a> node.dump()
</div>
<div class="parity0 source"><a href="#l325" id="l325"> 325</a> devices=[]
</div>
<div class="parity1 source"><a href="#l326" id="l326"> 326</a> pci_tree.get_devices_with_proximity(acpi_tree, node.id, devices)
</div>
<div class="parity0 source"><a href="#l327" id="l327"> 327</a> for device in devices:
</div>
<div class="parity1 source"><a href="#l328" id="l328"> 328</a> device.dump_with(" PCI BUS")
</div>
<div class="parity0 source"><a href="#l329" id="l329"> 329</a>
</div>
<div class="parity1 source"><a href="#l330" id="l330"> 330</a> if __name__ == "__main__":
</div>
<div class="parity0 source"><a href="#l331" id="l331"> 331</a> main(sys.argv)
</div>
<div class="sourcelast"></div>
</div>
</div>
</div>
<script type="text/javascript">process_dates()</script>
</body>
</html>
[-- Attachment #3: run.sh --]
[-- Type: application/octet-stream, Size: 7252 bytes --]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<link rel="icon" href="/carbon/trunk/support.hg/static/hgicon.png" type="image/png" />
<meta name="robots" content="index, nofollow" />
<link rel="stylesheet" href="/carbon/trunk/support.hg/static/style-paper.css" type="text/css" />
<script type="text/javascript" src="/carbon/trunk/support.hg/static/mercurial.js"></script>
<title>/carbon/trunk/support: a66685b5d147 numa/src/run.sh</title>
</head>
<body>
<div class="container">
<div class="menu">
<div class="logo">
<a href="http://mercurial.selenic.com/">
<img src="/carbon/trunk/support.hg/static/hglogo.png" alt="mercurial" /></a>
</div>
<ul>
<li><a href="/carbon/trunk/support.hg/shortlog/a66685b5d147">log</a></li>
<li><a href="/carbon/trunk/support.hg/graph/a66685b5d147">graph</a></li>
<li><a href="/carbon/trunk/support.hg/tags">tags</a></li>
<li><a href="/carbon/trunk/support.hg/branches">branches</a></li>
</ul>
<ul>
<li><a href="/carbon/trunk/support.hg/rev/a66685b5d147">changeset</a></li>
<li><a href="/carbon/trunk/support.hg/file/a66685b5d147/numa/src/">browse</a></li>
</ul>
<ul>
<li class="active">file</li>
<li><a href="/carbon/trunk/support.hg/file/tip/numa/src/run.sh">latest</a></li>
<li><a href="/carbon/trunk/support.hg/diff/a66685b5d147/numa/src/run.sh">diff</a></li>
<li><a href="/carbon/trunk/support.hg/annotate/a66685b5d147/numa/src/run.sh">annotate</a></li>
<li><a href="/carbon/trunk/support.hg/log/a66685b5d147/numa/src/run.sh">file log</a></li>
<li><a href="/carbon/trunk/support.hg/raw-file/a66685b5d147/numa/src/run.sh">raw</a></li>
</ul>
<ul>
<li><a href="/carbon/trunk/support.hg/help">help</a></li>
</ul>
</div>
<div class="main">
<h2><a href="/carbon/trunk/support.hg/">/carbon/trunk/support</a></h2>
<h3>view numa/src/run.sh @ 355:a66685b5d147</h3>
<form class="search" action="/carbon/trunk/support.hg/log">
<p><input name="rev" id="search1" type="text" size="30" /></p>
<div id="hint">find changesets by author, revision,
files, or words in the commit message</div>
</form>
<div class="description">Add README for NUMA tool.</div>
<table id="changesetEntry">
<tr>
<th class="author">author</th>
<td class="author">Santosh Jodh <santosh.jodh@citrix.com></td>
</tr>
<tr>
<th class="date">date</th>
<td class="date age">Thu, 02 May 2013 19:35:00 -0700</td>
</tr>
<tr>
<th class="author">parents</th>
<td class="author"></td>
</tr>
<tr>
<th class="author">children</th>
<td class="author"></td>
</tr>
</table>
<div class="overflow">
<div class="sourcefirst"> line source</div>
<div class="parity0 source"><a href="#l1" id="l1"> 1</a> #!/bin/bash
</div>
<div class="parity1 source"><a href="#l2" id="l2"> 2</a>
</div>
<div class="parity0 source"><a href="#l3" id="l3"> 3</a> echo "Listing all PCI devices and buses in the system."
</div>
<div class="parity1 source"><a href="#l4" id="l4"> 4</a> lspci -mm -M 1>lspci.out 2>lspci.err
</div>
<div class="parity0 source"><a href="#l5" id="l5"> 5</a>
</div>
<div class="parity1 source"><a href="#l6" id="l6"> 6</a> echo "Reading all ACPI tables."
</div>
<div class="parity0 source"><a href="#l7" id="l7"> 7</a> acpidump 1>acpi.dat 2>acpidump.err
</div>
<div class="parity1 source"><a href="#l8" id="l8"> 8</a>
</div>
<div class="parity0 source"><a href="#l9" id="l9"> 9</a> echo "Extracting all ACPI tables."
</div>
<div class="parity1 source"><a href="#l10" id="l10"> 10</a> acpixtract -a acpi.dat 1>acpixtract.out 2>acpixtract.err
</div>
<div class="parity0 source"><a href="#l11" id="l11"> 11</a>
</div>
<div class="parity1 source"><a href="#l12" id="l12"> 12</a> echo "Unassembling SRAT ACPI table."
</div>
<div class="parity0 source"><a href="#l13" id="l13"> 13</a> ./iasl -d SRAT.dat 1>srat.out 2>srat.err
</div>
<div class="parity1 source"><a href="#l14" id="l14"> 14</a>
</div>
<div class="parity0 source"><a href="#l15" id="l15"> 15</a> echo "Unassembling DSDT ACPI table."
</div>
<div class="parity1 source"><a href="#l16" id="l16"> 16</a> ./iasl -d DSDT.dat 1>dsdt.out 2>dsdt.err
</div>
<div class="parity0 source"><a href="#l17" id="l17"> 17</a>
</div>
<div class="parity1 source"><a href="#l18" id="l18"> 18</a> FILES=`ls SRAT.*`
</div>
<div class="parity0 source"><a href="#l19" id="l19"> 19</a> for file in $FILES; do
</div>
<div class="parity1 source"><a href="#l20" id="l20"> 20</a> if [ ${file##*.} != "dat" ]; then
</div>
<div class="parity0 source"><a href="#l21" id="l21"> 21</a> SRAT=$file
</div>
<div class="parity1 source"><a href="#l22" id="l22"> 22</a> break
</div>
<div class="parity0 source"><a href="#l23" id="l23"> 23</a> fi
</div>
<div class="parity1 source"><a href="#l24" id="l24"> 24</a> done
</div>
<div class="parity0 source"><a href="#l25" id="l25"> 25</a>
</div>
<div class="parity1 source"><a href="#l26" id="l26"> 26</a> if [ -z "$SRAT" ]; then
</div>
<div class="parity0 source"><a href="#l27" id="l27"> 27</a> echo "System BIOS does not contain SRAT table!"
</div>
<div class="parity1 source"><a href="#l28" id="l28"> 28</a> exit
</div>
<div class="parity0 source"><a href="#l29" id="l29"> 29</a> fi
</div>
<div class="parity1 source"><a href="#l30" id="l30"> 30</a>
</div>
<div class="parity0 source"><a href="#l31" id="l31"> 31</a> DSDT=""
</div>
<div class="parity1 source"><a href="#l32" id="l32"> 32</a> FILES=`ls DSDT.*`
</div>
<div class="parity0 source"><a href="#l33" id="l33"> 33</a> for file in $FILES; do
</div>
<div class="parity1 source"><a href="#l34" id="l34"> 34</a> if [ ${file##*.} != "dat" ]; then
</div>
<div class="parity0 source"><a href="#l35" id="l35"> 35</a> DSDT=$file
</div>
<div class="parity1 source"><a href="#l36" id="l36"> 36</a> break
</div>
<div class="parity0 source"><a href="#l37" id="l37"> 37</a> fi
</div>
<div class="parity1 source"><a href="#l38" id="l38"> 38</a> done
</div>
<div class="parity0 source"><a href="#l39" id="l39"> 39</a>
</div>
<div class="parity1 source"><a href="#l40" id="l40"> 40</a> if [ -z "$DSDT" ]; then
</div>
<div class="parity0 source"><a href="#l41" id="l41"> 41</a> echo "System BIOS does not contain DSDT table!"
</div>
<div class="parity1 source"><a href="#l42" id="l42"> 42</a> exit
</div>
<div class="parity0 source"><a href="#l43" id="l43"> 43</a> fi
</div>
<div class="parity1 source"><a href="#l44" id="l44"> 44</a>
</div>
<div class="parity0 source"><a href="#l45" id="l45"> 45</a> echo "Building NUMA domains."
</div>
<div class="parity1 source"><a href="#l46" id="l46"> 46</a> ./numa_info.py $SRAT $DSDT lspci.out
</div>
<div class="sourcelast"></div>
</div>
</div>
</div>
<script type="text/javascript">process_dates()</script>
</body>
</html>
[-- Attachment #4: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 7+ messages in thread