From patchwork Wed Feb 26 17:43:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245239 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=HQIr30J7; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNTD1cG4z9sNg for ; Thu, 27 Feb 2020 04:44:00 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726765AbgBZRn7 (ORCPT ); Wed, 26 Feb 2020 12:43:59 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:39643 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726151AbgBZRn6 (ORCPT ); Wed, 26 Feb 2020 12:43:58 -0500 Received: by mail-pg1-f195.google.com with SMTP id j15so19936pgm.6 for ; Wed, 26 Feb 2020 09:43:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=YoxBFaJwp79cTV0sFdQY2MHh7TsC1KL4EP7GRVxRbSc=; b=HQIr30J7ebCXafyv4ExmPURLzq9nSOaGdY/k3gYI8Ao9C1Q9zOWLEs21Jptb04HOfZ aE7auDTxVmmCrZf/9DqBe3h4enr6BZdMa9dpX0bda7TS9ynYHGu2+sVrvHBPLJMLlSWS 1LRp7RHvvI6P0x691dMoU0mZnfy9V+fhmTlp01FWLgQz1euKZQS5d17fDmmpeKhaUFvz 7R38vOZf5KuQKHfWqYwolMURA0+qQp8JY1K6nm12ytS382XcO8zFKwzaDLyX4ybhtvM7 JWlBrs4cLSpyOs9461Q8FzVI7G17bdFOW0eOMjS5Yw0xHh1hZ+4a2XCCGdrrlM7FvB2l Q00Q== 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=YoxBFaJwp79cTV0sFdQY2MHh7TsC1KL4EP7GRVxRbSc=; b=oH8PRxWndEtHMEPXY30RJlzwXJs/VMwjEa9EU03nUnbFbaVM7+3V/GyB0m/ReLS9F9 OLG9jmpARXg322KntfSG7cBBveqFG09Ky11+UU/bFO8qI8mAZz6hiuY/ZDum1/rk6C8g yoaIX5BFvYo0tNEZWPgKnGHwLv14x3Z/0aXHt+pFtLZB5P0uT2hMqGfWSo36DFPNI6IJ w34yGYWbD4UwtlASs1fQ7zxCiDq2rCPw2AoM8+A0UcSKPSPVC3IYJqs6T26apQ8qXEj3 O/f5DLNcpOCGe+oo5rv4439DEtw1SnZZBVgfnw2aO3PwLmuD7/nd7Fz++FrbPAq0/K6p SsDA== X-Gm-Message-State: APjAAAU2omS2Gg/344oQ6hw0RfuFjxYv58QD5JiOgMumwfKFsgCq53br oVmWzSVW5j65TngoEFaOWjSoalyDGZY= X-Google-Smtp-Source: APXvYqwCmGh8JNU2iG3TmzzvT7gNBer3UjfHDbkjOKyWdOvjICTeZS1e5EJNjCLOlKCUykCb/0F0VA== X-Received: by 2002:aa7:84cd:: with SMTP id x13mr5720615pfn.130.1582739036381; Wed, 26 Feb 2020 09:43:56 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id l13sm3445699pjq.23.2020.02.26.09.43.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:43:55 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 01/10] net: rmnet: fix NULL pointer dereference in rmnet_newlink() Date: Wed, 26 Feb 2020 17:43:49 +0000 Message-Id: <20200226174349.4403-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org rmnet registers IFLA_LINK interface as a lower interface. But, IFLA_LINK could be NULL. In the current code, rmnet doesn't check IFLA_LINK. So, panic would occur. Test commands: modprobe rmnet ip link add rmnet0 type rmnet mux_id 1 Splat looks like: [ 79.718433][ T923] general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 I [ 79.721234][ T923] KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] [ 79.722852][ T923] CPU: 0 PID: 923 Comm: ip Not tainted 5.5.0+ #394 [ 79.723897][ T923] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 79.725395][ T923] RIP: 0010:rmnet_newlink+0x54/0x510 [rmnet] [ 79.726349][ T923] Code: 83 ec 18 48 c1 e9 03 80 3c 01 00 0f 85 d4 03 00 00 48 8b 6a 28 48 b8 00 00 00 00 00 fc ff dc [ 79.729114][ T923] RSP: 0018:ffff88804cc9f1c0 EFLAGS: 00010247 [ 79.729970][ T923] RAX: dffffc0000000000 RBX: ffff8880620dfa00 RCX: 1ffff11009993e99 [ 79.731122][ T923] RDX: 0000000000000000 RSI: ffff888064f34000 RDI: 0000000000000004 [ 79.732389][ T923] RBP: 0000000000000000 R08: ffff88804cc9f8b0 R09: ffff8880644f0990 [ 79.733533][ T923] R10: ffffffffc04cfa40 R11: ffffed100c89e137 R12: ffffffff96ceacc0 [ 79.734810][ T923] R13: ffff888064f34000 R14: ffff88804cc9f8b0 R15: ffff888064f34000 [ 79.736102][ T923] FS: 00007f11d83b60c0(0000) GS:ffff88806c000000(0000) knlGS:0000000000000000 [ 79.737509][ T923] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 79.738430][ T923] CR2: 00005614e7c6bb00 CR3: 0000000064d58006 CR4: 00000000000606f0 [ 79.739545][ T923] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 79.740663][ T923] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 79.741786][ T923] Call Trace: [ 79.742244][ T923] __rtnl_newlink+0xbdb/0x1270 [ 79.742846][ T923] ? lock_downgrade+0x6e0/0x6e0 [ 79.743450][ T923] ? rtnl_link_unregister+0x220/0x220 [ 79.744122][ T923] ? lock_acquire+0x164/0x3b0 [ 79.744724][ T923] ? is_bpf_image_address+0xff/0x1d0 [ 79.745397][ T923] ? rtnl_newlink+0x4c/0x90 [ 79.745958][ T923] ? kernel_text_address+0x111/0x140 [ 79.746621][ T923] ? __kernel_text_address+0xe/0x30 [ 79.747270][ T923] ? unwind_get_return_address+0x5f/0xa0 [ 79.747974][ T923] ? create_prof_cpu_mask+0x20/0x20 [ 79.748635][ T923] ? arch_stack_walk+0x83/0xb0 [ 79.749238][ T923] ? stack_trace_save+0x82/0xb0 [ 79.749850][ T923] ? stack_trace_consume_entry+0x160/0x160 [ 79.750574][ T923] ? deactivate_slab.isra.78+0x2c5/0x800 [ 79.751306][ T923] ? kasan_unpoison_shadow+0x30/0x40 [ 79.751971][ T923] ? kmem_cache_alloc_trace+0x135/0x350 [ 79.752671][ T923] ? rtnl_newlink+0x4c/0x90 [ 79.753239][ T923] rtnl_newlink+0x65/0x90 [ ... ] Fixes: ceed73a2cf4a ("drivers: net: ethernet: qualcomm: rmnet: Initial implementation") Signed-off-by: Taehee Yoo --- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index 06de59521fc4..471e3b2a1403 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -135,6 +135,11 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, int err = 0; u16 mux_id; + if (!tb[IFLA_LINK]) { + NL_SET_ERR_MSG_MOD(extack, "link not specified"); + return -EINVAL; + } + real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); if (!real_dev || !dev) return -ENODEV; From patchwork Wed Feb 26 17:44:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245240 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=e8MrkS92; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNTb0pMMz9sPK for ; Thu, 27 Feb 2020 04:44:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726933AbgBZRoS (ORCPT ); Wed, 26 Feb 2020 12:44:18 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:32821 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726151AbgBZRoS (ORCPT ); Wed, 26 Feb 2020 12:44:18 -0500 Received: by mail-pl1-f196.google.com with SMTP id ay11so1577052plb.0 for ; Wed, 26 Feb 2020 09:44:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=h+HuEc8XubY/vQH6wlbG4hOGSo1knaAl3w4HEbHRGbc=; b=e8MrkS92DlpOcm2wR3qV8W7s6sHLS0g7zHGlWsatCu38SYTiJX5gah8ZJa3Rjblngf YZQkttAAmFFN4HAL9DstO1hPWLJoYVr/0oJWX9qC5xh1Dpm4Jpk8WfEBAxyX8piD3Zd0 4i3WFlRtCsPoHUPHMDQMCX0lJyteM/5iM5TNqsGUgSEqnenyU0NQV7ThYZRQ26RFBXik E+c6/bVQd7PWL5RlpAdq0h2dbHmvP0EDX8z2cLqVrwtobEnKGogBhsVy4Hx2fS5Mgzhs bR/U44xqH4ndToDBJ3veqq2mcFGL4HU55ZDLRNUkfUUmwXrvhzIRcNoEsm0YGpZgEBby lgfw== 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=h+HuEc8XubY/vQH6wlbG4hOGSo1knaAl3w4HEbHRGbc=; b=kvDk1Lf3aovRBlYVgr76KiSNsIOD9uhmQYL6ogYTe8U2avVTEVntAWOoU1qT3SM7vw YT32wiOwXXLB7771Aq28bNaqRnsSG8jEs+pz5sNDDEjhbx27y68KkP6gRtTWx4SZ25wQ 30RMQK1Yj3Xv++GqjiNqwzxlpo60ebhk77bPTL6FG8GcUMjgl/2SZ6naRpx6J0QUoUXD hWxC91V3iKrB9Oks3NneBSzGYGNkd8yg9CP7SHbG/7y6fuQZpDF0YRNDiFp6vAF3YWTr to8bmoqhi/Isq408iscbxivLdWO8xGEk6jnh+eqDM0LmQ9jHv+LiqrKXuOXKhiIlrL+t oLRw== X-Gm-Message-State: APjAAAUOwb2AwLn7l77+m6bEVPO3e49aiN17yZIKyKaXekvMJWidNNex rnXdSO/dTU2SlxZXMGAASzs= X-Google-Smtp-Source: APXvYqz3SohJIelCp2ZDuTye19+VhPMrtZLqvnlYbOVxvZ3eWnBfmtoCXnB9b62n6zS9cA0G8lMevw== X-Received: by 2002:a17:90a:c385:: with SMTP id h5mr229201pjt.122.1582739057038; Wed, 26 Feb 2020 09:44:17 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id iq22sm3533300pjb.9.2020.02.26.09.44.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:44:16 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 02/10] net: rmnet: add missing module alias Date: Wed, 26 Feb 2020 17:44:09 +0000 Message-Id: <20200226174409.4519-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In the current rmnet code, there is no module alias. So, RTNL couldn't load rmnet module automatically. Test commands: ip link add dummy0 type dummy modprobe -rv rmnet ip link add rmnet0 link dummy0 type rmnet mux_id 1 Signed-off-by: Taehee Yoo --- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index 471e3b2a1403..f3d6a43b97a1 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -484,4 +484,5 @@ static void __exit rmnet_exit(void) module_init(rmnet_init) module_exit(rmnet_exit) +MODULE_ALIAS_RTNL_LINK("rmnet"); MODULE_LICENSE("GPL v2"); From patchwork Wed Feb 26 17:44:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245241 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=DUA1lj9z; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNVF6N7Tz9sNg for ; Thu, 27 Feb 2020 04:44:53 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726940AbgBZRow (ORCPT ); Wed, 26 Feb 2020 12:44:52 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:36718 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726151AbgBZRow (ORCPT ); Wed, 26 Feb 2020 12:44:52 -0500 Received: by mail-pg1-f194.google.com with SMTP id d9so28897pgu.3 for ; Wed, 26 Feb 2020 09:44:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=7a36pjxkFmsIkvhAgo7V/LR+VuMqWMf0y+Tp1c8BoGU=; b=DUA1lj9zhNElH7khRucQjSyh9alZJyfKKjSrd0/xlSzR6+rhk7m2ODOj7wub6ywgJM GoyMc9RMWYHhdI6TcQZmb0Xj/EpjDYkVKXyctPhkxSWamhZoK0V7jxmUgW1XhCkl7Tmt FUCw47f5flkTdLhHKsId4wTHz8xhM9zR36nKsHiYCxuQa5jxSVsL/3fZm8JpQb4FBGVI MFJB2wJO30ls1UIcz6nlLDSzX2n36vz3N6fQSqekSHfGthP4kJqq2x9kwc8wEdxvmmUV H55o8Hz8dkg+O0GD1g0D1iVyHu+hbTH96UXBxTKiKlfCBUs+2ja5XI3naQ14uQO7LqTX gnZw== 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=7a36pjxkFmsIkvhAgo7V/LR+VuMqWMf0y+Tp1c8BoGU=; b=r7/7UyQD93uQ0Ma34d8e8UqeMfvSR25PVGNQPFWlzmqAQwUPYQSAhsnyQtA2vjzXx4 rFN6vr+Q1d6YGEvBgF/dMYNG3GJ+mUJEle2H8ST/xXhV8/AbTol4wj92hUVEB+A2mCHS jA9HRRD2MachHkqALerocOXezDQy9wEmSXCSBkVFOHllDc4/adyC4vqX4e37v9swmfbS xwCGjjo/84aJzOKT0Tqxbrdb7+J+DbrP44MUVidQIr75Z/RGQAsYfQUfujZ7cKMnwxAT bKyLahqag5x/0rI607CKCysb4NJBPqgyNoL1c9SnUGhmp+neO0ZlEqhMEcK2XnqzI7IR w6VQ== X-Gm-Message-State: APjAAAX7PIn1DJvoVKCmpGUi/K0PT4SHQs6ItUGJcOC7Co3HSqKuq1ny vd104QzuVaRXZ9dpFG7+QSc= X-Google-Smtp-Source: APXvYqwXq65f/IZVh3Nym4w1gjyJKAcbfF8tFNoK2MvZKglPntuj3EDUzI5rIrycoFbHixcQchZV+A== X-Received: by 2002:a62:1958:: with SMTP id 85mr5246606pfz.221.1582739089760; Wed, 26 Feb 2020 09:44:49 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id k67sm3467842pga.91.2020.02.26.09.44.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:44:48 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 03/10] net: rmnet: fix NULL pointer dereference in rmnet_changelink() Date: Wed, 26 Feb 2020 17:44:43 +0000 Message-Id: <20200226174443.4749-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In the rmnet_changelink(), it uses IFLA_LINK without checking NULL pointer. tb[IFLA_LINK] could be NULL pointer. So, NULL-ptr-deref could occur. rmnet already has a lower interface (real_dev). So, after this patch, rmnet_changelink() does not use IFLA_LINK anymore. Test commands: modprobe rmnet ip link add dummy0 type dummy ip link add rmnet0 link dummy0 type rmnet mux_id 1 ip link set rmnet0 type rmnet mux_id 2 Splat looks like: [ 73.784702][ T944] general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 I [ 73.786128][ T944] KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] [ 73.786894][ T944] CPU: 0 PID: 944 Comm: ip Not tainted 5.5.0+ #406 [ 73.787573][ T944] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 73.788865][ T944] RIP: 0010:rmnet_changelink+0x5a/0x8a0 [rmnet] [ 73.789895][ T944] Code: 83 ec 20 48 c1 ea 03 80 3c 02 00 0f 85 6f 07 00 00 48 8b 5e 28 48 b8 00 00 00 00 00 fc ff d0 [ 73.792187][ T944] RSP: 0018:ffff88804ca571b8 EFLAGS: 00010247 [ 73.792939][ T944] RAX: dffffc0000000000 RBX: 0000000000000000 RCX: ffff88804ca578b0 [ 73.793880][ T944] RDX: 0000000000000000 RSI: ffff88804ca574a0 RDI: 0000000000000004 [ 73.794904][ T944] RBP: ffff88806241f400 R08: 0000000000000002 R09: 0000000000000002 [ 73.796720][ T944] R10: ffffffffc03f2a80 R11: 0000000000000000 R12: ffff88804d094000 [ 73.797721][ T944] R13: ffff88804d094000 R14: ffff88806241e800 R15: 0000000000000000 [ 73.798770][ T944] FS: 00007fc9d81650c0(0000) GS:ffff88806c000000(0000) knlGS:0000000000000000 [ 73.800184][ T944] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 73.801265][ T944] CR2: 0000557c57167458 CR3: 0000000066eea003 CR4: 00000000000606f0 [ 73.802297][ T944] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 73.803290][ T944] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 73.804433][ T944] Call Trace: [ 73.804855][ T944] __rtnl_newlink+0x922/0x1270 [ 73.805459][ T944] ? lock_downgrade+0x6e0/0x6e0 [ 73.806068][ T944] ? rtnl_link_unregister+0x220/0x220 [ 73.806737][ T944] ? lock_acquire+0x164/0x3b0 [ 73.807328][ T944] ? is_bpf_image_address+0xff/0x1d0 [ 73.807983][ T944] ? rtnl_newlink+0x4c/0x90 [ 73.808540][ T944] ? kernel_text_address+0x111/0x140 [ 73.809196][ T944] ? __kernel_text_address+0xe/0x30 [ 73.809859][ T944] ? unwind_get_return_address+0x5f/0xa0 [ 73.810560][ T944] ? create_prof_cpu_mask+0x20/0x20 [ 73.811614][ T944] ? arch_stack_walk+0x83/0xb0 [ 73.812350][ T944] ? stack_trace_save+0x82/0xb0 [ 73.812976][ T944] ? stack_trace_consume_entry+0x160/0x160 [ 73.814174][ T944] ? deactivate_slab.isra.78+0x2c5/0x800 [ 73.814920][ T944] ? kasan_unpoison_shadow+0x30/0x40 [ 73.815594][ T944] ? kmem_cache_alloc_trace+0x135/0x350 [ 73.816789][ T944] ? rtnl_newlink+0x4c/0x90 [ 73.817357][ T944] rtnl_newlink+0x65/0x90 [ ... ] Fixes: 23790ef12082 ("net: qualcomm: rmnet: Allow to configure flags for existing devices") Signed-off-by: Taehee Yoo --- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index f3d6a43b97a1..7a7d0f521352 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -300,10 +300,8 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[], if (!dev) return -ENODEV; - real_dev = __dev_get_by_index(dev_net(dev), - nla_get_u32(tb[IFLA_LINK])); - - if (!real_dev || !rmnet_is_real_dev_registered(real_dev)) + real_dev = priv->real_dev; + if (!rmnet_is_real_dev_registered(real_dev)) return -ENODEV; port = rmnet_get_port_rtnl(real_dev); From patchwork Wed Feb 26 17:47:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245243 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=eMseAdF2; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNY0095Vz9sNg for ; Thu, 27 Feb 2020 04:47:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726880AbgBZRrP (ORCPT ); Wed, 26 Feb 2020 12:47:15 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:32992 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726631AbgBZRrO (ORCPT ); Wed, 26 Feb 2020 12:47:14 -0500 Received: by mail-pl1-f195.google.com with SMTP id ay11so1580272plb.0 for ; Wed, 26 Feb 2020 09:47:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=NofkfjfaLA9LNBLTJrt7wvFh7bZZfLGeztgcSAupDvI=; b=eMseAdF2cwCOaID0ldxB5h2tD52848E+2k52gzG1Jx90nb0bXhtq6WZvfOJc/VMws6 OTm+ZgE/+L4bviA6OJZi0S+3WQnmqOKBEQwrgeBAdY0DijMeLPfNXJzwxCV4WVjeU81u ULA8NWNf0JA3dRZaxabU8JV1OtU5zHQ94qoyVIWl2FfVF3jawxU73JCOcZG+aOnvAkeb DNzTYtxukdlitWPFMngWBOO0Drwjer8NQ/PCP00jYGsrcOJboWlA/Wm82JTW3TLu5hKU Qn8xmvTnauXt4dGMVHUQRgm15yp3HWECtiRV+s036DI2SRXBWiacwwEmQF8xOTMs78ji ZXlw== 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=NofkfjfaLA9LNBLTJrt7wvFh7bZZfLGeztgcSAupDvI=; b=nt8uDOAZ42IvATrzlh4KiXALSNg2gqArX/EfN0aweTWcpac03E0uz8rb2SNg7AG0aX A5AHPloPgkalmsbani3xUYKds2SIgdQAFpmFYsf5rFkiYa1a1kwEQnolKFbw/CLS3fh/ l8M7Z1E2FMjyzXtYEyPYOU8Qw43grOtBUc3P+ygmxNGAecMiOFSzY8sbfOflqzAiOUUD /m4s+zCIf+AX7DHId6p7pE0y9LiLnWnKO1DdwqOrfKfBRn9FAbNyUgMGkwQ+i+NjV+SL CoB65NMUzmRY1bopfr57e9XrQPMhSFo8ScXFhPCWmLE13n9r/buIeSb5qcke3ziA6Gvy K9eQ== X-Gm-Message-State: APjAAAUbQ+FfLLLzfK+ClJQVgU07RMT1joez3WBHZx/WmrDtKbm0X4So Y/lwQZ7Elg1J2C+UOgsf1Q8= X-Google-Smtp-Source: APXvYqyWBYbWyZbuhDVu/9m/TJ9arUuvkrIdaQDadgOn1kwqYHSAlI0OxNqP4dV+JvVJ1ZfDcp7IgQ== X-Received: by 2002:a17:90a:c78b:: with SMTP id gn11mr217468pjb.97.1582739232965; Wed, 26 Feb 2020 09:47:12 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id a10sm3450705pgk.71.2020.02.26.09.47.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:47:12 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 04/10] net: rmnet: fix suspicious RCU usage Date: Wed, 26 Feb 2020 17:47:06 +0000 Message-Id: <20200226174706.5334-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org rmnet_get_port() internally calls rcu_dereference_rtnl(), which checks RTNL. But rmnet_get_port() could be called by packet path. The packet path is not protected by RTNL. So, the suspicious RCU usage problem occurs. Test commands: ip netns add nst ip link add veth0 type veth peer name veth1 ip link set veth1 netns nst ip link add rmnet0 link veth0 type rmnet mux_id 1 ip netns exec nst ip link add rmnet1 link veth1 type rmnet mux_id 1 ip netns exec nst ip link set veth1 up ip netns exec nst ip link set rmnet1 up ip netns exec nst ip a a 192.168.100.2/24 dev rmnet1 ip link set veth0 up ip link set rmnet0 up ip a a 192.168.100.1/24 dev rmnet0 ping 192.168.100.2 Splat looks like: [ 339.775811][ T969] ============================= [ 339.777204][ T969] WARNING: suspicious RCU usage [ 339.778188][ T969] 5.5.0+ #407 Not tainted [ 339.779123][ T969] ----------------------------- [ 339.780100][ T969] drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c:389 suspicious rcu_dereference_check() usage! [ 339.781943][ T969] [ 339.781943][ T969] other info that might help us debug this: [ 339.781943][ T969] [ 339.783475][ T969] [ 339.783475][ T969] rcu_scheduler_active = 2, debug_locks = 1 [ 339.784656][ T969] 5 locks held by ping/969: [ 339.785406][ T969] #0: ffff88804cb897f0 (sk_lock-AF_INET){+.+.}, at: raw_sendmsg+0xab8/0x2980 [ 339.786766][ T969] #1: ffffffff92925460 (rcu_read_lock_bh){....}, at: ip_finish_output2+0x243/0x2150 [ 339.788308][ T969] #2: ffffffff92925460 (rcu_read_lock_bh){....}, at: __dev_queue_xmit+0x213/0x2e10 [ 339.790662][ T969] #3: ffff88805a924158 (&dev->qdisc_running_key#3){+...}, at: ip_finish_output2+0x714/0x2150 [ 339.792072][ T969] #4: ffff88805b4fdc98 (&dev->qdisc_xmit_lock_key#3){+.-.}, at: sch_direct_xmit+0x1e2/0x1020 [ 339.793445][ T969] [ 339.793445][ T969] stack backtrace: [ 339.794691][ T969] CPU: 3 PID: 969 Comm: ping Not tainted 5.5.0+ #407 [ 339.795946][ T969] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 339.797621][ T969] Call Trace: [ 339.798249][ T969] dump_stack+0x96/0xdb [ 339.798847][ T969] rmnet_get_port.part.9+0x76/0x80 [rmnet] [ 339.799583][ T969] rmnet_egress_handler+0x107/0x420 [rmnet] [ 339.800350][ T969] ? sch_direct_xmit+0x1e2/0x1020 [ 339.801027][ T969] rmnet_vnd_start_xmit+0x3d/0xa0 [rmnet] [ 339.801784][ T969] dev_hard_start_xmit+0x160/0x740 [ 339.802667][ T969] sch_direct_xmit+0x265/0x1020 [ ... ] Fixes: ceed73a2cf4a ("drivers: net: ethernet: qualcomm: rmnet: Initial implementation") Signed-off-by: Taehee Yoo --- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 13 ++++++------- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h | 2 +- .../net/ethernet/qualcomm/rmnet/rmnet_handlers.c | 4 ++-- drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 2 ++ 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index 7a7d0f521352..93642cdd3305 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -382,11 +382,10 @@ struct rtnl_link_ops rmnet_link_ops __read_mostly = { .fill_info = rmnet_fill_info, }; -/* Needs either rcu_read_lock() or rtnl lock */ -struct rmnet_port *rmnet_get_port(struct net_device *real_dev) +struct rmnet_port *rmnet_get_port_rcu(struct net_device *real_dev) { if (rmnet_is_real_dev_registered(real_dev)) - return rcu_dereference_rtnl(real_dev->rx_handler_data); + return rcu_dereference(real_dev->rx_handler_data); else return NULL; } @@ -412,7 +411,7 @@ int rmnet_add_bridge(struct net_device *rmnet_dev, struct rmnet_port *port, *slave_port; int err; - port = rmnet_get_port(real_dev); + port = rmnet_get_port_rtnl(real_dev); /* If there is more than one rmnet dev attached, its probably being * used for muxing. Skip the briding in that case @@ -427,7 +426,7 @@ int rmnet_add_bridge(struct net_device *rmnet_dev, if (err) return -EBUSY; - slave_port = rmnet_get_port(slave_dev); + slave_port = rmnet_get_port_rtnl(slave_dev); slave_port->rmnet_mode = RMNET_EPMODE_BRIDGE; slave_port->bridge_ep = real_dev; @@ -445,11 +444,11 @@ int rmnet_del_bridge(struct net_device *rmnet_dev, struct net_device *real_dev = priv->real_dev; struct rmnet_port *port, *slave_port; - port = rmnet_get_port(real_dev); + port = rmnet_get_port_rtnl(real_dev); port->rmnet_mode = RMNET_EPMODE_VND; port->bridge_ep = NULL; - slave_port = rmnet_get_port(slave_dev); + slave_port = rmnet_get_port_rtnl(slave_dev); rmnet_unregister_real_device(slave_dev, slave_port); netdev_dbg(slave_dev, "removed from rmnet as slave\n"); diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h index cd0a6bcbe74a..0d568dcfd65a 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h @@ -65,7 +65,7 @@ struct rmnet_priv { struct rmnet_priv_stats stats; }; -struct rmnet_port *rmnet_get_port(struct net_device *real_dev); +struct rmnet_port *rmnet_get_port_rcu(struct net_device *real_dev); struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id); int rmnet_add_bridge(struct net_device *rmnet_dev, struct net_device *slave_dev, diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c index 1b74bc160402..074a8b326c30 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c @@ -184,7 +184,7 @@ rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb) return RX_HANDLER_PASS; dev = skb->dev; - port = rmnet_get_port(dev); + port = rmnet_get_port_rcu(dev); switch (port->rmnet_mode) { case RMNET_EPMODE_VND: @@ -217,7 +217,7 @@ void rmnet_egress_handler(struct sk_buff *skb) skb->dev = priv->real_dev; mux_id = priv->mux_id; - port = rmnet_get_port(skb->dev); + port = rmnet_get_port_rcu(skb->dev); if (!port) goto drop; diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c index 509dfc895a33..a26e76e9d382 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c @@ -50,7 +50,9 @@ static netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb, priv = netdev_priv(dev); if (priv->real_dev) { + rcu_read_lock(); rmnet_egress_handler(skb); + rcu_read_unlock(); } else { this_cpu_inc(priv->pcpu_stats->stats.tx_drops); kfree_skb(skb); From patchwork Wed Feb 26 17:47:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245244 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=g9v/jtOm; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNYJ3lsmz9sPK for ; Thu, 27 Feb 2020 04:47:32 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726907AbgBZRrb (ORCPT ); Wed, 26 Feb 2020 12:47:31 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:34858 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726631AbgBZRrb (ORCPT ); Wed, 26 Feb 2020 12:47:31 -0500 Received: by mail-pf1-f194.google.com with SMTP id i19so149624pfa.2 for ; Wed, 26 Feb 2020 09:47:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=YEewmmjg9L6uxTVzMfgFdNq1SumNAZgvtgHvnTSy5BQ=; b=g9v/jtOmWDbB8djivVMx/j25Izks1Gf+s2Ov3R1aNKfBseOYEujh/GU7gwRNMaedJo KtH6z5jLPofXpMeQF6E33z6YIj+FBJ4zGztx6WjgZv3056ZiA3AAY0lMQDr7bTmaCoJ4 0NDA2P091cmHu5MCJUO6713QfSgvuUkAq9nkCHNia0I9gcePVi0C5uiDSHeJ36y3A+Op ljbo+ivvfxOMy2gvkSXDWFX+DxEud2r3QM1UsXou4k4OOKMhf0YcxQwzyYMAOx4sKVr4 tVMs/HiT2ZTUZsSLQOALmDbALcFC6JfPRNETanVJO/c63p23Us5O8t4zFpzaG/h4N9DS tH/g== 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=YEewmmjg9L6uxTVzMfgFdNq1SumNAZgvtgHvnTSy5BQ=; b=cSaupw5hFG6yAfCDb39AEjGRRBI/OahD0yQmbZBGg7E240fVofpjS6zujCn1wxlkMo tlIbZDvDsqW/Y0xqSAhvwvtfTnWi8jGy4mlt24ztOZevI7Qe0OzvcKstLWWqHrXCwR3P DHo2ztGYSCatkQu0g7rD2YZ7lpXeAhiI2Bt5mND3XhhNsWs0Toj0pfCC+D8lIXw2KTAw 55c57Ba786DCRK7k/jFrIG1bFq5gWEMx4hx33sPxmKwlpMFBeEPg9p5XSh4UJgujytzv FxfAKGnO9JdAHQ6YI8FKrDapadAyRFsAp0r/A2kpOZZdYtORwzmKzyMjo/HEEznx3sBH gmVw== X-Gm-Message-State: APjAAAW1Zbl1ypjYulnGQRofnG/7l5bO2A2N6ah+slMqWkLmverFn69K ni04/wBXewfwPMv1l8qxmds= X-Google-Smtp-Source: APXvYqxJmpqaEFJx1dcmMxoe8Q7aRKP5zYU5eUsuat6r+F5eub33v3OEf5JO+gHiYlmuu0PFdKjL+w== X-Received: by 2002:a65:6090:: with SMTP id t16mr42124pgu.2.1582739249615; Wed, 26 Feb 2020 09:47:29 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id o6sm4050442pfg.180.2020.02.26.09.47.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:47:28 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 05/10] net: rmnet: remove rcu_read_lock in rmnet_force_unassociate_device() Date: Wed, 26 Feb 2020 17:47:23 +0000 Message-Id: <20200226174723.5492-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The notifier_call() of the slave interface removes rmnet interface with unregister_netdevice_queue(). But, before calling unregister_netdevice_queue(), it acquires rcu readlock. In the RCU critical section, sleeping isn't be allowed. But, unregister_netdevice_queue() internally calls synchronize_net(), which would sleep. So, suspicious RCU usage warning occurs. Test commands: ip link add dummy0 type dummy ip link add dummy1 type dummy ip link add rmnet0 link dummy0 type rmnet mux_id 1 ip link del dummy0 Splat looks like: [ 128.764922][ T979] WARNING: suspicious RCU usage [ 128.766356][ T979] 5.5.0+ #416 Not tainted [ 128.767667][ T979] ----------------------------- [ 128.769008][ T979] ./include/linux/rcupdate.h:273 Illegal context switch in RCU read-side critical section! [ 128.771375][ T979] [ 128.771375][ T979] other info that might help us debug this: [ 128.771375][ T979] [ 128.773998][ T979] [ 128.773998][ T979] rcu_scheduler_active = 2, debug_locks = 1 [ 128.775572][ T979] 2 locks held by ip/979: [ 128.776507][ T979] #0: ffffffff9ccf6230 (rtnl_mutex){+.+.}, at: rtnetlink_rcv_msg+0x457/0x890 [ 128.778241][ T979] #1: ffffffff9c9254c0 (rcu_read_lock){....}, at: rmnet_config_notify_cb+0xf0/0x590 [rmnet] [ 128.779704][ T979] [ 128.779704][ T979] stack backtrace: [ 128.780699][ T979] CPU: 0 PID: 979 Comm: ip Not tainted 5.5.0+ #416 [ 128.781763][ T979] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 128.783433][ T979] Call Trace: [ 128.783919][ T979] dump_stack+0x96/0xdb [ 128.784535][ T979] ___might_sleep+0x345/0x440 [ 128.785216][ T979] synchronize_net+0x18/0x30 [ 128.785868][ T979] netdev_rx_handler_unregister+0x40/0xb0 [ 128.786536][ T979] rmnet_unregister_real_device+0x42/0xb0 [rmnet] [ 128.787219][ T979] rmnet_config_notify_cb+0x1f7/0x590 [rmnet] [ 128.787859][ T979] ? rmnet_unregister_bridge.isra.6+0xf0/0xf0 [rmnet] [ 128.788668][ T979] ? rmnet_unregister_bridge.isra.6+0xf0/0xf0 [rmnet] [ 128.789347][ T979] ? __module_text_address+0x13/0x140 [ 128.789853][ T979] notifier_call_chain+0x90/0x160 [ 128.790353][ T979] rollback_registered_many+0x660/0xcf0 [ 128.790877][ T979] ? netif_set_real_num_tx_queues+0x780/0x780 [ 128.791452][ T979] ? __lock_acquire+0xdfe/0x3de0 [ 128.791926][ T979] ? memset+0x1f/0x40 [ 128.792309][ T979] ? __nla_validate_parse+0x98/0x1ab0 [ 128.793033][ T979] unregister_netdevice_many.part.134+0x13/0x1b0 [ 128.794060][ T979] rtnl_delete_link+0xbc/0x100 [ ... ] Fixes: ceed73a2cf4a ("drivers: net: ethernet: qualcomm: rmnet: Initial implementation") Signed-off-by: Taehee Yoo --- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index 93642cdd3305..c8b1bfe127ac 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -230,7 +230,6 @@ static void rmnet_force_unassociate_device(struct net_device *dev) port = rmnet_get_port_rtnl(dev); - rcu_read_lock(); rmnet_unregister_bridge(dev, port); hash_for_each_safe(port->muxed_ep, bkt_ep, tmp_ep, ep, hlnode) { @@ -241,7 +240,6 @@ static void rmnet_force_unassociate_device(struct net_device *dev) kfree(ep); } - rcu_read_unlock(); unregister_netdevice_many(&list); rmnet_unregister_real_device(real_dev, port); From patchwork Wed Feb 26 17:47:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245245 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=mNrb3to3; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNYf4Xvpz9sNg for ; Thu, 27 Feb 2020 04:47:50 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726956AbgBZRrt (ORCPT ); Wed, 26 Feb 2020 12:47:49 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:35910 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726151AbgBZRrt (ORCPT ); Wed, 26 Feb 2020 12:47:49 -0500 Received: by mail-pg1-f193.google.com with SMTP id d9so32129pgu.3 for ; Wed, 26 Feb 2020 09:47:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=wPHpIqXAqt+du0BxNpnYvniWJILbeASE2RtqbgYeh3I=; b=mNrb3to3/HX1Sa1VMpIdcaMMINXbOi2hcuvUqYjiLSLOIWoZD8Wn9eB6CzhksuhEc1 EJo2zw4tMjrB2XULbKJNuHwbtUu9f9rgupsz9TvXy/NpuvmrictoSY7kiZ3OyC6BlqhH uSyKRspX40PtOje1Bq7U5qAOcSEykcHOO872dSFTiosKSCzvV9F2v+XxxVC2J1pPG7as HrxxlCCT1QL73x29cH7C8WB3IMr0n3dgGjAiHSnHCsUWG9MA/TO6NMs4D5kDzAlRSbxG 1VOuW6BeT0nXnsYjeUv3YI59SHNU/IDLl+BirrY870To/RgCaS/J0mOg5lVcK03lhEDS tWJQ== 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=wPHpIqXAqt+du0BxNpnYvniWJILbeASE2RtqbgYeh3I=; b=U0szwhe9FEfL12kFClJjH2eE+aLIGbm0B6gaTuhoIMdB4ohWj6gGeug/wIXITTzcUd RG3jLmJyplmUbyL7wTziKFL/rKqev+m3Li2nkHWaLwn4HsJ4rlo4NYrqn0m7D/otdLa8 bbMzm6CxDqJlSRpvaaiEaf94MsJWoFYyI+DugvWNla5Nqbd3Oy6b3ei2BKYeyAYgqSQ6 EeV0Tc2UPfnWT6ic50N8upqGELfi02NFp1Suxdvol7/yLcEMy8HjeD9pR6Xap2/c1sy7 1oTMUtobrkStwrgTdUzvWpb+IRNESXrdhX7zfZtx571Br6FW06K2sABsat1MUdYgEmcU RTlQ== X-Gm-Message-State: APjAAAUL5ej6OdqIyXKbqkS28kHm6fk/w0PQy2rnflaxWia15XlXiU3l vJUebkUZFIsf1UBWrHLi2Sk= X-Google-Smtp-Source: APXvYqx3k7OwJOCZAoprTs42mpFFVbUkvzRCaHoFN3nWFsv3DI72mxXCcZZ9iXO6F055XCjH31ZfwA== X-Received: by 2002:a63:504d:: with SMTP id q13mr96342pgl.315.1582739267867; Wed, 26 Feb 2020 09:47:47 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id s130sm4074394pfc.62.2020.02.26.09.47.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:47:46 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 06/10] net: rmnet: print error message when command fails Date: Wed, 26 Feb 2020 17:47:40 +0000 Message-Id: <20200226174740.5636-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When rmnet netlink command fails, it doesn't print any error message. So, users couldn't know the exact reason. In order to tell the exact reason to the user, the extack error message is used in this patch. Signed-off-by: Taehee Yoo --- .../ethernet/qualcomm/rmnet/rmnet_config.c | 26 ++++++++++++------- .../net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 10 +++---- .../net/ethernet/qualcomm/rmnet/rmnet_vnd.h | 3 ++- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index c8b1bfe127ac..93745cd45c29 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -141,11 +141,10 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, } real_dev = __dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK])); - if (!real_dev || !dev) + if (!real_dev || !dev) { + NL_SET_ERR_MSG_MOD(extack, "link does not exist"); return -ENODEV; - - if (!data[IFLA_RMNET_MUX_ID]) - return -EINVAL; + } ep = kzalloc(sizeof(*ep), GFP_ATOMIC); if (!ep) @@ -158,7 +157,7 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, goto err0; port = rmnet_get_port_rtnl(real_dev); - err = rmnet_vnd_newlink(mux_id, dev, port, real_dev, ep); + err = rmnet_vnd_newlink(mux_id, dev, port, real_dev, ep, extack); if (err) goto err1; @@ -275,12 +274,16 @@ static int rmnet_rtnl_validate(struct nlattr *tb[], struct nlattr *data[], { u16 mux_id; - if (!data || !data[IFLA_RMNET_MUX_ID]) + if (!data || !data[IFLA_RMNET_MUX_ID]) { + NL_SET_ERR_MSG_MOD(extack, "MUX ID not specifies"); return -EINVAL; + } mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]); - if (mux_id > (RMNET_MAX_LOGICAL_EP - 1)) + if (mux_id > (RMNET_MAX_LOGICAL_EP - 1)) { + NL_SET_ERR_MSG_MOD(extack, "invalid MUX ID"); return -ERANGE; + } return 0; } @@ -414,11 +417,16 @@ int rmnet_add_bridge(struct net_device *rmnet_dev, /* If there is more than one rmnet dev attached, its probably being * used for muxing. Skip the briding in that case */ - if (port->nr_rmnet_devs > 1) + if (port->nr_rmnet_devs > 1) { + NL_SET_ERR_MSG_MOD(extack, "more than one rmnet dev attached"); return -EINVAL; + } - if (rmnet_is_real_dev_registered(slave_dev)) + if (rmnet_is_real_dev_registered(slave_dev)) { + NL_SET_ERR_MSG_MOD(extack, + "dev is already attached another rmnet dev"); return -EBUSY; + } err = rmnet_register_real_device(slave_dev); if (err) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c index a26e76e9d382..90c19033ebe0 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c @@ -224,16 +224,16 @@ void rmnet_vnd_setup(struct net_device *rmnet_dev) int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev, struct rmnet_port *port, struct net_device *real_dev, - struct rmnet_endpoint *ep) + struct rmnet_endpoint *ep, + struct netlink_ext_ack *extack) { struct rmnet_priv *priv = netdev_priv(rmnet_dev); int rc; - if (ep->egress_dev) - return -EINVAL; - - if (rmnet_get_endpoint(port, id)) + if (rmnet_get_endpoint(port, id)) { + NL_SET_ERR_MSG_MOD(extack, "MUX ID already exists"); return -EBUSY; + } rmnet_dev->hw_features = NETIF_F_RXCSUM; rmnet_dev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h index 54cbaf3c3bc4..d8fa76e8e9c4 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h @@ -11,7 +11,8 @@ int rmnet_vnd_do_flow_control(struct net_device *dev, int enable); int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev, struct rmnet_port *port, struct net_device *real_dev, - struct rmnet_endpoint *ep); + struct rmnet_endpoint *ep, + struct netlink_ext_ack *extack); int rmnet_vnd_dellink(u8 id, struct rmnet_port *port, struct rmnet_endpoint *ep); void rmnet_vnd_rx_fixup(struct sk_buff *skb, struct net_device *dev); From patchwork Wed Feb 26 17:48:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245246 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=G9mvHHey; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNZH5jVQz9sNg for ; Thu, 27 Feb 2020 04:48:23 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726970AbgBZRsW (ORCPT ); Wed, 26 Feb 2020 12:48:22 -0500 Received: from mail-pj1-f66.google.com ([209.85.216.66]:36044 "EHLO mail-pj1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726151AbgBZRsW (ORCPT ); Wed, 26 Feb 2020 12:48:22 -0500 Received: by mail-pj1-f66.google.com with SMTP id gv17so1551839pjb.1 for ; Wed, 26 Feb 2020 09:48:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=6DLzKXwALtpZesLpDIOrxCFZbd63obNFntK9/eaUVBM=; b=G9mvHHey0dVN6okTG1AwZBJnla25x14guj/+Fy047GsFx9ltWrLC5gCmOxeIyv6W3Y 16neI/O3gzQ9rzx5m7FBxcSnyK0y1ic1pViHfWG/7G/sh4tjulc/1WWaBSJr4F3/D+CE c4GWIAJRHLelZYw+Vbe35gzLxyzvehbbKLp5nyXpYIry2Riw57bCq0iPAW4kU0sMO2CM 0Pw7iPF4UGjHmsVgY3t8XKTJIIcv+fyAAItMogyLB/p7dYcTJ5/89Eznz1B0lZtulThx 12vbogejn8C5lyMzeutc1rPfjbeZwL1TBpCH/y6wpcFY1oSTLJ0WUUtn4MFZ3MqcLpre TcZQ== 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=6DLzKXwALtpZesLpDIOrxCFZbd63obNFntK9/eaUVBM=; b=pU+TPGd7CbFkbgOStoW3GiPMzH5a7xdupwPfgkAl9Kilbjgq6JeKG1BVx2H3n6lygH 8DOeFuBx3FgFahRokwEjJ0tjpqYJeRXc60FSa3X2WBVqAOYDKHJHdxBUZa4T3QIxCgwB +NHHWe/R5xpRTFJwrGojf/B3h084Yv7DMyQIk927NKpvy0BRPPKNxABaAQJJ6uYfaeam wkEWCM8LfwghqqOLV8PfQBFwMXFspE+Xi+zejbYhzEZYZeiNeUehmco0gfL19wBXxQbQ VnXFEjpt3HeDEAqXlkDPAcX32QGW/lCxodm6s3sO6T8vnOgQSVj4VNj0Fxoues2YIgPY Gk8g== X-Gm-Message-State: APjAAAUyny1NYqx0sJlkDPlPKTDnIpFwmgXMq/QWPz0bFlYY0t669stG Yrc6kSCBQe+F4SBDVGMCWUQ= X-Google-Smtp-Source: APXvYqx7+WzODygwHRGdh7HfuJg2/5nIDX04vCUhu1A0f11exJKIZ3KvLKIr9YsEXx9BUdUyCR7yjw== X-Received: by 2002:a17:90a:c706:: with SMTP id o6mr242176pjt.82.1582739301032; Wed, 26 Feb 2020 09:48:21 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id ep2sm3458884pjb.31.2020.02.26.09.48.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:48:20 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 07/10] net: rmnet: do not allow to change mux id if mux id is duplicated Date: Wed, 26 Feb 2020 17:48:14 +0000 Message-Id: <20200226174814.5965-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Basically, duplicate mux id isn't be allowed. So, the creation of rmnet will be failed if there is duplicate mux id is existing. But, changelink routine doesn't check duplicate mux id. Test commands: ip link add dummy0 type dummy ip link add rmnet0 link dummy0 type rmnet mux_id 1 ip link add rmnet1 link dummy0 type rmnet mux_id 2 ip link set rmnet1 type rmnet mux_id 1 Fixes: 23790ef12082 ("net: qualcomm: rmnet: Allow to configure flags for existing devices") Signed-off-by: Taehee Yoo --- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index 93745cd45c29..bdb88472a0a0 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -309,6 +309,10 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[], if (data[IFLA_RMNET_MUX_ID]) { mux_id = nla_get_u16(data[IFLA_RMNET_MUX_ID]); + if (rmnet_get_endpoint(port, mux_id)) { + NL_SET_ERR_MSG_MOD(extack, "MUX ID already exists"); + return -EINVAL; + } ep = rmnet_get_endpoint(port, priv->mux_id); if (!ep) return -ENODEV; From patchwork Wed Feb 26 17:48:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245249 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=i42SYEIU; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNZn4VGSz9sNg for ; Thu, 27 Feb 2020 04:48:49 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727064AbgBZRss (ORCPT ); Wed, 26 Feb 2020 12:48:48 -0500 Received: from mail-pj1-f68.google.com ([209.85.216.68]:36070 "EHLO mail-pj1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726810AbgBZRsr (ORCPT ); Wed, 26 Feb 2020 12:48:47 -0500 Received: by mail-pj1-f68.google.com with SMTP id gv17so1552265pjb.1 for ; Wed, 26 Feb 2020 09:48:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=UagKW/ZHLsnwygzzM41BQuciv7JPrh1DPKs7YCN3uYI=; b=i42SYEIU3PZPO7kWBKClBuLZ6CnqvTpOlZclAkGKYbgFyOJOeVdZL6sGzQG3uyJ6g4 rRX05OmOM7+8iFknfuiCFQFY+zXkd+yukgzPuiGs3pSnpAzI8GKkVMcAkeGud5QLP2lJ xiQ2twlcDuPDsOGq22mgh7pkvUuALGiRNl2nNhHyQ08vOf4bQl8uVOKv6tNk+N7zBv6A tN0LfP+BQg8eI55IdgZUSVeusVblKyAgzZ8SXeWbFpefkUO3Jet18eXT80keu6PdxPsX JZOv6EUdQDXyeADwkVaHouZciEwUzzTk9py9yf/K9G0MFfwrD2jSPJBnrCC6mvPqUbSa IrxQ== 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=UagKW/ZHLsnwygzzM41BQuciv7JPrh1DPKs7YCN3uYI=; b=fuWoBQLvee/QG0cGI8AtWcMTL20u0x+m4hmVlL9BnjTpKozvOHeof/dZEHdew7/PXn /pqlZgcTnVMxV60ro1bsCtI3UoYW9CrtfZeNcMxk4FDLuhm8xXZfiT5D8Pyqee8FLEtC TJIhNfTytPf01caaNkgVk326DkNsar4zY33kDDlpDUnRI55zZmW1Y38u4Xs50+57ry+1 FFqNVNvqpEldoNGAdgifdbeZPxirEg+ZeVWHy1fRxmr55dAKoPG5scc+7bZf21U07qoU EwoF9AO5oBmITK/Pk/DegTBXGNtvfJHSWKnQ0Okuph/jBtSSTsEZMCAuQiG1inFanfjP /GoA== X-Gm-Message-State: APjAAAWgkzCxSa+VXW9NCjESdlnnSZn3Go33+vkXCDpnrgIXSKshLaRV X81w3ryxTd+nyWyLJsc1P2w= X-Google-Smtp-Source: APXvYqxwsefdQVtUJQxp6ZD9zLydYBjrp95dKUnJ/X6ID4cNJ8zx3iRX9BlsW0BPIbq869AtKP73UA== X-Received: by 2002:a17:902:8d92:: with SMTP id v18mr473255plo.18.1582739326061; Wed, 26 Feb 2020 09:48:46 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id e18sm4004525pfm.24.2020.02.26.09.48.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:48:45 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 08/10] net: rmnet: use upper/lower device infrastructure Date: Wed, 26 Feb 2020 17:48:39 +0000 Message-Id: <20200226174839.6109-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org netdev_upper_dev_link() is useful to manage lower/upper interfaces. And this function internally validates looping, maximum depth. All or most virtual interfaces that could have a real interface (e.g. macsec, macvlan, ipvlan etc.) use lower/upper infrastructure. Test commands: ip link add dummy0 type dummy ip link add rmnet1 link dummy0 type rmnet mux_id 1 for i in {2..100} do let A=$i-1 ip link add rmnet$i link rmnet$A type rmnet mux_id $i done ip link del dummy0 The purpose of the test commands is to make stack overflow. Splat looks like: [ 54.352441][ T2169] BUG: KASAN: use-after-free in usage_match+0x85/0xa0 [ 54.353332][ T2169] Read of size 8 at addr ffff8880a6eae420 by task ip/2169 [ 54.404290][ T2169] [ 54.404615][ T2169] CPU: 1 PID: 2169 Comm: ip Not tainted 5.5.0+ #422 [ 54.409543][ T2169] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 54.410619][ T2169] Call Trace: [ 54.411051][ T2169] [ 54.411345][ T2169] Allocated by task 1: [ 54.793962][ T2169] (stack is not available) [ 54.794566][ T2169] [ 54.794880][ T2169] Freed by task 2519193708: [ 54.795487][ T2169] BUG: unable to handle page fault for address: ffffffff9b9dbe58 [ 54.796508][ T2169] #PF: supervisor read access in kernel mode [ 54.797274][ T2169] #PF: error_code(0x0000) - not-present page [ 54.798058][ T2169] PGD 11b818067 P4D 11b818067 PUD 11b819063 PMD 0 [ 54.798879][ T2169] Thread overran stack, or stack corrupted [ 54.799451][ T2169] Oops: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN PTI [ 55.293798][ T2169] CPU: 1 PID: 2169 Comm: ip Not tainted 5.5.0+ #422 [ 55.294661][ T2169] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 55.296407][ T2169] RIP: 0010:stack_depot_fetch+0x10/0x30 [ 55.297122][ T2169] Code: ff e9 f9 fe ff ff 48 89 df e8 9c 1d 91 ff e9 ca fe ff ff cc cc cc cc cc cc cc 89 f8 0 [ 55.299622][ T2169] RSP: 0018:ffff8880a6eae2c8 EFLAGS: 00010006 [ 55.798954][ T2169] RAX: 00000000001fffff RBX: ffff8880a6eaea48 RCX: 0000000000000000 [ 55.799997][ T2169] RDX: 0000000000000019 RSI: ffff8880a6eae2d0 RDI: 0000000000003ff0 [ 55.801075][ T2169] RBP: ffffea00029baa00 R08: ffffed101aabe403 R09: ffffed101aabe403 [ 55.802147][ T2169] R10: 0000000000000001 R11: ffffed101aabe402 R12: ffff8880d0660400 [ 55.803174][ T2169] R13: ffff8880a6ead900 R14: ffff8880a6eae4f0 R15: ffff8880a6eae610 [ 55.804192][ T2169] FS: 00007fc124f030c0(0000) GS:ffff8880d5400000(0000) knlGS:0000000000000000 [ 55.805328][ T2169] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 55.806193][ T2169] CR2: ffffffff9b9dbe58 CR3: 00000000a9a20004 CR4: 00000000000606e0 [ 55.807223][ T2169] Call Trace: [ 55.807642][ T2169] Modules linked in: rmnet dummy veth openvswitch nsh nf_conncount nf_nat nf_conntrack nf_dex [ 56.293411][ T2169] CR2: ffffffff9b9dbe58 [ 56.294041][ T2169] ---[ end trace 0c069624f07c5c8c ]--- [ 56.294761][ T2169] RIP: 0010:stack_depot_fetch+0x10/0x30 [ 56.295494][ T2169] Code: ff e9 f9 fe ff ff 48 89 df e8 9c 1d 91 ff e9 ca fe ff ff cc cc cc cc cc cc cc 89 f8 0 [ 56.298122][ T2169] RSP: 0018:ffff8880a6eae2c8 EFLAGS: 00010006 [ 56.298728][ T2169] RAX: 00000000001fffff RBX: ffff8880a6eaea48 RCX: 0000000000000000 [ 56.299770][ T2169] RDX: 0000000000000019 RSI: ffff8880a6eae2d0 RDI: 0000000000003ff0 [ 56.799064][ T2169] RBP: ffffea00029baa00 R08: ffffed101aabe403 R09: ffffed101aabe403 [ 56.800117][ T2169] R10: 0000000000000001 R11: ffffed101aabe402 R12: ffff8880d0660400 [ 56.801137][ T2169] R13: ffff8880a6ead900 R14: ffff8880a6eae4f0 R15: ffff8880a6eae610 [ 56.802181][ T2169] FS: 00007fc124f030c0(0000) GS:ffff8880d5400000(0000) knlGS:0000000000000000 [ 56.803325][ T2169] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 56.804173][ T2169] CR2: ffffffff9b9dbe58 CR3: 00000000a9a20004 CR4: 00000000000606e0 [ 56.805198][ T2169] Kernel panic - not syncing: Fatal exception Fixes: b37f78f234bf ("net: qualcomm: rmnet: Fix crash on real dev unregistration") Signed-off-by: Taehee Yoo --- .../ethernet/qualcomm/rmnet/rmnet_config.c | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index bdb88472a0a0..5b642123c178 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -61,9 +61,6 @@ static int rmnet_unregister_real_device(struct net_device *real_dev, kfree(port); - /* release reference on real_dev */ - dev_put(real_dev); - netdev_dbg(real_dev, "Removed from rmnet\n"); return 0; } @@ -89,9 +86,6 @@ static int rmnet_register_real_device(struct net_device *real_dev) return -EBUSY; } - /* hold on to real dev for MAP data */ - dev_hold(real_dev); - for (entry = 0; entry < RMNET_MAX_LOGICAL_EP; entry++) INIT_HLIST_HEAD(&port->muxed_ep[entry]); @@ -161,6 +155,10 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, if (err) goto err1; + err = netdev_upper_dev_link(real_dev, dev, extack); + if (err < 0) + goto err2; + port->rmnet_mode = mode; hlist_add_head_rcu(&ep->hlnode, &port->muxed_ep[mux_id]); @@ -177,6 +175,8 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, return 0; +err2: + unregister_netdevice(dev); err1: rmnet_unregister_real_device(real_dev, port); err0: @@ -208,33 +208,30 @@ static void rmnet_dellink(struct net_device *dev, struct list_head *head) rmnet_vnd_dellink(mux_id, port, ep); kfree(ep); } + netdev_upper_dev_unlink(real_dev, dev); rmnet_unregister_real_device(real_dev, port); unregister_netdevice_queue(dev, head); } -static void rmnet_force_unassociate_device(struct net_device *dev) +static void rmnet_force_unassociate_device(struct net_device *real_dev) { - struct net_device *real_dev = dev; struct hlist_node *tmp_ep; struct rmnet_endpoint *ep; struct rmnet_port *port; unsigned long bkt_ep; LIST_HEAD(list); - if (!rmnet_is_real_dev_registered(real_dev)) - return; - ASSERT_RTNL(); - port = rmnet_get_port_rtnl(dev); + port = rmnet_get_port_rtnl(real_dev); - rmnet_unregister_bridge(dev, port); + rmnet_unregister_bridge(real_dev, port); hash_for_each_safe(port->muxed_ep, bkt_ep, tmp_ep, ep, hlnode) { + netdev_upper_dev_unlink(real_dev, ep->egress_dev); unregister_netdevice_queue(ep->egress_dev, &list); rmnet_vnd_dellink(ep->mux_id, port, ep); - hlist_del_init_rcu(&ep->hlnode); kfree(ep); } @@ -247,15 +244,15 @@ static void rmnet_force_unassociate_device(struct net_device *dev) static int rmnet_config_notify_cb(struct notifier_block *nb, unsigned long event, void *data) { - struct net_device *dev = netdev_notifier_info_to_dev(data); + struct net_device *real_dev = netdev_notifier_info_to_dev(data); - if (!dev) + if (!rmnet_is_real_dev_registered(real_dev)) return NOTIFY_DONE; switch (event) { case NETDEV_UNREGISTER: - netdev_dbg(dev, "Kernel unregister\n"); - rmnet_force_unassociate_device(dev); + netdev_dbg(real_dev, "Kernel unregister\n"); + rmnet_force_unassociate_device(real_dev); break; default: @@ -485,8 +482,8 @@ static int __init rmnet_init(void) static void __exit rmnet_exit(void) { - unregister_netdevice_notifier(&rmnet_dev_notifier); rtnl_link_unregister(&rmnet_link_ops); + unregister_netdevice_notifier(&rmnet_dev_notifier); } module_init(rmnet_init) From patchwork Wed Feb 26 17:49:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245250 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=ePV01Ori; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNbW3dn8z9sNg for ; Thu, 27 Feb 2020 04:49:27 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727075AbgBZRt0 (ORCPT ); Wed, 26 Feb 2020 12:49:26 -0500 Received: from mail-pj1-f67.google.com ([209.85.216.67]:54733 "EHLO mail-pj1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726787AbgBZRtZ (ORCPT ); Wed, 26 Feb 2020 12:49:25 -0500 Received: by mail-pj1-f67.google.com with SMTP id dw13so1534431pjb.4 for ; Wed, 26 Feb 2020 09:49:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=VwMJgocV6YhDaeelLV9IerRRmlVu5ZN5e465ESHUgJQ=; b=ePV01Ori7pZ9C+x/X7xgPaBraEjFr6MbMxBIdJ72cvzh9Q6rIVrA3JVPU3NjFcUhfp sAeIfSirfbIP75EFNXETutKiwg0KN3oYQBX5dBmX2ZeRamj6DwJbnat5sX5wTYdQFFUG t6syj1WUAB80UW5XfPuJAnwMhUTx7fcikuv55OsIU9fh6lgdD6lHsKuy90WjutOh/0sM KJlEHJ5mS/Vv/WFpRJw25018dlTv9XYuRzwPpZFJc6soH5BNprivxkNZ4UAkeWDl5CZD aqDWXhALMtvKIx5fjRVao+QeGXLqv89ebgerE64mX3yBDvFauQSEjDXErJTT4bGlOrap //Pg== 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=VwMJgocV6YhDaeelLV9IerRRmlVu5ZN5e465ESHUgJQ=; b=J7sFfeORXMsWPzplfzUFDDt3Rbaj99Z6DeJpbVU90vtSDbR96UvLcJL26umfBGHKuI 0+5Q2kvfWSycHlKtKmkFVuXHFhoAvnblGFQFmoArABvGbQEIYIe3wC2akSzBTWO5B/J4 a/hUe1pnO8LXdLZRtzS0wwPSnWvllnaVvETLHgHunveCXP7Sd3sGrEhHzm9gvLvea06e 9jsEf0IBpL+YmeTLXaS+DUpNp+faj8XQkK7d1BnwJv/q+z6vuSIMeYUV+TGlE/8NHeq7 QtHtqsZer4L4eqd+KL5OGhu20Q2JBw/fQYwMm6m7CY1vksa9eqGXQnkXBmyJ8a9lc+hL yfIQ== X-Gm-Message-State: APjAAAVfee2PwsapnQTmWv0sqzHnNWN9155HbLq7nIqLKbBywRtkihDa 4Rw/t1vErBpgRUN9/otsxyE= X-Google-Smtp-Source: APXvYqwFsj5WGlYfQPOeQPKCyTPsyEh18IyThS3VqbIz1r5xMS4t+bnaXobp5uXnQK6wmObK723tJQ== X-Received: by 2002:a17:90a:f0d1:: with SMTP id fa17mr253809pjb.90.1582739364354; Wed, 26 Feb 2020 09:49:24 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id l12sm3436140pgj.16.2020.02.26.09.49.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:49:23 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 09/10] net: rmnet: fix bridge mode bugs Date: Wed, 26 Feb 2020 17:49:14 +0000 Message-Id: <20200226174914.6382-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In order to attach a bridge interface to the rmnet interface, "master" operation is used. (e.g. ip link set dummy1 master rmnet0) But, in the rmnet_add_bridge(), which is a callback of ->ndo_add_slave() doesn't register lower interface. So, ->ndo_del_slave() doesn't work. There are other problems too. 1. It couldn't detect circular upper/lower interface relationship. 2. It couldn't prevent stack overflow because of too deep depth of upper/lower interface 3. It doesn't check the number of lower interfaces. 4. Panics because of several reasons. The root problem of these issues is actually the same. So, in this patch, these all problems will be fixed. Test commands: ip link add dummy0 type dummy modprobe rmnet ip link add rmnet0 link dummy0 type rmnet mux_id 1 ip link add dummy1 master rmnet0 type dummy ip link add dummy2 master rmnet0 type dummy ip link del rmnet0 ip link del dummy2 ip link del dummy1 Splat looks like: [ 138.464412][ T1237] general protection fault, probably for non-canonical address 0xdffffc0000000101I [ 138.475658][ T1237] KASAN: null-ptr-deref in range [0x0000000000000808-0x000000000000080f] [ 138.477242][ T1237] CPU: 1 PID: 1237 Comm: ip Not tainted 5.6.0-rc1+ #447 [ 138.478428][ T1237] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 138.479899][ T1237] RIP: 0010:rmnet_unregister_bridge.isra.6+0x71/0xf0 [rmnet] [ 138.483673][ T1237] Code: 48 89 ef 48 89 c6 5b 5d e9 fc fe ff ff e8 f7 f3 ff ff 48 8d b8 08 08 00 00 48 ba 00 7 [ 138.511468][ T1237] RSP: 0018:ffff8880ca39f188 EFLAGS: 00010202 [ 138.512088][ T1237] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000101 [ 138.512803][ T1237] RDX: dffffc0000000000 RSI: ffffffff89cf64f0 RDI: 0000000000000808 [ 138.513542][ T1237] RBP: ffff8880c9f01000 R08: ffffed101b440e3c R09: 0000000000000001 [ 138.514332][ T1237] R10: 0000000000000001 R11: ffffed101b440e3b R12: 1ffff11019473e3c [ 138.515129][ T1237] R13: ffff8880ca39f200 R14: ffffffff89d56160 R15: ffff8880b7c7c000 [ 138.515900][ T1237] FS: 00007fe19afb30c0(0000) GS:ffff8880da000000(0000) knlGS:0000000000000000 [ 138.516711][ T1237] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 138.517309][ T1237] CR2: 0000563cebbb9928 CR3: 00000000d3756004 CR4: 00000000000606e0 [ 138.518093][ T1237] Call Trace: [ 138.518426][ T1237] ? rcu_is_watching+0x2c/0x80 [ 138.518860][ T1237] rmnet_config_notify_cb+0x1f7/0x590 [rmnet] [ 138.519412][ T1237] ? rmnet_unregister_bridge.isra.6+0xf0/0xf0 [rmnet] [ 138.523502][ T1237] ? rmnet_unregister_bridge.isra.6+0xf0/0xf0 [rmnet] [ 138.524180][ T1237] ? __module_text_address+0x13/0x140 [ 138.524710][ T1237] notifier_call_chain+0x90/0x160 [ 138.525211][ T1237] rollback_registered_many+0x660/0xcf0 [ 138.525780][ T1237] ? netif_set_real_num_tx_queues+0x780/0x780 [ 138.526394][ T1237] ? __lock_acquire+0xdfe/0x3de0 [ 138.526892][ T1237] ? memset+0x1f/0x40 [ 138.527294][ T1237] ? __nla_validate_parse+0x98/0x1ab0 [ 138.527831][ T1237] unregister_netdevice_many.part.133+0x13/0x1b0 [ 138.528464][ T1237] rtnl_delete_link+0xbc/0x100 [ 138.528929][ T1237] ? rtnl_af_register+0xc0/0xc0 [ 138.529372][ T1237] rtnl_dellink+0x2dc/0x840 [ ... ] Fixes: 60d58f971c10 ("net: qualcomm: rmnet: Implement bridge mode") Signed-off-by: Taehee Yoo --- .../ethernet/qualcomm/rmnet/rmnet_config.c | 128 ++++++++---------- .../ethernet/qualcomm/rmnet/rmnet_config.h | 1 + .../net/ethernet/qualcomm/rmnet/rmnet_vnd.c | 8 -- .../net/ethernet/qualcomm/rmnet/rmnet_vnd.h | 1 - 4 files changed, 61 insertions(+), 77 deletions(-) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index 5b642123c178..6dc332818e15 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -13,25 +13,6 @@ #include "rmnet_vnd.h" #include "rmnet_private.h" -/* Locking scheme - - * The shared resource which needs to be protected is realdev->rx_handler_data. - * For the writer path, this is using rtnl_lock(). The writer paths are - * rmnet_newlink(), rmnet_dellink() and rmnet_force_unassociate_device(). These - * paths are already called with rtnl_lock() acquired in. There is also an - * ASSERT_RTNL() to ensure that we are calling with rtnl acquired. For - * dereference here, we will need to use rtnl_dereference(). Dev list writing - * needs to happen with rtnl_lock() acquired for netdev_master_upper_dev_link(). - * For the reader path, the real_dev->rx_handler_data is called in the TX / RX - * path. We only need rcu_read_lock() for these scenarios. In these cases, - * the rcu_read_lock() is held in __dev_queue_xmit() and - * netif_receive_skb_internal(), so readers need to use rcu_dereference_rtnl() - * to get the relevant information. For dev list reading, we again acquire - * rcu_read_lock() in rmnet_dellink() for netdev_master_upper_dev_get_rcu(). - * We also use unregister_netdevice_many() to free all rmnet devices in - * rmnet_force_unassociate_device() so we dont lose the rtnl_lock() and free in - * same context. - */ - /* Local Definitions and Declarations */ static const struct nla_policy rmnet_policy[IFLA_RMNET_MAX + 1] = { @@ -51,9 +32,10 @@ rmnet_get_port_rtnl(const struct net_device *real_dev) return rtnl_dereference(real_dev->rx_handler_data); } -static int rmnet_unregister_real_device(struct net_device *real_dev, - struct rmnet_port *port) +static int rmnet_unregister_real_device(struct net_device *real_dev) { + struct rmnet_port *port = rmnet_get_port_rtnl(real_dev); + if (port->nr_rmnet_devs) return -EINVAL; @@ -93,28 +75,33 @@ static int rmnet_register_real_device(struct net_device *real_dev) return 0; } -static void rmnet_unregister_bridge(struct net_device *dev, - struct rmnet_port *port) +static void rmnet_unregister_bridge(struct rmnet_port *port) { - struct rmnet_port *bridge_port; - struct net_device *bridge_dev; + struct net_device *bridge_dev, *real_dev, *rmnet_dev; + struct rmnet_port *real_port; if (port->rmnet_mode != RMNET_EPMODE_BRIDGE) return; - /* bridge slave handling */ + rmnet_dev = port->rmnet_dev; if (!port->nr_rmnet_devs) { - bridge_dev = port->bridge_ep; + /* bridge device */ + real_dev = port->bridge_ep; + bridge_dev = port->dev; - bridge_port = rmnet_get_port_rtnl(bridge_dev); - bridge_port->bridge_ep = NULL; - bridge_port->rmnet_mode = RMNET_EPMODE_VND; + real_port = rmnet_get_port_rtnl(real_dev); + real_port->bridge_ep = NULL; + real_port->rmnet_mode = RMNET_EPMODE_VND; } else { + /* real device */ bridge_dev = port->bridge_ep; - bridge_port = rmnet_get_port_rtnl(bridge_dev); - rmnet_unregister_real_device(bridge_dev, bridge_port); + port->bridge_ep = NULL; + port->rmnet_mode = RMNET_EPMODE_VND; } + + netdev_upper_dev_unlink(bridge_dev, rmnet_dev); + rmnet_unregister_real_device(bridge_dev); } static int rmnet_newlink(struct net *src_net, struct net_device *dev, @@ -160,6 +147,7 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, goto err2; port->rmnet_mode = mode; + port->rmnet_dev = dev; hlist_add_head_rcu(&ep->hlnode, &port->muxed_ep[mux_id]); @@ -177,8 +165,9 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, err2: unregister_netdevice(dev); + rmnet_vnd_dellink(mux_id, port, ep); err1: - rmnet_unregister_real_device(real_dev, port); + rmnet_unregister_real_device(real_dev); err0: kfree(ep); return err; @@ -187,30 +176,32 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev, static void rmnet_dellink(struct net_device *dev, struct list_head *head) { struct rmnet_priv *priv = netdev_priv(dev); - struct net_device *real_dev; + struct net_device *real_dev, *bridge_dev; + struct rmnet_port *real_port, *bridge_port; struct rmnet_endpoint *ep; - struct rmnet_port *port; - u8 mux_id; + u8 mux_id = priv->mux_id; real_dev = priv->real_dev; - if (!real_dev || !rmnet_is_real_dev_registered(real_dev)) + if (!rmnet_is_real_dev_registered(real_dev)) return; - port = rmnet_get_port_rtnl(real_dev); - - mux_id = rmnet_vnd_get_mux(dev); + real_port = rmnet_get_port_rtnl(real_dev); + bridge_dev = real_port->bridge_ep; + if (bridge_dev) { + bridge_port = rmnet_get_port_rtnl(bridge_dev); + rmnet_unregister_bridge(bridge_port); + } - ep = rmnet_get_endpoint(port, mux_id); + ep = rmnet_get_endpoint(real_port, mux_id); if (ep) { hlist_del_init_rcu(&ep->hlnode); - rmnet_unregister_bridge(dev, port); - rmnet_vnd_dellink(mux_id, port, ep); + rmnet_vnd_dellink(mux_id, real_port, ep); kfree(ep); } - netdev_upper_dev_unlink(real_dev, dev); - rmnet_unregister_real_device(real_dev, port); + netdev_upper_dev_unlink(real_dev, dev); + rmnet_unregister_real_device(real_dev); unregister_netdevice_queue(dev, head); } @@ -222,23 +213,23 @@ static void rmnet_force_unassociate_device(struct net_device *real_dev) unsigned long bkt_ep; LIST_HEAD(list); - ASSERT_RTNL(); - port = rmnet_get_port_rtnl(real_dev); - rmnet_unregister_bridge(real_dev, port); - - hash_for_each_safe(port->muxed_ep, bkt_ep, tmp_ep, ep, hlnode) { - netdev_upper_dev_unlink(real_dev, ep->egress_dev); - unregister_netdevice_queue(ep->egress_dev, &list); - rmnet_vnd_dellink(ep->mux_id, port, ep); - hlist_del_init_rcu(&ep->hlnode); - kfree(ep); + if (port->nr_rmnet_devs) { + /* real device */ + rmnet_unregister_bridge(port); + hash_for_each_safe(port->muxed_ep, bkt_ep, tmp_ep, ep, hlnode) { + unregister_netdevice_queue(ep->egress_dev, &list); + netdev_upper_dev_unlink(real_dev, ep->egress_dev); + rmnet_vnd_dellink(ep->mux_id, port, ep); + hlist_del_init_rcu(&ep->hlnode); + kfree(ep); + } + rmnet_unregister_real_device(real_dev); + unregister_netdevice_many(&list); + } else { + rmnet_unregister_bridge(port); } - - unregister_netdevice_many(&list); - - rmnet_unregister_real_device(real_dev, port); } static int rmnet_config_notify_cb(struct notifier_block *nb, @@ -433,9 +424,17 @@ int rmnet_add_bridge(struct net_device *rmnet_dev, if (err) return -EBUSY; + err = netdev_master_upper_dev_link(slave_dev, rmnet_dev, NULL, NULL, + extack); + if (err) { + rmnet_unregister_real_device(slave_dev); + return err; + } + slave_port = rmnet_get_port_rtnl(slave_dev); slave_port->rmnet_mode = RMNET_EPMODE_BRIDGE; slave_port->bridge_ep = real_dev; + slave_port->rmnet_dev = rmnet_dev; port->rmnet_mode = RMNET_EPMODE_BRIDGE; port->bridge_ep = slave_dev; @@ -447,16 +446,9 @@ int rmnet_add_bridge(struct net_device *rmnet_dev, int rmnet_del_bridge(struct net_device *rmnet_dev, struct net_device *slave_dev) { - struct rmnet_priv *priv = netdev_priv(rmnet_dev); - struct net_device *real_dev = priv->real_dev; - struct rmnet_port *port, *slave_port; - - port = rmnet_get_port_rtnl(real_dev); - port->rmnet_mode = RMNET_EPMODE_VND; - port->bridge_ep = NULL; + struct rmnet_port *port = rmnet_get_port_rtnl(slave_dev); - slave_port = rmnet_get_port_rtnl(slave_dev); - rmnet_unregister_real_device(slave_dev, slave_port); + rmnet_unregister_bridge(port); netdev_dbg(slave_dev, "removed from rmnet as slave\n"); return 0; diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h index 0d568dcfd65a..be515982d628 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h @@ -28,6 +28,7 @@ struct rmnet_port { u8 rmnet_mode; struct hlist_head muxed_ep[RMNET_MAX_LOGICAL_EP]; struct net_device *bridge_ep; + struct net_device *rmnet_dev; }; extern struct rtnl_link_ops rmnet_link_ops; diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c index 90c19033ebe0..6ef007f69237 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c @@ -268,14 +268,6 @@ int rmnet_vnd_dellink(u8 id, struct rmnet_port *port, return 0; } -u8 rmnet_vnd_get_mux(struct net_device *rmnet_dev) -{ - struct rmnet_priv *priv; - - priv = netdev_priv(rmnet_dev); - return priv->mux_id; -} - int rmnet_vnd_do_flow_control(struct net_device *rmnet_dev, int enable) { netdev_dbg(rmnet_dev, "Setting VND TX queue state to %d\n", enable); diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h index d8fa76e8e9c4..4967f3461ed1 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.h @@ -17,6 +17,5 @@ int rmnet_vnd_dellink(u8 id, struct rmnet_port *port, struct rmnet_endpoint *ep); void rmnet_vnd_rx_fixup(struct sk_buff *skb, struct net_device *dev); void rmnet_vnd_tx_fixup(struct sk_buff *skb, struct net_device *dev); -u8 rmnet_vnd_get_mux(struct net_device *rmnet_dev); void rmnet_vnd_setup(struct net_device *dev); #endif /* _RMNET_VND_H_ */ From patchwork Wed Feb 26 17:49:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1245251 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=ZN0LZqaK; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 48SNbs2vkdz9sNg for ; Thu, 27 Feb 2020 04:49:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726994AbgBZRto (ORCPT ); Wed, 26 Feb 2020 12:49:44 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:35078 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726787AbgBZRto (ORCPT ); Wed, 26 Feb 2020 12:49:44 -0500 Received: by mail-pf1-f196.google.com with SMTP id i19so152616pfa.2 for ; Wed, 26 Feb 2020 09:49:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=zDbWiU49eM/NMB7xh13OJddo8OiK/Zcqry1cGnudfGw=; b=ZN0LZqaKDeWyenyt29/NTVUoJkVJ5p6pLfbWWsiXIw1tXfTNyeBlNG7kT8OJgICsCD Uj2Yk58IFr7RZM1p342Jf9aE1t/jfKyJ2G3oMCWiKmtf9A44VMatfWlbh5cPuCGwe+t8 uJVC7NNUblhMGkwD89gxQIJCx+x5hEI+LjP8CM5r0VlZNAph8JRPbYKc7PkkbaIW7956 V1obM9z7XrO6pCbKD2nJr+Y/lzF9AAFR5QYRlnPnKCBOvCfJLWQY0xB8ygskhekkZ148 HhudDdedPHyVgXkbDjeZOIPl5rsHYuihc8qyvxh185v/s3KoYlgll0X65UdDsw6jr59d SAOQ== 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=zDbWiU49eM/NMB7xh13OJddo8OiK/Zcqry1cGnudfGw=; b=kMX2pL/ZJRSTRPXohxUwF+yb63RQO7JERhlqSR1XFwkyUEQVlrerzvVKkRVSMLNX5v ZbC61Y88xjGGdaCf4GVQde/YfXf43g5wDpLd6NsC9/cEhQQsxRaPDSasC8pjGaSCA9xd IoWyyBQyL2uYCPuN3gsYYW9Qj7dvp/bKK+xcJ7rFxw/yZW78YZCJpbpeuFddDkva/5nu DBHiVgFslYboAp6HXwcowsmtyDG5uD3XXDaKGZm8VeaQTMQEcE4Kkb8iGN3UWeZ4cCBx ssE27AroCDjeXw/gvQWMQWizpRGMpIN7t8YuegCquQygKzDl3GdfN5vInmF0fSLMuxoJ sa2w== X-Gm-Message-State: APjAAAUeTDgFFSjz6HCINAM+GPdxRtagUaEaRcDwsgSFVDk6+Zai2SG3 sxCu2rffJ2n6RbkY0Kkel2g= X-Google-Smtp-Source: APXvYqzSLyHymTxwK2yWWolPGcTMsFojp2hYkT9+cP1rIH0s+a6KTakoD4/+XsKuEACnPS4BR9D7IA== X-Received: by 2002:a63:3587:: with SMTP id c129mr39745pga.140.1582739383046; Wed, 26 Feb 2020 09:49:43 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id t8sm3343354pjy.20.2020.02.26.09.49.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Feb 2020 09:49:41 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, subashab@codeaurora.org, stranche@codeaurora.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net 10/10] net: rmnet: fix packet forwarding in rmnet bridge mode Date: Wed, 26 Feb 2020 17:49:36 +0000 Message-Id: <20200226174936.6541-1-ap420073@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Packet forwarding is not working in rmnet bridge mode. Because when a packet is forwarded, skb_push() for an ethernet header is needed. But it doesn't call skb_push(). So, the ethernet header will be lost. Test commands: ip netns add nst ip netns add nst2 ip link add veth0 type veth peer name veth1 ip link add veth2 type veth peer name veth3 ip link set veth1 netns nst ip link set veth3 netns nst2 ip link add rmnet0 link veth0 type rmnet mux_id 1 ip link set veth2 master rmnet0 ip link set veth0 up ip link set veth2 up ip link set rmnet0 up ip a a 192.168.100.1/24 dev rmnet0 ip netns exec nst ip link set veth1 up ip netns exec nst ip a a 192.168.100.2/24 dev veth1 ip netns exec nst2 ip link set veth3 up ip netns exec nst2 ip a a 192.168.100.3/24 dev veth3 ip netns exec nst2 ping 192.168.100.2 Fixes: 60d58f971c10 ("net: qualcomm: rmnet: Implement bridge mode") Signed-off-by: Taehee Yoo --- drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c index 074a8b326c30..29a7bfa2584d 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c @@ -159,6 +159,9 @@ static int rmnet_map_egress_handler(struct sk_buff *skb, static void rmnet_bridge_handler(struct sk_buff *skb, struct net_device *bridge_dev) { + if (skb_mac_header_was_set(skb)) + skb_push(skb, skb->mac_len); + if (bridge_dev) { skb->dev = bridge_dev; dev_queue_xmit(skb);