2012-11-07 35 views
7

लिनक्स कर्नेल में मूल कोड है:लिनक्स कर्नेल: स्पिनलॉक एसएमपी: spin_lock_irq एसएमपी संस्करण में preempt_disable() क्यों है?

static inline void __raw_spin_lock_irq(raw_spinlock_t *lock) 
{ 
    local_irq_disable(); 
    preempt_disable(); 
    spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); 
    LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock); 
} 

मुझे लगता है कि वहाँ कोई निष्पादन पथ वर्तमान पूर्वनिर्धारित पथ पर कर सकते हैं के बाद स्थानीय आईआरक्यू अक्षम किया गया है है।

क्योंकि सभी सामान्य हार्ड आईआरक्यू अक्षम हैं, इसलिए कोई सॉफ्टरक नहीं होना चाहिए और शेड्यूल व्हील को किक करने के लिए कोई टिक नहीं होना चाहिए। मुझे लगता है कि वर्तमान पथ सुरक्षित है। तो एक preempt_disable() क्यों है?

धन्यवाद।

+0

@ cnicutar.क्या आप निश्चित हैं? मुझे ऐसा नहीं लगता। प्रत्येक सीपीयू कोर चलाने के लिए नौकरी लेने के लिए शेड्यूल() का उपयोग करता है। मल्टीकोर के साथ एक एसएमपी सिस्टम में, प्रत्येक कोर में यूपी सिस्टम की तरह एक समर्पित निष्पादन पथ होता है। इस मामले में, स्थानीय आईआरक्यू अक्षम है, इसलिए इस कोर पर शेड्यूल व्हील अवरुद्ध है। शायद किसी अन्य सीपीयू पर प्रीपेप्शन होता है, लेकिन इससे इस पर निष्पादन पथ प्रभावित नहीं होगा, मुझे लगता है कि वे निष्पादन स्तर पर समर्पित हैं। –

उत्तर

6

जहां तक ​​मैं कह सकता हूं, preempt_disable() कॉल 412, 2002 को डेव मिलर द्वारा spin_lock_irq समेत कुछ लॉकिंग प्राइमेटिव में जोड़े गए थे, और 2.5.51 में रिलीज़ किए गए थे। प्रतिबद्ध संदेश सहायक नहीं है; यह सिर्फ "[स्पिनलॉक] कहता है: गैर-एसएमपी नॉपिंग स्पिन/रॉकल मैक्रोज़ को ठीक करें।"

मुझे विश्वास है कि Proper Locking Under a Preemptible Kernel दस्तावेज़ीकरण यह अच्छी तरह से बताता है। अंतिम "बीच में अक्षम करने का उपयोग पूर्वक्रय रोकथाम" शीर्षक खंड शुरू होता है,

It is possible to prevent a preemption event using local_irq_disable and 
local_irq_save. Note, when doing so, you must be very careful ... 
+0

, आपकी टिप्पणी बहुत उपयोगी है। बहुत बहुत धन्यवाद। :) –

1

मैं patch तीव्र ने उल्लेख किया स्किम्ड और पाया कि आईआरक्यू अक्षम करने परोक्ष पूर्वक्रय निष्क्रिय कर सकते हैं, लेकिन जोखिम भरा है।

हालांकि, ध्यान रखें कि अक्षम होने वाले irqs पर भरोसा करना जोखिम भरा व्यवसाय है। कोई spin_unlock() जो पर प्रीम्प्शन गिनती को कम करता है, एक पुन: निर्धारित ट्रिगर कर सकता है। यहां तक ​​कि एक साधारण प्रिंटक() इस तरह के को पुन: निर्धारित कर सकता है। तो केवल अनुमानित छूट पर भरोसा करें- केवल तभी अक्षम करें जब आप जानते हैं कि इस तरह की चीज आपके कोड पथ में नहीं हो सकती है। सर्वोत्तम नीति केवल अनुमानित छूट पर भरोसा करना है-केवल कम समय के लिए अक्षम करना और केवल इतना ही समय तक जब आप अपने कोड के भीतर रहते हैं।