Re: [PATCHv3 1/1] [tools/selftests]: android/ion: userspace test utility for ion buffer sharing

From: Shuah Khan
Date: Fri Oct 20 2017 - 15:22:11 EST


On 10/20/2017 09:18 AM, Pintu Kumar wrote:
> On Fri, Oct 20, 2017 at 8:10 PM, Shuah Khan <shuahkh@xxxxxxxxxxxxxxx> wrote:
>> On 10/18/2017 04:38 AM, Pintu Kumar wrote:
>>> On Wed, Oct 18, 2017 at 2:28 AM, Shuah Khan <shuah@xxxxxxxxxx> wrote:
>>>> On 10/17/2017 02:21 PM, Laura Abbott wrote:
>>>>> On 10/14/2017 04:36 AM, Pintu Agarwal wrote:
>>>>>> This is a test utility to verify ION buffer sharing in user space
>>>>>> between 2 independent processes.
>>>>>> It uses unix domain socket (with SCM_RIGHTS) as IPC to transfer an FD to
>>>>>> another process to share the same buffer.
>>>>>> This utility demonstrates how ION buffer sharing can be implemented between
>>>>>> two user space processes, using various heap types.
>>>>>>
>>>>>> This utility is made to be run as part of kselftest framework in kernel.
>>>>>> The utility is verified on Ubuntu-32 bit system with Linux Kernel 4.14,
>>>>>> using ION system heap and CMA heap.
>>>>>>
>>>>>> For more information about the utility please check the README file.
>>>>>>
>>>>>> Signed-off-by: Pintu Agarwal <pintu.ping@xxxxxxxxx>
>>>>>> ---
>>>>>> tools/testing/selftests/Makefile | 3 +-
>>>>>> tools/testing/selftests/android/Makefile | 44 ++++
>>>>>> tools/testing/selftests/android/ion/.gitignore | 2 +
>>>>>> tools/testing/selftests/android/ion/Makefile | 16 ++
>>>>>> tools/testing/selftests/android/ion/README | 132 +++++++++++
>>>>>> tools/testing/selftests/android/ion/config | 3 +
>>>>>> tools/testing/selftests/android/ion/ion_test.sh | 61 +++++
>>>>>> .../testing/selftests/android/ion/ionapp_export.c | 151 ++++++++++++
>>>>>> .../testing/selftests/android/ion/ionapp_import.c | 88 +++++++
>>>>>> tools/testing/selftests/android/ion/ionutils.c | 259 +++++++++++++++++++++
>>>>>> tools/testing/selftests/android/ion/ionutils.h | 55 +++++
>>>>>> tools/testing/selftests/android/ion/ipcsocket.c | 227 ++++++++++++++++++
>>>>>> tools/testing/selftests/android/ion/ipcsocket.h | 35 +++
>>>>>> tools/testing/selftests/android/run.sh | 3 +
>>>>>> 14 files changed, 1078 insertions(+), 1 deletion(-)
>>>>>> create mode 100644 tools/testing/selftests/android/Makefile
>>>>>> create mode 100644 tools/testing/selftests/android/ion/.gitignore
>>>>>> create mode 100644 tools/testing/selftests/android/ion/Makefile
>>>>>> create mode 100644 tools/testing/selftests/android/ion/README
>>>>>> create mode 100644 tools/testing/selftests/android/ion/config
>>>>>> create mode 100755 tools/testing/selftests/android/ion/ion_test.sh
>>>>>> create mode 100644 tools/testing/selftests/android/ion/ionapp_export.c
>>>>>> create mode 100644 tools/testing/selftests/android/ion/ionapp_import.c
>>>>>> create mode 100644 tools/testing/selftests/android/ion/ionutils.c
>>>>>> create mode 100644 tools/testing/selftests/android/ion/ionutils.h
>>>>>> create mode 100644 tools/testing/selftests/android/ion/ipcsocket.c
>>>>>> create mode 100644 tools/testing/selftests/android/ion/ipcsocket.h
>>>>>> create mode 100755 tools/testing/selftests/android/run.sh
>>>>>>
>>>>>> diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
>>>>>> index ff80564..61bc77b 100644
>>>>>> --- a/tools/testing/selftests/Makefile
>>>>>> +++ b/tools/testing/selftests/Makefile
>>>>>> @@ -1,4 +1,5 @@
>>>>>> -TARGETS = bpf
>>>>>> +TARGETS = android
>>>>>> +TARGETS += bpf
>>>>>> TARGETS += breakpoints
>>>>>> TARGETS += capabilities
>>>>>> TARGETS += cpufreq
>>>>>> diff --git a/tools/testing/selftests/android/Makefile b/tools/testing/selftests/android/Makefile
>>>>>> new file mode 100644
>>>>>> index 0000000..ee76446
>>>>>> --- /dev/null
>>>>>> +++ b/tools/testing/selftests/android/Makefile
>>>>>> @@ -0,0 +1,44 @@
>>>>>> +SUBDIRS := ion
>>>>>> +
>>>>>> +TEST_PROGS := run.sh
>>>>>> +
>>>>>> +.PHONY: all clean
>>>>>> +
>>>>>> +include ../lib.mk
>>>>>> +
>>>>>> +all:
>>>>>> + @for DIR in $(SUBDIRS); do \
>>>>>> + BUILD_TARGET=$(OUTPUT)/$$DIR; \
>>>>>> + mkdir $$BUILD_TARGET -p; \
>>>>>> + make OUTPUT=$$BUILD_TARGET -C $$DIR $@;\
>>>>>> + if [ -e $$DIR/$(TEST_PROGS) ]; then
>>>>>> + rsync -a $$DIR/$(TEST_PROGS) $$BUILD_TARGET/;
>>>>>> + fi
>>>>>> + done
>>>>>> +
>>>>>> +override define RUN_TESTS
>>>>>> + @cd $(OUTPUT); ./run.sh
>>>>>> +endef
>>>>>> +
>>>>>> +override define INSTALL_RULE
>>>>>> + mkdir -p $(INSTALL_PATH)
>>>>>> + install -t $(INSTALL_PATH) $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES)
>>>>>> +
>>>>>> + @for SUBDIR in $(SUBDIRS); do \
>>>>>> + BUILD_TARGET=$(OUTPUT)/$$SUBDIR; \
>>>>>> + mkdir $$BUILD_TARGET -p; \
>>>>>> + $(MAKE) OUTPUT=$$BUILD_TARGET -C $$SUBDIR INSTALL_PATH=$(INSTALL_PATH)/$$SUBDIR install; \
>>>>>> + done;
>>>>>> +endef
>>>>>> +
>>>>>> +override define EMIT_TESTS
>>>>>> + echo "./run.sh"
>>>>>> +endef
>>>>>> +
>>>>>> +override define CLEAN
>>>>>> + @for DIR in $(SUBDIRS); do \
>>>>>> + BUILD_TARGET=$(OUTPUT)/$$DIR; \
>>>>>> + mkdir $$BUILD_TARGET -p; \
>>>>>> + make OUTPUT=$$BUILD_TARGET -C $$DIR $@;\
>>>>>> + done
>>>>>> +endef
>>>>>> diff --git a/tools/testing/selftests/android/ion/.gitignore b/tools/testing/selftests/android/ion/.gitignore
>>>>>> new file mode 100644
>>>>>> index 0000000..67e6f39
>>>>>> --- /dev/null
>>>>>> +++ b/tools/testing/selftests/android/ion/.gitignore
>>>>>> @@ -0,0 +1,2 @@
>>>>>> +ionapp_export
>>>>>> +ionapp_import
>>>>>> diff --git a/tools/testing/selftests/android/ion/Makefile b/tools/testing/selftests/android/ion/Makefile
>>>>>> new file mode 100644
>>>>>> index 0000000..b84e3b1
>>>>>> --- /dev/null
>>>>>> +++ b/tools/testing/selftests/android/ion/Makefile
>>>>>> @@ -0,0 +1,16 @@
>>>>>> +
>>>>>> +INCLUDEDIR := -I../../../../../drivers/staging/android/uapi/
>>>>>> +CFLAGS := $(INCLUDEDIR) -Wall -O2 -g
>>>>>> +
>>>>>> +TEST_GEN_FILES := ionapp_export ionapp_import
>>>>>> +
>>>>>> +all: $(TEST_GEN_FILES)
>>>>>> +
>>>>>> +$(TEST_GEN_FILES): ipcsocket.c ionutils.c
>>>>>> +
>>>>>> +TEST_PROGS := ion_test.sh
>>>>>> +
>>>>>> +include ../../lib.mk
>>>>>> +
>>>>>> +$(OUTPUT)/ionapp_export: ionapp_export.c ipcsocket.c ionutils.c
>>>>>> +$(OUTPUT)/ionapp_import: ionapp_import.c ipcsocket.c ionutils.c
>>>>>> diff --git a/tools/testing/selftests/android/ion/README b/tools/testing/selftests/android/ion/README
>>>>>> new file mode 100644
>>>>>> index 0000000..163e353
>>>>>> --- /dev/null
>>>>>> +++ b/tools/testing/selftests/android/ion/README
>>>>>> @@ -0,0 +1,132 @@
>>>>>> +ION BUFFER SHARING UTILITY
>>>>>> +==========================
>>>>>> +File: ion_test.sh : Utility to test ION driver buffer sharing mechanism.
>>>>>> +Author: Pintu Kumar <pintu.ping@xxxxxxxxx>
>>>>>> +
>>>>>> +Introduction:
>>>>>> +-------------
>>>>>> +This is a test utility to verify ION buffer sharing in user space
>>>>>> +between 2 independent processes.
>>>>>> +It uses unix domain socket (with SCM_RIGHTS) as IPC to transfer an FD to
>>>>>> +another process to share the same buffer.
>>>>>> +This utility demonstrates how ION buffer sharing can be implemented between
>>>>>> +two user space processes, using various heap types.
>>>>>> +The following heap types are supported by ION driver.
>>>>>> +ION_HEAP_TYPE_SYSTEM (0)
>>>>>> +ION_HEAP_TYPE_SYSTEM_CONTIG (1)
>>>>>> +ION_HEAP_TYPE_CARVEOUT (2)
>>>>>> +ION_HEAP_TYPE_CHUNK (3)
>>>>>> +ION_HEAP_TYPE_DMA (4)
>>>>>> +
>>>>>> +By default only the SYSTEM and SYSTEM_CONTIG heaps are supported.
>>>>>> +Each heap is associated with the respective heap id.
>>>>>> +This utility is designed in the form of client/server program.
>>>>>> +The server part (ionapp_export) is the exporter of the buffer.
>>>>>> +It is responsible for creating an ION client, allocating the buffer based on
>>>>>> +the heap id, writing some data to this buffer and then exporting the FD
>>>>>> +(associated with this buffer) to another process using socket IPC.
>>>>>> +This FD is called as buffer FD (which is different than the ION client FD).
>>>>>> +
>>>>>> +The client part (ionapp_import) is the importer of the buffer.
>>>>>> +It retrives the FD from the socket data and installs into its address space.
>>>>>> +This new FD internally points to the same kernel buffer.
>>>>>> +So first it reads the data that is stored in this buffer and prints it.
>>>>>> +Then it writes the different size of data (it could be different data) to the
>>>>>> +same buffer.
>>>>>> +Finally the buffer FD must be closed by both the exporter and importer.
>>>>>> +Thus the same kernel buffer is shared among two user space processes using
>>>>>> +ION driver and only one time allocation.
>>>>>> +
>>>>>> +Prerequisite:
>>>>>> +-------------
>>>>>> +This utility works only if /dev/ion interface is present.
>>>>>> +The following configs needs to be enabled in kernel to include ion driver.
>>>>>> +CONFIG_ANDROID=y
>>>>>> +CONFIG_ION=y
>>>>>> +CONFIG_ION_SYSTEM_HEAP=y
>>>>>
>>>>> You also need CONFIG_STAGING right now as well.
>>>>
>>>
>>> Ok, added CONFIG_STAGING under config and README
>>>
>>>> In which case, please make sure the test fails gracefully when the
>>>> these config options are disabled.
>>>>
>>>> What does the test do when all of these options are disabled?
>>>>
>>> I assume that if these configs are not present the /dev/ion will also
>>> not exists.
>>> If that is the case then, I don't proceed with the test.
>>> This is checked under ion_test script using: check_device
>>>
>>>>>
>>>>>> +
>>>>>> +This utility requires to be run as root user.
>>>>>> +
>>>>>> +
>>>>>> +Compile and test:
>>>>>> +-----------------
>>>>>> +This utility is made to be run as part of kselftest framework in kernel.
>>>>>> +To compile and run using kselftest you can simply do the following from the
>>>>>> +kernel top directory.
>>>>>> +linux$ make TARGETS=android kselftest
>>>>
>>>> Please make sure
>>>>
>>>> make O=/tmp/kselftest TARGETS=android kselftest
>>>>
>>>> works.
>>>>
>>>
>>> Ok when I specify O as output directory. It did not work.
>>> ./run.sh: 3: ./run.sh: ./ion_test.sh: not found
>>> ../lib.mk:41: recipe for target 'run_tests' failed
>>>
>>> When I checked /tmp/kselftest/ion/, I see that ion_test.sh is not installed.
>>> Only the executable are installed.
>>> I followed the same Makefile as futex.
>>> Currently I am trying to figure out what could be the problem.
>>> Any hint will be really appreciated.
>>
>> Please see the latest futex Makefile from 4.14. You will see that the
>> TEST_PROGS get copied from its all target for sub-dirs. You just have to
>> add a copy in that path
>>
>
> Yes, I am already using the latest version of futex/Makefile.
> Actually I figured out the problem, but currently I don't know how to fix it.
> In futex case, both in the main dir as well as sub-dir they are using
> the same TEST_PROGS name as <run.sh>.
> So both the scripts are getting installed in /tmp/.
> However in my case, in main dir I am using <run.sh> but in sub-dir I
> am using <ion_test.sh> as TEST_PROGS.

That should be fine. Let me play with it and let you know.

> So, the sub-dir TEST_PROGS is not installed. Only the TEST_GEN_FILES
> are installed.

Right. This is not for install path. This is setting up the O=dir with
the right files for run_tests target.

> If I change the <ion_test.sh> name to <run.sh>, then it is working fine.
> > Currently I am checking more how to fix this. This could be problem
> with futex as well.

I don't think that is the problem.'

> If I could not figure out, I will also change TEST_PROGS to run.sh and push it.

thanks,
-- Shuah