test/jdk/java/nio/MappedByteBuffer/PmemTest.java
author adinn
Tue, 20 Aug 2019 10:11:53 +0100
changeset 57804 9b7b9f16dfd9
permissions -rw-r--r--
8224974: Implement JEP 352 Summary: Non-Volatile Mapped Byte Buffers Reviewed-by: alanb, kvn, bpb, gromero, darcy, shade, bulasevich, dchuyko
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57804
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     1
/*
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     4
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     8
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    13
 * accompanied this code).
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    14
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    18
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    21
 * questions.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    22
 */
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    23
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    24
/*
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    25
 * This test is manually run because it requires an NVRAM device to be
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    26
 * mapped as DAX file system or, at least, to be simulated by a
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    27
 * volatile RAM mapped file system. Also, on AArch64 it requires an
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    28
 * ARMV8.2 CPU which implements the dc CVAP instruction (CPU feature
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    29
 * dcpop) and an OS that makes it available from user space.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    30
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    31
 * If the test runs on such a host without throwing an exception then
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    32
 * that confirms that NVRAM-backed byte buffers can be allocated,
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    33
 * updated and forced via cache line writeback.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    34
 */
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    35
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    36
/*
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    37
 * How to run this test:
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    38
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    39
 * Ideally this test should be run on a x86_64/amd64 or aarch64 host
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    40
 * fitted with an NVRAM memory device. The NVRAM should appear as
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    41
 * /dev/pmem0 or some equivalent DAX file device. The file device
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    42
 * should be mounted at /mnt/pmem with a directory tmp created
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    43
 * directly under that mount point with a+rwx access.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    44
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    45
 * It is possible to run the test on x86_64 using a volatile RAM
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    46
 * backed device to simulate NVRAM, even though this does not provide
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    47
 * any guarantee of persistence of data across program runs. For the
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    48
 * latter case the following instructions explain how to set up the
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    49
 * simulated NVRAM device.
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    50
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    51
 * https://developers.redhat.com/blog/2016/12/05/configuring-and-using-persistent-memory-rhel-7-3/
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    52
 * https://nvdimm.wiki.kernel.org/
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    53
 * TL;DR: add "memmap=1G!4G" to /etc/default/grub,
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    54
 *        then grub2-mkconfig -o /boot/grub2/grub.cfg and reboot
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    55
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    56
 *  ndctl create-namespace  * -f -e namespace0.0 -m memory -M mem
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    57
 *  mkdir /mnt/pmem
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    58
 *  mkfs.xfs -f /dev/pmem0; mount -o dax /dev/pmem0 /mnt/pmem/
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    59
 *  mkdir /mnt/pmem/test; chmod a+rwx /mnt/pmem/test
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    60
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    61
 * Now run the test program
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    62
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    63
 *  java PmemTest
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    64
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    65
 * or
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    66
 *
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    67
 *  make test TEST=jdk/java/nio/MappedByteBuffer/PmemTest.java
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    68
*/
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    69
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    70
/* @test
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    71
 * @summary Testing NVRAM mapped byte buffer support
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    72
 * @run main/manual PmemTest
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    73
 * @requires (os.family == "linux")
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    74
 * @requires ((os.arch == "x86_64")|(os.arch == "amd64")|(os.arch == "aarch64"))
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    75
 */
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    76
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    77
import java.io.File;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    78
import java.nio.MappedByteBuffer;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    79
import java.nio.channels.FileChannel;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    80
import java.nio.file.Files;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    81
import java.nio.file.Path;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    82
import java.nio.file.StandardOpenOption;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    83
import java.util.EnumSet;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    84
import java.util.List;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    85
import jdk.nio.mapmode.ExtendedMapMode;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    86
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    87
import java.lang.management.ManagementFactory;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    88
import java.lang.management.BufferPoolMXBean;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    89
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    90
public class PmemTest {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    91
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    92
    public static final int K = 1024;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    93
    public static final int NUM_KBS = 16;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    94
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    95
    public static void main(String[] args) throws Exception {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    96
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    97
        System.out.println("test");
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    98
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
    99
        String dir = "/tmp"; // mapSync should fail
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   100
        dir = "/mnt/pmem/test"; // mapSync should work, since fs mount is -o dax
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   101
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   102
        Path path = new File(dir, "pmemtest").toPath();
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   103
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   104
        FileChannel fileChannel = (FileChannel) Files
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   105
                .newByteChannel(path, EnumSet.of(
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   106
                        StandardOpenOption.READ,
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   107
                        StandardOpenOption.WRITE,
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   108
                        StandardOpenOption.CREATE));
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   109
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   110
        MappedByteBuffer mappedByteBuffer = fileChannel.map(ExtendedMapMode.READ_WRITE_SYNC, 0, NUM_KBS * K);
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   111
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   112
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   113
        dumpBufferPoolBeans();
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   114
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   115
        // for (int loops = 0; loops < 1000; loops++) {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   116
        for (int loops = 0; loops < 100; loops++) {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   117
            int base = K * (loops % NUM_KBS);
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   118
            for (int i = 0; i < K ; i++) {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   119
                for (int j = 0; j < K ;j++) {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   120
                    testBuffer(mappedByteBuffer, base, (i << 3) + j);
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   121
                    commitBuffer(mappedByteBuffer, base);
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   122
                }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   123
            }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   124
        }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   125
        dumpBufferPoolBeans();
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   126
    }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   127
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   128
    public static void testBuffer(MappedByteBuffer mappedByteBuffer, int base, int start) {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   129
        for (int k = 0; k < 8; k++) {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   130
            int idx = (start + k) % K;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   131
            byte z = mappedByteBuffer.get(base + idx);
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   132
            z++;
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   133
            mappedByteBuffer.put(base + idx, z);
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   134
        }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   135
    }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   136
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   137
    public static void commitBuffer(MappedByteBuffer mappedByteBuffer, int base)
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   138
    {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   139
        mappedByteBuffer.force(base, K);
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   140
    }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   141
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   142
    public static void dumpBufferPoolBeans()
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   143
    {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   144
        List<BufferPoolMXBean> beansList = ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   145
        for (BufferPoolMXBean bean : beansList) {
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   146
            System.out.println("BufferPoolMXBean {" +
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   147
                               "\n\tname:          " + bean.getName() +
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   148
                               "\n\tcount:         " + bean.getCount() +
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   149
                               "\n\ttotalCapacity: " + bean.getTotalCapacity() +
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   150
                               "\n\tmemoryUsed:    " + bean.getMemoryUsed() +
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   151
                               "\n}");
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   152
        }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   153
    }
9b7b9f16dfd9 8224974: Implement JEP 352
adinn
parents:
diff changeset
   154
}