Userspace pages in UC mode

Sabela Ramos Garea sabelaraga at gmail.com
Fri Sep 11 10:07:17 EDT 2015


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;

        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 */
                printk("Write: %d pages set as uncacheable\n",numpages);
        }
        else{
                pr_err("Couldn't get pages to set them as UC :(\n");
                return -EAGAIN;
        }
}



More information about the Kernelnewbies mailing list