RFR: 8245000: Windows GDI functions don't support large pages

Stefan Karlsson stefan.karlsson at oracle.com
Fri May 15 17:47:46 UTC 2020


Hi all,

Please review this patch to turn off -XX:+UseLargePages as long as 
Windows GDI functions don't work with large pages.

https://cr.openjdk.java.net/~stefank/8245000/webrev.00.cleanup
https://cr.openjdk.java.net/~stefank/8245000/webrev.01.workaround
https://cr.openjdk.java.net/~stefank/8245000/webrev.all/

The patches build upon the changes in:
8245002: Windows GDI functions don't support NUMA interleaving
https://mail.openjdk.java.net/pipermail/hotspot-dev/2020-May/041798.html

During the investigation of JDK-8240654 
<https://bugs.openjdk.java.net/browse/JDK-8240654> it was found that 
some of the Windows GDI functions don't work with large pages 
(-XX:+UseLargePages). This causes severe repaint issues.

The problem can easily be seen with the Java2D demos, where the drawn UI 
is grayed out instead of containing all relevant components.

This can be reproduced by running building J2DBench and running:
java -Xmx1g -Xms1g -XX:+UseLargePages -Dsun.java2d.opengl=False 
-Dsun.java2d.d3d=False -jar dist/J2DBench.jar

The -Dsun.java2d.d3d property is used to ensure that that java2d doesn't 
enable the alternative, D3D implementation instead of GDI. 
-Dsun.java2d.opengl is turned off for the same reason.

The cleanup patch simplifies request_lock_memory_privilege and 
large_page_init, to make it easier to insert the necessary checks.

The code first checks if memory allocated with large pages can be used 
by GDI functions. If this check fails it forcefully turns off 
-XX:+UseLargePages.

Just like with JDK-8245002, the intention is that as long as the GDI 
functions can't use large pages, the -XX:+UseLargePages flag will be 
turned off. If Microsoft changes the GDI code, so that it works with 
large pages, then the proposed patch will automatically allow the flag 
to be enabled.

There's a second case that we need to consider for large pages. If the 
GDI functions start to allow large pages, we have a flag 
(-XX:+UseLargePagesIndividualAllocation) that reserves and commits large 
pages in page-sized granules. This could cause the same 
multi-reservation problem described in JDK-8245002. I've also added a 
check for that, and turn off -XX:+UseLargePagesIndividualAllocation if 
it fails.

I've run this through tier1-3 and also tested this manually. I've 
manually turned off the different checks to verify that it turns on the 
two flags.

Thanks,
StefanK


More information about the hotspot-dev mailing list