From patchwork Mon Jul 18 08:38:33 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denys Fedoryshchenko X-Patchwork-Id: 105232 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 9E478B6F75 for ; Mon, 18 Jul 2011 18:38:43 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753514Ab1GRIii (ORCPT ); Mon, 18 Jul 2011 04:38:38 -0400 Received: from hosting.visp.net.lb ([194.146.153.11]:33571 "EHLO hosting.visp.net.lb" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752479Ab1GRIih (ORCPT ); Mon, 18 Jul 2011 04:38:37 -0400 Received: by hosting.visp.net.lb (Postfix, from userid 81) id D21E6368500; Mon, 18 Jul 2011 11:38:33 +0300 (EEST) To: Stephen Hemminger , Subject: [RFC] iproute2, ifindex option X-PHP-Originating-Script: 501:func.inc Received: from ZGFNttuCv+zkYwrNz3BFm288UvP1M1VKEAcZGQo1Z+Ny31OCVg4H5Q== (hZNx/VzwubLs7GDOXI1MZQ5kVDMV5RDx) by webmail.visp.net.lb with HTTP (HTTP/1.1 POST); Mon, 18 Jul 2011 11:38:33 +0300 MIME-Version: 1.0 Date: Mon, 18 Jul 2011 11:38:33 +0300 From: Denys Fedoryshchenko Message-ID: X-Sender: denys@visp.net.lb User-Agent: VISP Webmail/0.5.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org After battling with iproute2 interface name caching, i decided to try to introduce ifindex option, where i can specify manually device index, and avoid expensive device index lookups, especially during massive changes for qdisc/class. In batch mode ll_map cache will cause problems on servers with ppp interfaces (same name after while can have another index), and also if i run command too often, each start it will retrieve list of all interfaces, on 3k+ interfaces it will be CPU hog. This is sample of patch, just for qdisc/class/filter modify and show operation. Here is some changes in logic, because before qdisc code during _list operation was not checking duplicate "dev" argument, as it done in _modify code and class/filter list code. Also maybe i need to change duparg to something else? Because: centaur iproute2-newifindex # tc/tc -s -d filter show ifindex 23 dev sdf Error: duplicate "ifindex": "sdf" is the second value. Or it is ok like this? I'm sorry that patch is not inline, seems my webmail can't do it now, i will try to install normal mail client. --- System administrator Denys Fedoryshchenko Virtual ISP S.A.L. diff -Naur iproute2/tc/tc_class.c iproute2-newifindex/tc/tc_class.c --- iproute2/tc/tc_class.c 2011-07-18 11:10:41.390973397 +0300 +++ iproute2-newifindex/tc/tc_class.c 2011-07-18 11:29:50.177611576 +0300 @@ -67,7 +67,16 @@ NEXT_ARG(); if (d[0]) duparg("dev", *argv); + if (req.t.tcm_ifindex) + duparg("ifindex", *argv); strncpy(d, *argv, sizeof(d)-1); + } else if (strcmp(*argv, "ifindex") == 0) { + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); + if (req.t.tcm_ifindex) + duparg("ifindex", *argv); + req.t.tcm_ifindex = atoi(*argv); } else if (strcmp(*argv, "classid") == 0) { __u32 handle; NEXT_ARG(); @@ -246,7 +255,16 @@ NEXT_ARG(); if (d[0]) duparg("dev", *argv); + if (t.tcm_ifindex) + duparg("ifindex", *argv); strncpy(d, *argv, sizeof(d)-1); + } else if (strcmp(*argv, "ifindex") == 0) { + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); + if (t.tcm_ifindex) + duparg("ifindex", *argv); + t.tcm_ifindex = atoi(*argv); } else if (strcmp(*argv, "qdisc") == 0) { NEXT_ARG(); if (filter_qdisc) @@ -290,9 +308,10 @@ fprintf(stderr, "Cannot find device \"%s\"\n", d); return 1; } - filter_ifindex = t.tcm_ifindex; } + filter_ifindex = t.tcm_ifindex; + if (rtnl_dump_request(&rth, RTM_GETTCLASS, &t, sizeof(t)) < 0) { perror("Cannot send dump request"); return 1; diff -Naur iproute2/tc/tc_filter.c iproute2-newifindex/tc/tc_filter.c --- iproute2/tc/tc_filter.c 2011-07-18 11:10:41.390973397 +0300 +++ iproute2-newifindex/tc/tc_filter.c 2011-07-18 11:28:18.097762745 +0300 @@ -80,7 +80,16 @@ NEXT_ARG(); if (d[0]) duparg("dev", *argv); + if (req.t.tcm_ifindex) + duparg("ifindex", *argv); strncpy(d, *argv, sizeof(d)-1); + } else if (strcmp(*argv, "ifindex") == 0) { + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); + if (req.t.tcm_ifindex) + duparg("ifindex", *argv); + req.t.tcm_ifindex = atoi(*argv); } else if (strcmp(*argv, "root") == 0) { if (req.t.tcm_parent) { fprintf(stderr, "Error: \"root\" is duplicate parent ID\n"); @@ -277,7 +286,16 @@ NEXT_ARG(); if (d[0]) duparg("dev", *argv); + if (t.tcm_ifindex) + duparg("ifindex", *argv); strncpy(d, *argv, sizeof(d)-1); + } else if (strcmp(*argv, "ifindex") == 0) { + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); + if (t.tcm_ifindex) + duparg("ifindex", *argv); + t.tcm_ifindex = atoi(*argv); } else if (strcmp(*argv, "root") == 0) { if (t.tcm_parent) { fprintf(stderr, "Error: \"root\" is duplicate parent ID\n"); @@ -332,10 +350,11 @@ if ((t.tcm_ifindex = ll_name_to_index(d)) == 0) { fprintf(stderr, "Cannot find device \"%s\"\n", d); return 1; - } - filter_ifindex = t.tcm_ifindex; + } } + filter_ifindex = t.tcm_ifindex; + if (rtnl_dump_request(&rth, RTM_GETTFILTER, &t, sizeof(t)) < 0) { perror("Cannot send dump request"); return 1; diff -Naur iproute2/tc/tc_qdisc.c iproute2-newifindex/tc/tc_qdisc.c --- iproute2/tc/tc_qdisc.c 2011-07-18 11:10:41.390973397 +0300 +++ iproute2-newifindex/tc/tc_qdisc.c 2011-07-18 11:29:09.322122349 +0300 @@ -76,7 +76,16 @@ NEXT_ARG(); if (d[0]) duparg("dev", *argv); + if (req.t.tcm_ifindex) + duparg("ifindex", *argv); strncpy(d, *argv, sizeof(d)-1); + } else if (strcmp(*argv, "ifindex") == 0) { + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); + if (req.t.tcm_ifindex) + duparg("ifindex", *argv); + req.t.tcm_ifindex = atoi(*argv); } else if (strcmp(*argv, "handle") == 0) { __u32 handle; if (req.t.tcm_handle) @@ -289,7 +298,18 @@ while (argc > 0) { if (strcmp(*argv, "dev") == 0) { NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); + if (t.tcm_ifindex) + duparg("ifindex", *argv); strncpy(d, *argv, sizeof(d)-1); + } else if (strcmp(*argv, "ifindex") == 0) { + NEXT_ARG(); + if (d[0]) + duparg("dev", *argv); + if (t.tcm_ifindex) + duparg("ifindex", *argv); + t.tcm_ifindex = atoi(*argv); #ifdef TC_H_INGRESS } else if (strcmp(*argv, "ingress") == 0) { if (t.tcm_parent) { @@ -315,9 +335,10 @@ fprintf(stderr, "Cannot find device \"%s\"\n", d); return 1; } - filter_ifindex = t.tcm_ifindex; } + filter_ifindex = t.tcm_ifindex; + if (rtnl_dump_request(&rth, RTM_GETQDISC, &t, sizeof(t)) < 0) { perror("Cannot send dump request"); return 1;