Thread (112 messages) 112 messages, 9 authors, 2016-05-29
STALE3688d REVIEWED: 1 (0M)

[PATCH kexec-tools 01/32] kdump: mmap() and munmap() only work on page-aligned quantites

From: Pratyush Anand <hidden>
Date: 2016-05-25 06:16:08
Also in: kexec

On Tue, May 3, 2016 at 3:51 PM, Russell King [off-list ref] wrote:
The man page for mmap() and munmap() says that mmap() and munmap()
only works for page-aligned addresses, sizes and offsets.  Arrange
to give these interfaces what they want.
If I read correctly, it talks only offsets to be page aligned.
Signed-off-by: Russell King <redacted>
Anyway, changes looks good to me.
Reviewed-by: Pratyush Anand <redacted>
quoted hunk ↗ jump to hunk
---
 kdump/kdump.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/kdump/kdump.c b/kdump/kdump.c
index 821ee7c..3247a54 100644
--- a/kdump/kdump.c
+++ b/kdump/kdump.c
@@ -25,22 +25,35 @@
 #define MAP_WINDOW_SIZE (64*1024*1024)
 #define DEV_MEM "/dev/mem"

+#define ALIGN_MASK(x,y) (((x) + (y)) & ~(y))
+#define ALIGN(x,y)     ALIGN_MASK(x, (y) - 1)
+
 static void *map_addr(int fd, unsigned long size, off_t offset)
 {
+       unsigned long page_size = getpagesize();
+       unsigned long map_offset = offset & (page_size - 1);
+       size_t len = ALIGN(size + map_offset, page_size);
        void *result;
-       result = mmap(0, size, PROT_READ, MAP_SHARED, fd, offset);
+
+       result = mmap(0, len, PROT_READ, MAP_SHARED, fd, offset - map_offset);
        if (result == MAP_FAILED) {
                fprintf(stderr, "Cannot mmap " DEV_MEM " offset: %llu size: %lu: %s\n",
                        (unsigned long long)offset, size, strerror(errno));
                exit(5);
        }
-       return result;
+       return result + map_offset;
 }

 static void unmap_addr(void *addr, unsigned long size)
 {
+       unsigned long page_size = getpagesize();
+       unsigned long map_offset = (uintptr_t)addr & (page_size - 1);
+       size_t len = ALIGN(size + map_offset, page_size);
        int ret;
-       ret = munmap(addr, size);
+
+       addr -= map_offset;
+
+       ret = munmap(addr, len);
        if (ret < 0) {
                fprintf(stderr, "munmap failed: %s\n",
                        strerror(errno));
--
1.9.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help