Cpuset

2016-03-29 8 views
18

उपयोगकर्ता-स्पेस से एक विशिष्ट कोर पर कर्नेल मॉड्यूल को अलग करें हम cpuset का उपयोग को हमारे सिस्टम में एक विशिष्ट कोर अलग कर सकते हैं और उस कोर को केवल एक विशिष्ट प्रक्रिया निष्पादित कर सकते हैं।Cpuset

मैं कर्नेल मॉड्यूल के साथ एक ही काम करने की कोशिश कर रहा हूं। तो मैं चाहता हूं कि मॉड्यूल एक अलग कोर में निष्पादित हो। दूसरे शब्दों में: मैं कर्नेल मॉड्यूल के अंदर से cpuset का उपयोग कैसे करूं? *

मेरे कर्नेल मॉड्यूल में linux/cpuset.h का उपयोग नहीं करता है।

#include <linux/module.h> 
#include <linux/cpuset.h> 

... 
#ifdef CONFIG_CPUSETS 
    printk(KERN_INFO, "cpusets is enabled!"); 
#endif 
cpuset_init(); // this function is declared in cpuset.h 
... 

जब (dmesg में) इस मॉड्यूल मैं लोड करने की कोशिश निम्न संदेश cpusets is enabled!: तो, मैं इस तरह एक मॉड्यूल है। लेकिन मुझे संदेश Unknown symbol cpu_init (err 0) भी मिलता है।

इसी तरह, मैंने linux/sched.h से सभी चल रही procceses को एक विशिष्ट कोर में स्थानांतरित करने के लिए और फिर मेरे मॉड्यूल को एक अलग कोर पर चलाने का प्रयास किया। मुझे एक ही त्रुटि मेसेज मिला: Unknown symbol sched_setaffinity (err 0)। मुझे लगता है कि मुझे "अज्ञात प्रतीकों" मिल गए हैं क्योंकि उन कार्यों में कर्नेल में EXPORT_SYMBOL नहीं है। तो मैं गया और sys_sched_setaffinityसिस्टम कॉल (इस question पर आधारित) को कॉल करने का प्रयास किया लेकिन फिर से यह संदेश मिला: Unknown symbol sys_sched_setaffinity (err 0)!

इसके अलावा, मैं ऐसे समाधान की तलाश नहीं कर रहा हूं जो isolcpus का उपयोग करता है, जो बूटिंग के दौरान सेट किया गया है। मैं मॉड्यूल को लोड करना चाहता हूं और इसके बाद अलगाव को घटाना चाहता हूं।

  • (अधिक सटीक, मैं अपने कर्नेल धागे पृथक कोर में निष्पादित करने के लिए चाहता हूँ। मुझे पता है कि मैं विशिष्ट कोर करने के लिए बाध्य करने के लिए सूत्र आत्मीयता का उपयोग कर सकते हैं, लेकिन यह मुझे गारंटी नहीं है कि कोर होने जा रहे हैं उन पर चल अन्य प्रक्रियाओं के द्वारा अलग किया।)
+1

