@@ -31,7 +31,7 @@ module_param(name, charp, S_IRUGO); ///< Param desc. charp = char ptr, S_IRUGO c
3131MODULE_PARM_DESC (name , "The name to display in /var/log/kern.log" ); ///< parameter description
3232
3333struct fw_iso_buffer {
34- struct page * * pages ;
34+ char * * pages ;
3535 int page_count ;
3636};
3737
@@ -43,10 +43,16 @@ struct client {
4343static 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