Skip to content

Commit f40a293

Browse files
committed
set memory uncached
1 parent f010489 commit f40a293

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

hello.c

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module_param(name, charp, S_IRUGO); ///< Param desc. charp = char ptr, S_IRUGO c
3131
MODULE_PARM_DESC(name, "The name to display in /var/log/kern.log"); ///< parameter description
3232

3333
struct fw_iso_buffer {
34-
struct page **pages;
34+
char **pages;
3535
int page_count;
3636
};
3737

@@ -43,10 +43,16 @@ struct client {
4343
static void fw_iso_buffer_destroy(struct fw_iso_buffer *buffer)
4444
{
4545
int i;
46-
4746
printk(KERN_INFO "Freeing pages\n");
47+
4848
for (i = 0; i < buffer->page_count; i++)
49-
__free_page(buffer->pages[i]);
49+
if (buffer->pages[i]) {
50+
char *addr = buffer->pages[i];
51+
52+
set_memory_wb((unsigned long)addr, 1);
53+
ClearPageReserved(virt_to_page(addr));
54+
free_page((unsigned long)addr);
55+
}
5056

5157
kfree(buffer->pages);
5258
buffer->pages = NULL;
@@ -59,17 +65,22 @@ static int fw_iso_buffer_alloc(struct fw_iso_buffer *buffer, int page_count)
5965
int i;
6066

6167
printk(KERN_INFO "Allocating %i pages\n", page_count);
62-
buffer->page_count = 0;
63-
buffer->pages = kmalloc(page_count * sizeof(buffer->pages[0]), GFP_KERNEL);
68+
buffer->page_count = page_count;
69+
buffer->pages = kzalloc(page_count * sizeof(buffer->pages[0]), GFP_KERNEL);
6470
if (buffer->pages == NULL)
6571
return -ENOMEM;
6672

6773
for (i = 0; i < page_count; i++) {
68-
buffer->pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO);
69-
if (buffer->pages[i] == NULL)
74+
char *addr = (char*) __get_free_page(GFP_KERNEL);
75+
if (addr == NULL)
76+
break;
77+
78+
buffer->pages[i] = addr;
79+
SetPageReserved(virt_to_page(addr));
80+
if (set_memory_uc((unsigned long)addr, 1))
7081
break;
7182
}
72-
buffer->page_count = i;
83+
7384
if (i < page_count) {
7485
fw_iso_buffer_destroy(buffer);
7586
return -ENOMEM;
@@ -87,7 +98,7 @@ static int fw_iso_buffer_map_vma(struct fw_iso_buffer *buffer,
8798

8899
uaddr = vma->vm_start;
89100
for (i = 0; i < buffer->page_count; i++) {
90-
err = vm_insert_page(vma, uaddr, buffer->pages[i]);
101+
err = vm_insert_page(vma, uaddr, virt_to_page(buffer->pages[i]));
91102
if (err)
92103
return err;
93104

0 commit comments

Comments
 (0)