| 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 |