Userspace pages in UC mode

Pranay Srivastava pranjas at gmail.com
Fri Sep 11 21:12:04 EDT 2015


Hi Sabela,

On Fri, Sep 11, 2015 at 8:29 PM, Sabela Ramos Garea
<sabelaraga at gmail.com> wrote:
> Sorry, little mistake copypasting and cleaning. The pages and vma
> structs should look like that:
>
> struct page *pages --> struct page *pages[MAX_PAGES];
> struct vma_area_struct *vma --> struct vma_area_struct *vma[MAX_PAGES];
>
> Where MAX_PAGES is defined to 5.
>
> Sabela.
>
> 2015-09-11 16:07 GMT+02:00 Sabela Ramos Garea <sabelaraga at gmail.com>:
>> Dear all,
>>
>> For research purposes I need some userspace memory pages to be in
>> uncacheable mode. I am using two different Intel architectures (Sandy
>> Bridge and Haswell) and two different kernels (2.6.32-358 and
>> 3.19.0-28).
>>
>> The non-temporal stores from Intel assembly are not a valid solution
>> so I am programming a kernel module that gets a set of pages from user
>> space reserved with posix_memalign (get_user_pages) and then sets them
>> as uncacheable (I have tried set_pages_uc and set_pages_array_uc).
>> When I use one page, the access times are not very coherent and with
>> more than one page the module crashes (in both architectures and both
>> kernels).
>>
>> I wonder if I am using the correct approach or if I have to use kernel
>> space pages in order to work with uncacheable memory. Or if I have to
>> remap the memory. Just in case it makes it clearer, I am attaching the
>> relevant lines of a kernel module function that should set the pages
>> as uncacheable. (This function is the .write of a misc device; count
>> is treated as the number of pages).
>>
>> Best and Thanks,
>>
>> Sabela.
>>
>> struct page *pages; //defined outside in order to be able to set them
>> to WB in the release function.
>> int numpages;
>>
>> static ssize_t setup_memory(struct file *filp, const char __user *buf,
>> size_t count, loff_t * ppos)
>> {
>>         int res;
>>         struct vm_area_struct *vmas;
>>
shouldn't this be rounded this up?
>>         numpages = count/4096;
>>
>>         down_read(&current->mm->mmap_sem);
>>         res = get_user_pages(current, current->mm,
>>                                 (unsigned long) buf,
>>                                 numpages, /* Number of pages */
>>                                 0, /* Do want to write into it */
>>                                 1, /* do force */
>>                                 &pages,
>>                                 &vmas);
>>         up_read(&current->mm->mmap_sem);
>>
>>         numpages=res;
>>
>>         if (res > 0) {
>>                 set_pages_uc(pages, numpages); /* Uncached */

what about high-mem pages. set_memory_uc does __pa, so perhaps that's
the reason for your kernel oops?

>>                 printk("Write: %d pages set as uncacheable\n",numpages);
>>         }
>>         else{
>>                 pr_err("Couldn't get pages to set them as UC :(\n");
>>                 return -EAGAIN;
>>         }
>> }
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



-- 
        ---P.K.S



More information about the Kernelnewbies mailing list