Enable CPU Affnity for UE threads
This commit is contained in:
+182
-6
@@ -53,6 +53,7 @@
|
|||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
#include <sys/sysinfo.h>
|
||||||
|
|
||||||
#include "rt_wrapper.h"
|
#include "rt_wrapper.h"
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
@@ -211,6 +212,69 @@ static void *UE_thread_synch(void *arg)
|
|||||||
printf("UE_thread_sync in with PHY_vars_UE %p\n",arg);
|
printf("UE_thread_sync in with PHY_vars_UE %p\n",arg);
|
||||||
printf("waiting for sync (UE_thread_synch) \n");
|
printf("waiting for sync (UE_thread_synch) \n");
|
||||||
|
|
||||||
|
#ifndef LOWLATENCY
|
||||||
|
int policy, s, j;
|
||||||
|
struct sched_param sparam;
|
||||||
|
char cpu_affinity[1024];
|
||||||
|
cpu_set_t cpuset;
|
||||||
|
|
||||||
|
/* Set affinity mask to include CPUs 1 to MAX_CPUS */
|
||||||
|
/* CPU 0 is reserved for UHD threads */
|
||||||
|
CPU_ZERO(&cpuset);
|
||||||
|
for (j = 1; j < get_nprocs(); j++)
|
||||||
|
CPU_SET(j, &cpuset);
|
||||||
|
|
||||||
|
s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror( "pthread_setaffinity_np");
|
||||||
|
exit_fun("Error setting processor affinity");
|
||||||
|
}
|
||||||
|
/* Check the actual affinity mask assigned to the thread */
|
||||||
|
|
||||||
|
s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror( "pthread_getaffinity_np");
|
||||||
|
exit_fun("Error getting processor affinity ");
|
||||||
|
}
|
||||||
|
memset(cpu_affinity, 0 , sizeof(cpu_affinity));
|
||||||
|
for (j = 0; j < CPU_SETSIZE; j++)
|
||||||
|
if (CPU_ISSET(j, &cpuset))
|
||||||
|
{
|
||||||
|
char temp[1024];
|
||||||
|
sprintf(temp, " CPU_%d ", j);
|
||||||
|
strcat(cpu_affinity, temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&sparam, 0 , sizeof (sparam));
|
||||||
|
sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
|
||||||
|
policy = SCHED_FIFO ;
|
||||||
|
|
||||||
|
s = pthread_setschedparam(pthread_self(), policy, &sparam);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror("pthread_setschedparam : ");
|
||||||
|
exit_fun("Error setting thread priority");
|
||||||
|
}
|
||||||
|
s = pthread_getschedparam(pthread_self(), &policy, &sparam);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror("pthread_getschedparam : ");
|
||||||
|
exit_fun("Error getting thread priority");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I( HW, "[SCHED][UE] Started UE synch thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(),
|
||||||
|
(policy == SCHED_FIFO) ? "SCHED_FIFO" :
|
||||||
|
(policy == SCHED_RR) ? "SCHED_RR" :
|
||||||
|
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
|
||||||
|
"???",
|
||||||
|
(int) sparam.sched_priority, cpu_affinity);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_lock(&sync_mutex);
|
pthread_mutex_lock(&sync_mutex);
|
||||||
printf("Locked sync_mutex, waiting (UE_sync_thread)\n");
|
printf("Locked sync_mutex, waiting (UE_sync_thread)\n");
|
||||||
|
|
||||||
@@ -652,9 +716,65 @@ static void *UE_thread_tx(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
struct sched_param sp;
|
int policy, s, j;
|
||||||
sp.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
|
struct sched_param sparam;
|
||||||
pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp);
|
char cpu_affinity[1024];
|
||||||
|
cpu_set_t cpuset;
|
||||||
|
|
||||||
|
/* Set affinity mask to include CPUs 1 to MAX_CPUS */
|
||||||
|
/* CPU 0 is reserved for UHD threads */
|
||||||
|
CPU_ZERO(&cpuset);
|
||||||
|
for (j = 1; j < get_nprocs(); j++)
|
||||||
|
CPU_SET(j, &cpuset);
|
||||||
|
|
||||||
|
s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror( "pthread_setaffinity_np");
|
||||||
|
exit_fun("Error setting processor affinity");
|
||||||
|
}
|
||||||
|
/* Check the actual affinity mask assigned to the thread */
|
||||||
|
|
||||||
|
s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror( "pthread_getaffinity_np");
|
||||||
|
exit_fun("Error getting processor affinity ");
|
||||||
|
}
|
||||||
|
memset(cpu_affinity, 0 , sizeof(cpu_affinity));
|
||||||
|
for (j = 0; j < CPU_SETSIZE; j++)
|
||||||
|
if (CPU_ISSET(j, &cpuset))
|
||||||
|
{
|
||||||
|
char temp[1024];
|
||||||
|
sprintf(temp, " CPU_%d ", j);
|
||||||
|
strcat(cpu_affinity, temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&sparam, 0 , sizeof (sparam));
|
||||||
|
sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
|
||||||
|
policy = SCHED_FIFO ;
|
||||||
|
|
||||||
|
s = pthread_setschedparam(pthread_self(), policy, &sparam);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror("pthread_setschedparam : ");
|
||||||
|
exit_fun("Error setting thread priority");
|
||||||
|
}
|
||||||
|
s = pthread_getschedparam(pthread_self(), &policy, &sparam);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror("pthread_getschedparam : ");
|
||||||
|
exit_fun("Error getting thread priority");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I( HW, "[SCHED][UE] Started UE thread TX on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(),
|
||||||
|
(policy == SCHED_FIFO) ? "SCHED_FIFO" :
|
||||||
|
(policy == SCHED_RR) ? "SCHED_RR" :
|
||||||
|
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
|
||||||
|
"???",
|
||||||
|
(int) sparam.sched_priority, cpu_affinity);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -807,9 +927,65 @@ static void *UE_thread_rx(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
struct sched_param sp;
|
int policy, s, j;
|
||||||
sp.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
|
struct sched_param sparam;
|
||||||
pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp);
|
char cpu_affinity[1024];
|
||||||
|
cpu_set_t cpuset;
|
||||||
|
|
||||||
|
/* Set affinity mask to include CPUs 1 to MAX_CPUS */
|
||||||
|
/* CPU 0 is reserved for UHD threads */
|
||||||
|
CPU_ZERO(&cpuset);
|
||||||
|
for (j = 1; j < get_nprocs(); j++)
|
||||||
|
CPU_SET(j, &cpuset);
|
||||||
|
|
||||||
|
s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror( "pthread_setaffinity_np");
|
||||||
|
exit_fun("Error setting processor affinity");
|
||||||
|
}
|
||||||
|
/* Check the actual affinity mask assigned to the thread */
|
||||||
|
|
||||||
|
s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror( "pthread_getaffinity_np");
|
||||||
|
exit_fun("Error getting processor affinity ");
|
||||||
|
}
|
||||||
|
memset(cpu_affinity, 0 , sizeof(cpu_affinity));
|
||||||
|
for (j = 0; j < CPU_SETSIZE; j++)
|
||||||
|
if (CPU_ISSET(j, &cpuset))
|
||||||
|
{
|
||||||
|
char temp[1024];
|
||||||
|
sprintf(temp, " CPU_%d ", j);
|
||||||
|
strcat(cpu_affinity, temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&sparam, 0 , sizeof (sparam));
|
||||||
|
sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
|
||||||
|
policy = SCHED_FIFO ;
|
||||||
|
|
||||||
|
s = pthread_setschedparam(pthread_self(), policy, &sparam);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror("pthread_setschedparam : ");
|
||||||
|
exit_fun("Error setting thread priority");
|
||||||
|
}
|
||||||
|
s = pthread_getschedparam(pthread_self(), &policy, &sparam);
|
||||||
|
if (s != 0)
|
||||||
|
{
|
||||||
|
perror("pthread_getschedparam : ");
|
||||||
|
exit_fun("Error getting thread priority");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I( HW, "[SCHED][UE] Started UE RX thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(),
|
||||||
|
(policy == SCHED_FIFO) ? "SCHED_FIFO" :
|
||||||
|
(policy == SCHED_RR) ? "SCHED_RR" :
|
||||||
|
(policy == SCHED_OTHER) ? "SCHED_OTHER" :
|
||||||
|
"???",
|
||||||
|
(int) sparam.sched_priority, cpu_affinity);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user