From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5D753A0540; Tue, 13 Dec 2022 04:02:59 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3FAAD40684; Tue, 13 Dec 2022 04:02:59 +0100 (CET) Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by mails.dpdk.org (Postfix) with ESMTP id 12F2F40146 for ; Tue, 13 Dec 2022 04:02:57 +0100 (CET) Received: from kwepemm600004.china.huawei.com (unknown [172.30.72.55]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4NWNW95MDPzJpGR; Tue, 13 Dec 2022 10:59:17 +0800 (CST) Received: from [10.67.103.231] (10.67.103.231) by kwepemm600004.china.huawei.com (7.193.23.242) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Tue, 13 Dec 2022 11:02:54 +0800 Message-ID: <585fd255-3e79-cebe-70d5-639832ecf621@huawei.com> Date: Tue, 13 Dec 2022 11:02:47 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 Subject: Re: [PATCH V3 00/11] telemetry: add u32 value type and hex integer string API To: =?UTF-8?Q?Morten_Br=c3=b8rup?= , Bruce Richardson CC: , , , , References: <20221208080540.62913-1-lihuisong@huawei.com> <20221212064306.39232-1-lihuisong@huawei.com> <98CBD80474FA8B44BF855DF32C47DC35D87585@smartserver.smartshare.dk> <98CBD80474FA8B44BF855DF32C47DC35D87586@smartserver.smartshare.dk> From: "lihuisong (C)" In-Reply-To: <98CBD80474FA8B44BF855DF32C47DC35D87586@smartserver.smartshare.dk> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.67.103.231] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To kwepemm600004.china.huawei.com (7.193.23.242) X-CFilter-Loop: Reflected X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 在 2022/12/12 20:03, Morten Brørup 写道: >> From: Bruce Richardson [mailto:bruce.richardson@intel.com] >> Sent: Monday, 12 December 2022 12.21 >> >> On Mon, Dec 12, 2022 at 12:02:32PM +0100, Morten Brørup wrote: >>>> From: Bruce Richardson [mailto:bruce.richardson@intel.com] >>>> Sent: Monday, 12 December 2022 11.32 >>>> >>>> On Mon, Dec 12, 2022 at 02:42:55PM +0800, Huisong Li wrote: >>>>> Some lib telemetry interfaces add the 'u32' and 'u64' data by the >>>>> rte_tel_data_add_dict/array_int API. This may cause data >> conversion >>>> error >>>>> or data truncation. >>>>> >>>>> The 'u32' data can not be assigned to signed 32-bit integer. >> However, >>>>> assigning to u64 is very wasteful, after all, the buffer capacity >> of >>>> each >>>>> transfer is limited. So it is necessary for 'u32' data to add >> usigned >>>>> 32-bit integer type and a series of 'u32' operation APIs. >>>>> >>>>> This patchset uses the new 'u32' API to resolve the problem of >> data >>>>> conversion error, and use the 'u64' API to add 'u64' data. >>>>> >>>>> In addition, this patchset introduces two APIs to store u32 and >> u64 >>>>> values as hexadecimal encoded strings in telemetry library. >>>>> >>>>> --- -v3: fix a misspelling mistake in commit log. -v2: - fix ABI >>>> break >>>>> warning. - introduce two APIs to store u32 and u64 values as >>>> hexadecimal >>>>> encoded strings. >>>>> >>>> I'm not convinced about adding the u32 value generically to the >>>> telemetry >>>> lib - except in the case of having explicit function calls for u32 >> vs >>>> u64 >>>> hex strings. Having a u32 type doesn't gain us any space internally >>>> over a >>>> u64 value, since all values are in a union type. Also, for output >> as >>>> json, >>>> the numeric values are all output as decimal values, meaning that >> the >>>> value >>>> 1 appears as the same size in the output string whether it is a u32 >> or >>>> u64 >>>> type. Now, it may save space in a future binary output format, but >> even >>>> then it still may not do so. >>> I agree that a u32 doesn't gain any space internally. >>> >>> However, many SNMP counters are unsigned 32 bit, and expected to wrap >> around as such. >>> So I suppose the u32 type might be useful for SNMP, if obtained >> through the telemetry library. >>> Alternatively, we could somehow reuse the u64 type and require the >> application to pass (value & UINT32_MAX) to the u64 functions. To make >> this easy to use, we should add some wrappers to do it for the >> application. And eventually we would probably end up with something >> very similar to this patch. >> I think just using the u64 functions is probably simplest and best >> right >> now. If we add support for something like snmp then yes, it would make >> sense to explicitly add it, but it seems like a lot of extra code for >> little or no benefit until we support something like that. > > If we wanted to fix this generally, we should rely on type promotion, so the existing _int function should be updated to take an int64_t value, and the _u64 function should be renamed to _uint (and still take an uint64_t value). However, that would break the ABI, and would need to go through some process for that. So let's not change this now. > > > I tend to agree with Bruce on this: Let's get rid of the new u32 functions, and rely on the u64 functions for that instead. All right. Let's drop the new u32 functions. > >>>> Therefore, I'd tend to keep the existing u64 type as-is, and >> instead >>>> only >>>> add the functions for outputting hex values. Those hex output >> functions >>>> could take an additional parameter indicating the desired hex >> output >>>> length, as there could well be cases where we want just 16-bit hex >>>> value >>>> too. >>> The way I read the patch series, the hex output length is not fixed, >> but an u64 value of 5 will be output as 0x5, not 0x0000000000000005. >>> So the only benefit of having both u32_hex and u64_hex functions is >> to avoid type promotion from uint32_t to uint64_t on input for 32 bit >> values. >>> Instead of passing a 3rd parameter or adding u16_hex functions, we >> could consider just having one set of hex functions using uint64_t for >> the value, and rely on type promotion for 32 and 16 bit values. >> +1 to having only a single hex function, and I think type promotion >> should >> work fine. >> >> However, I still think it might be worthwhile allowing the user to pass >> in >> a min output length parameter too. I find for many hex strings having >> the >> leading zeros to explicitly show the length can be useful. The value >> "0" >> could cover the current behaviour of no-padding, otherwise the >> parameter >> should indicate the number of bits to be displayed. (If we want to lock >> it >> down we can use an enum parameter rather than int to limit it to 0, 8, >> 16, >> 32 or 64 bit displayed values). > An extra parameter for minimum output length (in number of input bits) would be very nice, and makes avoids a set of functions for each bit width. > > (I don't think it should be lock it down to some special bit lengths; there is no need to prevent 24 bit or other exotic bit widths.) > > Something like this: > > char str[64]; // Big enough length. > if (bits != 0) { > char format[16]; // Big enough length. > sprintf(format, "0x0%u%" PRIx64, (bits + 3) / 4); > sprintf(str, format, value); > } else { > sprintf(str, "0x%" PRIx64, value); > } Fix it in v4. >> All that said, I'm not massively concerned if we want to just keep the >> current approach of always just printing without any leading zeros. >> It's a >> nice-to-have only for me. >> >> /Bruce > > .