summaryrefslogtreecommitdiff
path: root/cpukit/libnetworking/rtems/rtems_glue.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libnetworking/rtems/rtems_glue.c')
-rw-r--r--cpukit/libnetworking/rtems/rtems_glue.c34
1 files changed, 34 insertions, 0 deletions
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);
/*
@@ -281,6 +284,13 @@ rtems_bsdnet_initialize (void)
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
*/
if (rtems_bsdnet_config.mbuf_bytecount)
@@ -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
*/