102 lines
3.9 KiB
Plaintext
102 lines
3.9 KiB
Plaintext
|
ION BUFFER SHARING UTILITY
|
||
|
==========================
|
||
|
File: ion_test.sh : Utility to test ION driver buffer sharing mechanism.
|
||
|
Author: Pintu Kumar <pintu.ping@gmail.com>
|
||
|
|
||
|
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_STAGING=y
|
||
|
CONFIG_ION=y
|
||
|
CONFIG_ION_SYSTEM_HEAP=y
|
||
|
|
||
|
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
|
||
|
Or you can also use:
|
||
|
linux$ make -C tools/testing/selftests TARGETS=android run_tests
|
||
|
Using the selftest it can directly execute the ion_test.sh script to test the
|
||
|
buffer sharing using ion system heap.
|
||
|
Currently the heap size is hard coded as just 10 bytes inside this script.
|
||
|
You need to be a root user to run under selftest.
|
||
|
|
||
|
You can also compile and test manually using the following steps:
|
||
|
ion$ make
|
||
|
These will generate 2 executable: ionapp_export, ionapp_import
|
||
|
Now you can run the export and import manually by specifying the heap type
|
||
|
and the heap size.
|
||
|
You can also directly execute the shell script to run the test automatically.
|
||
|
Simply use the following command to run the test.
|
||
|
ion$ sudo ./ion_test.sh
|
||
|
|
||
|
Test Results:
|
||
|
-------------
|
||
|
The utility is verified on Ubuntu-32 bit system with Linux Kernel 4.14.
|
||
|
Here is the snapshot of the test result using kselftest.
|
||
|
|
||
|
linux# make TARGETS=android kselftest
|
||
|
heap_type: 0, heap_size: 10
|
||
|
--------------------------------------
|
||
|
heap type: 0
|
||
|
heap id: 1
|
||
|
heap name: ion_system_heap
|
||
|
--------------------------------------
|
||
|
Fill buffer content:
|
||
|
0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd
|
||
|
Sharing fd: 6, Client fd: 5
|
||
|
<ion_close_buffer_fd>: buffer release successfully....
|
||
|
Received buffer fd: 4
|
||
|
Read buffer content:
|
||
|
0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0x0 0x0 0x0 0x0 0x0 0x0
|
||
|
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
|
||
|
Fill buffer content:
|
||
|
0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd
|
||
|
0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd
|
||
|
0xfd 0xfd
|
||
|
<ion_close_buffer_fd>: buffer release successfully....
|
||
|
ion_test.sh: heap_type: 0 - [PASS]
|
||
|
|
||
|
ion_test.sh: done
|