From a8d22f2306a2aaa406733853b7646b5d7b7486c3 Mon Sep 17 00:00:00 2001 From: Gleb Natapov <gleb@cloudius-systems.com> Date: Sun, 30 Mar 2014 15:44:15 +0300 Subject: [PATCH] mmu: save flags passed during file mapping in a vma. Currently flags are saved for anon_vma, but not for file_vma. Examining those flags in gdb proved to be helpful. Remove _shared since it no longer needed, the information is in the flags. Reviewed-by: Glauber Costa <glommer@cloudius-systems.com> Signed-off-by: Gleb Natapov <gleb@cloudius-systems.com> --- core/mmu.cc | 13 ++++++------- include/osv/mmu.hh | 3 +-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/core/mmu.cc b/core/mmu.cc index 920107ec0..4d7ae9ac5 100644 --- a/core/mmu.cc +++ b/core/mmu.cc @@ -1091,12 +1091,12 @@ void* map_anon(const void* addr, size_t size, unsigned flags, unsigned perm) std::unique_ptr<file_vma> default_file_mmap(file* file, addr_range range, unsigned flags, unsigned perm, off_t offset) { - return std::unique_ptr<file_vma>(new file_vma(range, perm, file, offset, flags & mmu::mmap_shared, new map_file_page_read(file, offset))); + return std::unique_ptr<file_vma>(new file_vma(range, perm, flags, file, offset, new map_file_page_read(file, offset))); } std::unique_ptr<file_vma> map_file_mmap(file* file, addr_range range, unsigned flags, unsigned perm, off_t offset) { - return std::unique_ptr<file_vma>(new file_vma(range, perm, file, offset, flags & mmu::mmap_shared, new map_file_page_mmap(file, offset))); + return std::unique_ptr<file_vma>(new file_vma(range, perm, flags, file, offset, new map_file_page_mmap(file, offset))); } void* map_file(const void* addr, size_t size, unsigned flags, unsigned perm, @@ -1534,11 +1534,10 @@ ulong map_jvm(unsigned char* jvm_addr, size_t size, size_t align, balloon_ptr b) return 0; } -file_vma::file_vma(addr_range range, unsigned perm, fileref file, f_offset offset, bool shared, page_allocator* page_ops) - : vma(range, perm, mmap_small, !shared, page_ops) +file_vma::file_vma(addr_range range, unsigned perm, unsigned flags, fileref file, f_offset offset, page_allocator* page_ops) + : vma(range, perm, flags | mmap_small, !(flags & mmap_shared), page_ops) , _file(file) , _offset(offset) - , _shared(shared) { int err = validate_perm(perm); @@ -1596,7 +1595,7 @@ private: error file_vma::sync(uintptr_t start, uintptr_t end) { - if (!_shared) + if (!has_flags(mmap_shared)) return make_error(ENOMEM); start = std::max(start, _range.start()); end = std::min(end, _range.end()); @@ -1617,7 +1616,7 @@ int file_vma::validate_perm(unsigned perm) return EACCES; } if (perm & perm_write) { - if (_shared && !(_file->f_flags & FWRITE)) { + if (has_flags(mmap_shared) && !(_file->f_flags & FWRITE)) { return EACCES; } } diff --git a/include/osv/mmu.hh b/include/osv/mmu.hh index 74c93f052..ebe3bdd73 100644 --- a/include/osv/mmu.hh +++ b/include/osv/mmu.hh @@ -90,7 +90,7 @@ public: class file_vma : public vma { public: - file_vma(addr_range range, unsigned perm, fileref file, f_offset offset, bool shared, page_allocator *page_ops); + file_vma(addr_range range, unsigned perm, unsigned flags, fileref file, f_offset offset, page_allocator *page_ops); ~file_vma(); virtual void split(uintptr_t edge) override; virtual error sync(uintptr_t start, uintptr_t end) override; @@ -99,7 +99,6 @@ private: f_offset offset(uintptr_t addr); fileref _file; f_offset _offset; - bool _shared; }; ulong map_jvm(unsigned char* addr, size_t size, size_t align, balloon_ptr b); -- GitLab