Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp1274148imm; Tue, 5 Jun 2018 11:47:20 -0700 (PDT) X-Google-Smtp-Source: ADUXVKL/mcglEJnHaXXc8IERp66IWgQnW5/zYGaRyOI8YB/paNire7mObU7srBs7D6XMuvX7u2P4 X-Received: by 2002:a17:902:7883:: with SMTP id q3-v6mr27977606pll.71.1528224440546; Tue, 05 Jun 2018 11:47:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528224440; cv=none; d=google.com; s=arc-20160816; b=tT1YmLPFJnqqccLLBraYtwegV9/bokp58Zj/dW59ikX1HiTGKS9462WSFSzipNKygx IdFXS6obCrEiHtcwMW+pVGT8fhsDtLCDo0TS78IkebhIbhVtR5EMl69fAIcW4PFvOnuo 47QShLQMrenrAzzS6Pr5yEII1wwMPifi2xrbC2/wo9x6C7dZkY6ENt5rl6SeaLNJk5oQ A+aVm2qGU9KZiEJluvMAvlxxaBeBo1f2u/ojdbJ3+zylS+1L4fELojYjKyAtaidpKNpL GVXt9uyVNUby/yMTNo20B9nWE29R303RM06ypmwbGaAmj2Fb/Zh1afzr0gM0+NbnhLw4 nqsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=m4oYanb9WWRcGWNcH15lxfgxLJ4Gb/O9FaIaqOgyUxI=; b=sjTQd8GM7WSkTdZIT7r6uMRi8P8iAtKVJ62VCaWnJi/jKcikSfP+o9fe6K6jCKwylb 9E6cvKhpNr/0SD3GNx0JBOaSWyRT9VTEsp9JtBvL/kr3myVKEs6i8Bm1YUJQc0NoYehs yX3pT3Sb/yfpAEEdejyLqfIU5QtZWaXXwuDJk45wLENzNkZZ5y22tu6C2H/DUzJ6E1IM F5AtYRqDAo6CCDXCg+2YQgplWtxInTDd195iUkJoxiMxqB1F6FwgU7tw/prmCiC7sHVh q5ChAuh0aOfNx3wn/JfHDqO09DfPEEAdM6ki6in8ma2OMzheiiFba47z92qp3Qj1Qguk tUog== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@de.bosch.com header.s=2015-01-21 header.b=PKQk2/Jw; 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=fail (p=NONE sp=NONE dis=NONE) header.from=de.bosch.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e1-v6si50419528ple.195.2018.06.05.11.47.06; Tue, 05 Jun 2018 11:47:20 -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=fail header.i=@de.bosch.com header.s=2015-01-21 header.b=PKQk2/Jw; 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=fail (p=NONE sp=NONE dis=NONE) header.from=de.bosch.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752050AbeFESpT (ORCPT + 99 others); Tue, 5 Jun 2018 14:45:19 -0400 Received: from de-out1.bosch-org.com ([139.15.230.186]:49098 "EHLO de-out1.bosch-org.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751879AbeFESpP (ORCPT ); Tue, 5 Jun 2018 14:45:15 -0400 Received: from si0vm1947.rbesz01.com (unknown [139.15.230.188]) by fe0vms0187.rbdmz01.com (Postfix) with ESMTPS id 410gj54gS9z1XLFYb; Tue, 5 Jun 2018 20:45:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=de.bosch.com; s=2015-01-21; t=1528224313; bh=xKWvSJAExCFYwQPkF9cpeARYs1KgGM4+MQ0/Lt2hetU=; l=10; h=From:From:Reply-To:Sender; b=PKQk2/JwG99yEPZ4rne+p3bzxLi+cuDAwS2frQanlTPwGlccPT7dV+Cy+54jI3vGY F4WupQ39DthXAaqugGYtKIikj4reweRLG28uvwonUHor8sThtT8x6z/MCBMin47Wkq 0ANBxe5S1QLpE1vsXFzL5hV6dxab1mMI/XWent2M= Received: from fe0vm1741.rbesz01.com (unknown [10.58.172.176]) by si0vm1947.rbesz01.com (Postfix) with ESMTPS id 410gj54NRdz6CjQSJ; Tue, 5 Jun 2018 20:45:13 +0200 (CEST) X-AuditID: 0a3aad15-a0bff70000007ca2-d3-5b16da42317e Received: from fe0vm1652.rbesz01.com ( [10.58.173.29]) (using TLS with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by fe0vm1741.rbesz01.com (SMG Outbound) with SMTP id 0F.B8.31906.24AD61B5; Tue, 5 Jun 2018 20:45:22 +0200 (CEST) Received: from SI-HUB1000.de.bosch.com (si-hub1000.de.bosch.com [10.4.103.106]) by fe0vm1652.rbesz01.com (Postfix) with ESMTPS id 410gj52TkczBcvN; Tue, 5 Jun 2018 20:45:13 +0200 (CEST) Received: from luchador.grb-fir.grb.de.bosch.com (10.19.187.97) by SI-HUB1000.de.bosch.com (10.4.103.106) with Microsoft SMTP Server id 14.3.319.2; Tue, 5 Jun 2018 20:45:13 +0200 From: Mark Jonas To: Wolfgang Grandegger , Marc Kleine-Budde CC: , , , , , Mark Jonas Subject: [PATCH 1/5] can: enable multi-queue for SocketCAN devices Date: Tue, 5 Jun 2018 20:43:56 +0200 Message-ID: <1528224240-30786-2-git-send-email-mark.jonas@de.bosch.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1528224240-30786-1-git-send-email-mark.jonas@de.bosch.com> References: <1528224240-30786-1-git-send-email-mark.jonas@de.bosch.com> MIME-Version: 1.0 Content-Type: text/plain X-Brightmail-Tracker: H4sIAAAAAAAAA22Sa0xTZxzGeXsO7Wnl6MsprX+roDlqFLcpOBe7S6ZhUbsPJG6LGuGDnMqB NusFe1oCbMmq8cq8TklqrQzwQsamhkq04gy2W1zrZjOYbmEuzkUkBdlULqOMue0cCrYf9u3/ Ps//9z55n7wUwbQqdJTZ5uQdNs7CylWk6rVz2S8V/Kwtzhvuna8P/PIroW8ZrSP0P7T75PoL TcdI/Y0Grf7MvSvpq+WGem+YNDztuosMh57lGYb8OevJItUbpbzFXMk7lr1ZojJ9da5PVuGf VXXt+k7CjT7W1CKKArwCwqeJWqSiGOyRwc7+OyhxuIYgHHFPOpcQXLkalNciJSXHS6A7HCCk OQtvgBMPd5PSEoE/Q/Cw+ZZMMtS4AB55PBNLJF4AseFWhRRH43Uw5l8tyYBzoDu6b2JFiQ0w vusPhTQz4krUHyWlmcaZEDneMzETGCAYixGH0QxviuVNsRqQrAVpyvi8Smv+yhX5Sx1GXqjJ y1+61W71o0SfmgBqbNwYQphCbAY9FtQWM+lcpVBtDaFXKBmroV9sEqXpRntptYkTTFscLgsv sDoapaWlMernsuAyWs2CYLbbQggogs2iuS6Ro0u56hreYU9gITSbItmZ9P7SD4sYXM45+fd5 voJ3TLmvUxQLdGa3CGY6+HK+qsxscU7ZbHYiU5vqpMbKKGUIvUxliNkF0hW0UMFZBXP5JD4r gTNTahK9iVbqZtLVEoMl1+SyPU/VzaFPRrKKGU2KkST7UTcSe1PTxyU4Q/yqyTygA2rfZiZz UkxCy8+IDP5iGtQHRsQvFdhDQtx9lITzsTskjB3pJSE8ejkdhn8fT4eudq8C9g3sVkLn3sdK GPH+Ow2OftlBQ7zOh+F2509qiPsHsuDI924tDHzeroPh8RvZcPtWLBt+bLuZAz3b3XOhp2N0 LozcH5kHvt/i86AnuIOFppaDiyDy6N5iCA4+WQyRvoZciLnbciFy7K9cGNp76oV+sUyZWGZv lVoq08k5/6fMSTX5Op0bfXLxnabHrlUl6BRjjLAXBohXL7q26ZYZ2wyza64e/qhmwYPrDyot hQv/Wet5ukj9tvK9hbVrlg816wsbN319cP7WQ87pRYNx8sA340/KOhvfZT5VK/7c7ouOdvx9 ln2r42zRt63b6lZtKN78ga15Ttp3JYP2HdF1rZ4Z9+8+Y4Psrj3ePpYUTFz+EsIhcP8BdpmM WkQEAAA= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zhu Yi The existing SocketCAN implementation provides alloc_candev() to allocate a CAN device using a single Tx and Rx queue. This can lead to priority inversion in case the single Tx queue is already full with low priority messages and a high priority message needs to be sent while the bus is fully loaded with medium priority messages. This problem can be solved by using the existing multi-queue support of the network subsytem. The commit makes it possible to use multi-queue in the CAN subsystem in the same way it is used in the Ethernet subsystem by adding an alloc_candev_mqs() call and accompanying macros. With this support a CAN device can use multi-queue qdisc (e.g. mqprio) to avoid the aforementioned priority inversion. The exisiting functionality of alloc_candev() is the same as before. CAN devices need to have prioritized multiple hardware queues or are able to abort waiting for arbitration to make sensible use of multi-queues. Signed-off-by: Zhu Yi Signed-off-by: Mark Jonas Reviewed-by: Heiko Schocher --- drivers/net/can/dev.c | 8 +++++--- include/linux/can/dev.h | 7 ++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 365a8cc..ac8270c 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c @@ -702,7 +702,8 @@ EXPORT_SYMBOL_GPL(alloc_can_err_skb); /* * Allocate and setup space for the CAN network device */ -struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max) +struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max, + unsigned int txqs, unsigned int rxqs) { struct net_device *dev; struct can_priv *priv; @@ -714,7 +715,8 @@ struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max) else size = sizeof_priv; - dev = alloc_netdev(size, "can%d", NET_NAME_UNKNOWN, can_setup); + dev = alloc_netdev_mqs(size, "can%d", NET_NAME_UNKNOWN, can_setup, + txqs, rxqs); if (!dev) return NULL; @@ -733,7 +735,7 @@ struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max) return dev; } -EXPORT_SYMBOL_GPL(alloc_candev); +EXPORT_SYMBOL_GPL(alloc_candev_mqs); /* * Free space of the CAN network device diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 61f1cf2..07b73d2 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -142,7 +142,12 @@ u8 can_dlc2len(u8 can_dlc); /* map the sanitized data length to an appropriate data length code */ u8 can_len2dlc(u8 len); -struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max); +struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max, + unsigned int txqs, unsigned int rxqs); +#define alloc_candev(sizeof_priv, echo_skb_max) \ + alloc_candev_mqs(sizeof_priv, echo_skb_max, 1, 1) +#define alloc_candev_mq(sizeof_priv, echo_skb_max, count) \ + alloc_candev_mqs(sizeof_priv, echo_skb_max, count, count) void free_candev(struct net_device *dev); /* a candev safe wrapper around netdev_priv */ -- 2.7.4