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 
 |