<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://elinux.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://elinux.org/index.php?title=Instrumentation_API&amp;feed=atom&amp;action=history</id>
		<title>Instrumentation API - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://elinux.org/index.php?title=Instrumentation_API&amp;feed=atom&amp;action=history"/>
		<link rel="alternate" type="text/html" href="http://elinux.org/index.php?title=Instrumentation_API&amp;action=history"/>
		<updated>2013-05-25T20:45:43Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.22alpha</generator>

	<entry>
		<id>http://elinux.org/index.php?title=Instrumentation_API&amp;diff=74173&amp;oldid=prev</id>
		<title>Cschalle: Add category</title>
		<link rel="alternate" type="text/html" href="http://elinux.org/index.php?title=Instrumentation_API&amp;diff=74173&amp;oldid=prev"/>
				<updated>2011-10-28T10:36:05Z</updated>
		
		<summary type="html">&lt;p&gt;Add category&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr style='vertical-align: top;'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 10:36, 28 October 2011&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 290:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 290:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== System Tap timestamp notes ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== System Tap timestamp notes ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;See [[System Tap Timestamp Notes]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;See [[System Tap Timestamp Notes]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Kernel]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Cschalle</name></author>	</entry>

	<entry>
		<id>http://elinux.org/index.php?title=Instrumentation_API&amp;diff=2005&amp;oldid=prev</id>
		<title>RBot: Bot (Edward's framework)</title>
		<link rel="alternate" type="text/html" href="http://elinux.org/index.php?title=Instrumentation_API&amp;diff=2005&amp;oldid=prev"/>
				<updated>2007-03-06T03:33:58Z</updated>
		
		<summary type="html">&lt;p&gt;Bot (Edward&amp;#039;s framework)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;We seek to define an API to allow for simple measurement of timing data inside the&lt;br /&gt;
Linux kernel. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
(these notes are from the face-to-face meeting on Jan 10th)&lt;br /&gt;
 - The clock needs to support instrumentation lasting during the boot up period.  This&lt;br /&gt;
 may be up to 2 minutes.  For warm resets, the clock may not be reinitialized (is this true?)&lt;br /&gt;
 Therefore, even for bootup measurements, the clock may be running far into its cycle when&lt;br /&gt;
 the measurements are made.&lt;br /&gt;
   - Note that embedded processors have CPU clock ranging from a few MHZ to &lt;br /&gt;
   a few GHZ.  A 1 GHZ clock will overrun 32 bits in about 4 seconds.&lt;br /&gt;
   - result is that we should probably use a 64-bit clock value.&lt;br /&gt;
   - for supporting periods of several seconds, a clock driver will need&lt;br /&gt;
   to manage upper bits to handle hardware clock overrun or wrap.&lt;br /&gt;
 - There should be a config option to turn on or off support for the feature&lt;br /&gt;
 - The instrumentation clock must be available early&lt;br /&gt;
 (before calibrate_delay()). It should probably be initialized inside setup_arch()&lt;br /&gt;
   - Note that a free-running clock could be set up by firmware&lt;br /&gt;
   (before kernel start)&lt;br /&gt;
   - Note that often you can use same clock as system clock (used for&lt;br /&gt;
   jiffies)&lt;br /&gt;
 - 1 usec or greater resolution is desired.&lt;br /&gt;
 - 100 usec accuracy is desired for our current bootup time measurement work&lt;br /&gt;
 - the value returned should not fluctuate with changes in CPU frequency.&lt;br /&gt;
   - Alternative, the CPU frequency should not be modified during the &lt;br /&gt;
   timing period.  For the BTWG, the timing period is system bootup, so it&lt;br /&gt;
   should be easy to avoid changing CPU frequency during this period. (??)&lt;br /&gt;
 - the value returned should be monotonically increasing (except for rollover or&lt;br /&gt;
 some process specifically setting the clock)&lt;br /&gt;
 - the values returned need not be linearly related.  That is, it is acceptable&lt;br /&gt;
 for the values to be non-linear, as long as the conversion to time results (sec, nsec)&lt;br /&gt;
 is correct.  Thus, as one example of value management, it is possible to&lt;br /&gt;
 store the hardware clock value in the low 32 bits, and the number of rollovers&lt;br /&gt;
 in the high 32 bits.  This works even if the clock source itself is less than&lt;br /&gt;
 32 bits wide (eg 12 bits, or 16 bits).&lt;br /&gt;
 - the API should be available on all architectures of interest (eg. cpu cycle read&lt;br /&gt;
 is not available on ARM or SH)&lt;br /&gt;
 - it should add minimal overhead to the system.&lt;br /&gt;
&lt;br /&gt;
== Proposed Specification ==&lt;br /&gt;
=== Old proposed spec. ===&lt;br /&gt;
 - unsigned long long get_cycles(void) - which maps to get_arch_cycles()&lt;br /&gt;
 - unsigned long cycles_to_usec(unsigned long long) - which maps to arch_cycles_to_usec()&lt;br /&gt;
&lt;br /&gt;
Problems:&lt;br /&gt;
 - usecs returned in a unsigned 32-bit overflows at about 4000 seconds.  This&lt;br /&gt;
 should be enough for a reasonable bootup time.&lt;br /&gt;
&lt;br /&gt;
=== Another old proposed spec. (deprecated) ===&lt;br /&gt;
 - see [[Timing APISpecification _R2]]&lt;br /&gt;
&lt;br /&gt;
=== New proposed spec. ===&lt;br /&gt;
 - use sched_clock(), and admonish board support authors to support it properly&lt;br /&gt;
 - also, document methods to provide scaling factor prior to time_init()&lt;br /&gt;
 to that measurements are available from very start of kernel execution.&lt;br /&gt;
&lt;br /&gt;
== [[APIs]] needed by current systems ==&lt;br /&gt;
=== printk-times ===&lt;br /&gt;
 - static inline void highres_timer_read_ticks (u32 *slow, u32 *fast)&lt;br /&gt;
 - static inline void highres_timer_ticks_to_timeval(u32 slow, u32 fast, struct timeval *tv)&lt;br /&gt;
&lt;br /&gt;
In the patch submitted to the forum, this was only supported on x86.&lt;br /&gt;
The highres_timer_ticks_to_timeval used a hardcoded value which had&lt;br /&gt;
to be set at compile time.  highres_timer_read_ticks used a read of&lt;br /&gt;
the Time Stamp Counter (TSC) of the central processor.&lt;br /&gt;
Also, highres_timer_ticks_to_timeval did not handle rollover&lt;br /&gt;
from fast to slow very well.&lt;br /&gt;
&lt;br /&gt;
Current implementation for x86 (see [[Printk Times]]) uses hardcoded&lt;br /&gt;
cpu_fixed_khz (in the 2.4 version of the patch), which requires&lt;br /&gt;
a code change for different targets.&lt;br /&gt;
&lt;br /&gt;
These techniques are not portable.&lt;br /&gt;
&lt;br /&gt;
Problems:&lt;br /&gt;
 - separation of timer value into high and low 32-bit values&lt;br /&gt;
 doesn't seem necessary&lt;br /&gt;
 - it doesn't resemble other  clock read [[APIs]] in the kernel&lt;br /&gt;
 - it should use term &amp;quot;clock&amp;quot; instead of &amp;quot;timer&amp;quot;&lt;br /&gt;
 - uses hard-coded (compiled in) value for conversion function&lt;br /&gt;
&lt;br /&gt;
=== KFI ===&lt;br /&gt;
 - unsigned long kfi_readclock(void)&lt;br /&gt;
   (which maps to do_getmachinecycles() )&lt;br /&gt;
 - unsigned long kfi_clock_to_usecs(unsigned long clocks)&lt;br /&gt;
   (which maps to machinecycles_to_usecs() )&lt;br /&gt;
&lt;br /&gt;
Problems:&lt;br /&gt;
 - has kfi in name&lt;br /&gt;
 - only supports 32-bit clock value&lt;br /&gt;
&lt;br /&gt;
=== kernel tracing ===&lt;br /&gt;
 - get_profiler_timestamp()&lt;br /&gt;
   - defined in /asm-&amp;lt;arch&amp;gt;/profiler.h&lt;br /&gt;
&lt;br /&gt;
On alpha get_profiler_timestamp is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 - #define get_profiler_timestamp()                     \ &lt;br /&gt;
+    ( {                                                \ &lt;br /&gt;
+       register u32 __res;                             \ &lt;br /&gt;
+       asm volatile (&amp;quot;rpcc %0&amp;quot; : &amp;quot;=r&amp;quot; (__res));        \ &lt;br /&gt;
+       __res;                                          \ &lt;br /&gt;
+    } )&lt;br /&gt;
+&lt;br /&gt;
+/* Always u32, even when CONFIG_TRACE_TRUNCTIME */&lt;br /&gt;
+typedef u32 profiler_timestamp_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On x86 get_profiler_timestamp is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef CONFIG_TRACE_TIMESTAMP&lt;br /&gt;
+#define get_profiler_timestamp()                               \ &lt;br /&gt;
+    ( {                                                        \ &lt;br /&gt;
+           register u64 __res;                                 \ &lt;br /&gt;
+           if (test_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability)) { \ &lt;br /&gt;
+               __asm__ __volatile__(                           \ &lt;br /&gt;
+                       &amp;quot;rdtsc&amp;quot; : &amp;quot;=A&amp;quot;(__res)                   \ &lt;br /&gt;
+               );                                              \ &lt;br /&gt;
+           }                                                   \ &lt;br /&gt;
+           else {                                              \ &lt;br /&gt;
+               /* no rdtsc, use jiffies instead */             \ &lt;br /&gt;
+               __res = jiffies;                                \ &lt;br /&gt;
+           }                                                   \ &lt;br /&gt;
+           __res;                                              \ &lt;br /&gt;
+    } )&lt;br /&gt;
+&lt;br /&gt;
+#ifdef CONFIG_TRACE_TRUNCTIME&lt;br /&gt;
+typedef u32 profiler_timestamp_t;&lt;br /&gt;
+#else&lt;br /&gt;
+typedef u64 profiler_timestamp_t;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problems:&lt;br /&gt;
 - only supported on ALPHA and x86&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See http://www.kernel.org/pub/linux/kernel/people/andrea/ikd/README&lt;br /&gt;
for information and for patches.&lt;br /&gt;
&lt;br /&gt;
=== Linux Trace Toolkit ===&lt;br /&gt;
[don't know - need to find out]&lt;br /&gt;
&lt;br /&gt;
=== kgdb instrument functions ===&lt;br /&gt;
 - rdtsc(t1,t2)&lt;br /&gt;
 - extern unsigned long fast_gettimeoffset_quotient;&lt;br /&gt;
&lt;br /&gt;
I'm not sure where fast_gettimeoffset_quotient comes&lt;br /&gt;
from, but it is used like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ll = 1LL &amp;lt;&amp;lt; 32; &lt;br /&gt;
do_div(ll, fast_gettimeoffset_quotient); &lt;br /&gt;
cycles = (unsigned int)ll;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is later used with the values returned from rdtsc, to convert it&lt;br /&gt;
to integer and fractional seconds.&lt;br /&gt;
&lt;br /&gt;
Problems:&lt;br /&gt;
 - this only works on x86 (rdtsc)&lt;br /&gt;
&lt;br /&gt;
== Current [[APIs]] ==&lt;br /&gt;
=== Current Linux (2.4) get_cycles() ===&lt;br /&gt;
Linux version 2.4.20 has:&lt;br /&gt;
 - typedef unsigned long long cycles_t&lt;br /&gt;
 - cycles_t get_cycles(void) defined in include/asm/timex.h&lt;br /&gt;
   This returns 0 on x86 processors without a TSC, and 0 on some other processors&lt;br /&gt;
   - supported on x86, ppc, mips, alpha&lt;br /&gt;
   - not supported on arm, sh&lt;br /&gt;
&lt;br /&gt;
There appears to be no supporting function to convert to usecs.&lt;br /&gt;
&lt;br /&gt;
=== Current Linux (2.6) sched_clock() ===&lt;br /&gt;
Linux version 2.6.7 has:&lt;br /&gt;
 - sched_clock() - returns current time in nanosec units.&lt;br /&gt;
   - unsigned long long sched_clock(void)&lt;br /&gt;
   - this routine won't function correctly (it returns 0) until a valid scale&lt;br /&gt;
   factore is set (for x86 and ppc).  For x86, this means until the routine&lt;br /&gt;
   &amp;lt;code&amp;gt;set_cyc2ns_scale()&amp;lt;/code&amp;gt; is called.  This is normally called from &amp;lt;code&amp;gt;time_init()&amp;lt;/code&amp;gt;.&lt;br /&gt;
   - on x86, it reads TSC.&lt;br /&gt;
   - on x86, found in &amp;lt;code&amp;gt;arch/i386/kernel/timers/timer_tsc.c&amp;lt;/code&amp;gt;&lt;br /&gt;
 - set_cyc2ns_scale() (x86 only)&lt;br /&gt;
   - static inline void set_cyc2ns_scale(unsigned long cpu_mhz)&lt;br /&gt;
   - initializes the conversion factor for the clock scaling of sched clock.&lt;br /&gt;
   - this is also called?? for CPU frequency changes&lt;br /&gt;
&lt;br /&gt;
 - for a large number of architectures, sched_clock is defined as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned long long sched_clock(void)&lt;br /&gt;
{&lt;br /&gt;
     return (unsigned long long)jiffies * (1000000000 / HZ);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   - this only give jiffy accuracy (10 ms, when HZ=100)&lt;br /&gt;
     - this is completely unacceptable for microsecond timings&lt;br /&gt;
&lt;br /&gt;
=== do_gettimeofday() ===&lt;br /&gt;
This is supported all platforms.  Most (??) have sub-jiffy resolution (usecs&lt;br /&gt;
or better?).&lt;br /&gt;
&lt;br /&gt;
- When is this available in boot cycle?&lt;br /&gt;
- What is overhead of call?&lt;br /&gt;
&lt;br /&gt;
I'm assuming the overhead of the call to do_gettimeofday is what has prompted&lt;br /&gt;
the proposal for Fast Timestamps (see next section).&lt;br /&gt;
&lt;br /&gt;
Todd Poynor writes:&lt;br /&gt;
 Re: gettimeofday(), the implementation can vary considerably between&lt;br /&gt;
 architectures.  Generally, I believe architectures read the count of&lt;br /&gt;
 jiffies and also a board-specific microsecond timer source, if any, to&lt;br /&gt;
 add the number of microseconds that have elapsed since the last timer&lt;br /&gt;
 interrupt bumped jiffies.  And a spinlock is expected to be held during&lt;br /&gt;
 this operation.  gettimeofday() is available everywhere, but not all&lt;br /&gt;
 boards necessarily implement microsecond accuracy -- I don't know&lt;br /&gt;
 statistics on this.  You would probably also need some hook to&lt;br /&gt;
 compensate for the place in the boot sequence in which the system time&lt;br /&gt;
 is seeded from the RTC or set via settimeofday, etc.  gettimeofday()&lt;br /&gt;
 isn't setup immediately at kernel startup, but not long afterwards, and&lt;br /&gt;
 it would probably be easy to force the init earlier.&lt;br /&gt;
&lt;br /&gt;
 Directly using the microsecond-level accuracy time source for&lt;br /&gt;
 gettimeofday would be board-specific, so an API wrapper would still be&lt;br /&gt;
 needed.&lt;br /&gt;
&lt;br /&gt;
Greg Ungerer writes:&lt;br /&gt;
 On many platforms (I would think most) it [gettimeofday] gives much better&lt;br /&gt;
 than jiffy resolution.&lt;br /&gt;
&lt;br /&gt;
 Looking around the underlying architecture and platform code&lt;br /&gt;
 in 2.6 it looks like most have code to deal with determining&lt;br /&gt;
 the time reasonably accurately in do_gettimeofday(). Even on&lt;br /&gt;
 the small/slower embedded processors I deal with this is easy&lt;br /&gt;
 to do, and mostly gives resoutions in the usec's range.&lt;br /&gt;
&lt;br /&gt;
 The support do this on an architectural and platform basis&lt;br /&gt;
 is flexible enough and easy to implement I would argue there&lt;br /&gt;
 is more value in implementing a better do_gettimeofday()&lt;br /&gt;
 [if it is only jiffie resolution on your platform of interest]&lt;br /&gt;
 than to have a separate API. A good gettimeofday helps all&lt;br /&gt;
 system timing calculations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fast Timestamp (proposal) ===&lt;br /&gt;
This was a proposal for a mechanism that could quickly record a timer value&lt;br /&gt;
that could be translated into timeofday (timeval) at some later time.&lt;br /&gt;
The purpose of this would be to separate the operations of acquiring&lt;br /&gt;
the timing data, and converting the units into a recognizable form.&lt;br /&gt;
I didn't understand the full context, but I gather that this was decoupled&lt;br /&gt;
to allow for very quick time recording, with later subsequent interpretation,&lt;br /&gt;
possible to preserve performance inside the network stacks.&lt;br /&gt;
&lt;br /&gt;
1) Some kind of fast_timestamp_t, the property is that this stores&lt;br /&gt;
   enough information at time &amp;quot;T&amp;quot; such that at time &amp;quot;T + something&amp;quot;&lt;br /&gt;
   the fast_timestamp_t can be converted what the timeval was back at&lt;br /&gt;
   time &amp;quot;T&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
   For networking, make skb-&amp;gt;stamp into this type.&lt;br /&gt;
&lt;br /&gt;
2) store_fast_timestamp(fast_timestamp_t *)&lt;br /&gt;
&lt;br /&gt;
   For networking, change do_gettimeofday(&amp;amp;skb-&amp;gt;stamp) into&lt;br /&gt;
   store_fast_timestamp(&amp;amp;skb-&amp;gt;stamp)&lt;br /&gt;
&lt;br /&gt;
3) fast_timestamp_to_timeval(arch_timestamp_t *, struct timeval *)&lt;br /&gt;
&lt;br /&gt;
   For networking, change things that read the skb-&amp;gt;stamp value&lt;br /&gt;
   into calls to fast_timestamp_to_timeval().&lt;br /&gt;
&lt;br /&gt;
It is defined that the timeval given by fast_timestamp_to_timeval()&lt;br /&gt;
needs to be the same thing that do_gettimeofday() would have recorded&lt;br /&gt;
at the time store_fast_timestamp() was called.&lt;br /&gt;
&lt;br /&gt;
See http://lwn.net/Articles/61269/&lt;br /&gt;
&lt;br /&gt;
what was final status of this?  David Miller was going to push this&lt;br /&gt;
proposal to arch maintainers for sanity checking.  I don't know &lt;br /&gt;
what happened.&lt;br /&gt;
&lt;br /&gt;
== Other information ==&lt;br /&gt;
=== System Tap timestamp notes ===&lt;br /&gt;
See [[System Tap Timestamp Notes]]&lt;/div&gt;</summary>
		<author><name>RBot</name></author>	</entry>

	</feed>