include/linux/map_benchmark.h | 22 +-----------
include/uapi/linux/map_benchmark.h | 35 +++++++++++++++++++
tools/Makefile | 13 +++----
tools/dma/.gitignore | 2 ++
tools/dma/Makefile | 17 +++++++++
tools/{testing/selftests => }/dma/config | 0
.../selftests => }/dma/dma_map_benchmark.c | 1 -
tools/testing/selftests/dma/Makefile | 7 ----
8 files changed, 62 insertions(+), 35 deletions(-)
create mode 100644 include/uapi/linux/map_benchmark.h
create mode 100644 tools/dma/.gitignore
create mode 100644 tools/dma/Makefile
rename tools/{testing/selftests => }/dma/config (100%)
rename tools/{testing/selftests => }/dma/dma_map_benchmark.c (99%)
delete mode 100644 tools/testing/selftests/dma/Makefile
dma_map_benchmark is a standalone developer tool rather than an
automated selftest. It has no pass/fail criteria, expects manual
invocation, and is built as a normal userspace binary. Move it to
tools/dma/ and add a minimal Makefile.
Signed-off-by: Qinxin Xia <xiaqinxin@huawei.com>
---
Changes since v2:
1) Fix some x86_64 build errors.
Link: https://lore.kernel.org/all/20251018101402.3079372-1-xiaqinxin@huawei.com/
Changes since v1:
1) Addressed comments from Barry:
- Moved map_benchmark.h from include/linux to include/uapi/linux/.
- Modified CFLAGS in Makefile to reflect the new header location.
2) Added a .gitignore file to exclude unnecessary files.
3) Restored the 'expansion' field in 'struct map_benchmark':
- This field was accidentally removed in commit 8ddde07a3d.
- The change ensures that the structure remains compatible with existing codebases.
Link: https://lore.kernel.org/all/20250814133527.2679261-1-xiaqinxin@huawei.com/
---
include/linux/map_benchmark.h | 22 +-----------
include/uapi/linux/map_benchmark.h | 35 +++++++++++++++++++
tools/Makefile | 13 +++----
tools/dma/.gitignore | 2 ++
tools/dma/Makefile | 17 +++++++++
tools/{testing/selftests => }/dma/config | 0
.../selftests => }/dma/dma_map_benchmark.c | 1 -
tools/testing/selftests/dma/Makefile | 7 ----
8 files changed, 62 insertions(+), 35 deletions(-)
create mode 100644 include/uapi/linux/map_benchmark.h
create mode 100644 tools/dma/.gitignore
create mode 100644 tools/dma/Makefile
rename tools/{testing/selftests => }/dma/config (100%)
rename tools/{testing/selftests => }/dma/dma_map_benchmark.c (99%)
delete mode 100644 tools/testing/selftests/dma/Makefile
diff --git a/include/linux/map_benchmark.h b/include/linux/map_benchmark.h
index 62674c83bde4..c1bcb4b23398 100644
--- a/include/linux/map_benchmark.h
+++ b/include/linux/map_benchmark.h
@@ -6,26 +6,6 @@
#ifndef _KERNEL_DMA_BENCHMARK_H
#define _KERNEL_DMA_BENCHMARK_H
-#define DMA_MAP_BENCHMARK _IOWR('d', 1, struct map_benchmark)
-#define DMA_MAP_MAX_THREADS 1024
-#define DMA_MAP_MAX_SECONDS 300
-#define DMA_MAP_MAX_TRANS_DELAY (10 * NSEC_PER_MSEC)
+#include <uapi/linux/map_benchmark.h>
-#define DMA_MAP_BIDIRECTIONAL 0
-#define DMA_MAP_TO_DEVICE 1
-#define DMA_MAP_FROM_DEVICE 2
-
-struct map_benchmark {
- __u64 avg_map_100ns; /* average map latency in 100ns */
- __u64 map_stddev; /* standard deviation of map latency */
- __u64 avg_unmap_100ns; /* as above */
- __u64 unmap_stddev;
- __u32 threads; /* how many threads will do map/unmap in parallel */
- __u32 seconds; /* how long the test will last */
- __s32 node; /* which numa node this benchmark will run on */
- __u32 dma_bits; /* DMA addressing capability */
- __u32 dma_dir; /* DMA data direction */
- __u32 dma_trans_ns; /* time for DMA transmission in ns */
- __u32 granule; /* how many PAGE_SIZE will do map/unmap once a time */
-};
#endif /* _KERNEL_DMA_BENCHMARK_H */
diff --git a/include/uapi/linux/map_benchmark.h b/include/uapi/linux/map_benchmark.h
new file mode 100644
index 000000000000..9875f892ac03
--- /dev/null
+++ b/include/uapi/linux/map_benchmark.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
+/*
+ * Copyright (C) 2025 HiSilicon Limited.
+ */
+
+#ifndef _UAPI_DMA_BENCHMARK_H
+#define _UAPI_DMA_BENCHMARK_H
+
+#include <linux/types.h>
+
+#define DMA_MAP_BENCHMARK _IOWR('d', 1, struct map_benchmark)
+#define DMA_MAP_MAX_THREADS 1024
+#define DMA_MAP_MAX_SECONDS 300
+#define DMA_MAP_MAX_TRANS_DELAY (10 * NSEC_PER_MSEC)
+
+#define DMA_MAP_BIDIRECTIONAL 0
+#define DMA_MAP_TO_DEVICE 1
+#define DMA_MAP_FROM_DEVICE 2
+
+struct map_benchmark {
+ __u64 avg_map_100ns; /* average map latency in 100ns */
+ __u64 map_stddev; /* standard deviation of map latency */
+ __u64 avg_unmap_100ns; /* as above */
+ __u64 unmap_stddev;
+ __u32 threads; /* how many threads will do map/unmap in parallel */
+ __u32 seconds; /* how long the test will last */
+ __s32 node; /* which numa node this benchmark will run on */
+ __u32 dma_bits; /* DMA addressing capability */
+ __u32 dma_dir; /* DMA data direction */
+ __u32 dma_trans_ns; /* time for DMA transmission in ns */
+ __u32 granule; /* how many PAGE_SIZE will do map/unmap once a time */
+ __u8 expansion[76]; /* For future use */
+};
+
+#endif /* _UAPI_DMA_BENCHMARK_H */
diff --git a/tools/Makefile b/tools/Makefile
index c31cbbd12c45..cb40961a740f 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -14,6 +14,7 @@ help:
@echo ' counter - counter tools'
@echo ' cpupower - a tool for all things x86 CPU power'
@echo ' debugging - tools for debugging'
+ @echo ' dma - tools for DMA mapping'
@echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer'
@echo ' firmware - Firmware tools'
@echo ' freefall - laptop accelerometer program for disk protection'
@@ -69,7 +70,7 @@ acpi: FORCE
cpupower: FORCE
$(call descend,power/$@)
-counter firewire hv guest bootconfig spi usb virtio mm bpf iio gpio objtool leds wmi firmware debugging tracing: FORCE
+counter dma firewire hv guest bootconfig spi usb virtio mm bpf iio gpio objtool leds wmi firmware debugging tracing: FORCE
$(call descend,$@)
bpf/%: FORCE
@@ -122,7 +123,7 @@ kvm_stat: FORCE
ynl: FORCE
$(call descend,net/ynl)
-all: acpi counter cpupower gpio hv firewire \
+all: acpi counter cpupower dma gpio hv firewire \
perf selftests bootconfig spi turbostat usb \
virtio mm bpf x86_energy_perf_policy \
tmon freefall iio objtool kvm_stat wmi \
@@ -134,7 +135,7 @@ acpi_install:
cpupower_install:
$(call descend,power/$(@:_install=),install)
-counter_install firewire_install gpio_install hv_install iio_install perf_install bootconfig_install spi_install usb_install virtio_install mm_install bpf_install objtool_install wmi_install debugging_install tracing_install:
+counter_install dma_install firewire_install gpio_install hv_install iio_install perf_install bootconfig_install spi_install usb_install virtio_install mm_install bpf_install objtool_install wmi_install debugging_install tracing_install:
$(call descend,$(@:_install=),install)
selftests_install:
@@ -164,7 +165,7 @@ kvm_stat_install:
ynl_install:
$(call descend,net/$(@:_install=),install)
-install: acpi_install counter_install cpupower_install gpio_install \
+install: acpi_install counter_install cpupower_install dma_install gpio_install \
hv_install firewire_install iio_install \
perf_install selftests_install turbostat_install usb_install \
virtio_install mm_install bpf_install x86_energy_perf_policy_install \
@@ -178,7 +179,7 @@ acpi_clean:
cpupower_clean:
$(call descend,power/cpupower,clean)
-counter_clean hv_clean firewire_clean bootconfig_clean spi_clean usb_clean virtio_clean mm_clean wmi_clean bpf_clean iio_clean gpio_clean objtool_clean leds_clean firmware_clean debugging_clean tracing_clean:
+counter_clean dma_clean hv_clean firewire_clean bootconfig_clean spi_clean usb_clean virtio_clean mm_clean wmi_clean bpf_clean iio_clean gpio_clean objtool_clean leds_clean firmware_clean debugging_clean tracing_clean:
$(call descend,$(@:_clean=),clean)
libapi_clean:
@@ -224,7 +225,7 @@ build_clean:
ynl_clean:
$(call descend,net/$(@:_clean=),clean)
-clean: acpi_clean counter_clean cpupower_clean hv_clean firewire_clean \
+clean: acpi_clean counter_clean cpupower_clean dma_clean hv_clean firewire_clean \
perf_clean selftests_clean turbostat_clean bootconfig_clean spi_clean usb_clean virtio_clean \
mm_clean bpf_clean iio_clean x86_energy_perf_policy_clean tmon_clean \
freefall_clean build_clean libbpf_clean libsubcmd_clean \
diff --git a/tools/dma/.gitignore b/tools/dma/.gitignore
new file mode 100644
index 000000000000..b4b99b6ffea3
--- /dev/null
+++ b/tools/dma/.gitignore
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+dma_map_benchmark
diff --git a/tools/dma/Makefile b/tools/dma/Makefile
new file mode 100644
index 000000000000..4acbd9e00cfa
--- /dev/null
+++ b/tools/dma/Makefile
@@ -0,0 +1,17 @@
+# SPDX-License-Identifier: GPL-2.0
+bindir ?= /usr/bin
+
+CFLAGS += -idirafter../../include/uapi
+
+TARGET = dma_map_benchmark
+
+all: $(TARGET)
+
+$(TARGET): $(TARGET).c
+ $(CC) $(CFLAGS) $< -o $@
+
+install: all
+ install -D -m 755 $(TARGET) $(DESTDIR)$(bindir)/$(TARGET)
+
+clean:
+ rm -f $(TARGET)
diff --git a/tools/testing/selftests/dma/config b/tools/dma/config
similarity index 100%
rename from tools/testing/selftests/dma/config
rename to tools/dma/config
diff --git a/tools/testing/selftests/dma/dma_map_benchmark.c b/tools/dma/dma_map_benchmark.c
similarity index 99%
rename from tools/testing/selftests/dma/dma_map_benchmark.c
rename to tools/dma/dma_map_benchmark.c
index b12f1f9babf8..5474a450863c 100644
--- a/tools/testing/selftests/dma/dma_map_benchmark.c
+++ b/tools/dma/dma_map_benchmark.c
@@ -10,7 +10,6 @@
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
-#include <linux/types.h>
#include <linux/map_benchmark.h>
#define NSEC_PER_MSEC 1000000L
diff --git a/tools/testing/selftests/dma/Makefile b/tools/testing/selftests/dma/Makefile
deleted file mode 100644
index cd8c5ece1cba..000000000000
--- a/tools/testing/selftests/dma/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-CFLAGS += -I../../../../usr/include/
-CFLAGS += -I../../../../include/
-
-TEST_GEN_PROGS := dma_map_benchmark
-
-include ../lib.mk
--
2.33.0
>
> diff --git a/include/linux/map_benchmark.h b/include/linux/map_benchmark.h
> index 62674c83bde4..c1bcb4b23398 100644
> --- a/include/linux/map_benchmark.h
> +++ b/include/linux/map_benchmark.h
> @@ -6,26 +6,6 @@
> #ifndef _KERNEL_DMA_BENCHMARK_H
> #define _KERNEL_DMA_BENCHMARK_H
>
> -#define DMA_MAP_BENCHMARK _IOWR('d', 1, struct map_benchmark)
> -#define DMA_MAP_MAX_THREADS 1024
> -#define DMA_MAP_MAX_SECONDS 300
> -#define DMA_MAP_MAX_TRANS_DELAY (10 * NSEC_PER_MSEC)
> +#include <uapi/linux/map_benchmark.h>
>
Since you’ve moved the header file to uapi, please remove
include/linux/map_benchmark.h as all other drivers.
Thanks
Barry
> @@ -0,0 +1,2 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +dma_map_benchmark > diff --git a/tools/dma/Makefile b/tools/dma/Makefile > new file mode 100644 > index 000000000000..4acbd9e00cfa > --- /dev/null > +++ b/tools/dma/Makefile > @@ -0,0 +1,17 @@ > +# SPDX-License-Identifier: GPL-2.0 > +bindir ?= /usr/bin > + > +CFLAGS += -idirafter../../include/uapi I'm a bit confused — it seems you haven’t tried to understand what the issue was in v1 [1]. You were using -I for kernel header files (under include/linux but not uapi), which caused those kernel headers to take precedence over the system headers, leading to build errors. The uapi headers, however, are specifically designed to be installed into the system by the toolchain. So that’s no longer the case — -idirafter is not the correct flag for uapi. > index b12f1f9babf8..5474a450863c 100644 > --- a/tools/testing/selftests/dma/dma_map_benchmark.c > +++ b/tools/dma/dma_map_benchmark.c > @@ -10,7 +10,6 @@ > #include <unistd.h> > #include <sys/ioctl.h> > #include <sys/mman.h> > -#include <linux/types.h> What’s the reason for this? Is it to work around a build error? If so, no — please keep it. > #include <linux/map_benchmark.h> Thanks Barry
On 2025/10/21 10:59:05, Barry Song <21cnbao@gmail.com> wrote:
>> @@ -0,0 +1,2 @@
>> +# SPDX-License-Identifier: GPL-2.0-only
>> +dma_map_benchmark
>> diff --git a/tools/dma/Makefile b/tools/dma/Makefile
>> new file mode 100644
>> index 000000000000..4acbd9e00cfa
>> --- /dev/null
>> +++ b/tools/dma/Makefile
>> @@ -0,0 +1,17 @@
>> +# SPDX-License-Identifier: GPL-2.0
>> +bindir ?= /usr/bin
>> +
>> +CFLAGS += -idirafter../../include/uapi
>
> I'm a bit confused — it seems you haven’t tried to understand what the issue
> was in v1 [1]. You were using -I for kernel header files (under
> include/linux but not uapi), which caused those kernel headers to take
> precedence over the system headers, leading to build errors. The uapi
> headers, however, are specifically designed to be installed into the system by
> the toolchain.
> So that’s no longer the case — -idirafter is not the correct flag for uapi.
>
Hello Barry :
If I delete -idirafter, like:
CFLAGS += -I../../include/uapi
It will get warning info:
[xiaqinxin@localhost dma]$ make
cc -I../../include/uapi dma_map_benchmark.c -o dma_map_benchmark
In file included from ../../include/uapi/linux/map_benchmark.h:9,
from dma_map_benchmark.c:13:
../../include/uapi/linux/types.h:10:2: warning: #warning "Attempt to use
kernel headers from user space, see https://kernelnewbies.org/
KernelHeaders" [-Wcpp]
10 | #warning "Attempt to use kernel headers from user space, see
https://kernelnewbies.org/KernelHeaders"
So I keep -idirafter there.
There's another way, like:
CFLAGS += -I../../usr/include
(need make headers_install first)
Maybe I haven’t thought it through.
If you have a better way, you can give an example.:)
>> index b12f1f9babf8..5474a450863c 100644
>> --- a/tools/testing/selftests/dma/dma_map_benchmark.c
>> +++ b/tools/dma/dma_map_benchmark.c
>> @@ -10,7 +10,6 @@
>> #include <unistd.h>
>> #include <sys/ioctl.h>
>> #include <sys/mman.h>
>> -#include <linux/types.h>
>
> What’s the reason for this? Is it to work around a build error?
> If so, no — please keep it.
>
>> #include <linux/map_benchmark.h>
>
> Thanks
> Barry
Moved it to map_benchmark.h, otherwise some x86_64 build errors
would occur.
On Tue, Oct 21, 2025 at 6:16 PM Qinxin Xia <xiaqinxin@huawei.com> wrote:
>
>
>
> On 2025/10/21 10:59:05, Barry Song <21cnbao@gmail.com> wrote:
> >> @@ -0,0 +1,2 @@
> >> +# SPDX-License-Identifier: GPL-2.0-only
> >> +dma_map_benchmark
> >> diff --git a/tools/dma/Makefile b/tools/dma/Makefile
> >> new file mode 100644
> >> index 000000000000..4acbd9e00cfa
> >> --- /dev/null
> >> +++ b/tools/dma/Makefile
> >> @@ -0,0 +1,17 @@
> >> +# SPDX-License-Identifier: GPL-2.0
> >> +bindir ?= /usr/bin
> >> +
> >> +CFLAGS += -idirafter../../include/uapi
> >
> > I'm a bit confused — it seems you haven’t tried to understand what the issue
> > was in v1 [1]. You were using -I for kernel header files (under
> > include/linux but not uapi), which caused those kernel headers to take
> > precedence over the system headers, leading to build errors. The uapi
> > headers, however, are specifically designed to be installed into the system by
> > the toolchain.
> > So that’s no longer the case — -idirafter is not the correct flag for uapi.
> >
> Hello Barry :
> If I delete -idirafter, like:
>
> CFLAGS += -I../../include/uapi
>
> It will get warning info:
>
> [xiaqinxin@localhost dma]$ make
> cc -I../../include/uapi dma_map_benchmark.c -o dma_map_benchmark
> In file included from ../../include/uapi/linux/map_benchmark.h:9,
> from dma_map_benchmark.c:13:
> ../../include/uapi/linux/types.h:10:2: warning: #warning "Attempt to use
> kernel headers from user space, see https://kernelnewbies.org/
> KernelHeaders" [-Wcpp]
> 10 | #warning "Attempt to use kernel headers from user space, see
> https://kernelnewbies.org/KernelHeaders"
>
> So I keep -idirafter there.
>
> There's another way, like:
>
> CFLAGS += -I../../usr/include
> (need make headers_install first)
>
> Maybe I haven’t thought it through.
> If you have a better way, you can give an example.:)
I see — the uapi headers haven’t been installed yet. This issue will
automatically resolve once the toolchain is upgraded. Before that, we
can try the following:
tools/gpio/Makefile
#
# We need the following to be outside of kernel tree
#
$(OUTPUT)include/linux/gpio.h: ../../include/uapi/linux/gpio.h
mkdir -p $(OUTPUT)include/linux 2>&1 || true
ln -sf $(CURDIR)/../../include/uapi/linux/gpio.h $@
prepare: $(OUTPUT)include/linux/gpio.h
I guess we could copy and paste GPIO’s Makefile and make a few minor
modifications?
>
> >> index b12f1f9babf8..5474a450863c 100644
> >> --- a/tools/testing/selftests/dma/dma_map_benchmark.c
> >> +++ b/tools/dma/dma_map_benchmark.c
> >> @@ -10,7 +10,6 @@
> >> #include <unistd.h>
> >> #include <sys/ioctl.h>
> >> #include <sys/mman.h>
> >> -#include <linux/types.h>
> >
> > What’s the reason for this? Is it to work around a build error?
> > If so, no — please keep it.
> >
> >> #include <linux/map_benchmark.h>
> >
>
> Moved it to map_benchmark.h, otherwise some x86_64 build errors
> would occur.
Let’s avoid moving types.h — that feels more like a workaround than a
proper fix.
Thanks
Barry
On 2025/10/21 14:23:40, Barry Song <21cnbao@gmail.com> wrote: > On Tue, Oct 21, 2025 at 6:16 PM Qinxin Xia <xiaqinxin@huawei.com> wrote: >> >> >> >> On 2025/10/21 10:59:05, Barry Song <21cnbao@gmail.com> wrote: >>>> @@ -0,0 +1,2 @@ >>>> +# SPDX-License-Identifier: GPL-2.0-only >>>> +dma_map_benchmark >>>> diff --git a/tools/dma/Makefile b/tools/dma/Makefile >>>> new file mode 100644 >>>> index 000000000000..4acbd9e00cfa >>>> --- /dev/null >>>> +++ b/tools/dma/Makefile >>>> @@ -0,0 +1,17 @@ >>>> +# SPDX-License-Identifier: GPL-2.0 >>>> +bindir ?= /usr/bin >>>> + >>>> +CFLAGS += -idirafter../../include/uapi >>> >>> I'm a bit confused — it seems you haven’t tried to understand what the issue >>> was in v1 [1]. You were using -I for kernel header files (under >>> include/linux but not uapi), which caused those kernel headers to take >>> precedence over the system headers, leading to build errors. The uapi >>> headers, however, are specifically designed to be installed into the system by >>> the toolchain. >>> So that’s no longer the case — -idirafter is not the correct flag for uapi. >>> >> Hello Barry : >> If I delete -idirafter, like: >> >> CFLAGS += -I../../include/uapi >> >> It will get warning info: >> >> [xiaqinxin@localhost dma]$ make >> cc -I../../include/uapi dma_map_benchmark.c -o dma_map_benchmark >> In file included from ../../include/uapi/linux/map_benchmark.h:9, >> from dma_map_benchmark.c:13: >> ../../include/uapi/linux/types.h:10:2: warning: #warning "Attempt to use >> kernel headers from user space, see https://kernelnewbies.org/ >> KernelHeaders" [-Wcpp] >> 10 | #warning "Attempt to use kernel headers from user space, see >> https://kernelnewbies.org/KernelHeaders" >> >> So I keep -idirafter there. >> >> There's another way, like: >> >> CFLAGS += -I../../usr/include >> (need make headers_install first) >> >> Maybe I haven’t thought it through. >> If you have a better way, you can give an example.:) > > I see — the uapi headers haven’t been installed yet. This issue will > automatically resolve once the toolchain is upgraded. Before that, we > can try the following: > > tools/gpio/Makefile > > # > # We need the following to be outside of kernel tree > # > $(OUTPUT)include/linux/gpio.h: ../../include/uapi/linux/gpio.h > mkdir -p $(OUTPUT)include/linux 2>&1 || true > ln -sf $(CURDIR)/../../include/uapi/linux/gpio.h $@ > > prepare: $(OUTPUT)include/linux/gpio.h > > I guess we could copy and paste GPIO’s Makefile and make a few minor > modifications? > >> >>>> index b12f1f9babf8..5474a450863c 100644 >>>> --- a/tools/testing/selftests/dma/dma_map_benchmark.c >>>> +++ b/tools/dma/dma_map_benchmark.c >>>> @@ -10,7 +10,6 @@ >>>> #include <unistd.h> >>>> #include <sys/ioctl.h> >>>> #include <sys/mman.h> >>>> -#include <linux/types.h> >>> >>> What’s the reason for this? Is it to work around a build error? >>> If so, no — please keep it. >>> >>>> #include <linux/map_benchmark.h> >>> >> >> Moved it to map_benchmark.h, otherwise some x86_64 build errors >> would occur. > > Let’s avoid moving types.h — that feels more like a workaround than a > proper fix. > > Thanks > Barry Hello Barry: Sorry, I don't think it a workaround.When kernel builds with 'CONFIG_UAPI_HEADER_TEST=y'. The build system will checks on the user space API header files in the usr/include directory. The header file must be compiled independently. '__u32' '__u64' in map_benchmark.h depends on the definition of linux/ types.h. If map_benchmark.h does not include types.h,there will lead to hdrtest error. That's why I do that.
> Hello Barry: > > Sorry, I don't think it a workaround.When kernel builds with > 'CONFIG_UAPI_HEADER_TEST=y'. The build system will checks on the > user space API header files in the usr/include directory. > The header file must be compiled independently. > > '__u32' '__u64' in map_benchmark.h depends on the definition of linux/ > types.h. If map_benchmark.h does not include types.h,there will lead to > hdrtest error. > > That's why I do that. > Ok. Thanks for the clarification. make sense to me now. Best regards Barry
© 2016 - 2026 Red Hat, Inc.