विशिष्ट कोर के लिए बाँध विशिष्ट कर्नेल धागा के लिए, आप उपयोग कर सकते हैं [kthread_bind] (http://lxr.free-electrons.com/source/kernel/kthread.c#L366) या [set_cpu_allowed_ptr] (http://lxr.free-electrons.com/source/kernel/sched/core.c#L1262)। विशिष्ट कोर का उपयोग करने के लिए अन्य प्रक्रियाओं को अस्वीकार करने के लिए, आपको किसी भी तरह शेड्यूल कॉन्फ़िगर करने की आवश्यकता है। उदा।, जैसा कि वर्णन किया गया है [यहां] (http://unix.stackexchange.com/questions/186338/setting-system-wide-cpu-affinities-for-running-processes-on-a-linux-platform)। – Tsyvarev

+2

@ Tsyvarev की टिप्पणी में जोड़ने के लिए: 'isolcpus' (कर्नेल पैरामीटर - दस्तावेज़ीकरण/कर्नेल-पैरामीटर.txt देखें) "सामान्य एसएमपी संतुलन और शेड्यूलिंग एल्गोरिदम से अलग करने के लिए एक या अधिक CPU निर्दिष्ट करने के लिए उपयोग किया जा सकता है। आप एक स्थानांतरित कर सकते हैं सीपीयू एफ़िनिटी सिस्कोल या सीपीयूसेट के माध्यम से "पृथक" सीपीयू को चालू या बंद करें। " –

+0

@Tsyvarev और @Gil Hamlton। आपके उत्तरों के लिए धन्यवाद। मुझे 'kthread_bind' के बारे में पता है। प्रस्तावित समाधानों के बारे में: 'isolcpus' और' maxcpus', मेरी समझ से उन पैरामीटर को बूट करने के दौरान उपयोग किया जाना चाहिए। मैं पुनरारंभ किए बिना अलग करना चाहता हूं, वास्तव में, अलगाव केवल तब होता है जब मॉड्यूल लोड हो जाता है, इसलिए मुझे लगता है कि यह जाने का तरीका नहीं है। – insumity

उत्तर

7

तो मैं मॉड्यूल एक अलग कोर में मार डाला प्राप्त करना चाहते हैं।

और

वास्तव में हमारी प्रणाली में एक विशिष्ट कोर को अलग करने और उस कोर

यह एक काम स्रोत संकलित और एक डेबियन बॉक्स पर परीक्षण कोड है सिर्फ एक विशिष्ट प्रक्रिया निष्पादित कर्नेल 3.16 का उपयोग कर। मैं वर्णन करूंगा कि पहले लोड और अनलोड कैसे करें और पैरामीटर पारित करने का अर्थ क्या है।

सभी स्रोतों GitHub यहां पाया जा सकता है ...

https://github.com/harryjackson/doc/tree/master/linux/kernel/toy/toy

बिल्ड और मॉड्यूल लोड ...

make 
insmod toy param_cpu_id=2 

मॉड्यूल उपयोग

rmmod toy 
उतारना करने के लिए

मैं modprobe का उपयोग नहीं कर रहा हूं क्योंकि यह कुछ विन्यास आदि की अपेक्षा करता है।पैरामीटर जिसे हम toy कर्नेल मॉड्यूल में पास कर रहे हैं वह सीपीयू है जिसे हम अलग करना चाहते हैं। कॉल किए जाने वाले डिवाइस ऑपरेशंस में से कोई भी तब तक चलाएगा जब तक कि वह उस CPU पर निष्पादित नहीं हो जाता।

एक बार मॉड्यूल लोड किया जाता है आप की तरह

cat /dev/toy 

यहाँ

/dev/toy 

सरल संचालन इसे पा सकते हैं कि घटनाओं कर्नेल मॉड्यूल कैच और कुछ उत्पादन का उत्पादन पैदा करते हैं। आप dmesg का उपयोग कर आउटपुट देख सकते हैं।

स्रोत कोड ...

#include <linux/module.h> 
#include <linux/fs.h> 
#include <linux/miscdevice.h> 
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("Harry"); 
MODULE_DESCRIPTION("toy kernel module"); 
MODULE_VERSION("0.1"); 
#define DEVICE_NAME "toy" 
#define CLASS_NAME "toy" 

static int param_cpu_id; 
module_param(param_cpu_id , int, (S_IRUSR | S_IRGRP | S_IROTH)); 
MODULE_PARM_DESC(param_cpu_id, "CPU ID that operations run on"); 

//static void bar(void *arg); 
//static void foo(void *cpu); 
static int  toy_open( struct inode *inodep, struct file *fp); 
static ssize_t toy_read( struct file *fp  , char *buffer, size_t len, loff_t * offset); 
static ssize_t toy_write( struct file *fp  , const char *buffer, size_t len, loff_t *); 
static int  toy_release(struct inode *inodep, struct file *fp); 

static struct file_operations toy_fops = { 
    .owner = THIS_MODULE, 
    .open = toy_open, 
    .read = toy_read, 
    .write = toy_write, 
    .release = toy_release, 
}; 

static struct miscdevice toy_device = { 
    .minor = MISC_DYNAMIC_MINOR, 
    .name = "toy", 
    .fops = &toy_fops 
}; 

//static int CPU_IDS[64] = {0}; 
static int toy_open(struct inode *inodep, struct file *filep) { 
    int this_cpu = get_cpu(); 
    printk(KERN_INFO "open: called on CPU:%d\n", this_cpu); 
    if(this_cpu == param_cpu_id) { 
    printk(KERN_INFO "open: is on requested CPU: %d\n", smp_processor_id()); 
    } 
    else { 
    printk(KERN_INFO "open: not on requested CPU:%d\n", smp_processor_id()); 
    } 
    put_cpu(); 
    return 0; 
} 
static ssize_t toy_read(struct file *filep, char *buffer, size_t len, loff_t *offset){ 
    int this_cpu = get_cpu(); 
    printk(KERN_INFO "read: called on CPU:%d\n", this_cpu); 
    if(this_cpu == param_cpu_id) { 
    printk(KERN_INFO "read: is on requested CPU: %d\n", smp_processor_id()); 
    } 
    else { 
    printk(KERN_INFO "read: not on requested CPU:%d\n", smp_processor_id()); 
    } 
    put_cpu(); 
    return 0; 
} 
static ssize_t toy_write(struct file *filep, const char *buffer, size_t len, loff_t *offset){ 
    int this_cpu = get_cpu(); 
    printk(KERN_INFO "write called on CPU:%d\n", this_cpu); 
    if(this_cpu == param_cpu_id) { 
    printk(KERN_INFO "write: is on requested CPU: %d\n", smp_processor_id()); 
    } 
    else { 
    printk(KERN_INFO "write: not on requested CPU:%d\n", smp_processor_id()); 
    } 
    put_cpu(); 
    return 0; 
} 
static int toy_release(struct inode *inodep, struct file *filep){ 
    int this_cpu = get_cpu(); 
    printk(KERN_INFO "release called on CPU:%d\n", this_cpu); 
    if(this_cpu == param_cpu_id) { 
    printk(KERN_INFO "release: is on requested CPU: %d\n", smp_processor_id()); 
    } 
    else { 
    printk(KERN_INFO "release: not on requested CPU:%d\n", smp_processor_id()); 
    } 
    put_cpu(); 
    return 0; 
} 

static int __init toy_init(void) { 
    int cpu_id; 
    if(param_cpu_id < 0 || param_cpu_id > 4) { 
    printk(KERN_INFO "toy: unable to load module without cpu parameter\n"); 
    return -1; 
    } 
    printk(KERN_INFO "toy: loading to device driver, param_cpu_id: %d\n", param_cpu_id); 
    //preempt_disable(); // See notes below 
    cpu_id = get_cpu(); 
    printk(KERN_INFO "toy init called and running on CPU: %d\n", cpu_id); 
    misc_register(&toy_device); 
    //preempt_enable(); // See notes below 
    put_cpu(); 
    //smp_call_function_single(1,foo,(void *)(uintptr_t) 1,1); 
    return 0; 
} 

static void __exit toy_exit(void) { 
    misc_deregister(&toy_device); 
    printk(KERN_INFO "toy exit called\n"); 
} 

module_init(toy_init); 
module_exit(toy_exit); 

कोड ऊपर दो तरीकों आप सीपीयू की यानी अलगाव के लिए और एक अलग कोर पर init रन पर पूछा होता है।

इनिट get_cpu पर प्रीमेप्शन अक्षम करता है यानी इसके बाद आने वाली किसी भी चीज़ को कर्नेल द्वारा पूर्ववत नहीं किया जाएगा और एक कोर पर चलाया जाएगा। ध्यान दें, यह 3.16 का उपयोग कर गिरी किया गया था, अपने लाभ के लिए अपने कर्नेल संस्करण के आधार पर भिन्न हो सकते हैं, लेकिन मुझे लगता है कि इन एपीआई एक लंबे समय

यह Makefile है चारों ओर कर दिया गया है ...

obj-m += toy.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

नोट्स। get_cpu में linux/smp.h रूप

#define get_cpu() ({ preempt_disable(); smp_processor_id(); }) 
#define put_cpu() preempt_enable() 

ताकि आप वास्तव में get_cpu कॉल करने से पहले preempt_disable कॉल करने के लिए की जरूरत नहीं है की घोषणा की है। get_cpu कॉल

preempt_count_inc(); 
barrier(); 

कॉल की निम्न क्रम के चारों ओर एक आवरण है ... और put_cpu वास्तव में इस कर रहा है ...

barrier(); 
if (unlikely(preempt_count_dec_and_test())) { 
    __preempt_schedule(); 
} 

आप उपरोक्त का उपयोग कर की तरह आप के रूप में के रूप में कल्पना प्राप्त कर सकते हैं । लगभग सभी इस बात का के लिए ... रॉबर्ट प्यार से smp_call_function_single

लिनक्स कर्नेल विकास, पुस्तक निम्नलिखित स्रोतों से लिया गया था ..

गूगल।

http://derekmolloy.ie/writing-a-linux-kernel-module-part-2-a-character-device/

https://github.com/vsinitsyn/reverse/blob/master/reverse.c

+0

'kernel_thread' के बाद, थ्रेड' cpuset * 'कॉल का उपयोग करके किसी दिए गए CPU पर क्लैंप कर सकता है। लेकिन, इस सीपीयू का उपयोग करने के लिए _all_ अन्य धागे को _not_ को मजबूर करने के लिए [संभवतः] 'do_fork' में एक कस्टम परिवर्तन की आवश्यकता होगी जो [बदसूरत] समस्याग्रस्त होगा। दिए गए थ्रेड के लिए आर/टी शेड्यूलर सेट करने के लिए एक "अच्छा पर्याप्त" कामकाज होगा और 11 की आर/टी प्राथमिकता निर्धारित करें [एक सुरक्षित मूल्य - केवल तभी उच्च हो जब आप हिम्मत करते हैं]। व्यावहारिक रूप से, यह वांछित प्रभाव उत्पन्न करेगा क्योंकि लगभग कुछ और नहीं होगा [चलाने में सक्षम] क्योंकि धागा उच्च (एआर) प्राथमिकता –

0

आप के साथ work_struct कोशिश किया

struct workqueue_attrs { 
cpumask_var_t   cpumask;  /* allowed CPUs */ 
} 

सभी cpu पहले के माध्यम से (उदाहरण के cpu 0x1 के लिए)

setenv bootargs isolcpus=\"0x1"\ 

और अगले

अलग करना चाहिए
struct lkm_sample { 
struct work_struct lkm_work_struct; 
struct workqueue_struct *lkm_wq_struct; 
... 
}; 
static struct lkm_sample lkm_smpl; 

static void work(struct work_struct *work) 
{ 
struct lkm_sample *tmp = container_of(work, struct lkm_sample,  lkm_work_struct); 
.... 
return; 
} 
static int __init lkm_init(void) 
{ 
//see:  https://lwn.net/Articles/540999/ 
lkm_smpl.lkm_wq_struct = create_singlethread_workqueue("you_wq_name"); 
INIT_WORK(&lkm_smpl.lkm_wq_struct, work); 
} 

आप अलग CPU पर शुरू (चलाने __init) लाइन किमी करना चाहते हैं:

  1. साथ setenv bootargs isolcpus = \ "0x1" \

  2. lsmod helper_module.ko call_usermodehelper_setup struct subprocess_info * call_usermodehelper_setup (चार * पथ, चार ** argv,/* taskset 0x00000001 helper_application */ char ** envp, gfp_t gfp_mask, int (* init) (struct subprocess_info * जानकारी, स्ट्रक्चर क्रेडिट * नया), शून्य (* सफाई) (संरचना subprocess_info * जानकारी), शून्य * डेटा); उपयोग सहायक गिरी मॉड्यूल जो taskset और मुखौटा के माध्यम से यूज़रस्पेस कार्यक्रम (helper_application) चलाना चाहिए isolcpus से होना चाहिए। हेल्पर मॉड्यूल केवल __init समारोह() चलाने के लिए और वापस आ जाएगी -1 क्योंकि केवल एक ही कार्य: पृथक CPU पर यूज़रस्पेस अनुप्रयोग चलाने के।

  3. उपयोगकर्तास्पेस सहायक आवेदन के बाद केवल यह होना चाहिए: goal_module.ko के लिए lsmod, target_module उसी पृथक सीपीयू पर प्रारंभ होना चाहिए।

  4. उपयोग workqueue अलग CPU पर रन पृथक मॉड्यूल जारी रखने के लिए।

+0

के साथ सीपीयू को अर्ध-एकाधिकार करेगा मेरे प्रश्न में टिप्पणी अनुभाग देखें। मैं ऐसे समाधान के लिए नहीं देख रहा हूं जो 'आइसोलपस' का उपयोग करता है। मैं केवल मॉड्यूल लोड करते समय अलग करना चाहता हूं। – insumity

+0

क्या आप रनटाइम के दौरान सीपीयू को अलग करना चाहते हैं? उदाहरण के लिए आप for_each_process और लूप में प्रत्येक task_struct पीआईडी ​​और सीपीयू के लिए प्राप्त कर सकते हैं, अलग-अलग संख्या के साथ सीपीयू की तुलना करें और यदि सही किसी अन्य को अलग सीपीयू को सही प्रक्रिया नहीं है। और अगली सीपीयू पर अगले रन वर्क_स्ट्रक्चर। – cosinus0

+0

में उदाहरण के लिए task_struct रूप cpu नज़र ले जाने के लिएः > static void __migrate_swap_task (struct task_struct * p, पूर्णांक CPU) > शून्य set_task_cpu (struct task_struct * p, अहस्ताक्षरित int CPU) प्रक्रिया के लिए CPU मस्तूल सेट करने के लिए देखें: > cpumask_t cpus_allowed; संरचना task_struct में – cosinus0

2

आप अपने सवाल में कहा:

मुझे लगता है मैं "अज्ञात प्रतीकों" मिल गया क्योंकि उन कार्यों कर्नेल में कोई EXPORT_SYMBOL है

मुझे लगता है कि यह प्रमुख मुद्दा है आपकी समस्या का cpuset_init अन्य लोगों के अलावा: मैं आप फ़ाइल linux/cpuset.h जो विधि को परिभाषित करता है शामिल कर रहे हैं देखते हैं।

संकलन:

[email protected]:/home/hectorvp/cpuset/cpuset_try# make 
make -C /lib/modules/3.19.0-31-generic/build M=/home/hectorvp/cpuset/cpuset_try modules 
make[1]: Entering directory '/usr/src/linux-headers-3.19.0-31-generic' 
    CC [M] /home/hectorvp/cpuset/cpuset_try/cpuset_try.o 
    Building modules, stage 2. 
    MODPOST 1 modules 
    WARNING: "cpuset_init" [/home/hectorvp/cpuset/cpuset_try/cpuset_try.ko] undefined! 
    CC  /home/hectorvp/cpuset/cpuset_try/cpuset_try.mod.o 
    LD [M] /home/hectorvp/cpuset/cpuset_try/cpuset_try.ko 
make[1]: Leaving directory '/usr/src/linux-headers-3.19.0-31-generic' 

WARNING: "cupset_init" [...] undefined! देखें हालांकि, दोनों संकलन के दौरान और कमांड nm का उपयोग कर हम संकेतक हमें उनका कहना है कि इस समारोह उपलब्ध नहीं है देख सकते हैं।(: 'अनिर्धारित' के लिए U खड़ा नोट)

हालांकि, मैं इस प्रकार कर्नेल के प्रतीकों की खोज किया गया है:

[email protected]:/home/hectorvp/cpuset/cpuset_try# cat /proc/kallsyms | grep cpuset_init 
ffffffff8110dc40 T cpuset_init_current_mems_allowed 
ffffffff81d722ae T cpuset_init 
ffffffff81d72342 T cpuset_init_smp 

मैं: और nm का उपयोग कर

इसे निर्यात किया गया है लेकिन यह /lib/modules/$(uname -r)/build/Module.symvers में उपलब्ध नहीं है। तो तुम सही हो

आगे की जांच पड़ताल करने के बाद मैंने पाया यह वास्तव में परिभाषित किया गया है:

http://lxr.free-electrons.com/source/kernel/cpuset.c#L2101

इस समारोह आप कॉल करने के लिए के रूप में यह कर्नेल अंतरिक्ष में उपलब्ध है की जरूरत है। इस प्रकार आपको उपयोगकर्ता की जगह तक पहुंच की आवश्यकता नहीं होगी।

इस प्रतीक को कॉल करने में सक्षम मॉड्यूल को this question के दूसरे उत्तर में रिपोर्ट किया गया है। ध्यान दें कि आप linux/cpuset.h अब शामिल करने के लिए की जरूरत नहीं है :

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
//#include <linux/cpuset.h> 
#include <linux/kallsyms.h> 


int init_module(void) 
{ 
     static void (*cpuset_init_p)(void); 
     cpuset_init_p = (void*) kallsyms_lookup_name("cpuset_init"); 
     printk(KERN_INFO "Starting ...\n"); 
     #ifdef CONFIG_CPUSETS 
      printk(KERN_INFO "cpusets is enabled!"); 
     #endif 
     (*cpuset_init_p)(); 
     /* 
     * A non 0 return means init_module failed; module can't be loaded. 
     */ 
     return 0; 
} 

void cleanup_module(void) 
{ 
     printk(KERN_INFO "Ending ...\n"); 
} 

MODULE_LICENSE("GPL"); 

मैं इसे सफलतापूर्वक संकलित और insmod के साथ स्थापित किया। Bellow उत्पादन मैं dmesg में मिल गया है:

[ 1713.738925] Starting ... 
[ 1713.738929] cpusets is enabled! 
[ 1713.738943] kernel tried to execute NX-protected page - exploit attempt? (uid: 0) 
[ 1713.739042] BUG: unable to handle kernel paging request at ffffffff81d7237b 
[ 1713.739074] IP: [<ffffffff81d7237b>] cpuset_init+0x0/0x94 
[ 1713.739102] PGD 1c16067 PUD 1c17063 PMD 30bc74063 PTE 8000000001d72163 
[ 1713.739136] Oops: 0011 [#1] SMP 
[ 1713.739153] Modules linked in: cpuset_try(OE+) xt_conntrack ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 xt_addrtype iptable_filter ip_tables x_tables nf_nat nf_conntrack br_netfilter bridge stp llc pci_stub vboxpci(OE) vboxnetadp(OE) vboxnetflt(OE) vboxdrv(OE) aufs binfmt_misc cfg80211 nls_iso8859_1 snd_hda_codec_hdmi snd_hda_codec_realtek intel_rapl snd_hda_codec_generic iosf_mbi snd_hda_intel x86_pkg_temp_thermal intel_powerclamp snd_hda_controller snd_hda_codec snd_hwdep coretemp kvm_intel amdkfd kvm snd_pcm snd_seq_midi snd_seq_midi_event amd_iommu_v2 snd_rawmidi radeon snd_seq crct10dif_pclmul crc32_pclmul snd_seq_device aesni_intel ttm aes_x86_64 drm_kms_helper drm snd_timer i2c_algo_bit dcdbas mei_me lrw gf128mul mei snd glue_helper ablk_helper 
[ 1713.739533] cryptd soundcore shpchp lpc_ich serio_raw 8250_fintek mac_hid video parport_pc ppdev lp parport autofs4 hid_generic usbhid hid e1000e ahci psmouse ptp libahci pps_core 
[ 1713.739628] CPU: 2 PID: 24679 Comm: insmod Tainted: G   OE 3.19.0-56-generiC#62-Ubuntu 
[ 1713.739663] Hardware name: Dell Inc. OptiPlex 9020/0PC5F7, BIOS A03 09/17/2013 
[ 1713.739693] task: ffff8800d29f09d0 ti: ffff88009177c000 task.ti: ffff88009177c000 
[ 1713.739723] RIP: 0010:[<ffffffff81d7237b>] [<ffffffff81d7237b>] cpuset_init+0x0/0x94 
[ 1713.739757] RSP: 0018:ffff88009177fd10 EFLAGS: 00010292 
[ 1713.739779] RAX: 0000000000000013 RBX: ffffffff81c1a080 RCX: 0000000000000013 
[ 1713.739808] RDX: 000000000000c928 RSI: 0000000000000246 RDI: 0000000000000246 
[ 1713.739836] RBP: ffff88009177fd18 R08: 000000000000000a R09: 00000000000003db 
[ 1713.739865] R10: 0000000000000092 R11: 00000000000003db R12: ffff8800ad1aaee0 
[ 1713.739893] R13: 0000000000000000 R14: ffffffffc0947000 R15: ffff88009177fef8 
[ 1713.739923] FS: 00007fbf45be8700(0000) GS:ffff88031dd00000(0000) knlGS:0000000000000000 
[ 1713.739955] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 
[ 1713.739979] CR2: ffffffff81d7237b CR3: 00000000a3733000 CR4: 00000000001407e0 
[ 1713.740007] Stack: 
[ 1713.740016] ffffffffc094703e ffff88009177fd98 ffffffff81002148 0000000000000001 
[ 1713.740052] 0000000000000001 ffff8802479de200 0000000000000001 ffff88009177fd78 
[ 1713.740087] ffffffff811d79e9 ffffffff810fb058 0000000000000018 ffffffffc0949000 
[ 1713.740122] Call Trace: 
[ 1713.740137] [<ffffffffc094703e>] ? init_module+0x3e/0x50 [cpuset_try] 
[ 1713.740175] [<ffffffff81002148>] do_one_initcall+0xd8/0x210 
[ 1713.740190] [<ffffffff811d79e9>] ? kmem_cache_alloc_trace+0x189/0x200 
[ 1713.740207] [<ffffffff810fb058>] ? load_module+0x15b8/0x1d00 
[ 1713.740222] [<ffffffff810fb092>] load_module+0x15f2/0x1d00 
[ 1713.740236] [<ffffffff810f6850>] ? store_uevent+0x40/0x40 
[ 1713.740250] [<ffffffff810fb916>] SyS_finit_module+0x86/0xb0 
[ 1713.740265] [<ffffffff817ce10d>] system_call_fastpath+0x16/0x1b 
[ 1713.740280] Code: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c 53 58 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <00> 00 00 00 00 1c 00 00 00 c0 92 2c 7d c0 92 2c 7d a0 fc 69 ee 
[ 1713.740398] RIP [<ffffffff81d7237b>] cpuset_init+0x0/0x94 
[ 1713.740413] RSP <ffff88009177fd10> 
[ 1713.740421] CR2: ffffffff81d7237b 
[ 1713.746177] ---[ end trace 25614103c0658b94 ]--- 

त्रुटियों के बावजूद, मैं कहेंगे मैं अपने प्रारंभिक प्रश्न का उत्तर दिया:

मैं कैसे cpuset के प्रयोग करते हैं एक कर्नेल मॉड्यूल के अंदर से? *

शायद सबसे सुरुचिपूर्ण तरीके से नहीं, क्योंकि मैं बिल्कुल विशेषज्ञ नहीं हूं। आपको यहां से जारी रखने की जरूरत है।

सादर