From patchwork Mon Dec 18 22:45:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Aring X-Patchwork-Id: 850480 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=mojatatu-com.20150623.gappssmtp.com header.i=@mojatatu-com.20150623.gappssmtp.com header.b="aW562yPX"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z0x3w6f5Rz9s4s for ; Tue, 19 Dec 2017 09:46:52 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965850AbdLRWql (ORCPT ); Mon, 18 Dec 2017 17:46:41 -0500 Received: from mail-io0-f196.google.com ([209.85.223.196]:40662 "EHLO mail-io0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936367AbdLRWpi (ORCPT ); Mon, 18 Dec 2017 17:45:38 -0500 Received: by mail-io0-f196.google.com with SMTP id v186so11546309iod.7 for ; Mon, 18 Dec 2017 14:45:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mojatatu-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=mlbbS/HKThbT0vC4TgXXATzqbQiY/USpyUqWGBlizkg=; b=aW562yPX3zomPD4QBB++TMw5G2r+jbcqajtoWtJSVkKo4xTX6W1MKOx8vhGx4iD1cE +LGT/nZaiQUTnDCGBS2htGd1F/SqRxSCYgdlBHDqvZYTmuCfr6XM4mmDEtB6FwtAFwbB SsLZu513NCggpEU4Zkm7XZAtULnVTfNkShG4JMUtcezUR1lbd9rPRTDl5+rmCyWvI8xK HGc1pjV2XsBsTiiL7C9QL+mXOXUNVTcoASYpcp1zeroipjTChDynCAZWtrSAFnwAImmw U1MxY2iOkFozyJCkVw5WDmPYrkbtbgjVeWfRQVS7Zmlf17UcGQcdq2L19ST+pPapRyGQ KWhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=mlbbS/HKThbT0vC4TgXXATzqbQiY/USpyUqWGBlizkg=; b=lseZgxJc23QpA17D72EkcM6c5ED7a0tbXVnoQfwkZC/j/es17yLH0vhWTBNl7Gp8uQ qFNAHxYQPGtMD2LZGe5UWLm0F/fn4qhCp7yPOFTCs+BKRTWZoRMbgqMa3cpCCX9YHWCV jl1sUXkeTHoWCDTzpPUa4DkLXD5H3k28eV2uEeehnE6GlPRRXv86EmH/yqFq6+AAvPRF 3B518HaxjPd5O5RHzjZNfp7yZ7OAi0cOHR7S0K2FuDvhOh8O7COE3ngazBcyiWTgPeRk ez2hlxugSXP81VgsIQ59O+YVTGmjl5fc2D8Ofpyx3vKlfOnVmeSpck8z04mK0FEoG2p0 oa6Q== X-Gm-Message-State: AKGB3mLPXbrR2l4EHuK4mbSbKKpMgaIXlDpkrY8yMFrCBbp38HHG5rST D67hdCdO39lrF3GWL6dWFfpCjA== X-Google-Smtp-Source: ACJfBovSiMgVu7reZLyMwdatMS7PgILaBY5b728yTvGmEOm4uOuggPWNg+a99OG321N5H2jPmUM+Yw== X-Received: by 10.107.30.81 with SMTP id e78mr1564664ioe.130.1513637137317; Mon, 18 Dec 2017 14:45:37 -0800 (PST) Received: from x220t.lan ([64.26.149.125]) by smtp.gmail.com with ESMTPSA id o71sm210867itb.28.2017.12.18.14.45.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Dec 2017 14:45:36 -0800 (PST) From: Alexander Aring To: jhs@mojatatu.com Cc: xiyou.wangcong@gmail.com, jiri@resnulli.us, davem@davemloft.net, netdev@vger.kernel.org, kernel@mojatatu.com, Alexander Aring , David Ahern Subject: [PATCHv3 net-next 08/14] net: sch: api: add extack support in qdisc_get_rtab Date: Mon, 18 Dec 2017 17:45:07 -0500 Message-Id: <20171218224513.29836-9-aring@mojatatu.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171218224513.29836-1-aring@mojatatu.com> References: <20171218224513.29836-1-aring@mojatatu.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds extack support for the function qdisc_get_rtab which is a common used function in the tc subsystem. Callers which are interested in the receiving error can assign extack to get a more detailed information why qdisc_get_rtab failed. Cc: David Ahern Signed-off-by: Alexander Aring --- include/net/pkt_sched.h | 3 ++- net/sched/act_police.c | 4 ++-- net/sched/sch_api.c | 9 +++++++-- net/sched/sch_cbq.c | 7 ++++--- net/sched/sch_htb.c | 6 ++++-- net/sched/sch_tbf.c | 6 ++++-- 6 files changed, 23 insertions(+), 12 deletions(-) diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 240469228851..a4f21c0b4a43 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h @@ -101,7 +101,8 @@ void qdisc_hash_del(struct Qdisc *q); struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle); struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle); struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, - struct nlattr *tab); + struct nlattr *tab, + struct netlink_ext_ack *extack); void qdisc_put_rtab(struct qdisc_rate_table *tab); void qdisc_put_stab(struct qdisc_size_table *tab); void qdisc_warn_nonwc(const char *txt, struct Qdisc *qdisc); diff --git a/net/sched/act_police.c b/net/sched/act_police.c index bf483db993a1..95d3c9097b25 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c @@ -118,13 +118,13 @@ static int tcf_act_police_init(struct net *net, struct nlattr *nla, police = to_police(*a); if (parm->rate.rate) { err = -ENOMEM; - R_tab = qdisc_get_rtab(&parm->rate, tb[TCA_POLICE_RATE]); + R_tab = qdisc_get_rtab(&parm->rate, tb[TCA_POLICE_RATE], NULL); if (R_tab == NULL) goto failure; if (parm->peakrate.rate) { P_tab = qdisc_get_rtab(&parm->peakrate, - tb[TCA_POLICE_PEAKRATE]); + tb[TCA_POLICE_PEAKRATE], NULL); if (P_tab == NULL) goto failure; } diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 1bf6da80c6e7..a58459569f35 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -393,13 +393,16 @@ static __u8 __detect_linklayer(struct tc_ratespec *r, __u32 *rtab) static struct qdisc_rate_table *qdisc_rtab_list; struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, - struct nlattr *tab) + struct nlattr *tab, + struct netlink_ext_ack *extack) { struct qdisc_rate_table *rtab; if (tab == NULL || r->rate == 0 || r->cell_log == 0 || - nla_len(tab) != TC_RTAB_SIZE) + nla_len(tab) != TC_RTAB_SIZE) { + NL_SET_ERR_MSG(extack, "Invalid rate table parameters for searching"); return NULL; + } for (rtab = qdisc_rtab_list; rtab; rtab = rtab->next) { if (!memcmp(&rtab->rate, r, sizeof(struct tc_ratespec)) && @@ -418,6 +421,8 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, r->linklayer = __detect_linklayer(r, rtab->data); rtab->next = qdisc_rtab_list; qdisc_rtab_list = rtab; + } else { + NL_SET_ERR_MSG(extack, "Failed to allocate new qdisc rate table"); } return rtab; } diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index bb7e4ccd7caf..79f081eb6bb0 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c @@ -1156,7 +1156,7 @@ static int cbq_init(struct Qdisc *sch, struct nlattr *opt, r = nla_data(tb[TCA_CBQ_RATE]); - q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB]); + q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB], extack); if (!q->link.R_tab) return -EINVAL; @@ -1484,7 +1484,7 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t if (tb[TCA_CBQ_RATE]) { rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), - tb[TCA_CBQ_RTAB]); + tb[TCA_CBQ_RTAB], extack); if (rtab == NULL) return -EINVAL; } @@ -1537,7 +1537,8 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **t if (!tb[TCA_CBQ_WRROPT] || !tb[TCA_CBQ_RATE] || !tb[TCA_CBQ_LSSOPT]) return -EINVAL; - rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB]); + rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB], + extack); if (rtab == NULL) return -EINVAL; diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 65762d57a70d..51be1b756e4e 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -1357,10 +1357,12 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, /* Keeping backward compatible with rate_table based iproute2 tc */ if (hopt->rate.linklayer == TC_LINKLAYER_UNAWARE) - qdisc_put_rtab(qdisc_get_rtab(&hopt->rate, tb[TCA_HTB_RTAB])); + qdisc_put_rtab(qdisc_get_rtab(&hopt->rate, tb[TCA_HTB_RTAB], + NULL)); if (hopt->ceil.linklayer == TC_LINKLAYER_UNAWARE) - qdisc_put_rtab(qdisc_get_rtab(&hopt->ceil, tb[TCA_HTB_CTAB])); + qdisc_put_rtab(qdisc_get_rtab(&hopt->ceil, tb[TCA_HTB_CTAB], + NULL)); if (!cl) { /* new class */ struct Qdisc *new_q; diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index db6bd23530d4..1ab53ff80f46 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -327,11 +327,13 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt, qopt = nla_data(tb[TCA_TBF_PARMS]); if (qopt->rate.linklayer == TC_LINKLAYER_UNAWARE) qdisc_put_rtab(qdisc_get_rtab(&qopt->rate, - tb[TCA_TBF_RTAB])); + tb[TCA_TBF_RTAB], + NULL)); if (qopt->peakrate.linklayer == TC_LINKLAYER_UNAWARE) qdisc_put_rtab(qdisc_get_rtab(&qopt->peakrate, - tb[TCA_TBF_PTAB])); + tb[TCA_TBF_PTAB], + NULL)); buffer = min_t(u64, PSCHED_TICKS2NS(qopt->buffer), ~0U); mtu = min_t(u64, PSCHED_TICKS2NS(qopt->mtu), ~0U);