xref: /dpdk/examples/vm_power_manager/main.c (revision 98a1648109b8dbaa4e6b821c17d1f6bd86d33a9a)
18db653ffSAlan Carew /*-
28db653ffSAlan Carew  *   BSD LICENSE
38db653ffSAlan Carew  *
48db653ffSAlan Carew  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
58db653ffSAlan Carew  *   All rights reserved.
68db653ffSAlan Carew  *
78db653ffSAlan Carew  *   Redistribution and use in source and binary forms, with or without
88db653ffSAlan Carew  *   modification, are permitted provided that the following conditions
98db653ffSAlan Carew  *   are met:
108db653ffSAlan Carew  *
118db653ffSAlan Carew  *     * Redistributions of source code must retain the above copyright
128db653ffSAlan Carew  *       notice, this list of conditions and the following disclaimer.
138db653ffSAlan Carew  *     * Redistributions in binary form must reproduce the above copyright
148db653ffSAlan Carew  *       notice, this list of conditions and the following disclaimer in
158db653ffSAlan Carew  *       the documentation and/or other materials provided with the
168db653ffSAlan Carew  *       distribution.
178db653ffSAlan Carew  *     * Neither the name of Intel Corporation nor the names of its
188db653ffSAlan Carew  *       contributors may be used to endorse or promote products derived
198db653ffSAlan Carew  *       from this software without specific prior written permission.
208db653ffSAlan Carew  *
218db653ffSAlan Carew  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
228db653ffSAlan Carew  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
238db653ffSAlan Carew  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
248db653ffSAlan Carew  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
258db653ffSAlan Carew  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
268db653ffSAlan Carew  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
278db653ffSAlan Carew  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
288db653ffSAlan Carew  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
298db653ffSAlan Carew  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
308db653ffSAlan Carew  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
318db653ffSAlan Carew  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
328db653ffSAlan Carew  */
338db653ffSAlan Carew 
348db653ffSAlan Carew #include <stdio.h>
358db653ffSAlan Carew #include <string.h>
368db653ffSAlan Carew #include <stdint.h>
378db653ffSAlan Carew #include <errno.h>
388db653ffSAlan Carew #include <sys/epoll.h>
398db653ffSAlan Carew #include <fcntl.h>
408db653ffSAlan Carew #include <unistd.h>
418db653ffSAlan Carew #include <stdlib.h>
428db653ffSAlan Carew #include <unistd.h>
438db653ffSAlan Carew #include <signal.h>
448db653ffSAlan Carew #include <errno.h>
458db653ffSAlan Carew 
468db653ffSAlan Carew #include <sys/queue.h>
478db653ffSAlan Carew 
488db653ffSAlan Carew #include <rte_common.h>
498db653ffSAlan Carew #include <rte_eal.h>
508db653ffSAlan Carew #include <rte_launch.h>
518db653ffSAlan Carew #include <rte_log.h>
528db653ffSAlan Carew #include <rte_per_lcore.h>
538db653ffSAlan Carew #include <rte_lcore.h>
548db653ffSAlan Carew #include <rte_debug.h>
558db653ffSAlan Carew #include <rte_config.h>
568db653ffSAlan Carew 
578db653ffSAlan Carew #include "channel_manager.h"
588db653ffSAlan Carew #include "channel_monitor.h"
598db653ffSAlan Carew #include "power_manager.h"
608db653ffSAlan Carew #include "vm_power_cli.h"
618db653ffSAlan Carew 
628db653ffSAlan Carew static int
638db653ffSAlan Carew run_monitor(__attribute__((unused)) void *arg)
648db653ffSAlan Carew {
658db653ffSAlan Carew 	if (channel_monitor_init() < 0) {
668db653ffSAlan Carew 		printf("Unable to initialize channel monitor\n");
678db653ffSAlan Carew 		return -1;
688db653ffSAlan Carew 	}
698db653ffSAlan Carew 	run_channel_monitor();
708db653ffSAlan Carew 	return 0;
718db653ffSAlan Carew }
728db653ffSAlan Carew 
738db653ffSAlan Carew static void
748db653ffSAlan Carew sig_handler(int signo)
758db653ffSAlan Carew {
768db653ffSAlan Carew 	printf("Received signal %d, exiting...\n", signo);
778db653ffSAlan Carew 	channel_monitor_exit();
788db653ffSAlan Carew 	channel_manager_exit();
798db653ffSAlan Carew 	power_manager_exit();
808db653ffSAlan Carew 
818db653ffSAlan Carew }
828db653ffSAlan Carew 
838db653ffSAlan Carew int
84*98a16481SDavid Marchand main(int argc, char **argv)
858db653ffSAlan Carew {
868db653ffSAlan Carew 	int ret;
878db653ffSAlan Carew 	unsigned lcore_id;
888db653ffSAlan Carew 
898db653ffSAlan Carew 	ret = rte_eal_init(argc, argv);
908db653ffSAlan Carew 	if (ret < 0)
918db653ffSAlan Carew 		rte_panic("Cannot init EAL\n");
928db653ffSAlan Carew 
938db653ffSAlan Carew 	signal(SIGINT, sig_handler);
948db653ffSAlan Carew 	signal(SIGTERM, sig_handler);
958db653ffSAlan Carew 
968db653ffSAlan Carew 	lcore_id = rte_get_next_lcore(-1, 1, 0);
978db653ffSAlan Carew 	if (lcore_id == RTE_MAX_LCORE) {
988db653ffSAlan Carew 		RTE_LOG(ERR, EAL, "A minimum of two cores are required to run "
998db653ffSAlan Carew 				"application\n");
1008db653ffSAlan Carew 		return 0;
1018db653ffSAlan Carew 	}
1028db653ffSAlan Carew 	rte_eal_remote_launch(run_monitor, NULL, lcore_id);
1038db653ffSAlan Carew 
1048db653ffSAlan Carew 	if (power_manager_init() < 0) {
1058db653ffSAlan Carew 		printf("Unable to initialize power manager\n");
1068db653ffSAlan Carew 		return -1;
1078db653ffSAlan Carew 	}
1088db653ffSAlan Carew 	if (channel_manager_init(CHANNEL_MGR_DEFAULT_HV_PATH) < 0) {
1098db653ffSAlan Carew 		printf("Unable to initialize channel manager\n");
1108db653ffSAlan Carew 		return -1;
1118db653ffSAlan Carew 	}
1128db653ffSAlan Carew 	run_cli(NULL);
1138db653ffSAlan Carew 
1148db653ffSAlan Carew 	rte_eal_mp_wait_lcore();
1158db653ffSAlan Carew 	return 0;
1168db653ffSAlan Carew }
117