2015-09-11 5 views
5

कहें कि मैंने एकाधिक कॉलबैक के साथ genl_register_family_with_ops का उपयोग करके एक सामान्य नेटलिंक इंटरफ़ेस पंजीकृत किया है।लिनक्स कर्नेल जेनेरिक नेटलिंक - क्या यह समवर्ती है?

मुझे इसके बारे में कोई चेतावनी नहीं दिखाई दे रही है और मुझे लगता है कि कॉलबैक को क्रमशः बुलाया जाता है लेकिन कॉलबैक को न तो कैसे कहा जाता है इसके बारे में कोई जानकारी नहीं है।

क्या यह संभव है कि एक ही सामान्य नेटलिंक इंटरफ़ेस पर एकाधिक कॉलबैक समवर्ती रूप से कॉल किए गए हों? क्या मुझे कॉलबैक के बीच कोई सिंक्रनाइज़ेशन चाहिए?

एक भी नेटलिंक कॉलबैक रोका जा सकता है या समवर्ती दो कोर में चलाएँ:

सवाल आसान बनाने के लिए?

+0

कॉल ईवेंट को ईवेंट होने पर कॉल किया जाता है। यदि कॉलबैक समाप्त होने से पहले एक और घटना होती है, तो उसे एक ओवरलैपिंग कॉल मिल जाएगी। – stark

+0

@ स्टार्क मैं अधिक विशेष रूप से पूछ रहा हूं कि क्या मुझे उसी नेटलिंक परिवार पंजीकरण पर दो घटनाएं मिल सकती हैं जो कॉलबैक ओवरलैप कर सकती हैं। एकाधिक कॉलबैक के साथ केवल एक पंजीकरण है। नेटलिंक कॉलबैक समान संरचनाओं को संशोधित करेंगे और संरचनाओं को केवल नेटलिंक कॉलबैक द्वारा संशोधित/एक्सेस किया जाएगा। – Etherealone

+1

@Etherealone मुझे संदेह है कि जवाब यह है कि यह विन्यास योग्य है, लेकिन डिफ़ॉल्ट रूप से बंद है। कर्नेल 3.11 के स्रोतों की मेरी प्रति में, 'struct genl_family' में' bool parallel_ops' है। 'Linux-3.11.10-21/net/netlink/genetlink.c: 674' या nearabouts में,' genl_rcv_msg() 'में, यदि वह ध्वज सेट नहीं है, तो वैश्विक म्यूटेक्स लॉक हो गया है, अनुरोध संसाधित हो गया है, और वैश्विक म्यूटेक्स अनलॉक। यदि यह सेट है तो यह लॉकिंग नहीं होती है। –

उत्तर

2

उत्तर लिनक्स कर्नेल संस्करण 3.11 या 4.2 मानता है, शायद कई अन्य लोगों के लिए मान्य है। सितंबर 2015

की कॉलबैक समवर्ती हो सकता है या नहीं के रूप में वर्तमान का जवाब दें या नहीं पंजीकरण समय में struct genl_family की एक विन्यास संपत्ति है, लेकिन अगर स्पष्ट रूप से निर्दिष्ट नहीं है, शायद बंद सामान्य रूप से है। यह 1 के कारण) struct genl_family में एक bool parallel_ops सदस्य की उपस्थिति है, और 2) एक स्थिर अवधि struct के शुरू नहीं किए गए सदस्यों में कहा जाता है एक नेटलिंक संदेश, अंत में समारोह genl_rcv_msg() के स्वागत पर सी

में 0 सामान्य रूप से किया जा रहा , जो वैश्विक genl_mutex को लॉक करना है या नहीं, यह तय करने के लिए parallel_ops पर संदेश के गीनेटलिंक परिवार और शर्तों को निर्धारित करता है।

static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) 
{ 
     struct genl_family *family; 
     int err; 

     family = genl_family_find_byid(nlh->nlmsg_type); 
     if (family == NULL) 
       return -ENOENT; 

     if (!family->parallel_ops) 
       genl_lock(); 

     err = genl_family_rcv_msg(family, skb, nlh); 

     if (!family->parallel_ops) 
       genl_unlock(); 

     return err; 
} 

एक बार genl_family_rcv_msg() शुरू हो जाती है (संरक्षित या म्युटेक्स द्वारा असुरक्षित), वास्तविक कॉलबैक here शुरू हो जाती है।

संबंधित मुद्दे