From nobody Wed Nov 12 02:06:52 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1567347890; cv=none; d=zoho.com; s=zohoarc; b=f/Hrw0dC3XhTb1itLAGlij/z5U4jJW7eFsdGsbYOKR1VZXWWafmVhyr2htIKmTv5pajRwPuMo7D5lYm7L5OA5p0iOVDNYiFMsezop5guVAPvgbfOOh+LfqzBrpiazj6lgsrbNzHFbhmqtb17DWliYUJgwfrKGjFT0e0ppX0D8hM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567347890; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=4pgIi6yyiqsV1g1OBBMg7zBt/g1u4c9cImwzWVZuPf8=; b=EFBZVNpD9G8e5qetFdyHPoWwSIjJrgMv2nJZIflF+FKrCtTyIrIKy+hSl/FYzoZQGUKPgnDCRjlY+NieOsrASY5ZFmmUFyuO4ybtiAbgHMQ3yQnkwWYGi38ms3eYxs+u0RPXzH7cZwHhVSQiXTLnpLaH8SFlaDr8BcLc57KPOs8= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567347890237839.1979309217062; Sun, 1 Sep 2019 07:24:50 -0700 (PDT) Received: from localhost ([::1]:57750 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i4QmZ-0006Gg-Ua for importer@patchew.org; Sun, 01 Sep 2019 10:24:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39468) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i4QjU-0004Sm-Jz for qemu-devel@nongnu.org; Sun, 01 Sep 2019 10:21:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i4QjT-0004d5-7k for qemu-devel@nongnu.org; Sun, 01 Sep 2019 10:21:32 -0400 Received: from mga12.intel.com ([192.55.52.136]:16712) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i4QjS-0004b6-V2 for qemu-devel@nongnu.org; Sun, 01 Sep 2019 10:21:31 -0400 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Sep 2019 07:21:30 -0700 Received: from tao-optiplex-7060.sh.intel.com ([10.239.159.36]) by fmsmga002.fm.intel.com with ESMTP; 01 Sep 2019 07:21:28 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,455,1559545200"; d="scan'208";a="211453083" From: Tao Xu To: imammedo@redhat.com, eblake@redhat.com, ehabkost@redhat.com Date: Sun, 1 Sep 2019 22:21:11 +0800 Message-Id: <20190901142119.20482-4-tao3.xu@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190901142119.20482-1-tao3.xu@intel.com> References: <20190901142119.20482-1-tao3.xu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 192.55.52.136 Subject: [Qemu-devel] [PATCH v10 03/11] qapi: Add builtin type time X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jingqi.liu@intel.com, tao3.xu@intel.com, fan.du@intel.com, qemu-devel@nongnu.org, daniel@linux.ibm.com, jonathan.cameron@huawei.com, dan.j.williams@intel.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Add optional builtin type time, fallback is uint64. This type use qemu_strtotime_ps() for pre-converting time suffix to numbers. Signed-off-by: Tao Xu --- New patch in v10. --- include/qapi/visitor-impl.h | 4 ++++ include/qapi/visitor.h | 9 +++++++++ qapi/opts-visitor.c | 22 ++++++++++++++++++++++ qapi/qapi-visit-core.c | 12 ++++++++++++ qapi/qobject-input-visitor.c | 18 ++++++++++++++++++ qapi/trace-events | 1 + scripts/qapi/common.py | 2 ++ 7 files changed, 68 insertions(+) diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h index 8ccb3b6c20..e0979563c7 100644 --- a/include/qapi/visitor-impl.h +++ b/include/qapi/visitor-impl.h @@ -88,6 +88,10 @@ struct Visitor void (*type_size)(Visitor *v, const char *name, uint64_t *obj, Error **errp); =20 + /* Optional; fallback is type_uint64() */ + void (*type_time)(Visitor *v, const char *name, uint64_t *obj, + Error **errp); + /* Must be set */ void (*type_bool)(Visitor *v, const char *name, bool *obj, Error **err= p); =20 diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h index 5b2ed3f202..4c3198b1c5 100644 --- a/include/qapi/visitor.h +++ b/include/qapi/visitor.h @@ -554,6 +554,15 @@ void visit_type_int64(Visitor *v, const char *name, in= t64_t *obj, void visit_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp); =20 +/* + * Visit a uint64_t value. + * Like visit_type_uint64(), except that some visitors may choose to + * recognize numbers with timeunit suffix, such as "ps", "ns", "us" + * "ms" and "s". + */ +void visit_type_time(Visitor *v, const char *name, uint64_t *obj, + Error **errp); + /* * Visit a boolean value. * diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index 324b197495..d73b2e51a0 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -508,6 +508,27 @@ opts_type_size(Visitor *v, const char *name, uint64_t = *obj, Error **errp) processed(ov, name); } =20 +static void +opts_type_time(Visitor *v, const char *name, uint64_t *obj, Error **errp) +{ + OptsVisitor *ov =3D to_ov(v); + const QemuOpt *opt; + int err; + + opt =3D lookup_scalar(ov, name, errp); + if (!opt) { + return; + } + + err =3D qemu_strtotime_ps(opt->str ? opt->str : "", NULL, obj); + if (err < 0) { + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, + "a time value"); + return; + } + + processed(ov, name); +} =20 static void opts_optional(Visitor *v, const char *name, bool *present) @@ -555,6 +576,7 @@ opts_visitor_new(const QemuOpts *opts) ov->visitor.type_int64 =3D &opts_type_int64; ov->visitor.type_uint64 =3D &opts_type_uint64; ov->visitor.type_size =3D &opts_type_size; + ov->visitor.type_time =3D &opts_type_time; ov->visitor.type_bool =3D &opts_type_bool; ov->visitor.type_str =3D &opts_type_str; =20 diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 5365561b07..ac8896455c 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -277,6 +277,18 @@ void visit_type_size(Visitor *v, const char *name, uin= t64_t *obj, } } =20 +void visit_type_time(Visitor *v, const char *name, uint64_t *obj, + Error **errp) +{ + assert(obj); + trace_visit_type_time(v, name, obj); + if (v->type_time) { + v->type_time(v, name, obj, errp); + } else { + v->type_uint64(v, name, obj, errp); + } +} + void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { assert(obj); diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c index 32236cbcb1..9b66941d8a 100644 --- a/qapi/qobject-input-visitor.c +++ b/qapi/qobject-input-visitor.c @@ -627,6 +627,23 @@ static void qobject_input_type_size_keyval(Visitor *v,= const char *name, } } =20 +static void qobject_input_type_time_keyval(Visitor *v, const char *name, + uint64_t *obj, Error **errp) +{ + QObjectInputVisitor *qiv =3D to_qiv(v); + const char *str =3D qobject_input_get_keyval(qiv, name, errp); + + if (!str) { + return; + } + + if (qemu_strtotime_ps(str, NULL, obj) < 0) { + /* TODO report -ERANGE more nicely */ + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, + full_name(qiv, name), "time"); + } +} + static void qobject_input_optional(Visitor *v, const char *name, bool *pre= sent) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -708,6 +725,7 @@ Visitor *qobject_input_visitor_new_keyval(QObject *obj) v->visitor.type_any =3D qobject_input_type_any; v->visitor.type_null =3D qobject_input_type_null; v->visitor.type_size =3D qobject_input_type_size_keyval; + v->visitor.type_time =3D qobject_input_type_time_keyval; v->keyval =3D true; =20 return &v->visitor; diff --git a/qapi/trace-events b/qapi/trace-events index 5eb4afa110..c4605a7ccc 100644 --- a/qapi/trace-events +++ b/qapi/trace-events @@ -29,6 +29,7 @@ visit_type_int16(void *v, const char *name, int16_t *obj)= "v=3D%p name=3D%s obj=3D%p" visit_type_int32(void *v, const char *name, int32_t *obj) "v=3D%p name=3D%= s obj=3D%p" visit_type_int64(void *v, const char *name, int64_t *obj) "v=3D%p name=3D%= s obj=3D%p" visit_type_size(void *v, const char *name, uint64_t *obj) "v=3D%p name=3D%= s obj=3D%p" +visit_type_time(void *v, const char *name, uint64_t *obj) "v=3D%p name=3D%= s obj=3D%p" visit_type_bool(void *v, const char *name, bool *obj) "v=3D%p name=3D%s ob= j=3D%p" visit_type_str(void *v, const char *name, char **obj) "v=3D%p name=3D%s ob= j=3D%p" visit_type_number(void *v, const char *name, void *obj) "v=3D%p name=3D%s = obj=3D%p" diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py index d61bfdc526..3a6f108794 100644 --- a/scripts/qapi/common.py +++ b/scripts/qapi/common.py @@ -35,6 +35,7 @@ builtin_types =3D { 'uint32': 'QTYPE_QNUM', 'uint64': 'QTYPE_QNUM', 'size': 'QTYPE_QNUM', + 'time': 'QTYPE_QNUM', 'any': None, # any QType possible, actually 'QType': 'QTYPE_QSTRING', } @@ -1834,6 +1835,7 @@ class QAPISchema(object): ('uint32', 'int', 'uint32_t'), ('uint64', 'int', 'uint64_t'), ('size', 'int', 'uint64_t'), + ('time', 'int', 'uint64_t'), ('bool', 'boolean', 'bool'), ('any', 'value', 'QObject' + pointer_suffix), ('null', 'null', 'QNull' + pointer_suffix)]: --=20 2.20.1