lkml.org 
[lkml]   [1998]   [Dec]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: PG_clean for shared mapping smart syncing
On Sat, 19 Dec 1998, Andrea Arcangeli wrote:

>previous update_shared_mappings() patch. So I think we could drop
>completly my last patch and return to my old code and solve the problem to
>handle the mmap_sem locking right...

Here the remainings cleanup/fixes...

Index: mm//filemap.c
===================================================================
RCS file: /var/cvs/linux/mm/filemap.c,v
retrieving revision 1.1.1.1.2.16
diff -u -r1.1.1.1.2.16 filemap.c
--- filemap.c 1998/12/19 16:38:04 1.1.1.1.2.16
+++ linux/mm/filemap.c 1998/12/19 16:43:44
@@ -30,6 +30,10 @@
* Shared mappings now work. 15.8.1995 Bruno.
*/

+/*
+ * Some cleanup of filemap_sync_pte(). 19 Dec 1998, Andrea Arcangeli
+ */
+
unsigned long page_cache_size = 0;
struct page * page_hash_table[PAGE_HASH_SIZE];

@@ -1210,8 +1214,9 @@
unsigned long address, unsigned int flags)
{
pte_t pte = *ptep;
- unsigned long page;
+ unsigned long page = pte_page(pte);
int error;
+ struct page * map = mem_map + MAP_NR(page);

if (!(flags & MS_INVALIDATE)) {
if (!pte_present(pte))
@@ -1222,8 +1227,7 @@
flush_cache_page(vma, address);
set_pte(ptep, pte_mkclean(pte));
flush_tlb_page(vma, address);
- page = pte_page(pte);
- atomic_inc(&mem_map[MAP_NR(page)].count);
+ atomic_inc(&map->count);
} else {
if (pte_none(pte))
return 0;
@@ -1234,14 +1238,13 @@
swap_free(pte_val(pte));
return 0;
}
- page = pte_page(pte);
if (!pte_dirty(pte) || flags == MS_INVALIDATE) {
- free_page(page);
+ __free_page(map);
return 0;
}
}
error = filemap_write_page(vma, address - vma->vm_start + vma->vm_offset, page);
- free_page(page);
+ __free_page(map);
return error;
}

Index: mm//memory.c
===================================================================
RCS file: /var/cvs/linux/mm/memory.c,v
retrieving revision 1.1.1.1.2.3
diff -u -r1.1.1.1.2.3 memory.c
--- memory.c 1998/12/19 16:38:04 1.1.1.1.2.3
+++ linux/mm/memory.c 1998/12/19 16:42:25
@@ -33,6 +33,10 @@
* Idea by Alex Bligh (alex@cconcepts.co.uk)
*/

+/*
+ * Some fix and cleanup to of do_wp_page(). 19 Dec 1998, Andrea Arcangeli
+ */
+
#include <linux/mm.h>
#include <linux/mman.h>
#include <linux/swap.h>
@@ -623,11 +627,10 @@
unsigned long address, pte_t *page_table)
{
pte_t pte;
- unsigned long old_page, new_page;
+ unsigned long old_page;
struct page * page_map;

pte = *page_table;
- new_page = __get_free_page(GFP_USER);
/* Did someone else copy this page for us while we slept? */
if (pte_val(*page_table) != pte_val(pte))
goto end_wp_page;
@@ -645,11 +648,13 @@
* Do we need to copy?
*/
if (is_page_shared(page_map)) {
+ unsigned long new_page;
unlock_kernel();
+ new_page = __get_free_page(GFP_USER);
if (!new_page)
return 0;

- if (PageReserved(mem_map + MAP_NR(old_page)))
+ if (PageReserved(page_map))
++vma->vm_mm->rss;
copy_cow_page(old_page,new_page);
flush_page_to_ram(old_page);
@@ -670,16 +675,15 @@
flush_cache_page(vma, address);
set_pte(page_table, pte_mkdirty(pte_mkwrite(pte)));
flush_tlb_page(vma, address);
+ return 1;
end_wp_page:
- if (new_page)
- free_page(new_page);
+ unlock_kernel();
return 1;

bad_wp_page:
+ unlock_kernel();
printk("do_wp_page: bogus page at address %08lx (%08lx)\n",address,old_page);
send_sig(SIGKILL, tsk, 1);
- if (new_page)
- free_page(new_page);
return 0;
}


Andrea Arcangeli


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:46    [W:0.713 / U:0.172 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site