Jan Kiszka wrote:
> M. Koehrer wrote:
>> Is there a possibility to mask the CPUs to be used globally?
>> This could also avoid to pass the CPU number with each rt_task_create() call.
> 
> Well, that would actually be an additional way. Yeah, maybe some global
> CPU mask that controls the affinity on future thread creation. We could
> export it via /proc so that you can set it right before starting a
> specific group of applications and drivers.

Some food for thoughts:

Here is an experimental implementation of such a global mask. Seems to
work, at least I was able to prevent any task creation on a UP box by
setting the mask to 0.

Jan
---
 include/nucleus/pod.h |    2 +
 ksrc/nucleus/module.c |   57 ++++++++++++++++++++++++++++++++++++++++++++++++++
 ksrc/nucleus/pod.c    |    3 ++
 3 files changed, 62 insertions(+)

Index: xenomai/include/nucleus/pod.h
===================================================================
--- xenomai.orig/include/nucleus/pod.h
+++ xenomai/include/nucleus/pod.h
@@ -253,6 +253,8 @@ extern u_long nktickdef;
 
 extern char *nkmsgbuf;
 
+extern xnarch_cpumask_t nkaffinity;
+
 #define xnprintf(fmt,args...)  xnarch_printf(fmt , ##args)
 #define xnloginfo(fmt,args...) xnarch_loginfo(fmt , ##args)
 #define xnlogwarn(fmt,args...) xnarch_logwarn(fmt , ##args)
Index: xenomai/ksrc/nucleus/module.c
===================================================================
--- xenomai.orig/ksrc/nucleus/module.c
+++ xenomai/ksrc/nucleus/module.c
@@ -688,6 +688,59 @@ static int heap_read_proc(char *page,
        return len;
 }
 
+static int affinity_read_proc(char *page,
+                             char **start,
+                             off_t off, int count, int *eof, void *data)
+{
+       unsigned long val = 0;
+       int len, cpu;
+
+       for (cpu = 0; cpu < sizeof(val) * 8; cpu++)
+               if (xnarch_cpu_isset(cpu, nkaffinity))
+                       val |= (1 << cpu);
+
+       len = sprintf(page, "0x%08lx\n", val);
+       len -= off;
+       if (len <= off + count)
+               *eof = 1;
+       *start = page + off;
+       if (len > count)
+               len = count;
+       if (len < 0)
+               len = 0;
+
+       return len;
+}
+
+static int affinity_write_proc(struct file *file,
+                              const char __user * buffer,
+                              unsigned long count, void *data)
+{
+       char *end, buf[16];
+       unsigned long val;
+       xnarch_cpumask_t new_affinity;
+       int n, cpu;
+
+       n = count > sizeof(buf) - 1 ? sizeof(buf) - 1 : count;
+
+       if (copy_from_user(buf, buffer, n))
+               return -EFAULT;
+
+       buf[n] = '\0';
+       val = simple_strtol(buf, &end, 0);
+
+       if (*end != '\0' && !isspace(*end))
+               return -EINVAL;
+
+       xnarch_cpus_clear(new_affinity);
+       for (cpu = 0; cpu < sizeof(val) * 8; cpu++, val >>= 1)
+               if (val & 1)
+                       xnarch_cpu_set(cpu, new_affinity);
+       nkaffinity = new_affinity;
+
+       return count;
+}
+
 static struct proc_dir_entry *add_proc_leaf(const char *name,
                                            read_proc_t rdproc,
                                            write_proc_t wrproc,
@@ -760,6 +813,9 @@ void xnpod_init_proc(void)
 
        add_proc_leaf("heap", &heap_read_proc, NULL, NULL, rthal_proc_root);
 
+       add_proc_leaf("affinity", &affinity_read_proc, &affinity_write_proc,
+                     NULL, rthal_proc_root);
+
 #ifdef CONFIG_XENO_OPT_PERVASIVE
        iface_proc_root =
            create_proc_entry("interfaces", S_IFDIR, rthal_proc_root);
@@ -778,6 +834,7 @@ void xnpod_delete_proc(void)
 
        remove_proc_entry("interfaces", rthal_proc_root);
 #endif /* CONFIG_XENO_OPT_PERVASIVE */
+       remove_proc_entry("affinity", rthal_proc_root);
        remove_proc_entry("heap", rthal_proc_root);
        remove_proc_entry("irq", rthal_proc_root);
        remove_proc_entry("timer", rthal_proc_root);
Index: xenomai/ksrc/nucleus/pod.c
===================================================================
--- xenomai.orig/ksrc/nucleus/pod.c
+++ xenomai/ksrc/nucleus/pod.c
@@ -70,6 +70,8 @@ MODULE_PARM_DESC(tick_arg, "Fixed clock 
 
 char *nkmsgbuf = NULL;
 
+xnarch_cpumask_t nkaffinity = XNPOD_ALL_CPUS;
+
 const char *xnpod_fatal_helper(const char *format, ...)
 {
        const unsigned nr_cpus = xnarch_num_online_cpus();
@@ -915,6 +917,7 @@ int xnpod_start_thread(xnthread_t *threa
        xnlock_get_irqsave(&nklock, s);
 
        thread->affinity = xnarch_cpu_online_map;
+       xnarch_cpus_and(thread->affinity, nkaffinity, thread->affinity);
        xnarch_cpus_and(thread->affinity, affinity, thread->affinity);
 
        if (xnarch_cpus_empty(thread->affinity)) {

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to