जीकेआई 16-6.12 Android-मेनलाइन की गड़बड़ी

इस पेज पर android-mainline पर मिली अहम समस्याओं और गड़बड़ियों को ठीक करने के बारे में बताया गया है. ये पार्टनर के लिए अहम हो सकती हैं.

1 नवंबर, 2024

  • Linux 6.12-rc4 के लिए लॉन्चिंग
    • खास जानकारी: CONFIG_OF_DYNAMIC की वजह से, गड़बड़ी वाले ड्राइवर के लिए परफ़ॉर्मेंस में काफ़ी गिरावट आ सकती है.
    • जानकारी: Linux 6.12-rc1 को android-mainline में मर्ज करते समय, हमें पता चला कि ट्री के बाहर के ड्राइवर लोड नहीं हो पा रहे हैं. ड्राइवर की गड़बड़ियों की जानकारी देने वाले बदलाव की पहचान, कमिट 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data") के तौर पर की गई है. हमने aosp/3287735 में इसे कुछ समय के लिए पहले जैसा कर दिया है. बदलाव करने पर, CONFIG_OF_OVERLAY को चुना जाता है, जो CONFIG_OF_DYNAMIC को चुनता है. !OF_DYNAMIC के साथ, of_node_get() और of_node_put() पर रेफ़रंस की गिनती करने की सुविधा बंद हो जाती है, क्योंकि इन्हें noops के तौर पर लागू किया जाता है. OF_DYNAMIC को फिर से चालू करने पर, struct device_node के लिए रेफ़रंस की गिनती गलत तरीके से लागू करने वाले ड्राइवर में समस्याएं दिखती हैं. इससे कई तरह की गड़बड़ियां होती हैं. जैसे, मेमोरी में गड़बड़ी, फ़्री होने के बाद इस्तेमाल करना, और मेमोरी लीक.
    • OF पार्सिंग से जुड़े एपीआई के सभी इस्तेमाल की जांच की जानी चाहिए. यह सूची आंशिक है, लेकिन इसमें ऐसे मामले शामिल हैं जिन पर हम नज़र रख रहे हैं:
      • मुफ़्त में आज़माने की अवधि खत्म होने के बाद इस्तेमाल करें (यूएएफ़):
        • एक ही device_node आर्ग्युमेंट का फिर से इस्तेमाल करना: ये फ़ंक्शन, दिए गए नोड पर of_node_put() को कॉल करते हैं. इन्हें कॉल करने से पहले, of_node_get() जोड़ना पड़ सकता है. उदाहरण के लिए, एक ही नोड को आर्ग्युमेंट के तौर पर बार-बार कॉल करते समय:
          • of_find_compatible_node()
          • of_find_node_by_name()
          • of_find_node_by_path()
          • of_find_node_by_type()
          • of_get_next_cpu_node()
          • of_get_next_parent()
          • of_get_next_child()
          • of_get_next_available_child()
          • of_get_next_reserved_child()
          • of_find_node_with_property()
          • of_find_matching_node_and_match()
        • कुछ लूप से किसी भी तरह से बाहर निकलने के बाद device_node का इस्तेमाल करना:
          • for_each_available_child_of_node_scoped()
          • for_each_available_child_of_node()
          • for_each_child_of_node_scoped()
          • for_each_child_of_node()
        • device_node के आस-पास char * प्रॉपर्टी के लिए सीधे पॉइंटर रखना. उदाहरण के लिए, इनका इस्तेमाल करना:
          • const char *foo = struct device_node::name
          • of_property_read_string()
          • of_property_read_string_array()
          • of_property_read_string_index()
          • of_get_property()
      • मेमोरी लीक:
        • device_node पाएं और उसे रद्द न करें (of_node_put()). इन से मिले नोड को कुछ समय के लिए खाली करना ज़रूरी है:
          • of_find_compatible_node()
          • of_find_node_by_name()
          • of_find_node_by_path()
          • of_find_node_by_type()
          • of_find_node_by_phandle()
          • of_parse_phandle()
          • of_find_node_opts_by_path()
          • of_get_next_cpu_node()
          • of_get_compatible_child()
          • of_get_child_by_name()
          • of_get_parent()
          • of_get_next_parent()
          • of_get_next_child()
          • of_get_next_available_child()
          • of_get_next_reserved_child()
          • of_find_node_with_property()
          • of_find_matching_node_and_match()
      • लूप के किसी Iteration से device_node को सेव करना. अगर आप वापस लौट रहे हैं या इसे यहां से उल्लंघन कर रहे हैं, तो आपको कुछ हिस्से में बाकी फ़ाइलों को छोड़ना होगा:
        • for_each_available_child_of_node()
        • for_each_child_of_node()
        • for_each_node_by_type()
        • for_each_compatible_node()
        • of_for_each_phandle()
    • Linux 6.12-rc4 को लैंडिंग के समय, बताए गए बदलाव पहले जैसे कर दिए गए थे (aosp/3315251 देखें) CONFIG_OF_DYNAMIC फिर से चालू हो रहा है और संभावित रूप से खराब ड्राइवर सामने आ सकते हैं.