<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 01 Feb 2011, at 2:48 PM, vinit dhatrak wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><br><br><div class="gmail_quote">On Tue, Feb 1, 2011 at 3:53 PM, Jason Nymble <span dir="ltr">&lt;<a href="mailto:jason.nymble@gmail.com">jason.nymble@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I was using memset on a reserved area of memory (64bit x86 kernel and system), and noticed that as soon as I exceed a size of 2GB, the function becomes extremely slow, e.g just below 2GB it takes typically about 0.3s, and just above 2GB is takes about 39s to complete...<br>

<br>
I tried tracing the eventual function that is called in the kernel, and I think it resolves to the below (even on x86_64 if I'm not mistaken):<br>
static inline void *__memset_generic(void *s, char c, size_t count)<br>
{<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int d0, d1;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;asm volatile("rep\n\t"<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "stosb"<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : "=&amp;c" (d0), "=&amp;D" (d1)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : "a" (c), "1" (s), "0" (count)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : "memory");<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return s;<br>
}<br>
<br>
size_t is defined as (unsigned long) on my platform, but I suspect the d0 and d1 variables above cause problems because they are int... Is this a kernel bug, or known limitation, or what?<br>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</blockquote></div><br><div><br></div><div>Hi Jason,</div><div><br></div><div>How did you allocate the memory? What is the size of physical memory that is attached to your machine ?</div><div><br></div><div><br></div></blockquote><br></div><div>The machine has 48GB of physical memory, and I reserve a chunk as a kernel param with the&nbsp;memmap=nn[KMG]$ss[KMG] syntax (see Documentation/kernel-parameters.txt), e.g. memmap=8G$4G to reserve an 8GB chunk of mem starting at offset 4GB. Then in the driver I simply use ioremap_cache() with the physical base offset and size I require to get a kernel virtual address. If I do that across any 4GB physical boundary, then access to that memory via that kernel virtual address pointer is extremely slow.</div><div><br></div></body></html>