ডিভাইস শিপিং কার্নেল 4.14 এবং উচ্চতর আইওন কার্নেল মডিউলের একটি প্রধান রিফ্যাক্টরিং দ্বারা প্রভাবিত হয়, যা অনেক বিক্রেতা গ্রাফিক্স মেমরি অ্যালোকেটর (গ্রালোক) হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) বাস্তবায়ন শেয়ার করা মেমরি বাফারগুলিকে বরাদ্দ করতে বলে। এই পৃষ্ঠাটি ION এর নতুন সংস্করণে উত্তরাধিকার বিক্রেতা কোড স্থানান্তরিত করার বিষয়ে নির্দেশিকা প্রদান করে এবং সম্ভাব্য ভবিষ্যতের অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) বিরতি নিয়ে আলোচনা করে।
ION সম্পর্কে
ION হল আপস্ট্রীম কার্নেলের কাজের-প্রগতিতে স্টেজিং ট্রির অংশ। স্টেজিং করার সময়, ION-এর Userspace-to-kernel ABI প্রধান কার্নেল সংস্করণগুলির মধ্যে ভেঙে যেতে পারে। যদিও ION ABI বিরতিগুলি সাধারণ অ্যাপ বা ইতিমধ্যে চালু হওয়া ডিভাইসগুলিকে সরাসরি প্রভাবিত করে না , বিক্রেতারা নতুন প্রধান কার্নেল সংস্করণে স্থানান্তরিত হওয়া পরিবর্তনের সম্মুখীন হতে পারে যা ION-এ বিক্রেতা কোড কলিংকে প্রভাবিত করে৷ উপরন্তু, ভবিষ্যতে ABI বিরতি ঘটতে পারে কারণ অ্যান্ড্রয়েড সিস্টেম টিম ION কে স্টেজিং ট্রি থেকে সরানোর জন্য আপস্ট্রিমের সাথে কাজ করে৷
android-4.14-এ পরিবর্তন
কার্নেল 4.12 আইওন কার্নেল কোডকে ভারীভাবে রিফ্যাক্টর করে, অন্যান্য কার্নেল ফ্রেমওয়ার্কের সাথে ওভারল্যাপ করা ION এর অংশগুলি পরিষ্কার করে এবং অপসারণ করে। ফলস্বরূপ, অনেক উত্তরাধিকার ION ioctls আর প্রাসঙ্গিক নয় এবং সরানো হয়েছে।
ION ক্লায়েন্ট এবং হ্যান্ডলগুলি অপসারণ
কার্নেল 4.12 এর আগে, /dev/ion
খোলার ফলে একটি ION ক্লায়েন্ট বরাদ্দ করা হয়েছে। ION_IOC_ALLOC
ioctl একটি নতুন বাফার বরাদ্দ করেছে এবং এটিকে একটি ION হ্যান্ডেল হিসাবে ইউজারস্পেসে ফিরিয়ে দিয়েছে (একটি অস্বচ্ছ পূর্ণসংখ্যা শুধুমাত্র ION ক্লায়েন্টের জন্য অর্থপূর্ণ যে এটি বরাদ্দ করেছে)। ইউজারস্পেসে বাফার ম্যাপ করতে বা অন্যান্য প্রক্রিয়ার সাথে শেয়ার করতে, ION হ্যান্ডেলগুলি ION_IOC_SHARE
ioctl ব্যবহার করে dma-buf fds হিসাবে পুনরায় রপ্তানি করা হয়েছিল।
কার্নেল 4.12-এ, ION_IOC_ALLOC
ioctl সরাসরি dma-buf fds আউটপুট করে। মধ্যবর্তী ION হ্যান্ডেলের অবস্থা সরানো হয়েছে, সমস্ত ioctls সহ যেগুলি ION হ্যান্ডেলগুলি গ্রহণ করে বা উত্পাদন করে। যেহেতু 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 ABI সনাক্ত করে এবং কার্নেলের মধ্যে যে কোনও পার্থক্য মাস্ক করার চেষ্টা করে। যাইহোক, ion_user_handle_t
হ্যান্ডেলগুলি তৈরি বা ব্যবহার করে এমন যেকোন libion ফাংশন কার্নেল 4.12 এর পরে আর কাজ করে না। আপনি dma-buf fds-এ নিম্নলিখিত সমতুল্য ক্রিয়াকলাপগুলির সাথে এই ফাংশনগুলি প্রতিস্থাপন করতে পারেন, যা কার্নেলের সমস্ত সংস্করণে কাজ করে।
লিগ্যাসি আয়ন_উসার_হ্যান্ডেল_টি কল | সমতুল্য ডিএমএ-বুফ এফডি কল |
---|---|
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 ব্যবহার করতে রূপান্তর করতে হবে।
ভবিষ্যত ION ABI বিরতি
ION-কে স্টেজিং ট্রি থেকে সরিয়ে নেওয়ার আগে, ভবিষ্যতে কার্নেল রিলিজের জন্য আবার ION ABI ভাঙতে হতে পারে। অ্যান্ড্রয়েড সিস্টেম টিম আশা করে না যে এই পরিবর্তনগুলি পরবর্তী অ্যান্ড্রয়েড সংস্করণের সাথে লঞ্চ হওয়া ডিভাইসগুলিকে প্রভাবিত করবে, তবে এই ধরনের পরিবর্তনগুলি পরবর্তী Android সংস্করণগুলির সাথে লঞ্চ হওয়া ডিভাইসগুলিকে প্রভাবিত করতে পারে৷
উদাহরণস্বরূপ, আপস্ট্রিম সম্প্রদায় একক /dev/ion
নোডকে একাধিক, প্রতি-হিপ নোডে (উদাহরণস্বরূপ, /dev/ion/heap0
) বিভক্ত করার প্রস্তাব করেছে যাতে ডিভাইসগুলিকে প্রতিটি হিপে বিভিন্ন SELinux নীতি প্রয়োগ করতে সক্ষম করে। যদি এই পরিবর্তনটি ভবিষ্যতের কার্নেল রিলিজে প্রয়োগ করা হয়, তাহলে এটি ION ABI ভেঙে দেবে।
ডিভাইস শিপিং কার্নেল 4.14 এবং উচ্চতর আইওন কার্নেল মডিউলের একটি প্রধান রিফ্যাক্টরিং দ্বারা প্রভাবিত হয়, যা অনেক বিক্রেতা গ্রাফিক্স মেমরি অ্যালোকেটর (গ্রালোক) হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) বাস্তবায়ন শেয়ার করা মেমরি বাফারগুলিকে বরাদ্দ করতে বলে। এই পৃষ্ঠাটি ION এর নতুন সংস্করণে উত্তরাধিকার বিক্রেতা কোড স্থানান্তরিত করার বিষয়ে নির্দেশিকা প্রদান করে এবং সম্ভাব্য ভবিষ্যতের অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) বিরতি নিয়ে আলোচনা করে।
ION সম্পর্কে
ION হল আপস্ট্রীম কার্নেলের কাজের-প্রগতিতে স্টেজিং ট্রির অংশ। স্টেজিং করার সময়, ION-এর Userspace-to-kernel ABI প্রধান কার্নেল সংস্করণগুলির মধ্যে ভেঙে যেতে পারে। যদিও ION ABI বিরতিগুলি সাধারণ অ্যাপ বা ইতিমধ্যে চালু হওয়া ডিভাইসগুলিকে সরাসরি প্রভাবিত করে না , বিক্রেতারা নতুন প্রধান কার্নেল সংস্করণে স্থানান্তরিত হওয়া পরিবর্তনের সম্মুখীন হতে পারে যা ION-এ বিক্রেতা কোড কলিংকে প্রভাবিত করে৷ উপরন্তু, ভবিষ্যতে ABI বিরতি ঘটতে পারে কারণ অ্যান্ড্রয়েড সিস্টেম টিম ION কে স্টেজিং ট্রি থেকে সরানোর জন্য আপস্ট্রিমের সাথে কাজ করে৷
android-4.14-এ পরিবর্তন
কার্নেল 4.12 আইওন কার্নেল কোডকে ভারীভাবে রিফ্যাক্টর করে, অন্যান্য কার্নেল ফ্রেমওয়ার্কের সাথে ওভারল্যাপ করা ION এর অংশগুলি পরিষ্কার করে এবং অপসারণ করে। ফলস্বরূপ, অনেক উত্তরাধিকার ION ioctls আর প্রাসঙ্গিক নয় এবং সরানো হয়েছে।
আয়ন ক্লায়েন্ট এবং হ্যান্ডলগুলি অপসারণ
কার্নেল 4.12 এর আগে, /dev/ion
খোলার ফলে একটি ION ক্লায়েন্ট বরাদ্দ করা হয়েছে। ION_IOC_ALLOC
ioctl একটি নতুন বাফার বরাদ্দ করেছে এবং এটিকে একটি ION হ্যান্ডেল হিসাবে ইউজারস্পেসে ফিরিয়ে দিয়েছে (একটি অস্বচ্ছ পূর্ণসংখ্যা শুধুমাত্র ION ক্লায়েন্টের জন্য অর্থপূর্ণ যে এটি বরাদ্দ করেছে)। ইউজারস্পেসে বাফার ম্যাপ করতে বা অন্যান্য প্রক্রিয়ার সাথে শেয়ার করতে, ION হ্যান্ডেলগুলি ION_IOC_SHARE
ioctl ব্যবহার করে dma-buf fds হিসাবে পুনরায় রপ্তানি করা হয়েছিল।
কার্নেল 4.12-এ, ION_IOC_ALLOC
ioctl সরাসরি dma-buf fds আউটপুট করে। মধ্যবর্তী ION হ্যান্ডেলের অবস্থা সরানো হয়েছে, সমস্ত ioctls সহ যেগুলি ION হ্যান্ডেলগুলি গ্রহণ করে বা উত্পাদন করে। যেহেতু 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 ABI সনাক্ত করে এবং কার্নেলের মধ্যে যে কোনও পার্থক্য মাস্ক করার চেষ্টা করে। যাইহোক, ion_user_handle_t
হ্যান্ডেলগুলি তৈরি বা ব্যবহার করে এমন যেকোন libion ফাংশন কার্নেল 4.12 এর পরে আর কাজ করে না। আপনি dma-buf fds-এ নিম্নলিখিত সমতুল্য ক্রিয়াকলাপগুলির সাথে এই ফাংশনগুলি প্রতিস্থাপন করতে পারেন, যা কার্নেলের সমস্ত সংস্করণে কাজ করে।
লিগ্যাসি আয়ন_উসার_হ্যান্ডেল_টি কল | সমতুল্য ডিএমএ-বুফ এফডি কল |
---|---|
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) | এন/এ (ডিএমএ-বুফ এফডিএসের সাথে এই কলটির প্রয়োজন নেই) |
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 ব্যবহার করতে রূপান্তর করতে হবে।
ভবিষ্যত ION ABI বিরতি
ION-কে স্টেজিং ট্রি থেকে সরিয়ে নেওয়ার আগে, ভবিষ্যতে কার্নেল রিলিজের জন্য আবার ION ABI ভাঙতে হতে পারে। অ্যান্ড্রয়েড সিস্টেম টিম আশা করে না যে এই পরিবর্তনগুলি পরবর্তী অ্যান্ড্রয়েড সংস্করণের সাথে লঞ্চ হওয়া ডিভাইসগুলিকে প্রভাবিত করবে, তবে এই ধরনের পরিবর্তনগুলি পরবর্তী Android সংস্করণগুলির সাথে লঞ্চ হওয়া ডিভাইসগুলিকে প্রভাবিত করতে পারে৷
উদাহরণস্বরূপ, আপস্ট্রিম সম্প্রদায় একক /dev/ion
নোডকে একাধিক, প্রতি-হিপ নোডে (উদাহরণস্বরূপ, /dev/ion/heap0
) বিভক্ত করার প্রস্তাব করেছে যাতে ডিভাইসগুলিকে প্রতিটি হিপে বিভিন্ন SELinux নীতি প্রয়োগ করতে সক্ষম করে। যদি এই পরিবর্তনটি ভবিষ্যতের কার্নেল রিলিজে প্রয়োগ করা হয়, তাহলে এটি ION ABI ভেঙে দেবে।