Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp3086156ybt; Mon, 29 Jun 2020 15:00:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzk7X+BrYNlmjVtusRphvqn2k5RxxKDFHpjQPS/tddlHQz2S1jnp86oabGcuoRaxxxJyuZR X-Received: by 2002:a17:906:33ca:: with SMTP id w10mr7967192eja.171.1593468049527; Mon, 29 Jun 2020 15:00:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593468049; cv=none; d=google.com; s=arc-20160816; b=eCMAII+16yzbTUrWZNC6TwUzUZn8n+ItUA7PEvqWKNidI+pQLizst/yu7TVFrUfSxs z99wJdgXh5lC2FaGNklc1TxNnRAajpONr2JioTd/qg6j0jCARQrX9iWOGVGxTgQ0LrU9 tldwu7saV9JbKum4Md7lN7lTyb5YK4sPvnk06CClRnslbP5t1LUNLLdjH38kNnkPz3WQ EfZtFTf+RY3J4DYBjngp9OlFHIyE7FLptFlTu7k6dCjeOJzdVjI3cCnNe0MA9fl0L7zy jMH40KyYbqT2jUUYsS/oryE2//9jaxcNTpW6Yj3MevqO3bXOKDhYiEBDzu2TAvqjsqAv 3g5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=4zKTlTnXrh/2vj/xoW4dBQiRGL+KGy/5RdQ422em5wY=; b=aOKNP+8KDTddRzsAD4Rqz0K8OcyAyl+xOs5nLqZ+G4xXXdrwSmFIYPQ2coXLo7/O3O KIAwy4ZrrlJWMJ7G4HBhvf0EVrJcrIGQ82Ica5ytsYDLfjVfdFOOHe+IYDbyQwuIS+8X qpdV1WBi6aTfeAe4vkFVyae8BzM6cdhzLN4bf3/WRX6L+sgYcNrTQMi4Uze7492KfDhw RByOfGk+X1VByOoX2prpRdDnqmTy9gVF2B3xZf9uLW5B+8EKpfBvSv52shrOc05JoZ4s BOpykqTywyMetKsvfXG123VwwZXr54+7cK+Kon20np4yO2Gb1Db58UJI8jTaxFXKEMLe Mnkg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Ez25g4s1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dh14si475812edb.591.2020.06.29.15.00.26; Mon, 29 Jun 2020 15:00:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Ez25g4s1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391689AbgF2V70 (ORCPT + 99 others); Mon, 29 Jun 2020 17:59:26 -0400 Received: from mail.kernel.org ([198.145.29.99]:56796 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726430AbgF2Sf0 (ORCPT ); Mon, 29 Jun 2020 14:35:26 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7C30824061; Mon, 29 Jun 2020 15:18:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1593443933; bh=AFTA9VXm2WtOiabAN8FzZBOpUKuSP8j/v981QvGyVyY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ez25g4s1GGhyYMD5m0d8guNv1JuYmicbxY5K5UYCGdjLeCwpuR9vg9IuwS5Jvh355 XlkYUOI1IYr3rN/d7gZRa1FnyuqnS5HJy2K5PbSlDK7ZcOWds+RwoYp4QDfZKbCu11 9GGHwxfT0GPIh2x9s/mzM4CR0xtVv/sODpSDJO94= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Ilya Ponetayev , =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= , "David S . Miller" , Greg Kroah-Hartman Subject: [PATCH 5.7 034/265] sch_cake: don't try to reallocate or unshare skb unconditionally Date: Mon, 29 Jun 2020 11:14:27 -0400 Message-Id: <20200629151818.2493727-35-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200629151818.2493727-1-sashal@kernel.org> References: <20200629151818.2493727-1-sashal@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.7.7-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.7.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.7.7-rc1 X-KernelTest-Deadline: 2020-07-01T15:14+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ilya Ponetayev [ Upstream commit 9208d2863ac689a563b92f2161d8d1e7127d0add ] cake_handle_diffserv() tries to linearize mac and network header parts of skb and to make it writable unconditionally. In some cases it leads to full skb reallocation, which reduces throughput and increases CPU load. Some measurements of IPv4 forward + NAPT on MIPS router with 580 MHz single-core CPU was conducted. It appears that on kernel 4.9 skb_try_make_writable() reallocates skb, if skb was allocated in ethernet driver via so-called 'build skb' method from page cache (it was discovered by strange increase of kmalloc-2048 slab at first). Obtain DSCP value via read-only skb_header_pointer() call, and leave linearization only for DSCP bleaching or ECN CE setting. And, as an additional optimisation, skip diffserv parsing entirely if it is not needed by the current configuration. Fixes: c87b4ecdbe8d ("sch_cake: Make sure we can write the IP header before changing DSCP bits") Signed-off-by: Ilya Ponetayev [ fix a few style issues, reflow commit message ] Signed-off-by: Toke Høiland-Jørgensen Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/sched/sch_cake.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c index 1496e87cd07bb..a92d6c57aa9a5 100644 --- a/net/sched/sch_cake.c +++ b/net/sched/sch_cake.c @@ -1516,30 +1516,49 @@ static unsigned int cake_drop(struct Qdisc *sch, struct sk_buff **to_free) static u8 cake_handle_diffserv(struct sk_buff *skb, u16 wash) { - int wlen = skb_network_offset(skb); + const int offset = skb_network_offset(skb); + u16 *buf, buf_; u8 dscp; switch (tc_skb_protocol(skb)) { case htons(ETH_P_IP): - wlen += sizeof(struct iphdr); - if (!pskb_may_pull(skb, wlen) || - skb_try_make_writable(skb, wlen)) + buf = skb_header_pointer(skb, offset, sizeof(buf_), &buf_); + if (unlikely(!buf)) return 0; - dscp = ipv4_get_dsfield(ip_hdr(skb)) >> 2; - if (wash && dscp) + /* ToS is in the second byte of iphdr */ + dscp = ipv4_get_dsfield((struct iphdr *)buf) >> 2; + + if (wash && dscp) { + const int wlen = offset + sizeof(struct iphdr); + + if (!pskb_may_pull(skb, wlen) || + skb_try_make_writable(skb, wlen)) + return 0; + ipv4_change_dsfield(ip_hdr(skb), INET_ECN_MASK, 0); + } + return dscp; case htons(ETH_P_IPV6): - wlen += sizeof(struct ipv6hdr); - if (!pskb_may_pull(skb, wlen) || - skb_try_make_writable(skb, wlen)) + buf = skb_header_pointer(skb, offset, sizeof(buf_), &buf_); + if (unlikely(!buf)) return 0; - dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> 2; - if (wash && dscp) + /* Traffic class is in the first and second bytes of ipv6hdr */ + dscp = ipv6_get_dsfield((struct ipv6hdr *)buf) >> 2; + + if (wash && dscp) { + const int wlen = offset + sizeof(struct ipv6hdr); + + if (!pskb_may_pull(skb, wlen) || + skb_try_make_writable(skb, wlen)) + return 0; + ipv6_change_dsfield(ipv6_hdr(skb), INET_ECN_MASK, 0); + } + return dscp; case htons(ETH_P_ARP): -- 2.25.1