summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@schwinge.name>2012-03-21 16:22:59 +0100
committerThomas Schwinge <thomas@schwinge.name>2012-03-21 16:22:59 +0100
commitf76a460375e906ad20de197c506ff47b42dc6b94 (patch)
treeac8de4c4b0cb9a773e3b8fc73d3a5946915ad79f
parent03f16b2498fa93bd69da9baa6d45d29f08bea45e (diff)
glibc/mmap: New.
-rw-r--r--glibc.mdwn6
-rw-r--r--glibc/mmap.mdwn82
-rw-r--r--open_issues/git_nfs_mmap.mdwn9
-rw-r--r--open_issues/libnetfs_io_map.mdwn15
4 files changed, 107 insertions, 5 deletions
diff --git a/glibc.mdwn b/glibc.mdwn
index dad3c42..701b7bf 100644
--- a/glibc.mdwn
+++ b/glibc.mdwn
@@ -1,5 +1,5 @@
-[[!meta copyright="Copyright © 2007, 2008, 2010, 2011 Free Software Foundation,
-Inc."]]
+[[!meta copyright="Copyright © 2007, 2008, 2010, 2011, 2012 Free Software
+Foundation, Inc."]]
[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
id="license" text="Permission is granted to copy, distribute and/or modify this
@@ -78,6 +78,8 @@ Some of these are well-known as [[UNIX]] [[system call]]s.
* [[fork]]
+ * [[mmap]]
+
* [[poll]]
diff --git a/glibc/mmap.mdwn b/glibc/mmap.mdwn
new file mode 100644
index 0000000..d0c492e
--- /dev/null
+++ b/glibc/mmap.mdwn
@@ -0,0 +1,82 @@
+[[!meta copyright="Copyright © 2012 Free Software Foundation, Inc."]]
+
+[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
+id="license" text="Permission is granted to copy, distribute and/or modify this
+document under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no Invariant
+Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license
+is included in the section entitled [[GNU Free Documentation
+License|/fdl]]."]]"""]]
+
+There are two implementations of `mmap` for GNU Hurd:
+`sysdeps/mach/hurd/mmap.c` (main implementation) and
+`sysdeps/mach/hurd/dl-sysdep.c` (*Minimal mmap implementation sufficient for
+initial loading of shared libraries.*).
+
+ * `MAP_COPY`
+
+ What exactly is that? `elf/dl-load.c` has some explanation.
+ <http://lkml.indiana.edu/hypermail/linux/kernel/0110.1/1506.html>
+
+ It is only handled in `dl-sysdep.c`, when `flags & (MAP_COPY|MAP_PRIVATE)`
+ is used for `vm_map`'s `copy` parameter, and `mmap.c` uses `! (flags &
+ MAP_SHARED)` instead.
+
+
+# `io_map` Failure
+
+[[libnetfs: `io_map`|open_issues/libnetfs_io_map]] issue.
+
+[[!tag open_issue_glibc]]
+
+Review of `mmap` usage in generic bits of glibc, based on
+a1bcbd4035ac2483dc10da150d4db46f3e1744f8 (2012-03-11), listing these cases
+where failure (due to `io_map` failing; that is, invocations where a `fd` is
+passed) is not properly handled.
+
+`catgets/open_catalog.c`, `iconv/gconv_cache.c`, `intl/loadmsgcat.c`,
+`locale/loadlocale.c` have fallback code for the `MAP_FAILED` case.
+
+[[tschwinge]]'s current plan is to make the following cases do the same (if
+that is possible); probably by introducing a generic `mmap_or_read` function,
+that first tries `mmap` (and that will succeed on Linux-based systems and also
+on Hurd-based, if it's backed by [[hurd/libdiskfs]]), and if that fails tries
+`mmap` on anonymous memory and then fills it by `read`ing the required data --
+but this would probably means all :-/ `PT_LOAD` segments for the ELF case? In
+parallel, it should be researched how Linux (or any other kernel) implements
+`mmap` on NFS and similar file systems, and then implement the same in
+[[hurd/libnetfs]]/[[hurd/translator/nfs]].
+
+ * `elf/cache.c`
+
+ * `elf/dl-load.c`
+
+ * `elf/dl-misc.c`
+
+ * `elf/dl-profile.c`
+
+ * `elf/readlib.c`
+
+ * `elf/sprof.c`
+
+ * `locale/loadarchive.c`
+
+ * `locale/programs/locale.c`
+
+ * `locale/programs/locarchive.c`
+
+ * `nscd/connections.c`
+
+ * `nscd/nscd_helper.c`
+
+ * `nss/makedb.c`
+
+ * `nss/nss_db/db-open.c`
+
+ * Omitted:
+
+ * `nptl/`
+
+ * `sysdeps/unix/sparc/`
+
+ * `sysdepts/unix/sysv/linux/`
diff --git a/open_issues/git_nfs_mmap.mdwn b/open_issues/git_nfs_mmap.mdwn
index b7e8649..2106702 100644
--- a/open_issues/git_nfs_mmap.mdwn
+++ b/open_issues/git_nfs_mmap.mdwn
@@ -1,4 +1,4 @@
-[[!meta copyright="Copyright © 2011 Free Software Foundation, Inc."]]
+[[!meta copyright="Copyright © 2011, 2012 Free Software Foundation, Inc."]]
[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
id="license" text="Permission is granted to copy, distribute and/or modify this
@@ -8,7 +8,7 @@ Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license
is included in the section entitled [[GNU Free Documentation
License|/fdl]]."]]"""]]
-[[!tag open_issue_hurd open_issue_porting]]
+[[!tag open_issue_porting]]
$ git-new-workdir /media/kepler-data/home/thomas/tmp/source/binutils/git master master
fatal: Out of memory? mmap failed: No such device
@@ -46,3 +46,8 @@ fails, and it isn't prepared to cope with that:
64->proc_mark_exit_request (32768 0) = 0
task3741-> 2008 () = 0
Child 3741 exited with 128
+
+This is the [[libnetfs: `io_map`|open_issues/libnetfs_io_map]] issue.
+
+There is a `NO_MMAP` conditional in Git's source code, but it is a compile-time
+conditional.
diff --git a/open_issues/libnetfs_io_map.mdwn b/open_issues/libnetfs_io_map.mdwn
index b340de9..9a6d816 100644
--- a/open_issues/libnetfs_io_map.mdwn
+++ b/open_issues/libnetfs_io_map.mdwn
@@ -12,7 +12,16 @@ License|/fdl]]."]]"""]]
[[!tag open_issue_hurd]]
-This hampers [[hurd/translator/nfs]] usability, for example.
+This hampers [[hurd/translator/nfs]] usability, for example:
+
+ $ fsysopts ./
+ /hurd/nfs [...]
+ $ cp -a /bin/true ./
+ cp: failed to preserve authorship for `./true': Operation not supported
+ $ ./true
+ $ /lib/ld.so /bin/true
+ $ /lib/ld.so $PWD/true
+ [...]/true: error while loading shared libraries: [...]/true: failed to map segment from shared object: Error 1073741869
IRC, freenode, #hurd, 2012-03-14:
@@ -28,3 +37,7 @@ IRC, freenode, #hurd, 2012-03-14:
for network file systems
<civodul> which is why it doesn't have it
<civodul> the GCS says "thou shall not require mmap" ;-)
+
+ * [[glibc/mmap]]
+
+ * <http://lists.gnu.org/archive/html/bug-hurd/2001-10/msg00306.html>