Received: by 10.192.165.148 with SMTP id m20csp3209390imm; Mon, 7 May 2018 08:25:29 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqeVkAdofetniLzuogpZsFbPRVf+rqQf81jarlTajzlIXzD3EVUYHXP+5yCcTVo8epSowd1 X-Received: by 2002:a24:c006:: with SMTP id u6-v6mr1623821itf.149.1525706729430; Mon, 07 May 2018 08:25:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525706729; cv=none; d=google.com; s=arc-20160816; b=Jn5BDdDrmpvYypAnsOi0XOxNKkmVBN9F/K4KP0Z/MHc+QfhlLc/z7KTqzrSFPfKbT0 r3bdh6C3MzbQxAtqddQ59Q3JsBXgyRV4C1OiSLZGU5ZMa1UWTCCLZSzP0SOV84KI4RO1 MMQRZx4qEnY1FArZwPZdbcgCMlx32IOJHwxka5uZLW/EmB3Odz0OttFRFlitZrnKsy2O 5+Iqmp7bIp61erXPMfylmq0Q0QTjKNc6rHiclLU0s2ba2WZM/LLm0ssqY6z4QCbCcnE2 nFlYs7lNJbGmV3hm8DED4HA1KRK/ylasnABbRpbtT/eNMerj5AhvYJWmPSrxWDvTjiqx Pd0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=Z00bKkbsS5ItJDut2FnPxNX2T5V0SKTWeMhI01fG63Y=; b=L7erBnvzzBg8eP69+Ix0SDU1rNnUXWE9+hDOC3GSoBckzJEU0p6PDE0L7sDEIPaDpS XDluOkAORQOUCc/xX/K0oehPAO7PidbOWDF/9DW1cN7o4PMYgim+3ulf78QAknZ3CFyk 1B3gr+hPdixzR0hOr/iz1a8yArqQcpLsBFWOweVIcBRjRq1lNbmlqMLgagCtu5razURc QGrvaH6Gq6i4gsQHGfUw/fyEqfOHPNDraLSRylHIn7QQP+LCNg9EEuaOUNsrZb8tq2U2 wmwVfjVFeUFOczaahWVNFKITviBcIVz7b5cRwTXWXkoiOUvOQghOYIBVys5SjbYf4HMW QFrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=FuudKQef; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g75-v6si7571817ita.40.2018.05.07.08.25.15; Mon, 07 May 2018 08:25:29 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=FuudKQef; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752634AbeEGPXf (ORCPT + 99 others); Mon, 7 May 2018 11:23:35 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:54818 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752572AbeEGPXc (ORCPT ); Mon, 7 May 2018 11:23:32 -0400 Received: by mail-wm0-f67.google.com with SMTP id f6so14048109wmc.4; Mon, 07 May 2018 08:23:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=Z00bKkbsS5ItJDut2FnPxNX2T5V0SKTWeMhI01fG63Y=; b=FuudKQefVI1d8cda6Kz1hP6fbG4JFrCbRk/1NplOjPQ7/0rRiw4Q3oRtJa96OK05WG BM/bfrbayZ3VTtqu9QyDQdeLUZTMTCZfJWKGk5Q0Uv1mkvsNsUhs/COokpizMl7NqVqM U2ZUQ9In/eFZ2NFGZqOtYRPSlaewYp+atVEEaFbRaXerMkYdBHV/66+AE39Un3LTyqC4 wRJ7hpmYsmXLgNwlyo97CL/VOBeJ9w47oX6uLPBA5gsHRrvTzXp+uXK1PhKb8k7ZTSUN gDibihwM79L29YYoPkLh0gv9f3xHMrySq02J+CPbWigCf5F5dPlV9mpziyQRS0P6LScc 6hhw== 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; bh=Z00bKkbsS5ItJDut2FnPxNX2T5V0SKTWeMhI01fG63Y=; b=sXZxhMW9FpbtF+4D6rFNjjVCsxox7D1EcwbH/jsR3jjp9bRZgYu6usMZQ62UkpCokR tMzHDBbgbTyg4Ii9k85sEKLAKQMIMWmeGwmTQUpnExk+yEHftiL5Sb0cGzaW1Uh2kw7S V/bA0N9YNnGFWJ5Vxgax/A4ZpqvfD/BLVU+bXsg7JlnoN8ew/agi4NrdL7fvNaVu+wgw THA3JHt01VDyyH09B1BavkI52QOkko8a3JsJ51ZPkyntCjSxuwbL1zcfmvYuLxU59boF SO7kYX3m4L/xe77IdHazLGpHwBjTUAmjG+NKse+kXb0qFXg4i1J6SzbwFMh37jDvTvbn Resw== X-Gm-Message-State: ALKqPwerkwPoB0m0VQzAU53JGB/p2PJ1WiO455UhfpXfw7PSIauJfjZ0 aftCrjPPST28fWKu6FONl6w= X-Received: by 2002:a1c:b4c3:: with SMTP id d186-v6mr1021421wmf.4.1525706611292; Mon, 07 May 2018 08:23:31 -0700 (PDT) Received: from localhost ([93.68.143.237]) by smtp.gmail.com with ESMTPSA id z63-v6sm27809642wrb.34.2018.05.07.08.23.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 07 May 2018 08:23:30 -0700 (PDT) From: Salvatore Mesoraca To: Andrew Lunn Cc: linux-kernel@vger.kernel.org, kernel-hardening@lists.openwall.com, netdev@vger.kernel.org, "David S. Miller" , Florian Fainelli , Kees Cook , Salvatore Mesoraca , Vivien Didelot , David Laight Subject: [PATCH v2] net: dsa: drop some VLAs in switch.c Date: Mon, 7 May 2018 17:23:16 +0200 Message-Id: <1525706596-13601-1-git-send-email-s.mesoraca16@gmail.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We avoid 2 VLAs by using a pre-allocated field in dsa_switch. We also try to avoid dynamic allocation whenever possible. Link: http://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com Link: http://lkml.kernel.org/r/20180505185145.GB32630@lunn.ch Signed-off-by: Salvatore Mesoraca --- include/net/dsa.h | 3 +++ net/dsa/dsa2.c | 14 ++++++++++++++ net/dsa/switch.c | 22 ++++++++++------------ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/include/net/dsa.h b/include/net/dsa.h index 60fb4ec..576791d 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -256,6 +256,9 @@ struct dsa_switch { /* Number of switch port queues */ unsigned int num_tx_queues; + unsigned long *bitmap; + unsigned long _bitmap; + /* Dynamically allocated ports, keep last */ size_t num_ports; struct dsa_port ports[]; diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index adf50fb..cebf35f0 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -748,6 +748,20 @@ struct dsa_switch *dsa_switch_alloc(struct device *dev, size_t n) if (!ds) return NULL; + /* We avoid allocating memory outside dsa_switch + * if it is not needed. + */ + if (n <= sizeof(ds->_bitmap) * 8) { + ds->bitmap = &ds->_bitmap; + } else { + ds->bitmap = devm_kzalloc(dev, + BITS_TO_LONGS(n) * + sizeof(unsigned long), + GFP_KERNEL); + if (unlikely(!ds->bitmap)) + return NULL; + } + ds->dev = dev; ds->num_ports = n; diff --git a/net/dsa/switch.c b/net/dsa/switch.c index b935117..142b294 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -136,21 +136,20 @@ static int dsa_switch_mdb_add(struct dsa_switch *ds, { const struct switchdev_obj_port_mdb *mdb = info->mdb; struct switchdev_trans *trans = info->trans; - DECLARE_BITMAP(group, ds->num_ports); int port; /* Build a mask of Multicast group members */ - bitmap_zero(group, ds->num_ports); + bitmap_zero(ds->bitmap, ds->num_ports); if (ds->index == info->sw_index) - set_bit(info->port, group); + set_bit(info->port, ds->bitmap); for (port = 0; port < ds->num_ports; port++) if (dsa_is_dsa_port(ds, port)) - set_bit(port, group); + set_bit(port, ds->bitmap); if (switchdev_trans_ph_prepare(trans)) - return dsa_switch_mdb_prepare_bitmap(ds, mdb, group); + return dsa_switch_mdb_prepare_bitmap(ds, mdb, ds->bitmap); - dsa_switch_mdb_add_bitmap(ds, mdb, group); + dsa_switch_mdb_add_bitmap(ds, mdb, ds->bitmap); return 0; } @@ -204,21 +203,20 @@ static int dsa_switch_vlan_add(struct dsa_switch *ds, { const struct switchdev_obj_port_vlan *vlan = info->vlan; struct switchdev_trans *trans = info->trans; - DECLARE_BITMAP(members, ds->num_ports); int port; /* Build a mask of VLAN members */ - bitmap_zero(members, ds->num_ports); + bitmap_zero(ds->bitmap, ds->num_ports); if (ds->index == info->sw_index) - set_bit(info->port, members); + set_bit(info->port, ds->bitmap); for (port = 0; port < ds->num_ports; port++) if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port)) - set_bit(port, members); + set_bit(port, ds->bitmap); if (switchdev_trans_ph_prepare(trans)) - return dsa_switch_vlan_prepare_bitmap(ds, vlan, members); + return dsa_switch_vlan_prepare_bitmap(ds, vlan, ds->bitmap); - dsa_switch_vlan_add_bitmap(ds, vlan, members); + dsa_switch_vlan_add_bitmap(ds, vlan, ds->bitmap); return 0; } -- 1.9.1