<div dir="ltr"><div>Hi,<br></div><div><br></div><div>Good to know that!</div><div><br></div><div>Yes, it should be faster than page faulting, although I haven't done the benchmarking yet. And yes, it is not needed to disable all but one CPU. In my current implementation, I use an ordered workqueue to send the data to the mmapped output buffer (where they will be read from from the user space) and that ensures the order of events is kept. May be less than ideal but it currently works quite well with network drivers, the performance overhead is acceptable there.</div>
<div><br></div><div>A subtle drawback may be that the system sees the memory reads and writes made by the code of the driver directly but if the driver uses some other kernel functions, it needs to intercept these calls and determine how they access the memory of interest. Theoretically, it could be less accurate than page fault handling. A page fault happens no matter if the driver accesses the memory directly or via strcpy(), for example. I doubt this would be a big problem for tracking the accesses to ioremapped memory though.</div>
<div><br></div><div>Nevertheless, it is manageable, the system already handles string functions, for example, and reports appropriate events. The handlers for other functions could be added as well. So this just requires a bit more maintenance work.</div>
<div><br></div><div>> Unfortunately, my job exhausts my coding energy, and I haven't even touched mmiotrace in years.</div><div><br></div><div>I understand. I have many other responsibilities too. Code to write, bugs to fix, etc. ;-)</div>
<div><br></div><div>Well, then, when time permits, I'll try to prepare a prototype so that its performance and reliability could be evaluated. Hard to tell what the numbers will be before that.</div><div><br></div><div>
Suggestions, comments and other feedback are welcome of course.</div><div><br></div><div>And, by the way, video drivers do not use SSE and similar instructions when accessing ioremapped memory, do they? </div><div>Such things are rare in the kernel and usually frowned upon so I opted not to handle them so far in KernelStrider. </div>
<div><br></div><div>Regards,</div><div>Eugene</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/10/17 Pekka Paalanen <span dir="ltr"><<a href="mailto:pq@iki.fi" target="_blank">pq@iki.fi</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, 14 Oct 2013 22:45:09 +0400<br>
Eugene Shatokhin <<a href="mailto:euspectre@gmail.com">euspectre@gmail.com</a>> wrote:<br>
<br>
> Hi,<br>
><br>
> There is an interesting TODO item on MmioTraceDeveloper page:<br>
> "kprobes has a generic instruction decoding facility, use that instead of<br>
> homebrewn (or KVM), and use emulation instead of page faulting"<br>
><br>
> Actually, I have done something similar in one of my systems, KernelStrider<br>
> (<a href="http://code.google.com/p/kernel-strider/" target="_blank">http://code.google.com/p/kernel-strider/</a>). The system instruments a kernel<br>
> module when that module is being loaded. The instrumented code executes<br>
> instead of the original one and provides information about the memory<br>
> accesses it makes and the functions it calls. These data are sent to user<br>
> space for further analysis.<br>
><br>
> Currently, I use this system to detect data races in the Linux kernel (and<br>
> have found some). I suppose, it could probably be useful to MmioTrace as<br>
> well.<br>
><br>
> KernelStrider uses an enhanced version of the x86 instruction decoder that<br>
> Kprobes use and relies on binary instrumentation rather than on page<br>
> faults. So, it can track:<br>
> - memory accesses (address and size of the accessed memory as well as the<br>
> access type are recorded)<br>
> - function calls (exported functions and callbacks, one can setup pre- and<br>
> post- handlers for these)<br>
><br>
> Is there any interest in trying this approach to the task of MmioTrace?<br>
><br>
> If so, we can discuss it. When I have time, I could try to create a<br>
> prototype based on KernelStrider's core that tracks the memory accesses<br>
> Mmiotrace needs.<br>
> What do you think?<br>
<br>
</div></div>Hi Eugene,<br>
<br>
that is very interesting! I assume emulating the instructions is<br>
not only cleaner, but also faster than page-faulting, right? Maybe<br>
even more reliable, perhaps up to the point where we would not need<br>
to disable all but one CPU.<br>
<br>
Unfortunately, my job exhausts my coding energy, and I haven't even<br>
touched mmiotrace in years.<br>
<br>
However, let's see if there are interested people on the mailing<br>
lists. I'm CC'ing nouveau, since that is where mmiotrace started,<br>
and dri-devel in the hopes to catch other drivers' reverse<br>
engineers.<br>
<br>
<br>
Thanks,<br>
pq<br>
</blockquote></div><br></div>