Re: [PATCH v4 2/4] generic: test mmap io fom DAX to non-DAX

Dan Williams
2017-04-17T14:14:34Z

On Mon, Apr 17, 2017 at 12:14 AM, Xiong Zhou <xzhou@redhat.com> wrote:
> Mount TEST_DEV as non-DAX, SCRATCH_DEV as DAX, then
> do mmap DIO from DAX to non-DAX.
>
> This test is split from generic/413. Since DIO from DAX
> to non-DAX is only supported/doable when device underneath
> has memory(struct page) backend.
>
> By ndctl looking at SCRATCH_DEV, skip this test if it is
> not in "memory mode".
>
> Adding helper to check pmem device status, which requires new
> PROGs ndctl to tweaking pmem devices and jq to parse ndctl's
> JSON format outputs.
>
> Signed-off-by: Xiong Zhou <xzhou@redhat.com>
> ---
> common/rc | 45 ++++++++++++++++++++
> tests/generic/423 | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/generic/423.out | 2 +
> tests/generic/group | 1 +
> 4 files changed, 161 insertions(+)
> create mode 100755 tests/generic/423
> create mode 100644 tests/generic/423.out
>
> diff --git a/common/rc b/common/rc
> index 78a2101..73ac79c 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -3151,6 +3151,51 @@ _require_chattr()
> rm -f $TEST_DIR/syscalltest.out
> }
>
> +# Require test/scratch device nvdimm and having specific
> +# arttibute key/value we need.
> +#
> +# This is designed to get attr values of nvdimm persistent
> +# memory device, by searching sysfs.
> +#
> +# Other non-nvdimm or non-persistent-memory devices would
> +# fail this helper anyway.
> +#
> +# So, ONLY use this helper when you REALLY need nvdimm and
> +# specific attr on it.
> +#
> +_require_pmem_key_value()
> +{
> + local dev=${1#/dev/}
> + local key=$2
> + local value=$3
> + local region index keyfile dev_value
> +
> + # find a filename string contains the region of dev, eg:
> + # /sys/devices/platform/e820_pmem/ndbus0/region1/\
> + # namespace1.0/block/pmem1
> + #
> + region=$(find /sys/ | grep $dev | grep region | head -1)
> + [ -z "$region" ] && \
> + _notrun "requires persistent memory $dev $key $value"

Running 'find' in sysfs is overkill. You can go directly to the sysfs
path for a given block device by stat(1) on the block device special
file to get the device major and minor numbers. Then go directly to
the sysfs path for that device by following this link
/sys/dev/block/$major:$minor.