From 6d977b89f35957e08ecac4cebac4bb83073c8082 Mon Sep 17 00:00:00 2001 From: Daniel Hellstrom Date: Fri, 30 May 2014 16:38:03 +0200 Subject: Net: add network task affinity config This patch adds a default network tasks CPU affinity configuration option. The network drivers have the option to create their own daemon tasks with a custom CPU affinity set, or rely on the default set. --- cpukit/libnetworking/rtems/rtems_bsdnet.h | 10 +++++++ cpukit/libnetworking/rtems/rtems_bsdnet_internal.h | 11 +++++++ cpukit/libnetworking/rtems/rtems_glue.c | 34 ++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/cpukit/libnetworking/rtems/rtems_bsdnet.h b/cpukit/libnetworking/rtems/rtems_bsdnet.h index 9dd44fec84..da6f76748d 100644 --- a/cpukit/libnetworking/rtems/rtems_bsdnet.h +++ b/cpukit/libnetworking/rtems/rtems_bsdnet.h @@ -11,6 +11,9 @@ extern "C" { #endif #include +#ifdef RTEMS_SMP +#include +#endif /* * If this file is included from inside the Network Stack proper or @@ -181,6 +184,13 @@ struct rtems_bsdnet_config { */ unsigned long tcp_tx_buf_size; unsigned long tcp_rx_buf_size; + + /* + * Default Network Tasks CPU Affinity + */ +#ifdef RTEMS_SMP + const cpu_set_t network_task_cpuset; +#endif }; /* diff --git a/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h b/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h index 05e54b272f..6869579b83 100644 --- a/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h +++ b/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h @@ -155,6 +155,17 @@ rtems_id rtems_bsdnet_newproc ( void *arg ); +#ifdef RTEMS_SMP +/* As rtems_bsdnet_newproc() but with ability to set CPU affinity too */ +rtems_id rtems_bsdnet_newproc_affinity ( + char *name, + int stacksize, + void (*entry)(void *), + void *arg, + const cpu_set_t *set +); +#endif + rtems_status_code rtems_bsdnet_event_receive ( rtems_event_set event_in, rtems_option option_set, diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c index 8ed17d1bf0..458cb2f19f 100644 --- a/cpukit/libnetworking/rtems/rtems_glue.c +++ b/cpukit/libnetworking/rtems/rtems_glue.c @@ -56,6 +56,9 @@ Semaphore_Control *the_networkSemaphore; #endif static rtems_id networkDaemonTid; static uint32_t networkDaemonPriority; +#ifdef RTEMS_SMP +static cpu_set_t networkDaemonCpuset; +#endif static void networkDaemon (void *task_argument); /* @@ -280,6 +283,13 @@ rtems_bsdnet_initialize (void) else networkDaemonPriority = rtems_bsdnet_config.network_task_priority; + /* + * Default network task CPU affinity + */ +#ifdef RTEMS_SMP + networkDaemonCpuset = rtems_bsdnet_config.network_task_cpuset; +#endif + /* * Set the memory allocation limits */ @@ -660,11 +670,29 @@ taskEntry (rtems_task_argument arg) rtems_panic ("Network task returned!\n"); } + /* * Start a network task */ +#ifdef RTEMS_SMP +rtems_id +rtems_bsdnet_newproc (char *name, int stacksize, void(*entry)(void *), void *arg) +{ + cpu_set_t *set = NULL; + + if (!CPU_EMPTY(&networkDaemonCpuset)) + set = &networkDaemonCpuset; + + return rtems_bsdnet_newproc_affinity(name, stacksize, entry, arg, set); +} + +rtems_id +rtems_bsdnet_newproc_affinity (char *name, int stacksize, void(*entry)(void *), + void *arg, const cpu_set_t *set) +#else rtems_id rtems_bsdnet_newproc (char *name, int stacksize, void(*entry)(void *), void *arg) +#endif { struct newtask *t; char nm[4]; @@ -681,6 +709,12 @@ rtems_bsdnet_newproc (char *name, int stacksize, void(*entry)(void *), void *arg if (sc != RTEMS_SUCCESSFUL) rtems_panic ("Can't create network daemon `%s': `%s'\n", name, rtems_status_text (sc)); +#ifdef RTEMS_SMP + /* Use the default affinity or use the user-provided CPU set */ + if (set) + rtems_task_set_affinity(tid, sizeof(cpu_set_t), set); +#endif + /* * Set up task arguments */ -- cgit v1.2.3