Perubahan Ion ABI

Perangkat yang mengirimkan kernel 4.14 dan lebih tinggi dipengaruhi oleh pemfaktoran ulang besar-besaran modul kernel Ion , yang oleh banyak implementasi lapisan abstraksi perangkat keras (HAL) vendor pengalokasi memori grafis (gralloc) dipanggil untuk mengalokasikan buffer memori bersama. Artikel ini memberikan panduan tentang migrasi kode vendor lama ke versi baru Ion dan membahas kemungkinan kerusakan antarmuka biner aplikasi (ABI) di masa mendatang.

Tentang Ion

Ion adalah bagian dari pohon pementasan yang sedang dalam proses di kernel hulu. Saat dalam pementasan, ABI ruang pengguna-ke-kernel Ion mungkin terpecah di antara versi kernel utama. Meskipun kerusakan Ion ABI tidak secara langsung memengaruhi aplikasi biasa atau perangkat yang sudah diluncurkan , vendor yang bermigrasi ke versi kernel utama baru mungkin mengalami perubahan yang memengaruhi pemanggilan kode vendor ke Ion. Selain itu, kerusakan ABI di masa mendatang mungkin terjadi saat tim sistem Android bekerja dengan upstream untuk mengeluarkan Ion dari staging tree.

Perubahan di Android-4.14

Kernel 4.12 melakukan refaktorisasi besar-besaran pada kode kernel Ion, membersihkan dan menghapus bagian Ion yang tumpang tindih dengan kerangka kernel lainnya. Akibatnya, banyak ioctl Ion lama yang tidak lagi relevan dan telah dihapus.

Penghapusan klien dan pegangan Ion

Sebelum kernel 4.12, pembukaan /dev/ion mengalokasikan klien Ion . ION_IOC_ALLOC ioctl mengalokasikan buffer baru dan mengembalikannya ke ruang pengguna sebagai pegangan Ion (bilangan bulat buram yang hanya berarti bagi klien Ion yang mengalokasikannya). Untuk memetakan buffer ke ruang pengguna atau membaginya dengan proses lain, pegangan Ion diekspor ulang sebagai dma-buf fds menggunakan ION_IOC_SHARE ioctl.

Di kernel 4.12, ION_IOC_ALLOC ioctl langsung mengeluarkan dma-buf fds. Status pegangan Ion perantara telah dihapus, bersama dengan semua ioctl yang menggunakan atau menghasilkan pegangan Ion. Karena dma-buf fds tidak terikat dengan klien Ion tertentu, ioctl ION_IOC_SHARE tidak lagi diperlukan, dan semua infrastruktur klien Ion telah dihapus.

Penambahan ioctls koherensi cache

Sebelum kernel 4.12, Ion menyediakan ION_IOC_SYNC ioctl untuk menyinkronkan deskriptor file dengan memori. Ioctl ini tidak didokumentasikan dengan baik dan tidak fleksibel. Akibatnya, banyak vendor menerapkan ioctls khusus untuk melakukan pemeliharaan cache.

Kernel 4.12 menggantikan ION_IOC_SYNC dengan DMA_BUF_IOCTL_SYNC ioctl yang didefinisikan dalam linux/dma-buf.h . Panggil DMA_BUF_IOCTL_SYNC di awal dan akhir setiap akses CPU, dengan tanda yang menentukan apakah akses ini dibaca dan/atau ditulis. Meskipun DMA_BUF_IOCTL_SYNC lebih bertele-tele dibandingkan ION_IOC_SYNC , ini memberi ruang pengguna kontrol lebih besar atas operasi pemeliharaan cache yang mendasarinya.

DMA_BUF_IOCTL_SYNC adalah bagian dari ABI stabil kernel dan dapat digunakan dengan semua fds dma-buf, baik dialokasikan oleh Ion atau tidak.

Memigrasikan kode vendor ke Android-4.12+

Untuk klien ruang pengguna , tim sistem Android sangat menganjurkan penggunaan panggilan libion ​​daripada panggilan ioctl() pengkodean terbuka. Mulai Android 9, libion ​​otomatis mendeteksi Ion ABI saat runtime dan berupaya menutupi perbedaan antar kernel. Namun, fungsi libion ​​apa pun yang menghasilkan atau menggunakan pegangan ion_user_handle_t tidak lagi berfungsi setelah kernel 4.12. Anda dapat mengganti fungsi-fungsi ini dengan operasi setara berikut pada dma-buf fds, yang berfungsi pada semua versi kernel hingga saat ini.

Panggilan ion_user_handle_t lama Panggilan fd dma-buf yang setara
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) T/A (panggilan ini tidak diperlukan dengan dma-buf fds)
ion_map(ion_fd, buf_handle, ...) mmap(buf_fd, ...)
ion_free(ion_fd, buf_handle) close(buf_fd)
ion_import(ion_fd, buf_fd, &buf_handle) T/A (panggilan ini tidak diperlukan dengan dma-buf fds)
ion_sync_fd(ion_fd, buf_fd) If (ion_is_legacy(ion_fd))

ion_sync_fd(ion_fd, buf_fd);

else

ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, ...);

Untuk klien dalam kernel , karena Ion tidak lagi mengekspor API apa pun yang berhubungan dengan kernel, driver yang sebelumnya menggunakan API kernel Ion dalam kernel dengan ion_import_dma_buf_fd() harus dikonversi untuk menggunakan API dma-buf dalam kernel dengan dma_buf_get() .

Ion ABI di masa depan rusak

Sebelum Ion dapat dikeluarkan dari staging tree, rilis kernel di masa mendatang mungkin perlu memecah Ion ABI lagi. Tim sistem Android tidak memperkirakan perubahan ini akan memengaruhi perangkat yang diluncurkan dengan versi Android berikutnya, namun perubahan tersebut mungkin memengaruhi perangkat yang diluncurkan dengan versi Android berikutnya.

Misalnya, komunitas upstream telah mengusulkan pemisahan satu node /dev/ion menjadi beberapa node per heap (misal, /dev/ion/heap0 ) agar perangkat dapat menerapkan kebijakan SELinux yang berbeda pada setiap heap. Jika perubahan ini diterapkan pada rilis kernel mendatang, Ion ABI akan rusak.