* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#define _GNU_SOURCE
#include <vppinfra/format.h>
#include <vlib/vlib.h>
#include <vlib/threads.h>
-#include <linux/sched.h>
+#include <vlib/unix/unix.h>
-u8 *
-format_sched_policy (u8 * s, va_list * args)
+static u8 *
+format_sched_policy_and_priority (u8 * s, va_list * args)
{
- u32 i = va_arg (*args, u32);
+ long i = va_arg (*args, long);
+ struct sched_param sched_param;
u8 *t = 0;
- switch (i)
+ switch (sched_getscheduler (i))
{
#define _(v,f,str) case SCHED_POLICY_##f: t = (u8 *) str; break;
foreach_sched_policy
#undef _
}
- s = format (s, "%-6s ", t);
- return s;
+ if (sched_getparam (i, &sched_param) == 0)
+ return format (s, "%s (%d)", t, sched_param.sched_priority);
+ else
+ return format (s, "%s (n/a)", t);
}
static clib_error_t *
vlib_worker_thread_t *w;
int i;
- vlib_cli_output (vm, "%-7s%-20s%-12s%-8s%-7s%-9s%-7s%-7s%-7s%-10s",
- "ID", "Name", "Type", "LWP", "Policy", "Priority",
+ vlib_cli_output (vm, "%-7s%-20s%-12s%-8s%-25s%-7s%-7s%-7s%-10s",
+ "ID", "Name", "Type", "LWP", "Sched Policy (Priority)",
"lcore", "Core", "Socket", "State");
#if !defined(__powerpc64__)
w->name ? w->name : (u8 *) "",
w->registration ? w->registration->name : "", w->lwp);
- line =
- format (line, "%U", format_sched_policy, sched_getscheduler (w->lwp));
+ line = format (line, "%-25U", format_sched_policy_and_priority, w->lwp);
- struct sched_param sched_param;
- line = format (line, "%8d ",
- (!sched_getparam (w->lwp, &sched_param)) ?
- sched_param.sched_priority : -1);
+ int lcore = -1;
+ cpu_set_t cpuset;
+ CPU_ZERO (&cpuset);
+ int ret = -1;
-#if DPDK==1
- int lcore = w->dpdk_lcore_id;
- if (lcore > -1)
+ ret =
+ pthread_getaffinity_np (w->thread_id, sizeof (cpu_set_t), &cpuset);
+ if (!ret)
+ {
+ int c;
+ for (c = 0; c < CPU_SETSIZE; c++)
+ if (CPU_ISSET (c, &cpuset))
+ {
+ if (lcore > -1)
+ {
+ lcore = -2;
+ break;
+ }
+ lcore = c;
+ }
+ }
+ else
{
- line = format (line, "%-7u%-7u%-7u",
- lcore,
- lcore_config[lcore].core_id,
- lcore_config[lcore].socket_id);
+ lcore = w->lcore_id;
+ }
+ if (lcore > -1)
+ {
+ const char *sys_cpu_path = "/sys/devices/system/cpu/cpu";
+ int socket_id = -1;
+ int core_id = -1;
+ u8 *p = 0;
+
+ p = format (p, "%s%u/topology/core_id%c", sys_cpu_path, lcore, 0);
+ vlib_sysfs_read ((char *) p, "%d", &core_id);
+
+ vec_reset_length (p);
+ p =
+ format (p,
+ "%s%u/topology/physical_package_id%c",
+ sys_cpu_path, lcore, 0);
+ vlib_sysfs_read ((char *) p, "%d", &socket_id);
+ vec_free (p);
+
+ line = format (line, "%-7u%-7u%-7u%", lcore, core_id, socket_id);
+#if DPDK==1
switch (lcore_config[lcore].state)
{
case WAIT:
default:
line = format (line, "unknown");
}
- }
#endif
+ }
+ else
+ {
+ line =
+ format (line, "%-7s%-7s%-7s%", (lcore == -2) ? "M" : "n/a", "n/a",
+ "n/a");
+ }
+
vlib_cli_output (vm, "%v", line);
vec_free (line);
}