আয়ন ABI পরিবর্তন

কার্নেল 4.14 এবং উচ্চতর ডিভাইস শিপিং ইয়ন কার্নেল মডিউলের একটি প্রধান রিফ্যাক্টরিং দ্বারা প্রভাবিত হয়, যা অনেক বিক্রেতা গ্রাফিক্স মেমরি অ্যালোকেটর (গ্রালোক) হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) বাস্তবায়ন শেয়ার করা মেমরি বাফারগুলিকে বরাদ্দ করতে বলে। এই নিবন্ধটি Ion-এর নতুন সংস্করণে উত্তরাধিকার বিক্রেতা কোড স্থানান্তরিত করার বিষয়ে নির্দেশিকা প্রদান করে এবং সম্ভাব্য ভবিষ্যতের অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) বিরতি নিয়ে আলোচনা করে।

অয়নের কথা

আয়ন হল আপস্ট্রীম কার্নেলের কাজ-প্রগতিতে স্টেজিং ট্রির অংশ। স্টেজিং করার সময়, Ion-এর userpace-to-kernel ABI প্রধান কার্নেল সংস্করণগুলির মধ্যে বিচ্ছিন্ন হতে পারে। যদিও Ion ABI ব্রেকগুলি সাধারণ অ্যাপ্লিকেশন বা ইতিমধ্যে চালু হওয়া ডিভাইসগুলিকে সরাসরি প্রভাবিত করে না , নতুন প্রধান কার্নেল সংস্করণে স্থানান্তরিত বিক্রেতারা এমন পরিবর্তনের সম্মুখীন হতে পারে যা Ion-এ বিক্রেতা কোড কলিংকে প্রভাবিত করে৷ উপরন্তু, ভবিষ্যতে ABI বিরতি ঘটতে পারে কারণ অ্যান্ড্রয়েড সিস্টেম টিম ইয়নকে স্টেজিং ট্রি থেকে সরানোর জন্য আপস্ট্রিমের সাথে কাজ করে।

android-4.14-এ পরিবর্তন

Kernel 4.12 Ion কার্নেল কোডকে ভারীভাবে রিফ্যাক্টর করে, অন্যান্য কার্নেল ফ্রেমওয়ার্কের সাথে ওভারল্যাপ করা Ion-এর কিছু অংশ পরিষ্কার করে এবং অপসারণ করে। ফলস্বরূপ, অনেক উত্তরাধিকার Ion ioctls আর প্রাসঙ্গিক নয় এবং সরানো হয়েছে।

আয়ন ক্লায়েন্ট এবং হ্যান্ডলগুলি অপসারণ

কার্নেল 4.12 এর আগে, /dev/ion খোলার সময় একটি Ion ক্লায়েন্ট বরাদ্দ করা হয়েছিল। ION_IOC_ALLOC ioctl একটি নতুন বাফার বরাদ্দ করেছে এবং এটিকে একটি Ion হ্যান্ডেল হিসাবে ইউজারস্পেসে ফেরত দিয়েছে (একটি অস্বচ্ছ পূর্ণসংখ্যা অর্থপূর্ণ শুধুমাত্র Ion ক্লায়েন্ট যে এটি বরাদ্দ করেছে)। ইউজারস্পেসে বাফার ম্যাপ করতে বা অন্যান্য প্রক্রিয়ার সাথে শেয়ার করতে, ION_IOC_SHARE ioctl ব্যবহার করে আয়ন হ্যান্ডেলগুলিকে dma-buf fds হিসাবে পুনরায় রপ্তানি করা হয়েছিল।

কার্নেল 4.12-এ, ION_IOC_ALLOC ioctl সরাসরি dma-buf fds আউটপুট করে। মধ্যবর্তী আয়ন হ্যান্ডেল অবস্থা সরানো হয়েছে, সমস্ত ioctls সহ যেগুলি আয়ন হ্যান্ডেলগুলি গ্রহণ করে বা উত্পাদন করে। যেহেতু dma-buf fds নির্দিষ্ট Ion ক্লায়েন্টের সাথে আবদ্ধ নয়, ION_IOC_SHARE ioctl এর আর প্রয়োজন নেই, এবং সমস্ত Ion ক্লায়েন্ট পরিকাঠামো সরানো হয়েছে।

ক্যাশে-সহনশীলতা ioctls এর সংযোজন

কার্নেল 4.12 এর আগে, ফাইল বর্ণনাকারীকে মেমরির সাথে সিঙ্ক্রোনাইজ করার জন্য Ion একটি ION_IOC_SYNC ioctl প্রদান করেছিল। এই ioctl খারাপভাবে নথিভুক্ত এবং অনমনীয় ছিল। ফলস্বরূপ, অনেক বিক্রেতা ক্যাশে রক্ষণাবেক্ষণ করতে কাস্টম ioctls প্রয়োগ করেছে।

