diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2023-06-26 14:26:50 +0300 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-07-03 01:59:49 +0200 |
commit | 505ecd7b30fca1dc296205ff3c0dc3aff9d76e12 (patch) | |
tree | f19cb99981292863d2db5ae6a0ad43e559b3acac /vm/vm_page.c | |
parent | d5464d531aaba049a3e734adb80fb0bfd28093a7 (diff) | |
download | gnumach-505ecd7b30fca1dc296205ff3c0dc3aff9d76e12.tar.gz gnumach-505ecd7b30fca1dc296205ff3c0dc3aff9d76e12.tar.bz2 gnumach-505ecd7b30fca1dc296205ff3c0dc3aff9d76e12.zip |
Shrink struct vm_page size
struct vm_page is supposed to be a "small structure", but it takes up 96
bytes on x86_64 (to represent a 4k page). By utilizing bitfields and
strategically reordering members to avoid excessive padding, it can be
shrunk to 80 bytes.
- page_lock and unlock_request only need to store a bitmask of
VM_PROT_READ, VM_PROT_WRITE, and VM_PROT_EXECUTE. Even though the
special values VM_PROT_NO_CHANGE and VM_PROT_NOTIFY are defined, they
are not used for the two struct vm_page members.
- type and seg_index both need to store one of the four possible values
in the range from 0 to 3. Two bits are sufficient for this.
- order needs to store a number from 0 to VM_PAGE_NR_FREE_LISTS (which
is 11), or a special value VM_PAGE_ORDER_UNLISTED. Four bits are
sufficient for this.
No functional change.
Message-Id: <20230626112656.435622-2-bugaevc@gmail.com>
Diffstat (limited to 'vm/vm_page.c')
-rw-r--r-- | vm/vm_page.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/vm/vm_page.c b/vm/vm_page.c index 50916b74..ce37c8aa 100644 --- a/vm/vm_page.c +++ b/vm/vm_page.c @@ -94,7 +94,7 @@ struct vm_page_cpu_pool { * Special order value for pages that aren't in a free list. Such pages are * either allocated, or part of a free block of pages but not the head page. */ -#define VM_PAGE_ORDER_UNLISTED ((unsigned short)-1) +#define VM_PAGE_ORDER_UNLISTED (VM_PAGE_NR_FREE_LISTS + 1) /* * Doubly-linked list of free blocks. @@ -1016,7 +1016,7 @@ vm_page_seg_balance_page(struct vm_page_seg *seg, vm_page_set_type(dest, 0, src->type); memcpy(&dest->vm_page_header, &src->vm_page_header, - sizeof(*dest) - VM_PAGE_HEADER_SIZE); + VM_PAGE_BODY_SIZE); vm_page_copy(src, dest); if (!src->dirty) { |