Wei,
I have been hacking at this, too, since I
am interested in trying 1GB pages to see what they can do. After I dug myself
into a hole, I restarted from the beginning and am trying a different approach
than modifying xc_hvm_build.c: modify populate_physmap()
to opportunistically allocate large pages, if possible. I just thought I'd
mention it.
John Byrne
I implemented a
preliminary version of HAP large page support. My testings showed that
32bit PAE and 64bit worked well. Also I saw decent performance improvement
for certain benchmarks.
So before I go too far, I
send this patch to community for reviews/comments. This patch goes with
xen-unstable changeset 16281. I will redo it after collecting all
ideas.
Thanks,
-Wei
============
DESIGN
IDEAS:
1. Large page
requests
- xc_hvm_build.c requests
large page (2MB for now) while starting guests
- memory.c handles large
page requests. If it can not handle it, falls back to 4KB
pages.
2. P2M
table
- P2M table takes page size
order as a parameter; It builds P2M table (setting PSE bit, etc.) according to
page size.
- Other related functions
(such as p2m_audit()) handles the table based on page size
too.
- Page
split/merge
** Large page will be split
into 4KB page in P2M table if needed. For instance, if set_p2m_entry() handles
4KB page but finds PSE/PRESENT bits are on, it will further split large page to
4KB pages.
** There is NO merge from
4KB pages to large page. Since large page is only used at the very beginning,
guest_physmap_add(), this is OK for now.
3. HAP
- To access the PSE bit, L2
pages of P2M table is installed in linear mapping on SH_LINEAR_PT_VIRT_START. We
borrow this address space since it was not used.
4. gfn_to_mfn translation
(P2M)
- gfn_to_mfn_foreign()
traverses P2M table and handles address translation correctly based on PSE
bit.
- gfn_to_mfn_current()
accesses SH_LINEAR_PT_VIRT_START to check PSE bit. If is on, we handle
translation using large page. Otherwise, it falls back to normal
RO_MPT_VIRT_START address space to access P2M L1 pages.
5. M2P
translation
- Same as before, M2P
translation still happens on 4KB level.
AREAS NEEDS
COMMENTS:
1. Large page for 32bit
mode
- 32bit use 4MB for large
page. This is very annoying for xc_hvm_build.c. I don't want to create another
4MB page_array for it.
- Because of this, this
area has not been tested very well. I expect changes soon.
2. Shadow
paging
- This implementation will
affect shadow mode, especially at xc_hvm_build.c and
memory.c.
- Where and how to avoid
affecting shadow?
3. Turn it
on/off
- Do we want to turn this
feature on/off through option (kernel option or anything
else)?
4. Other missing
areas?
===========
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|