linux/dma-buf.h- এ সংজ্ঞায়িত DMA_BUF_IOCTL_SYNC ioctl এর সাথে কার্নেল 4.12 ION_IOC_SYNC প্রতিস্থাপিত হয়েছে। প্রতিটি CPU অ্যাক্সেসের শুরুতে এবং শেষে DMA_BUF_IOCTL_SYNC কল করুন, এই অ্যাক্সেসগুলি পড়া এবং/অথবা লেখা হচ্ছে কিনা তা নির্দিষ্ট করে। যদিও DMA_BUF_IOCTL_SYNC ION_IOC_SYNC এর চেয়ে বেশি শব্দসমৃদ্ধ, এটি অন্তর্নিহিত ক্যাশে রক্ষণাবেক্ষণ ক্রিয়াকলাপের উপর ব্যবহারকারীর স্থানকে আরও নিয়ন্ত্রণ দেয়।

DMA_BUF_IOCTL_SYNC হল কার্নেলের স্থিতিশীল ABI-এর অংশ এবং সমস্ত dma-buf fds-এর সাথে ব্যবহারযোগ্য, সেগুলি Ion দ্বারা বরাদ্দ করা হোক বা না হোক।

android-4.12+ এ ভেন্ডর কোড মাইগ্রেট করা হচ্ছে

ইউজারস্পেস ক্লায়েন্টদের জন্য, অ্যান্ড্রয়েড সিস্টেম টিম ওপেন-কোডিং ioctl() কলের পরিবর্তে libion ​​ব্যবহার করতে জোরালোভাবে উৎসাহিত করে। অ্যান্ড্রয়েড 9 হিসাবে, লিবিয়ন রানটাইমে স্বয়ংক্রিয়ভাবে আয়ন এবিআই সনাক্ত করে এবং কার্নেলের মধ্যে যে কোনও পার্থক্য মাস্ক করার চেষ্টা করে। যাইহোক, ion_user_handle_t হ্যান্ডেলগুলি তৈরি বা ব্যবহার করে এমন যেকোন libion ​​ফাংশন কার্নেল 4.12 এর পরে আর কাজ করে না। আপনি dma-buf fds-এ নিম্নলিখিত সমতুল্য ক্রিয়াকলাপগুলির সাথে এই ফাংশনগুলি প্রতিস্থাপন করতে পারেন, যা কার্নেলের সমস্ত সংস্করণে কাজ করে।

লিগ্যাসি ion_user_handle_t কল সমতুল্য dma-buf fd কল
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) N/A (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) N/A (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, ...);

ইন-কার্নেল ক্লায়েন্টদের জন্য, যেহেতু Ion আর কার্নেল-মুখী API রপ্তানি করে না, যে ড্রাইভারগুলি পূর্বে ion_import_dma_buf_fd() এর সাথে ইন-কারনেল Ion কার্নেল API ব্যবহার করেছিল তাদের অবশ্যই dma_buf_get() এর সাথে ইন-কারনেল dma-buf API ব্যবহার করতে রূপান্তর করতে হবে।

ভবিষ্যত অয়ন ABI বিরতি

Ion-কে স্টেজিং ট্রি থেকে সরিয়ে নেওয়ার আগে, ভবিষ্যতে কার্নেল রিলিজের জন্য Ion ABI-কে আবার ভাঙতে হবে। অ্যান্ড্রয়েড সিস্টেম টিম আশা করে না যে এই পরিবর্তনগুলি পরবর্তী অ্যান্ড্রয়েড সংস্করণের সাথে লঞ্চ হওয়া ডিভাইসগুলিকে প্রভাবিত করবে, তবে এই ধরনের পরিবর্তনগুলি পরবর্তী Android সংস্করণগুলির সাথে লঞ্চ হওয়া ডিভাইসগুলিকে প্রভাবিত করতে পারে৷

উদাহরণস্বরূপ, আপস্ট্রিম সম্প্রদায় একক /dev/ion নোডকে একাধিক, প্রতি-হিপ নোডগুলিতে (যেমন, /dev/ion/heap0 ) বিভক্ত করার প্রস্তাব করেছে যাতে ডিভাইসগুলিকে প্রতিটি হিপে বিভিন্ন SELinux নীতি প্রয়োগ করতে সক্ষম করে। এই পরিবর্তনটি ভবিষ্যতে কার্নেল রিলিজে প্রয়োগ করা হলে, এটি Ion ABI কে ভেঙ্গে ফেলবে।