]> mj.ucw.cz Git - libucw.git/commitdiff
On 64-bit architectures, partmap is just an mmap.
authorMartin Mares <mj@ucw.cz>
Mon, 16 Jan 2006 19:41:56 +0000 (19:41 +0000)
committerMartin Mares <mj@ucw.cz>
Mon, 16 Jan 2006 19:41:56 +0000 (19:41 +0000)
On all architectures, it calls madvise() to optimize for sequential access.

lib/autoconf.cfg
lib/partmap.c
lib/partmap.h

index 4485db746ae9678f6f7e9107bbc0e08c21277f0b..3c81f034b021816b350b6c5ae30d0fcd089cf5d7 100644 (file)
@@ -170,6 +170,9 @@ if (IsSet("CONFIG_DEBUG")) {
        Append("LOPT" => "-s");
 }
 
+# Decide how will lib/partmap.c work
+Set("PARTMAP_IS_MMAP") if IsSet("CPU_64BIT_POINTERS");
+
 # If debugging memory allocations:
 #LIBS+=-lefence
 #CDEBUG+=-DDEBUG_DMALLOC
index 60ec168c41ae37f2b2604644c1fc3a95b3a2f3a7..49f12322492d60fc261260ebeec148aa28182e96 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     UCW Library -- Mapping of File Parts
  *
- *     (c) 2003 Martin Mares <mj@ucw.cz>
+ *     (c) 2003--2006 Martin Mares <mj@ucw.cz>
  *     (c) 2003--2005 Robert Spalek <robert@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
 #include <sys/mman.h>
 #include <sys/user.h>
 
+#ifdef CONFIG_PARTMAP_IS_MMAP
+#define PARTMAP_WINDOW ~(size_t)0
+#else
 #ifdef TEST
 #define PARTMAP_WINDOW 4096
 #else
 #define PARTMAP_WINDOW 16777216
 #endif
+#endif
 
 struct partmap *
 partmap_open(byte *name, int writeable)
@@ -37,6 +41,9 @@ partmap_open(byte *name, int writeable)
   if ((p->file_size = sh_seek(p->fd, 0, SEEK_END)) < 0)
     die("lseek(%s): %m", name);
   p->writeable = writeable;
+#ifdef CONFIG_PARTMAP_IS_MMAP
+  partmap_load(p, 0, p->file_size);
+#endif
   return p;
 }
 
@@ -62,7 +69,7 @@ partmap_load(struct partmap *p, sh_off_t start, uns size)
     munmap(p->start_map, p->end_off - p->start_off);
   sh_off_t end = start + size;
   sh_off_t win_start = start/PAGE_SIZE * PAGE_SIZE;
-  uns win_len = PARTMAP_WINDOW;
+  size_t win_len = PARTMAP_WINDOW;
   if ((sh_off_t) (win_start+win_len) > p->file_size)
     win_len = ALIGN(p->file_size - win_start, PAGE_SIZE);
   if ((sh_off_t) (win_start+win_len) < end)
@@ -72,6 +79,7 @@ partmap_load(struct partmap *p, sh_off_t start, uns size)
     die("mmap failed at position %Ld: %m", (long long)win_start);
   p->start_off = win_start;
   p->end_off = win_start+win_len;
+  madvise(p->start_map, win_len, MADV_SEQUENTIAL);
 }
 
 #ifdef TEST
index b5c480996e988945726f6304c0135829f2016f96..1be70ded414e3977e2863be99b8c049120da0c32 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     UCW Library -- Mapping of File Parts
  *
- *     (c) 2003 Martin Mares <mj@ucw.cz>
+ *     (c) 2003--2006 Martin Mares <mj@ucw.cz>
  *     (c) 2003--2005 Robert Spalek <robert@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
@@ -25,18 +25,22 @@ sh_off_t partmap_size(struct partmap *p);
 void partmap_load(struct partmap *p, sh_off_t start, uns size);
 
 static inline void *
-partmap_map(struct partmap *p, sh_off_t start, uns size)
+partmap_map(struct partmap *p, sh_off_t start, uns size UNUSED)
 {
+#ifndef CONFIG_PARTMAP_IS_MMAP
   if (unlikely(!p->start_map || start < p->start_off || (sh_off_t) (start+size) > p->end_off))
     partmap_load(p, start, size);
+#endif
   return p->start_map + (start - p->start_off);
 }
 
 static inline void *
-partmap_map_forward(struct partmap *p, sh_off_t start, uns size)
+partmap_map_forward(struct partmap *p, sh_off_t start, uns size UNUSED)
 {
+#ifndef CONFIG_PARTMAP_IS_MMAP
   if (unlikely((sh_off_t) (start+size) > p->end_off))
     partmap_load(p, start, size);
+#endif
   return p->start_map + (start - p->start_off);
 }