Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp9155287ybi; Wed, 10 Jul 2019 05:38:51 -0700 (PDT) X-Google-Smtp-Source: APXvYqxkK2o+Il2ZzT90s4fJltk2S3c65LthzZAMeBdESLTkEFuOJa8uIrrXtnPvBm307t3RHGJp X-Received: by 2002:a17:90a:bc0c:: with SMTP id w12mr6371682pjr.111.1562762331528; Wed, 10 Jul 2019 05:38:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562762331; cv=none; d=google.com; s=arc-20160816; b=SyzAR3LmHr7CSj/9uKI9wrJze2ZFvKgTUHth5T+9SrY/horOOCnA9oSR1ov3/HHeDX vL+zroilEd/1/8H5PcZnSxrUmyhOXFso/W1nN3f5SCPKIrD5WXEA3xq79BhqpkKOaRK8 QwAKvWF7l1mlgTWMFqKmhuURu5YddJbeGmiVUu6kvliIMGeIlj5jaBmqMvEZ1JGo7Tps wQsnZ2rIisxG4VhOYCR9397wK2TxGDQ4P7hodeEYEEnWJzRF1DaJA+5uyW1fEKtRrpIK jFYHHmTgIp6JSWWkFn+lZ7QqKuLXroKHgvxS4RkWFLau5V2q15SMZGUhHihxxZUorzNk id2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=GMJPKa7dqNf2Qc0TP6YnScYRM5AB6LptZtW7Y4DHggU=; b=X6Lt/gP1bvaKnoLz7AFEsIVXgV/K1djz2wWHRkEIr9n1TTgsVqmX+XrEmpmGxjwbZJ zM5DMgTKNARbhtBhaHArmcEXs9dwGrS594Sd9Gjy2CfpmC6FTZNZXtuAAj0oDI7btgC7 lTPkLkX0KCR8SzqkBATnpmwgZqTP951kjmi68pcZlYSrbfifBFjl0pjp0Pv7hG+pdMNd +G73klzUdcZ8lu8nfCm8sdWqSqJcGJY373LfZRy02OkUcBPkuw5G69XRG38fNnnZvuD6 9LU+umAHvRrchCcGoObthwhIVK7z7hCu/MG/hP/eujDqgqyVJ82VW3YWdp+uH5+lmmaU h34w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bd11si1976457plb.184.2019.07.10.05.38.35; Wed, 10 Jul 2019 05:38:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727437AbfGJMiG (ORCPT + 99 others); Wed, 10 Jul 2019 08:38:06 -0400 Received: from mx2.suse.de ([195.135.220.15]:43906 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725956AbfGJMiF (ORCPT ); Wed, 10 Jul 2019 08:38:05 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id BBD4BAEAC; Wed, 10 Jul 2019 12:38:03 +0000 (UTC) Received: by unicorn.suse.cz (Postfix, from userid 1000) id 126CEE0E06; Wed, 10 Jul 2019 14:38:03 +0200 (CEST) Date: Wed, 10 Jul 2019 14:38:03 +0200 From: Michal Kubecek To: netdev@vger.kernel.org Cc: Jiri Pirko , David Miller , Jakub Kicinski , Andrew Lunn , Florian Fainelli , John Linville , Stephen Hemminger , Johannes Berg , linux-kernel@vger.kernel.org Subject: Re: [PATCH net-next v6 06/15] ethtool: netlink bitset handling Message-ID: <20190710123803.GB5700@unicorn.suse.cz> References: <20190703114933.GW2250@nanopsycho> <20190703181851.GP20101@unicorn.suse.cz> <20190704080435.GF2250@nanopsycho> <20190704115236.GR20101@unicorn.suse.cz> <20190709141817.GE2301@nanopsycho.orion> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190709141817.GE2301@nanopsycho.orion> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jul 09, 2019 at 04:18:17PM +0200, Jiri Pirko wrote: > > I understand. So how about avoid the bitfield all together and just > have array of either bits of strings or combinations? > > ETHTOOL_CMD_SETTINGS_SET (U->K) > ETHTOOL_A_HEADER > ETHTOOL_A_DEV_NAME = "eth3" > ETHTOOL_A_SETTINGS_PRIV_FLAGS > ETHTOOL_A_SETTINGS_PRIV_FLAG > ETHTOOL_A_FLAG_NAME = "legacy-rx" > ETHTOOL_A_FLAG_VALUE (NLA_FLAG) > > or the same with index instead of string > > ETHTOOL_CMD_SETTINGS_SET (U->K) > ETHTOOL_A_HEADER > ETHTOOL_A_DEV_NAME = "eth3" > ETHTOOL_A_SETTINGS_PRIV_FLAGS > ETHTOOL_A_SETTINGS_PRIV_FLAG > ETHTOOL_A_FLAG_INDEX = 0 > ETHTOOL_A_FLAG_VALUE (NLA_FLAG) > > > For set you can combine both when you want to set multiple bits: > > ETHTOOL_CMD_SETTINGS_SET (U->K) > ETHTOOL_A_HEADER > ETHTOOL_A_DEV_NAME = "eth3" > ETHTOOL_A_SETTINGS_PRIV_FLAGS > ETHTOOL_A_SETTINGS_PRIV_FLAG > ETHTOOL_A_FLAG_INDEX = 2 > ETHTOOL_A_FLAG_VALUE (NLA_FLAG) > ETHTOOL_A_SETTINGS_PRIV_FLAG > ETHTOOL_A_FLAG_INDEX = 8 > ETHTOOL_A_FLAG_VALUE (NLA_FLAG) > ETHTOOL_A_SETTINGS_PRIV_FLAG > ETHTOOL_A_FLAG_NAME = "legacy-rx" > ETHTOOL_A_FLAG_VALUE (NLA_FLAG) > > > For get this might be a bit bigger message: > > ETHTOOL_CMD_SETTINGS_GET_REPLY (K->U) > ETHTOOL_A_HEADER > ETHTOOL_A_DEV_NAME = "eth3" > ETHTOOL_A_SETTINGS_PRIV_FLAGS > ETHTOOL_A_SETTINGS_PRIV_FLAG > ETHTOOL_A_FLAG_INDEX = 0 > ETHTOOL_A_FLAG_NAME = "legacy-rx" > ETHTOOL_A_FLAG_VALUE (NLA_FLAG) > ETHTOOL_A_SETTINGS_PRIV_FLAG > ETHTOOL_A_FLAG_INDEX = 1 > ETHTOOL_A_FLAG_NAME = "vf-ipsec" > ETHTOOL_A_FLAG_VALUE (NLA_FLAG) > ETHTOOL_A_SETTINGS_PRIV_FLAG > ETHTOOL_A_FLAG_INDEX = 8 > ETHTOOL_A_FLAG_NAME = "something-else" > ETHTOOL_A_FLAG_VALUE (NLA_FLAG) This is perfect for "one shot" applications but not so much for long running ones, either "ethtool --monitor" or management or monitoring daemons. Repeating the names in every notification message would be a waste, it's much more convenient to load the strings only once and cache them. Even if we omit the names in notifications (and possibly the GET replies if client opts for it), this format still takes 12-16 bytes per bit. So the problem I'm trying to address is that there are two types of clients with very different mode of work and different preferences. Looking at the bitset.c, I would rather say that most of the complexity and ugliness comes from dealing with both unsigned long based bitmaps and u32 based ones. Originally, there were functions working with unsigned long based bitmaps and the variants with "32" suffix were wrappers around them which converted u32 bitmaps to unsigned long ones and back. This became a problem when kernel started issuing warnings about variable length arrays as getting rid of them meant two kmalloc() and two kfree() for each u32 bitmap operation, even if most of the bitmaps are in rather short in practice. Maybe the wrapper could do something like int ethnl_put_bitset32(const u32 *value, const u32 *mask, unsigned int size, ...) { unsigned long fixed_value[2], fixed_mask[2]; unsigned long *tmp_value = fixed_value; unsigned long *tmp_mask = fixed_mask; if (size > sizeof(fixed_value) * BITS_PER_BYTE) { tmp_value = bitmap_alloc(size); if (!tmp_value) return -ENOMEM; tmp_mask = bitmap_alloc(size); if (!tmp_mask) { kfree(tmp_value); return -ENOMEM; } } bitmap_from_arr32(tmp_value, value, size); bitmap_from_arr32(tmp_mask, mask, size); ret = ethnl_put_bitset(tmp_value, tmp_mask, size, ...); } This way we would make bitset.c code cleaner while avoiding allocating short bitmaps (which is the most common case). Michal