From nobody Mon Feb 9 17:59:02 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1498921367802504.3226867643218; Sat, 1 Jul 2017 08:02:47 -0700 (PDT) Received: from localhost ([::1]:54828 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRJv1-0004jB-8d for importer@patchew.org; Sat, 01 Jul 2017 11:02:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35609) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRJtT-0003s0-Bz for qemu-devel@nongnu.org; Sat, 01 Jul 2017 11:01:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dRJtO-0003oq-UX for qemu-devel@nongnu.org; Sat, 01 Jul 2017 11:01:07 -0400 Received: from mga05.intel.com ([192.55.52.43]:57356) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dRJtO-0003hL-Mq for qemu-devel@nongnu.org; Sat, 01 Jul 2017 11:01:02 -0400 Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga105.fm.intel.com with ESMTP; 01 Jul 2017 08:01:01 -0700 Received: from unknown (HELO localhost.localdomain.sh.intel.com) ([10.239.48.64]) by fmsmga001.fm.intel.com with ESMTP; 01 Jul 2017 08:00:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,291,1496127600"; d="scan'208";a="1167015471" From: Benyu Xu To: qemu-devel@nongnu.org Date: Sat, 1 Jul 2017 22:57:09 +0800 Message-Id: <1498921030-23255-3-git-send-email-benyux.xu@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1498921030-23255-1-git-send-email-benyux.xu@intel.com> References: <1498921030-23255-1-git-send-email-benyux.xu@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 192.55.52.43 Subject: [Qemu-devel] [PATCH 2/3] vcpu pin: parameters parse and execution. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: tianyu.lan@intel.com, haozhong.zhang@intel.com, kevin.tian@intel.com, crosthwaite.peter@gmail.com, xudong.hao@intel.com, eddie.dong@intel.com, binx.wu@intel.com, gordon.jin@intel.com, benyux.xu@intel.com, pbonzini@redhat.com, hao.l.li@intel.com, benjamin_xby@163.com, hongbo.wang@intel.com, rth@twiddle.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Benyu Xu --- vl.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 115 insertions(+) diff --git a/vl.c b/vl.c index 36ff3f4..8c5dd25 100644 --- a/vl.c +++ b/vl.c @@ -167,6 +167,7 @@ int smp_cpus =3D 1; int max_cpus =3D 1; int smp_cores =3D 1; int smp_threads =3D 1; +int pcpu_id_array[131072 + 2] =3D {0}; /* 131072 =3D 1024 * 128 */ int acpi_enabled =3D 1; int no_hpet =3D 0; int fd_bootchk =3D 1; @@ -1270,6 +1271,106 @@ static void smp_parse(QemuOpts *opts) } } =20 +static void vcpupin_parse(const char *pcpu_id_list, const int smp_cpus_num) +{ + long pcpu_id; + int pcpu_num =3D 0; + bool pin_auto =3D false; + bool id_is_range =3D false; + long id_range_left; + long id_range_right; + int host_cpu_num; + const char *tmp_id_list =3D pcpu_id_list; + int ret =3D 0; + + if (!pcpu_id_list) { + return; + } + + if (strcmp(pcpu_id_list, "auto") =3D=3D 0) { + pin_auto =3D true; + } + + host_cpu_num =3D get_pcpu_num(pin_auto, pcpu_id_array); + if (host_cpu_num <=3D 0) { + error_report("cannot determine host cpu number"); + exit(1); + } + + if (smp_cpus_num > host_cpu_num) { + error_report("host can serve only %d cpus, less than smp_cpus_num = %d", + host_cpu_num, smp_cpus_num); + exit(1); + } + + if (pin_auto =3D=3D true) { + return; + } + + if (isdigit(tmp_id_list[0]) =3D=3D 0) { + error_report("invalid pcpu id list %s", pcpu_id_list); + error_report("pcpu id list should be \"auto\" or begin by digit"); + exit(1); + } + + while (tmp_id_list[0] !=3D '\0') { + if (isdigit(tmp_id_list[0]) =3D=3D 0 && tmp_id_list[0] !=3D ',' && + tmp_id_list[0] !=3D '-') { + error_report("invalid pcpu id list %s", pcpu_id_list); + error_report("pcpu id list only accept digit or ',' or '-'"); + exit(1); + } + tmp_id_list++; + } + tmp_id_list =3D pcpu_id_list; + + while (tmp_id_list) { + ret =3D qemu_strtol(tmp_id_list, &tmp_id_list, 10, &pcpu_id); + if (ret =3D=3D ERANGE || pcpu_id < 0 || pcpu_id >=3D host_cpu_num)= { + error_report("pcpu id %ld is out of range", pcpu_id); + exit(1); + } + + if (id_is_range =3D=3D true) { + id_range_right =3D pcpu_id; + if (id_range_right <=3D id_range_left) { + error_report("invalid pcpu id list [%ld-%ld]", + id_range_left, id_range_right); + exit(1); + } + for (; id_range_left <=3D id_range_right; id_range_left++) { + pcpu_id_array[0] =3D pcpu_num; + pcpu_id_array[pcpu_num] =3D id_range_left; + pcpu_num++; + } + pcpu_num--; + } else { + pcpu_num++; + pcpu_id_array[0] =3D pcpu_num; + pcpu_id_array[pcpu_num] =3D pcpu_id; + } + + if (tmp_id_list[0] =3D=3D '\0') { + break; + } else if (tmp_id_list[0] =3D=3D '-') { + id_is_range =3D true; + id_range_left =3D pcpu_id; + } else { + id_is_range =3D false; + } + tmp_id_list++; + + if (tmp_id_list[0] =3D=3D '\0') { + error_report("invalid pcpu id list %s", pcpu_id_list); + error_report("pcpu id list should be end by digit"); + exit(1); + } else if (isdigit(tmp_id_list[0]) =3D=3D 0) { + error_report("invalid pcpu id list %s", pcpu_id_list); + exit(1); + } + } +} + static void realtime_init(void) { if (enable_mlock) { @@ -3024,6 +3125,9 @@ int main(int argc, char **argv, char **envp) Error *main_loop_err =3D NULL; Error *err =3D NULL; bool list_data_dirs =3D false; + + const char *pcpu_id_list =3D NULL; + typedef struct BlockdevOptions_queue { BlockdevOptions *bdo; Location loc; @@ -3810,6 +3914,9 @@ int main(int argc, char **argv, char **envp) exit(1); } break; + case QEMU_OPTION_vcpupin: + pcpu_id_list =3D optarg; + break; case QEMU_OPTION_vnc: vnc_parse(optarg, &error_fatal); break; @@ -4222,6 +4329,8 @@ int main(int argc, char **argv, char **envp) =20 smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL)); =20 + vcpupin_parse(pcpu_id_list, smp_cpus); + machine_class->max_cpus =3D machine_class->max_cpus ?: 1; /* Default t= o UP */ if (max_cpus > machine_class->max_cpus) { error_report("Number of SMP CPUs requested (%d) exceeds max CPUs " @@ -4621,6 +4730,12 @@ int main(int argc, char **argv, char **envp) =20 machine_run_board_init(current_machine); =20 + pin_all_vcpus(smp_cpus, pcpu_id_array, &err); + if (err) { + error_report_err(err); + exit(1); + } + realtime_init(); =20 soundhw_init(); --=20 1.8.3.1