* I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice?
@ 2013-05-15 10:07 Pankaj Biswas
2013-05-15 11:00 ` Ian Campbell
2013-05-15 14:15 ` Konrad Rzeszutek Wilk
0 siblings, 2 replies; 7+ messages in thread
From: Pankaj Biswas @ 2013-05-15 10:07 UTC (permalink / raw)
To: xen-devel
[-- Attachment #1.1: Type: text/plain, Size: 262 bytes --]
hi Team,
Can you help me here. because the Xen driver is not mutually exclusive with
their Linux driver,
because I think the ability to detect Xen depends on it first finding that
it is running on Linux.
Any help is really appreciated.
thanks,
PANKAJCABS
[-- Attachment #1.2: Type: text/html, Size: 650 bytes --]
[-- Attachment #2: 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
* Re: I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice?
2013-05-15 10:07 I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice? Pankaj Biswas
@ 2013-05-15 11:00 ` Ian Campbell
2013-05-15 14:15 ` Konrad Rzeszutek Wilk
1 sibling, 0 replies; 7+ messages in thread
From: Ian Campbell @ 2013-05-15 11:00 UTC (permalink / raw)
To: Pankaj Biswas; +Cc: xen-devel
On Wed, 2013-05-15 at 15:37 +0530, Pankaj Biswas wrote:
> hi Team,
>
>
> Can you help me here. because the Xen driver is not mutually exclusive
> with their Linux driver,
>
> because I think the ability to detect Xen depends on it first finding
> that it is running on Linux.
I'm afraid I cannot parse the above, but:
In a Xen system the majority if the drivers are handled by guest
domains, often the domain 0 kernel, and not by the hypervisor. In other
words usually a standard Linux driver will be sufficient and no special
Xen code is required.
What sort of device are you working with?
Ian.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice?
2013-05-15 10:07 I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice? Pankaj Biswas
2013-05-15 11:00 ` Ian Campbell
@ 2013-05-15 14:15 ` Konrad Rzeszutek Wilk
2013-05-24 9:51 ` Pankaj Biswas
1 sibling, 1 reply; 7+ messages in thread
From: Konrad Rzeszutek Wilk @ 2013-05-15 14:15 UTC (permalink / raw)
To: Pankaj Biswas; +Cc: xen-devel
On Wed, May 15, 2013 at 03:37:39PM +0530, Pankaj Biswas wrote:
> hi Team,
>
> Can you help me here. because the Xen driver is not mutually exclusive with
> their Linux driver,
>
> because I think the ability to detect Xen depends on it first finding that
> it is running on Linux.
I have no idea what you are saying here. Could you be more specific please?
>
>
> Any help is really appreciated.
>
>
> thanks,
>
> PANKAJCABS
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice?
2013-05-15 14:15 ` Konrad Rzeszutek Wilk
@ 2013-05-24 9:51 ` Pankaj Biswas
2013-05-24 9:55 ` Ian Campbell
0 siblings, 1 reply; 7+ messages in thread
From: Pankaj Biswas @ 2013-05-24 9:51 UTC (permalink / raw)
To: Konrad Rzeszutek Wilk; +Cc: xen-devel
[-- Attachment #1.1: Type: text/plain, Size: 1746 bytes --]
hi Ian and Konrad,
Thanks for the reply and sorry for not being clear on what I want. I want
to work on a CPU/RAM/PCI diagram tool in Xen, which will help in debugging
kernel,hypervisor problems to understand the bus topology of a server. Tool
will create a layout diagram for a server automatically using data from
ACPI/SM-Bios tables, lspci oputput etc. It will either run on a Live system
or offline using captured data to produce a graphical representation of the
hardware device locations,memory bank locations etc. There are other
benefits like labelling relevant hardware errata, performing bus throughput
calculations.
I think hwloc will be good for this requirement.in the code base, there is
a "linux driver" which uses /sys/acpi/$FOO to discover the CPU topology.
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.
So trying and geting hwloc working under Xen will solve this purpose. Can
you please guide me here?
-PankajCabs
On Wed, May 15, 2013 at 7:45 PM, Konrad Rzeszutek Wilk <
konrad.wilk@oracle.com> wrote:
> On Wed, May 15, 2013 at 03:37:39PM +0530, Pankaj Biswas wrote:
> > hi Team,
> >
> > Can you help me here. because the Xen driver is not mutually exclusive
> with
> > their Linux driver,
> >
> > because I think the ability to detect Xen depends on it first finding
> that
> > it is running on Linux.
>
> I have no idea what you are saying here. Could you be more specific please?
>
> >
> >
> > Any help is really appreciated.
> >
> >
> > thanks,
> >
> > PANKAJCABS
>
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xen.org
> > http://lists.xen.org/xen-devel
>
>
[-- Attachment #1.2: Type: text/html, Size: 3069 bytes --]
[-- Attachment #2: 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
* 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:51 ` Pankaj Biswas
@ 2013-05-24 9:55 ` Ian Campbell
2013-05-24 15:06 ` Santosh Jodh
2013-05-29 15:55 ` Dario Faggioli
0 siblings, 2 replies; 7+ messages in thread
From: Ian Campbell @ 2013-05-24 9:55 UTC (permalink / raw)
To: Pankaj Biswas; +Cc: xen-devel, Konrad Rzeszutek Wilk
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.
^ permalink raw reply [flat|nested] 7+ messages in thread
* 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
* 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: Dario Faggioli @ 2013-05-29 15:55 UTC (permalink / raw)
To: Ian Campbell; +Cc: xen-devel, Konrad Rzeszutek Wilk, Pankaj Biswas
[-- Attachment #1.1: Type: text/plain, Size: 1337 bytes --]
On ven, 2013-05-24 at 10:55 +0100, Ian Campbell wrote:
> 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.
>
Indeed, and that is available on top of libxl too (in case it is easier
to use). Just look at output_topologyinfo() and output_numainfo() in
tools/libxl/xl_cmdimpl.c .
This might not be the complete set of information you need, but that's
all we have for now. Let us/me know whether there is something that you
think is missing, and we'll see whether and how to put it together. :-)
> > 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.
>
Me neither, sorry. :-(
Dario
--
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://about.me/dario.faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
[-- Attachment #1.2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
[-- Attachment #2: 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
end of thread, other threads:[~2013-05-29 15:55 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-15 10:07 I want to add a Xen driver and it doesn't look completely trivial given the current driver architecture - any advice? Pankaj Biswas
2013-05-15 11:00 ` Ian Campbell
2013-05-15 14:15 ` Konrad Rzeszutek Wilk
2013-05-24 9:51 ` Pankaj Biswas
2013-05-24 9:55 ` Ian Campbell
2013-05-24 15:06 ` Santosh Jodh
2013-05-29 15:55 ` Dario Faggioli
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).