Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp2795076ybp; Thu, 10 Oct 2019 12:44:46 -0700 (PDT) X-Google-Smtp-Source: APXvYqyF4NnCIvgaN4TWU/TV/i28+zCNZxbX/8N88N2OEktuioil/+JbWY8kg64A027tzigaeDJF X-Received: by 2002:a17:906:19d9:: with SMTP id h25mr9489117ejd.297.1570736685972; Thu, 10 Oct 2019 12:44:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570736685; cv=none; d=google.com; s=arc-20160816; b=J0tBysiFytC3YGCeahN/TEtvV4UE92tFrsWE80z5lVEZwKn0w6g+DmY8TB2wdlpxgY +iGzODT7kOy5c57uYZU6g0/mpC38cL8VJGCED3OugUmQjMFZoU/WDTYrxHTBzSMfqmXQ PVLnqnbEcegyZLj8qutPeJ99lqajMhcXXvEkni3/JVwqzRmPk0uaCMQdAeRtGE9Vh7oc MlU4s/Bo9vmtHA5VbTNeHKXRRdwa7JBB8GudIitowcvz3YhB5XaZ2sfLcIcUFfqxY8xk YVqtj6h/9jncNH+ANn/5vJ1w/+kZDuldZDbjo3nAtg7+P66AYtYCNtj0x0Vi7RzLBIjp JWEA== 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=qI1xug0CSYMXT0Ln1vRzirEGunazIQRarosfA/PsYLE=; b=j8R7PyJ88+BucRnnXYjcFy5cRV/3/RXgm6ChjAfGby8+cGMtYfCfnSe7GTFJIcuECo 42UxoUQkQ20zgMk/35USOeTaGyJtMJmv59dn1zQUob8DmKejPFhhVNX52epnd2kA3eqz oghzslit9ntHAu+Kw3fRQx3Wn5mOMq93d7UdDAy+fsY6tkp/gBnezL+khfuiOLGJc3xq ncHEct6dzqptr0HGTvKTHgFr3FmUvjzxguC7a0a/jIx/bfAI+VIk96b4Uc/ZarmL8bEj XgSweBbaZHrwNcDuj7Ic3Pen8O7fCW8k/KsEMLX2YDwHLD0NYPUril/CMJQ/W6k5Xyd0 7QbA== 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 ca9si3875163edb.79.2019.10.10.12.44.14; Thu, 10 Oct 2019 12:44:45 -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 S1726409AbfJJToC (ORCPT + 99 others); Thu, 10 Oct 2019 15:44:02 -0400 Received: from mx2.suse.de ([195.135.220.15]:43698 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725867AbfJJToC (ORCPT ); Thu, 10 Oct 2019 15:44:02 -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 36BD2AD54; Thu, 10 Oct 2019 19:30:47 +0000 (UTC) Received: by unicorn.suse.cz (Postfix, from userid 1000) id C62E6E378C; Thu, 10 Oct 2019 21:30:44 +0200 (CEST) Date: Thu, 10 Oct 2019 21:30:44 +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 v7 14/17] ethtool: set link settings with LINKINFO_SET request Message-ID: <20191010193044.GG22163@unicorn.suse.cz> References: <20191010153754.GA2901@nanopsycho> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20191010153754.GA2901@nanopsycho> 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 Thu, Oct 10, 2019 at 05:37:54PM +0200, Jiri Pirko wrote: > Wed, Oct 09, 2019 at 10:59:43PM CEST, mkubecek@suse.cz wrote: > >Implement LINKINFO_SET netlink request to set link settings queried by > >LINKINFO_GET message. > > > >Only physical port, phy MDIO address and MDI(-X) control can be set, > >attempt to modify MDI(-X) status and transceiver is rejected. > > > >When any data is modified, ETHTOOL_MSG_LINKINFO_NTF message in the same > >format as reply to LINKINFO_GET request is sent to notify userspace about > >the changes. The same notification is also sent when these settings are > >modified using the ioctl interface. > > > > It is a bit confusing and harder to follow when you have set and notify > code in the same patch. Could you please split? As the notification is composed and sent by ethnl_std_notify() with help of the callback functions used to generate the reply to GET request, the only notification related changes in this patch are the three calls to ethtool_notify() (one in netlink code, two in ioctl code) and the entry added to ethnl_notify_handlers[]. But I have no objection to splitting these out into a separate patch, except for having sacrifice some of the patches actually implementing something so that the series doesn't get too long. > > [...] > > > >+/* LINKINFO_SET */ > >+ > >+static const struct nla_policy linkinfo_hdr_policy[ETHTOOL_A_HEADER_MAX + 1] = { > >+ [ETHTOOL_A_HEADER_UNSPEC] = { .type = NLA_REJECT }, > >+ [ETHTOOL_A_HEADER_DEV_INDEX] = { .type = NLA_U32 }, > >+ [ETHTOOL_A_HEADER_DEV_NAME] = { .type = NLA_NUL_STRING, > >+ .len = IFNAMSIZ - 1 }, > >+ [ETHTOOL_A_HEADER_GFLAGS] = { .type = NLA_U32 }, > >+ [ETHTOOL_A_HEADER_RFLAGS] = { .type = NLA_REJECT }, > >+}; > > This is what I was talking about in the other email. These common attrs > should have common policy and should be parsed by generic netlink code > by default and be available for ethnl_set_linkinfo() in info->attrs. NLA_REJECT for ETHTOOL_A_HEADER_RFLAGS is probably an overkill here. If I just check that client does not set flags we do not know, I can have one universal header policy as well. I'll probably do that. > >+int ethnl_set_linkinfo(struct sk_buff *skb, struct genl_info *info) > >+{ > >+ struct nlattr *tb[ETHTOOL_A_LINKINFO_MAX + 1]; > >+ struct ethtool_link_ksettings ksettings = {}; > >+ struct ethtool_link_settings *lsettings; > >+ struct ethnl_req_info req_info = {}; > >+ struct net_device *dev; > >+ bool mod = false; > >+ int ret; > >+ > >+ ret = nlmsg_parse(info->nlhdr, GENL_HDRLEN, tb, > >+ ETHTOOL_A_LINKINFO_MAX, linkinfo_set_policy, > >+ info->extack); > > Yeah, genl code should do this parse.. Not really. It would only parse the top level - which, in your design, would only be the common header. In other words, it would do what is now done by the call to nla_parse_nested() inside ethnl_parse_header(). For equivalent of this parse, you would still have to call your own nla_parse_nested() on the "request specific data" nested attribute. > >+ if (ret < 0) > >+ return ret; > >+ ret = ethnl_parse_header(&req_info, tb[ETHTOOL_A_LINKINFO_HEADER], > >+ genl_info_net(info), info->extack, > >+ linkinfo_hdr_policy, true); > > and pre_doit should do this one. ...and also (each) start(). Which means you would either duplicate the code or introduce the same helper. All you would save would be that one call of nla_parse_nested() in ethnl_parse_header(). > >+ > >+ ret = 0; > >+ if (mod) { > > if (!mod) > goto out_ops; > > ? OK > >+ ret = dev->ethtool_ops->set_link_ksettings(dev, &ksettings); > >+ if (ret < 0) > >+ GENL_SET_ERR_MSG(info, "link settings update failed"); > >+ else > >+ ethtool_notify(dev, ETHTOOL_MSG_LINKINFO_NTF, NULL); > >+ } > >+ > >+out_ops: > >+ ethnl_after_ops(dev); > >+out_rtnl: > >+ rtnl_unlock(); > >+ dev_put(dev); > >+ return ret; > >+} ... > >@@ -683,6 +688,7 @@ typedef void (*ethnl_notify_handler_t)(struct net_device *dev, unsigned int cmd, > > const void *data); > > > > static const ethnl_notify_handler_t ethnl_notify_handlers[] = { > >+ [ETHTOOL_MSG_LINKINFO_NTF] = ethnl_std_notify, > > Correct me if I'm wrong, but this is the only notification I found in > this patchset. Do you expect other then ethnl_std_notify() handler? > Bacause otherwise this can ba simplified down to just a single table > similar you have for GET. Yes, there will be other handlers; ethnl_std_notify() can only handle the simplest (even if most common) type of notification where caller does not pass any information except the device, the notification message is exactly the same as reply to corresponding GET request would be and that GET request does not have any attributes (so that it can be handled with ethnl_get_doit()). There will be notifications which will need their own handlers, e.g. all notifications triggered by an action request (e.g. renegotiation or device reset) or notifications triggered by "ethtool -X". Michal