From patchwork Mon Jan 27 14:29:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1229870 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=EZNmiVhg; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 485sbL59Jcz9sQp for ; Tue, 28 Jan 2020 01:30:06 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729122AbgA0OaF (ORCPT ); Mon, 27 Jan 2020 09:30:05 -0500 Received: from mail-pj1-f66.google.com ([209.85.216.66]:38321 "EHLO mail-pj1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725828AbgA0OaF (ORCPT ); Mon, 27 Jan 2020 09:30:05 -0500 Received: by mail-pj1-f66.google.com with SMTP id m4so3179678pjv.3 for ; Mon, 27 Jan 2020 06:30:05 -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=0enkGfSAgOHPXl4Cl6zsJTgJX8JHEVRJdjc5PBhqh5Y=; b=EZNmiVhgn1RJxt+fjGuuPlGLDCFW4L0qcg2KYPQjiT/QS7NvkLFYPdGZrdE6K4CeJc +OSj99hnsWjy30re2qry/hrGfdXy3/zGaLwskHzIUc0K4TO1Y4QVzsWlid6zYk1sWLgf l+K8iF+RCy0KzTBbwNrYrnVNsGPnIgR6RONLlq+2WfjeD+cY/20W+a2F/YqDdnHwopLq D/H1vwvA73dL8bcvCdxsIKpFxBlyzVJkLBfupbmA8sIBesAmGpvjziOivSsxOCW5UjGE ahE4RiUfdrAETZAKnygAAqn4K7jTOI/18ThSfH064lukDnIOqRVcGWaZWRG2AlP1+Lmz 9iyA== 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=0enkGfSAgOHPXl4Cl6zsJTgJX8JHEVRJdjc5PBhqh5Y=; b=l1927fO86KmXVGK3U636Nr49enLV0USDoO95kToGNmqJq3//18nL7EVli4mcQLJxAY czE7R1rqzumJatqcVR+KFEGgoreWEicfu2LF3ZFbA7QRald3hear6hXL+Uh6YR1IHv+G 7N6rOWDw+QgvJWfpGywcN/ThrjV7Ih3R3bjZHzXu4tz1LRXsZjskys/Z8y+fyX/G8LON y/frBWs+knjn2c9SscTEcY/14FvO6O2s8hjZ2znHull5cnUYiI/lXPr+s60Ck6RWLt58 FUaqJYwDTj6ZrBQhu+nCt4KmXyK35q80hs7M5BlDWLsgUHyc5tVn4aF9ir6Ks6caarWD 84zA== X-Gm-Message-State: APjAAAUrij0phqdc03wtAD/kft9ivC4SkzN4d/gN3rLMQxGhU3kENE7i c3Ct7OuQy+2ju7KLPvORoGw= X-Google-Smtp-Source: APXvYqyI/GpDUl74nalLWBl5Rafa0l7S7XWPn/V8oD3ywgHt8pz1R9wEVxJLBY3n0dQ/wAP4AEJ+8w== X-Received: by 2002:a17:902:8c8b:: with SMTP id t11mr16693073plo.319.1580135404565; Mon, 27 Jan 2020 06:30:04 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id 70sm17095167pgf.90.2020.01.27.06.30.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jan 2020 06:30:03 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net v2 1/6] netdevsim: fix race conditions in netdevsim operations Date: Mon, 27 Jan 2020 14:29:57 +0000 Message-Id: <20200127142957.1177-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 This patch fixes a several locking problem. 1. netdevsim basic operations(new_device, del_device, new_port, and del_port) are called with sysfs. These operations use the same resource so they should acquire a lock for the whole resource not only for a list. 2. devices are managed by nsim_bus_dev_list. and all devices are deleted in the __exit() routine. After delete routine, new_device() and del_device() should be disallowed. So, the global flag variable 'enable' is added. 3. new_port() and del_port() would be called before resources are allocated or initialized. If so, panic will occur. In order to avoid this scenario, variable 'nsim_bus_dev->init' is added. Test commands: #SHELL1 modprobe netdevsim while : do echo "1 1" > /sys/bus/netdevsim/new_device echo "1 1" > /sys/bus/netdevsim/del_device done #SHELL2 while : do echo 1 > /sys/devices/netdevsim1/new_port echo 1 > /sys/devices/netdevsim1/del_port done Splat looks like: [ 66.648015][ T1095] kasan: CONFIG_KASAN_INLINE enabled [ 66.660685][ T1095] kasan: GPF could be caused by NULL-ptr deref or user memory access [ 66.662106][ T1095] general protection fault: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN PTI [ 66.663151][ T1095] CPU: 0 PID: 1095 Comm: bash Not tainted 5.5.0-rc6+ #318 [ 66.664046][ T1095] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 66.665308][ T1095] RIP: 0010:__mutex_lock+0x10a/0x14b0 [ 66.666056][ T1095] Code: 08 84 d2 0f 85 7f 12 00 00 44 8b 0d 70 c4 66 02 45 85 c9 75 29 49 8d 7f 68 48 b8 00 f [ 66.670158][ T1095] RSP: 0018:ffff8880d36efbb0 EFLAGS: 00010206 [ 66.672254][ T1095] RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 0000000000000000 [ 66.673392][ T1095] RDX: 0000000000000021 RSI: ffffffffbb922ac0 RDI: 0000000000000108 [ 66.674563][ T1095] RBP: ffff8880d36efd30 R08: ffffffffc033ead0 R09: 0000000000000000 [ 66.675731][ T1095] R10: ffff8880d36efd50 R11: ffff8880ca1f8040 R12: 0000000000000000 [ 66.676897][ T1095] R13: dffffc0000000000 R14: ffffffffbd17a7c0 R15: 00000000000000a0 [ 66.678005][ T1095] FS: 00007fe4a170f740(0000) GS:ffff8880d9c00000(0000) knlGS:0000000000000000 [ 66.679101][ T1095] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 66.679906][ T1095] CR2: 000055fa392f7ca0 CR3: 00000000b136a003 CR4: 00000000000606f0 [ 66.681467][ T1095] Call Trace: [ 66.681899][ T1095] ? nsim_dev_port_add+0x50/0x150 [netdevsim] [ 66.682681][ T1095] ? mutex_lock_io_nested+0x1380/0x1380 [ 66.683371][ T1095] ? _kstrtoull+0x76/0x160 [ 66.683819][ T1095] ? _parse_integer+0xf0/0xf0 [ 66.684324][ T1095] ? kernfs_fop_write+0x1cf/0x410 [ 66.684861][ T1095] ? sysfs_file_ops+0x160/0x160 [ 66.687441][ T1095] ? kstrtouint+0x86/0x110 [ 66.687961][ T1095] ? nsim_dev_port_add+0x50/0x150 [netdevsim] [ 66.688646][ T1095] nsim_dev_port_add+0x50/0x150 [netdevsim] [ 66.689269][ T1095] ? sysfs_file_ops+0x160/0x160 [ 66.690547][ T1095] new_port_store+0x99/0xb0 [netdevsim] [ 66.691114][ T1095] ? del_port_store+0xb0/0xb0 [netdevsim] [ 66.691699][ T1095] ? sysfs_file_ops+0x112/0x160 [ 66.692193][ T1095] ? sysfs_kf_write+0x3b/0x180 [ 66.692677][ T1095] kernfs_fop_write+0x276/0x410 [ 66.693176][ T1095] ? __sb_start_write+0x215/0x2e0 [ 66.693695][ T1095] vfs_write+0x197/0x4a0 [ 66.694136][ T1095] ksys_write+0x141/0x1d0 [ ... ] Fixes: f9d9db47d3ba ("netdevsim: add bus attributes to add new and delete devices") Fixes: 794b2c05ca1c ("netdevsim: extend device attrs to support port addition and deletion") Signed-off-by: Taehee Yoo --- v1 -> v2 - Do not use trylock - Do not include code, which fixes devlink reload problem - Update Fixes tags - Update comments drivers/net/netdevsim/bus.c | 35 ++++++++++++++++++++++++------- drivers/net/netdevsim/netdevsim.h | 1 + 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/drivers/net/netdevsim/bus.c b/drivers/net/netdevsim/bus.c index 6aeed0c600f8..a3205fd73c8f 100644 --- a/drivers/net/netdevsim/bus.c +++ b/drivers/net/netdevsim/bus.c @@ -16,7 +16,8 @@ static DEFINE_IDA(nsim_bus_dev_ids); static LIST_HEAD(nsim_bus_dev_list); -static DEFINE_MUTEX(nsim_bus_dev_list_lock); +static DEFINE_MUTEX(nsim_bus_dev_ops_lock); +static bool enable; static struct nsim_bus_dev *to_nsim_bus_dev(struct device *dev) { @@ -99,6 +100,8 @@ new_port_store(struct device *dev, struct device_attribute *attr, unsigned int port_index; int ret; + if (!nsim_bus_dev->init) + return -EBUSY; ret = kstrtouint(buf, 0, &port_index); if (ret) return ret; @@ -116,6 +119,8 @@ del_port_store(struct device *dev, struct device_attribute *attr, unsigned int port_index; int ret; + if (!nsim_bus_dev->init) + return -EBUSY; ret = kstrtouint(buf, 0, &port_index); if (ret) return ret; @@ -179,13 +184,21 @@ new_device_store(struct bus_type *bus, const char *buf, size_t count) pr_err("Format for adding new device is \"id port_count\" (uint uint).\n"); return -EINVAL; } + mutex_lock(&nsim_bus_dev_ops_lock); + if (!enable) { + mutex_unlock(&nsim_bus_dev_ops_lock); + return -EBUSY; + } nsim_bus_dev = nsim_bus_dev_new(id, port_count); - if (IS_ERR(nsim_bus_dev)) + if (IS_ERR(nsim_bus_dev)) { + mutex_unlock(&nsim_bus_dev_ops_lock); return PTR_ERR(nsim_bus_dev); + } + + nsim_bus_dev->init = true; - mutex_lock(&nsim_bus_dev_list_lock); list_add_tail(&nsim_bus_dev->list, &nsim_bus_dev_list); - mutex_unlock(&nsim_bus_dev_list_lock); + mutex_unlock(&nsim_bus_dev_ops_lock); return count; } @@ -214,7 +227,11 @@ del_device_store(struct bus_type *bus, const char *buf, size_t count) } err = -ENOENT; - mutex_lock(&nsim_bus_dev_list_lock); + mutex_lock(&nsim_bus_dev_ops_lock); + if (!enable) { + mutex_unlock(&nsim_bus_dev_ops_lock); + return -EBUSY; + } list_for_each_entry_safe(nsim_bus_dev, tmp, &nsim_bus_dev_list, list) { if (nsim_bus_dev->dev.id != id) continue; @@ -223,7 +240,7 @@ del_device_store(struct bus_type *bus, const char *buf, size_t count) err = 0; break; } - mutex_unlock(&nsim_bus_dev_list_lock); + mutex_unlock(&nsim_bus_dev_ops_lock); return !err ? count : err; } static BUS_ATTR_WO(del_device); @@ -320,6 +337,7 @@ int nsim_bus_init(void) err = driver_register(&nsim_driver); if (err) goto err_bus_unregister; + enable = true; return 0; err_bus_unregister: @@ -331,12 +349,13 @@ void nsim_bus_exit(void) { struct nsim_bus_dev *nsim_bus_dev, *tmp; - mutex_lock(&nsim_bus_dev_list_lock); + mutex_lock(&nsim_bus_dev_ops_lock); + enable = false; list_for_each_entry_safe(nsim_bus_dev, tmp, &nsim_bus_dev_list, list) { list_del(&nsim_bus_dev->list); nsim_bus_dev_del(nsim_bus_dev); } - mutex_unlock(&nsim_bus_dev_list_lock); + mutex_unlock(&nsim_bus_dev_ops_lock); driver_unregister(&nsim_driver); bus_unregister(&nsim_bus); } diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index 94df795ef4d3..ea3931391ce2 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -240,6 +240,7 @@ struct nsim_bus_dev { */ unsigned int num_vfs; struct nsim_vf_config *vfconfigs; + bool init; }; int nsim_bus_init(void); From patchwork Mon Jan 27 14:30:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1229871 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=Xz6VsuYt; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 485sbh2ljKz9sQp for ; Tue, 28 Jan 2020 01:30:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729163AbgA0OaW (ORCPT ); Mon, 27 Jan 2020 09:30:22 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:33258 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725828AbgA0OaW (ORCPT ); Mon, 27 Jan 2020 09:30:22 -0500 Received: by mail-pg1-f194.google.com with SMTP id 6so5250481pgk.0 for ; Mon, 27 Jan 2020 06:30:22 -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=pLB/w3JL8rxvnpeo7RV/rO8TtWLXOwfdyzVcmv+00Q8=; b=Xz6VsuYtAvu1rhlmmyyahVHPIRUDIPpQUEk9pVSBgtMM5z0t9St4I01sYVseux1PwY 2RO3TFuwgRQXRSHVlguORJJ2bfUkaR24VthDN7+7s6UrNaiHCWNZris9VjVfy/80sIi9 ELkguLYyUWUyCxHVLaTknFv5qN/Bnh42iW0Eg8dWE8DdUPyqZ66DzlOk5eEkqg/msRUk zAXjdomCuxmbQIqDBlokdSMRmd3TO/O5qNgM2banpHuenyhz8HqnHMN6qmRNhnkv0lTA xvWQze7GQVVuEySLvwrWZRDoyABaLdDnb3aD4k6j2AIf96CMqcRxAWUAa2BauosZBDFc BGBQ== 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=pLB/w3JL8rxvnpeo7RV/rO8TtWLXOwfdyzVcmv+00Q8=; b=ABChh7A0dGFSRDeChS2Gg38JK6Y4KaKs6rSKzqEr5Z7aedV6aUnSU9QkynI7fAPkbT 8UxqzuiJ+bPxga8nBfIQU45I60KIXsDw4R3qYOZ3i32EGH0Cv8zRtCJziYIr72ffDIED qss4Qr8zqKUKPlyD6MKZe3fmnYe2lMYxPdxzjfKhERj1SeW2zH9WWUapU4uE+ahF6FLD fPIlhcQMBNJewlCewurtIX+W4Yjcts37v7Ysj3LdK9dNSEsY4KI18lvLPaiqWNnS3tHe 35SkIYouLJDTohumv0hG9qZTURhrMwZF2eonWjB9FLRIIxw9RvC+jYRIGAVyNXcyEXjy CgKg== X-Gm-Message-State: APjAAAXzl5j54jk4q3i8dRiHy08UoNbUYGkmD5SLmDAhqNedUBpG/Qgd ijooNSeqvg5srg86VTvdl/yQohDN X-Google-Smtp-Source: APXvYqySC6rP+ZBxnEmATz1GNEsRqSul+6hcGSaa4UFX6Oo+Yo2aiQnATFaL6RUEURKm6SEk8Xjmlg== X-Received: by 2002:a63:b58:: with SMTP id a24mr19711592pgl.351.1580135421778; Mon, 27 Jan 2020 06:30:21 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id m22sm17270584pgn.8.2020.01.27.06.30.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jan 2020 06:30:20 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net v2 2/6] netdevsim: disable devlink reload when resources are being used Date: Mon, 27 Jan 2020 14:30:15 +0000 Message-Id: <20200127143015.1264-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 devlink reload destroys resources and allocates resources again. So, when devices and ports resources are being used, devlink reload function should not be executed. In order to avoid this race, a new lock is added and new_port() and del_port() call devlink_reload_disable() and devlink_reload_enable(). Thread0 Thread1 {new/del}_port() {new/del}_port() devlink_reload_disable() devlink_reload_disable() devlink_reload_enable() //here devlink_reload_enable() Before Thread1's devlink_reload_enable(), the devlink is already allowed to execute reload because Thread0 allows it. devlink reload disable/enable variable type is bool. So the above case would exist. So, disable/enable should be executed atomically. In order to do that, a new lock is used. Test commands: modprobe netdevsim echo 1 > /sys/bus/netdevsim/new_device while : do echo 1 > /sys/devices/netdevsim1/new_port & echo 1 > /sys/devices/netdevsim1/del_port & devlink dev reload netdevsim/netdevsim1 & done Splat looks like: [ 1067.313531][ T1480] kernel BUG at lib/list_debug.c:53! [ 1067.314519][ T1480] invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN PTI [ 1067.315948][ T1480] CPU: 3 PID: 1480 Comm: bash Tainted: G W 5.5.0-rc6+ #318 [ 1067.326082][ T1480] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 1067.356308][ T1480] RIP: 0010:__list_del_entry_valid+0xe6/0x150 [ 1067.357006][ T1480] Code: 89 ea 48 c7 c7 a0 64 1e 9f e8 7f 5b 4d ff 0f 0b 48 c7 c7 00 65 1e 9f e8 71 5b 4d ff 4 [ 1067.395359][ T1480] RSP: 0018:ffff8880a316fb58 EFLAGS: 00010282 [ 1067.396016][ T1480] RAX: 0000000000000054 RBX: ffff8880c0e76718 RCX: 0000000000000000 [ 1067.402370][ T1480] RDX: 0000000000000054 RSI: 0000000000000008 RDI: ffffed101462df61 [ 1067.430844][ T1480] RBP: ffff8880a31bfca0 R08: ffffed101b5404f9 R09: ffffed101b5404f9 [ 1067.432165][ T1480] R10: 0000000000000001 R11: ffffed101b5404f8 R12: ffff8880a316fcb0 [ 1067.433526][ T1480] R13: ffff8880a310d440 R14: ffffffffa117a7c0 R15: ffff8880c0e766c0 [ 1067.435818][ T1480] FS: 00007f001c026740(0000) GS:ffff8880da800000(0000) knlGS:0000000000000000 [ 1067.441677][ T1480] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1067.451305][ T1480] CR2: 00007f001afb7180 CR3: 00000000a3170003 CR4: 00000000000606e0 [ 1067.453416][ T1480] Call Trace: [ 1067.453832][ T1480] mutex_remove_waiter+0x101/0x520 [ 1067.455949][ T1480] __mutex_lock+0xac7/0x14b0 [ 1067.456880][ T1480] ? nsim_dev_port_add+0x50/0x150 [netdevsim] [ 1067.458946][ T1480] ? mutex_lock_io_nested+0x1380/0x1380 [ 1067.460614][ T1480] ? _parse_integer+0xf0/0xf0 [ 1067.472498][ T1480] ? kstrtouint+0x86/0x110 [ 1067.473327][ T1480] ? nsim_dev_port_add+0x50/0x150 [netdevsim] [ 1067.474187][ T1480] nsim_dev_port_add+0x50/0x150 [netdevsim] [ 1067.474980][ T1480] new_port_store+0xc4/0xf0 [netdevsim] [ 1067.475717][ T1480] ? del_port_store+0xf0/0xf0 [netdevsim] [ 1067.476478][ T1480] ? sysfs_kf_write+0x3b/0x180 [ 1067.477106][ T1480] ? sysfs_file_ops+0x160/0x160 [ 1067.477744][ T1480] kernfs_fop_write+0x276/0x410 [ ... ] Fixes: 4418f862d675 ("netdevsim: implement support for devlink region and snapshots") Fixes: 75ba029f3c07 ("netdevsim: implement proper devlink reload") Signed-off-by: Taehee Yoo --- drivers/net/netdevsim/bus.c | 21 ++++++++++++++++++++- drivers/net/netdevsim/dev.c | 14 ++++++++++++++ drivers/net/netdevsim/netdevsim.h | 4 ++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/drivers/net/netdevsim/bus.c b/drivers/net/netdevsim/bus.c index a3205fd73c8f..b1aed37a0574 100644 --- a/drivers/net/netdevsim/bus.c +++ b/drivers/net/netdevsim/bus.c @@ -16,7 +16,7 @@ static DEFINE_IDA(nsim_bus_dev_ids); static LIST_HEAD(nsim_bus_dev_list); -static DEFINE_MUTEX(nsim_bus_dev_ops_lock); +DEFINE_MUTEX(nsim_bus_dev_ops_lock); static bool enable; static struct nsim_bus_dev *to_nsim_bus_dev(struct device *dev) @@ -97,6 +97,8 @@ new_port_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev); + struct nsim_dev *nsim_dev = dev_get_drvdata(dev); + struct devlink *devlink; unsigned int port_index; int ret; @@ -105,7 +107,14 @@ new_port_store(struct device *dev, struct device_attribute *attr, ret = kstrtouint(buf, 0, &port_index); if (ret) return ret; + + devlink = priv_to_devlink(nsim_dev); + + mutex_lock(&nsim_bus_dev->port_ops_lock); + devlink_reload_disable(devlink); ret = nsim_dev_port_add(nsim_bus_dev, port_index); + devlink_reload_enable(devlink); + mutex_unlock(&nsim_bus_dev->port_ops_lock); return ret ? ret : count; } @@ -116,6 +125,8 @@ del_port_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev); + struct nsim_dev *nsim_dev = dev_get_drvdata(dev); + struct devlink *devlink; unsigned int port_index; int ret; @@ -124,7 +135,14 @@ del_port_store(struct device *dev, struct device_attribute *attr, ret = kstrtouint(buf, 0, &port_index); if (ret) return ret; + + devlink = priv_to_devlink(nsim_dev); + + mutex_lock(&nsim_bus_dev->port_ops_lock); + devlink_reload_disable(devlink); ret = nsim_dev_port_del(nsim_bus_dev, port_index); + devlink_reload_enable(devlink); + mutex_unlock(&nsim_bus_dev->port_ops_lock); return ret ? ret : count; } @@ -301,6 +319,7 @@ nsim_bus_dev_new(unsigned int id, unsigned int port_count) nsim_bus_dev->dev.type = &nsim_bus_dev_type; nsim_bus_dev->port_count = port_count; nsim_bus_dev->initial_net = current->nsproxy->net_ns; + mutex_init(&nsim_bus_dev->port_ops_lock); err = device_register(&nsim_bus_dev->dev); if (err) diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index 4b39aba2e9c4..0dfaf999e8db 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -43,6 +43,8 @@ static ssize_t nsim_dev_take_snapshot_write(struct file *file, size_t count, loff_t *ppos) { struct nsim_dev *nsim_dev = file->private_data; + struct nsim_bus_dev *nsim_bus_dev; + struct devlink *devlink; void *dummy_data; int err; u32 id; @@ -51,11 +53,23 @@ static ssize_t nsim_dev_take_snapshot_write(struct file *file, if (!dummy_data) return -ENOMEM; + devlink = priv_to_devlink(nsim_dev); + nsim_bus_dev = nsim_dev->nsim_bus_dev; + get_random_bytes(dummy_data, NSIM_DEV_DUMMY_REGION_SIZE); + mutex_lock(&nsim_bus_dev_ops_lock); + mutex_lock(&nsim_bus_dev->port_ops_lock); + devlink_reload_disable(devlink); + id = devlink_region_snapshot_id_get(priv_to_devlink(nsim_dev)); err = devlink_region_snapshot_create(nsim_dev->dummy_region, dummy_data, id, kfree); + + devlink_reload_enable(devlink); + mutex_unlock(&nsim_bus_dev->port_ops_lock); + mutex_unlock(&nsim_bus_dev_ops_lock); + if (err) { pr_err("Failed to create region snapshot\n"); kfree(dummy_data); diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index ea3931391ce2..a8b6c9e6f79f 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -74,6 +74,8 @@ struct netdevsim { struct nsim_ipsec ipsec; }; +extern struct mutex nsim_bus_dev_ops_lock; + struct netdevsim * nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port); void nsim_destroy(struct netdevsim *ns); @@ -240,6 +242,8 @@ struct nsim_bus_dev { */ unsigned int num_vfs; struct nsim_vf_config *vfconfigs; + /* Lock for new_port() and del_port() to disable devlink reload */ + struct mutex port_ops_lock; bool init; }; From patchwork Mon Jan 27 14:30:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1229872 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=vaaL8N9l; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 485sc348bmz9sQp for ; Tue, 28 Jan 2020 01:30:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729201AbgA0Oam (ORCPT ); Mon, 27 Jan 2020 09:30:42 -0500 Received: from mail-pj1-f67.google.com ([209.85.216.67]:54057 "EHLO mail-pj1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729186AbgA0Oal (ORCPT ); Mon, 27 Jan 2020 09:30:41 -0500 Received: by mail-pj1-f67.google.com with SMTP id n96so3014582pjc.3 for ; Mon, 27 Jan 2020 06:30:41 -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=bdXp12rWWIhABbMqabuTQA3uM8UtAWN7EmJVz8e/1f0=; b=vaaL8N9lg7WG4Skae9qJZyaKgZ4XiBkWsjtEPQjE/qm6dQlIzJrJ7Fehqdoem4VeY/ iepmiImxImxP4ZiKBD+c4+fxUwmZQNQF+1uO+qKxooWHaSdUa8m1JHNWlTPYrLApYf7X gys2U38Qt/e/2LmTL11+zc6UFClzZ8lX51px91Savn2fm6LHB44eAQAWWnpsO2FS2/WR dw0XCy3w0d3HJ46Kj1ynAM1hVUbGi5mCXxbfMkyUEffhNYmI2ieJktzJ8tqPYtLh7BO8 jQjugAiYyPlx0S+zO7OLxBqKPLZagxpw0AGJFa4jTbjKt8nwJX1q6Y9HFOGNnnDG2/gI fWqA== 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=bdXp12rWWIhABbMqabuTQA3uM8UtAWN7EmJVz8e/1f0=; b=SLwbLRQCKcDVSb9z1czSire3taVnOSRl3LmQkCdYe6vr0IdD4+fZrAa8HEeRTzkH7l a0KX8Q9jRmlaFc60pHeT6DoctMQ89uoLu6wWoa6y2LY4djoJS5q7LU9zC5OONSod+S14 7yCi4puLpI/lbLbr7Upn/qXDXfxOPEcAHz5b399C0EGFU/nCmK6C2p9GcvXrUFNqrx9O bG2gpGMslZBZFC7j7c4JAu35rvHMCOTsBR7qkMLCmG5stOKMcMRTefmA3eIUpn6s9a4D scO4135QnE2nn6BPSbI3tc79BH5S5oHP9lhwEdUzWIr3SZ31JxEkWQBl/yocU4cClEE8 3uKw== X-Gm-Message-State: APjAAAXj9xs70dJv3KUgInhjuhFAn0lnvKxg0F2UE0F3AQr2Rt2oyrIk RaULtNESl6AUt3hjNsNVnUDoY/tE X-Google-Smtp-Source: APXvYqypdux3P5f2or0ANpplbR75vSRQOKqliIFXOntdeaxdKhZAHfU3kjW4HIas3lXsYdG+Z2nrzw== X-Received: by 2002:a17:902:d918:: with SMTP id c24mr18174789plz.167.1580135441036; Mon, 27 Jan 2020 06:30:41 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id v25sm2059441pfe.147.2020.01.27.06.30.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jan 2020 06:30:40 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net v2 3/6] netdevsim: fix stack-out-of-bounds in nsim_dev_debugfs_init() Date: Mon, 27 Jan 2020 14:30:34 +0000 Message-Id: <20200127143034.1367-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 netdevsim dev is being created, a debugfs directory is created. The variable "dev_ddir_name" is 16bytes device name pointer and device name is "netdevsim". The maximum dev id length is 10. So, 16bytes for device name isn't enough. Test commands: modprobe netdevsim echo "1000000000 0" > /sys/bus/netdevsim/new_device Splat looks like: [ 362.229174][ T889] BUG: KASAN: stack-out-of-bounds in number+0x824/0x880 [ 362.230221][ T889] Write of size 1 at addr ffff8880c1def988 by task bash/889 [ 362.231541][ T889] [ 362.232116][ T889] CPU: 2 PID: 889 Comm: bash Not tainted 5.5.0-rc6+ #318 [ 362.233233][ T889] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 362.237316][ T889] Call Trace: [ 362.237790][ T889] dump_stack+0x96/0xdb [ 362.238471][ T889] ? number+0x824/0x880 [ 362.239137][ T889] print_address_description.constprop.5+0x1be/0x360 [ 362.240166][ T889] ? number+0x824/0x880 [ 362.240782][ T889] ? number+0x824/0x880 [ 362.254907][ T889] __kasan_report+0x12a/0x16f [ 362.276693][ T889] ? number+0x824/0x880 [ 362.284345][ T889] kasan_report+0xe/0x20 [ 362.291523][ T889] number+0x824/0x880 [ 362.305981][ T889] ? put_dec+0xa0/0xa0 [ 362.306583][ T889] ? rcu_read_lock_sched_held+0x90/0xc0 [ 362.307779][ T889] vsnprintf+0x63c/0x10b0 [ 362.308440][ T889] ? pointer+0x5b0/0x5b0 [ 362.309068][ T889] ? mark_lock+0x11d/0xc40 [ 362.309740][ T889] sprintf+0x9b/0xd0 [ 362.327152][ T889] ? scnprintf+0xe0/0xe0 [ 362.327888][ T889] nsim_dev_probe+0x63c/0xbf0 [netdevsim] [ 362.328882][ T889] ? kernfs_next_descendant_post+0x11d/0x250 [ 362.331521][ T889] ? nsim_dev_reload_up+0x500/0x500 [netdevsim] [ 362.333054][ T889] ? kernfs_add_one+0x2c6/0x410 [ 362.334145][ T889] ? kernfs_get.part.12+0x4c/0x60 [ 362.335181][ T889] ? kernfs_put+0x29/0x4b0 [ 362.335814][ T889] ? kernfs_create_link+0x170/0x230 [ 362.336600][ T889] ? sysfs_do_create_link_sd.isra.2+0x87/0xf0 [ 362.338118][ T889] really_probe+0x4b2/0xb50 [ 362.338789][ T889] ? driver_allows_async_probing+0x110/0x110 [ 362.340055][ T889] driver_probe_device+0x24d/0x370 [ 362.349864][ T889] ? __device_attach_driver+0xae/0x210 [ 362.364057][ T889] ? driver_allows_async_probing+0x110/0x110 [ 362.367598][ T889] bus_for_each_drv+0x10f/0x190 [ 362.371583][ T889] ? bus_rescan_devices+0x20/0x20 [ 362.372524][ T889] ? mutex_lock_io_nested+0x1380/0x1380 [ 362.374546][ T889] __device_attach+0x1b1/0x2d0 [ 362.376621][ T889] ? device_bind_driver+0xa0/0xa0 [ 362.378889][ T889] ? wait_for_completion+0x390/0x390 [ 362.379727][ T889] bus_probe_device+0x1a7/0x250 [ 362.380635][ T889] device_add+0x1101/0x1900 [ 362.381590][ T889] ? memset+0x1f/0x40 [ 362.382409][ T889] ? lockdep_init_map+0x10c/0x630 [ 362.383701][ T889] ? device_link_remove+0x120/0x120 [ 362.386953][ T889] ? lockdep_init_map+0x10c/0x630 [ 362.387656][ T889] ? __init_waitqueue_head+0x3a/0x90 [ 362.388868][ T889] new_device_store+0x277/0x4c0 [netdevsim] [ 362.389822][ T889] ? del_port_store+0x160/0x160 [netdevsim] [ ... ] Fixes: ab1d0cc004d7 ("netdevsim: change debugfs tree topology") Signed-off-by: Taehee Yoo Reviewed-by: Jakub Kicinski --- v1 -> v2: - Update Fixes tag - Do not use arbitary 32 bytes for dev_ddir_name drivers/net/netdevsim/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index 0dfaf999e8db..2c23b232926b 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -87,7 +87,7 @@ static const struct file_operations nsim_dev_take_snapshot_fops = { static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev) { - char dev_ddir_name[16]; + char dev_ddir_name[sizeof(DRV_NAME) + 10]; sprintf(dev_ddir_name, DRV_NAME "%u", nsim_dev->nsim_bus_dev->dev.id); nsim_dev->ddir = debugfs_create_dir(dev_ddir_name, nsim_dev_ddir); From patchwork Mon Jan 27 14:30:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1229873 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=CVkMFCMk; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 485scF15vGz9sQp for ; Tue, 28 Jan 2020 01:30:53 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729211AbgA0Oaw (ORCPT ); Mon, 27 Jan 2020 09:30:52 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:43100 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729066AbgA0Oaw (ORCPT ); Mon, 27 Jan 2020 09:30:52 -0500 Received: by mail-pf1-f195.google.com with SMTP id s1so4388860pfh.10 for ; Mon, 27 Jan 2020 06:30:51 -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=Ou0kDYuq5RJq3J5tI4/vM3gS4N0SdYFivJXJ6M6m160=; b=CVkMFCMkXd3cPSdOIPioKUZtcXDSynz5wFIOECwHV3gM1yvCynkDo/Q2Fm1ttbq6CG 8IPg/uQ1d5+MlHTYQpxi9vvnwbrA+fOyn+C9rT+uVY9APcJFWH+5Bk3SNDklPBdkWFXz uSJWg149YRmdJgHkWdN2BepFdHSwx0ki6L1DkDTqWAkofzNGi4YAyBxIxzKk9Jmo9u5C dOUJWIdyPb6dafyvsqlGDNhanvp0nokEAt9TG1SsM2Nqf0uLt3klusQixh8eFzYwlM2q s51/QEExzfB7iiuj8QwSQ/3dMJDn9nYGlLQgr4S3RnLVjIxKC3fuCtRsfG2oO31Ex1iB zqZA== 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=Ou0kDYuq5RJq3J5tI4/vM3gS4N0SdYFivJXJ6M6m160=; b=EglgvLtmbVr6OhMmYdNpCO7DUkHajTCWhsr/E0lyW22VDnFj0rueaeOY39QhPibCrR 2DguwD4gOGLTGFiRObKPhHY6j/NrX21vsNFBZ7r+bbJSqO635etTwVDhKNiHAdkIq85J 5L0s4zMz03Slnn3/nXS5fLoCNtJlrFIckBeUghMQER6KiWDVoK7ndxb9VUHLQKGz3dbt 2sxz/EKI9JCLaASMjBmjWBzdrh7uSTq8sBIiGtLQrCH23x0wPmrg4VCbeIYUqaRrs8lP OER+jFPHFqiVbpkQoz4LNgAYN6BdByp6bBLnuZSYHhpbvgYEDLH5c7CtwM7Dql5Bj1o2 j1zw== X-Gm-Message-State: APjAAAXYy9BraPKAVDnTrCvAXd6aOMg+GKCDQPtaGYqgtpLzWpuqJk4H GdQfPnZTyRA37P5I2tJP8vw= X-Google-Smtp-Source: APXvYqxcurYBFfp95Ut9cKBAYNJ+z0dgRlE+5ld11S39ngcCkaUzu4WdZyos+lncbGXQh3GgiPYJ8w== X-Received: by 2002:a62:3846:: with SMTP id f67mr1467610pfa.29.1580135451360; Mon, 27 Jan 2020 06:30:51 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id s124sm7483611pfc.57.2020.01.27.06.30.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jan 2020 06:30:50 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net v2 4/6] netdevsim: use IS_ERR instead of IS_ERR_OR_NULL for debugfs Date: Mon, 27 Jan 2020 14:30:44 +0000 Message-Id: <20200127143044.1468-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 Debugfs APIs return valid pointer or error pointer. it doesn't return NULL. So, using IS_ERR is enough, not using IS_ERR_OR_NULL. Reported-by: kbuild test robot Reported-by: Dan Carpenter Signed-off-by: Taehee Yoo Reviewed-by: Jakub Kicinski --- v1 -> v2: - Fix use-after-free drivers/net/netdevsim/bpf.c | 10 ++++++---- drivers/net/netdevsim/dev.c | 16 ++++++++-------- drivers/net/netdevsim/health.c | 4 ++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/net/netdevsim/bpf.c b/drivers/net/netdevsim/bpf.c index 2b74425822ab..0b362b8dac17 100644 --- a/drivers/net/netdevsim/bpf.c +++ b/drivers/net/netdevsim/bpf.c @@ -218,6 +218,7 @@ static int nsim_bpf_create_prog(struct nsim_dev *nsim_dev, { struct nsim_bpf_bound_prog *state; char name[16]; + int ret; state = kzalloc(sizeof(*state), GFP_KERNEL); if (!state) @@ -230,9 +231,10 @@ static int nsim_bpf_create_prog(struct nsim_dev *nsim_dev, /* Program id is not populated yet when we create the state. */ sprintf(name, "%u", nsim_dev->prog_id_gen++); state->ddir = debugfs_create_dir(name, nsim_dev->ddir_bpf_bound_progs); - if (IS_ERR_OR_NULL(state->ddir)) { + if (IS_ERR(state->ddir)) { + ret = PTR_ERR(state->ddir); kfree(state); - return -ENOMEM; + return ret; } debugfs_create_u32("id", 0400, state->ddir, &prog->aux->id); @@ -587,8 +589,8 @@ int nsim_bpf_dev_init(struct nsim_dev *nsim_dev) nsim_dev->ddir_bpf_bound_progs = debugfs_create_dir("bpf_bound_progs", nsim_dev->ddir); - if (IS_ERR_OR_NULL(nsim_dev->ddir_bpf_bound_progs)) - return -ENOMEM; + if (IS_ERR(nsim_dev->ddir_bpf_bound_progs)) + return PTR_ERR(nsim_dev->ddir_bpf_bound_progs); nsim_dev->bpf_dev = bpf_offload_dev_create(&nsim_bpf_dev_ops, nsim_dev); err = PTR_ERR_OR_ZERO(nsim_dev->bpf_dev); diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index 2c23b232926b..955da8da72db 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -91,11 +91,11 @@ static int nsim_dev_debugfs_init(struct nsim_dev *nsim_dev) sprintf(dev_ddir_name, DRV_NAME "%u", nsim_dev->nsim_bus_dev->dev.id); nsim_dev->ddir = debugfs_create_dir(dev_ddir_name, nsim_dev_ddir); - if (IS_ERR_OR_NULL(nsim_dev->ddir)) - return PTR_ERR_OR_ZERO(nsim_dev->ddir) ?: -EINVAL; + if (IS_ERR(nsim_dev->ddir)) + return PTR_ERR(nsim_dev->ddir); nsim_dev->ports_ddir = debugfs_create_dir("ports", nsim_dev->ddir); - if (IS_ERR_OR_NULL(nsim_dev->ports_ddir)) - return PTR_ERR_OR_ZERO(nsim_dev->ports_ddir) ?: -EINVAL; + if (IS_ERR(nsim_dev->ports_ddir)) + return PTR_ERR(nsim_dev->ports_ddir); debugfs_create_bool("fw_update_status", 0600, nsim_dev->ddir, &nsim_dev->fw_update_status); debugfs_create_u32("max_macs", 0600, nsim_dev->ddir, @@ -126,8 +126,8 @@ static int nsim_dev_port_debugfs_init(struct nsim_dev *nsim_dev, sprintf(port_ddir_name, "%u", nsim_dev_port->port_index); nsim_dev_port->ddir = debugfs_create_dir(port_ddir_name, nsim_dev->ports_ddir); - if (IS_ERR_OR_NULL(nsim_dev_port->ddir)) - return -ENOMEM; + if (IS_ERR(nsim_dev_port->ddir)) + return PTR_ERR(nsim_dev_port->ddir); sprintf(dev_link_name, "../../../" DRV_NAME "%u", nsim_dev->nsim_bus_dev->dev.id); @@ -939,8 +939,8 @@ int nsim_dev_port_del(struct nsim_bus_dev *nsim_bus_dev, int nsim_dev_init(void) { nsim_dev_ddir = debugfs_create_dir(DRV_NAME, NULL); - if (IS_ERR_OR_NULL(nsim_dev_ddir)) - return -ENOMEM; + if (IS_ERR(nsim_dev_ddir)) + return PTR_ERR(nsim_dev_ddir); return 0; } diff --git a/drivers/net/netdevsim/health.c b/drivers/net/netdevsim/health.c index 9aa637d162eb..30595b1299bd 100644 --- a/drivers/net/netdevsim/health.c +++ b/drivers/net/netdevsim/health.c @@ -285,8 +285,8 @@ int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink) } health->ddir = debugfs_create_dir("health", nsim_dev->ddir); - if (IS_ERR_OR_NULL(health->ddir)) { - err = PTR_ERR_OR_ZERO(health->ddir) ?: -EINVAL; + if (IS_ERR(health->ddir)) { + err = PTR_ERR(health->ddir); goto err_dummy_reporter_destroy; } From patchwork Mon Jan 27 14:30:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taehee Yoo X-Patchwork-Id: 1229874 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=rApjOFlz; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 485scQ01FLz9sQp for ; Tue, 28 Jan 2020 01:31:01 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729219AbgA0ObB (ORCPT ); Mon, 27 Jan 2020 09:31:01 -0500 Received: from mail-pl1-f193.google.com ([209.85.214.193]:37957 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725828AbgA0ObA (ORCPT ); Mon, 27 Jan 2020 09:31:00 -0500 Received: by mail-pl1-f193.google.com with SMTP id t6so3818302plj.5 for ; Mon, 27 Jan 2020 06:31:00 -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=oxlbt6k6AX6JVBPbqvGrMvLQm/7OGlleTvFaZ6cEpRw=; b=rApjOFlzZQuCxz9i0eTXEtZC9ISxk91PCzWT1xS1PSWfXjod+bxmMFgebdbv9blqRo ihLrJSubZfkiCZMxVAtUdTRGZw7fUZThipueoxSB/iIjUb3ibAVy54cuF8cKhFjXlYXH NtIT1aYWa6aqlQT/HMDs0ehZRdcJHb+U0pWfcUN56Gwu6i3/wlnbfNiIpMZpYWAb+HoO cwGrYjezPiNi3PwSUlmyyQFhsYwOkK6/zhszMQdf23F87WOFIai65o+9SsfzmVnoqhm4 NQ4qHPLPuDzfrbg6lxfRtXLP2Js4vneAMWkXJskhsqedCEJ2n9u7dqljw4yiEeDr1HBU dFpw== 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=oxlbt6k6AX6JVBPbqvGrMvLQm/7OGlleTvFaZ6cEpRw=; b=A1ZWQ99yNmHkRY4TZJMqX/DtrZEW1D9/kVomGfIsKvHCQ+D53sA3Ta7MDkjJ2toro9 RvQwi3hX9m/rFLm3K1NC4ebg8DVhNlAqmXPe8i6B+nhfEvuQWi/e2+Onkrah53KMZugb lGn5ew7YnBc1bez0989hBFzLxvJqUkdohqT4mldEvyMKf/X0xY9qQk4Egs7IGOYIfpkq 6xaxPBMPuGYn0GKjnastSBwaDFLrnvw0ELBB6DRs5QisXVjpz+UKPCN5sDp33XZaJvNi stfN2mBULQhRdLSvG/+PHYjFrEhRtby8uUMjXWn2G1hdO6YblZznDsa07ZScnz2upWx7 ll3g== X-Gm-Message-State: APjAAAXq9to7v6AclI8yL54qgQmT979kzxLw6SivOIUVh4ToZT+3akJL TeghvIwlaBMpEPFMjHeL81A= X-Google-Smtp-Source: APXvYqyPYLu8ydyWXvT6M+1N9hD/tCmqOslZdUlTzfCnJqhvOl7jTlw0uMZYhQ72eb17Cy9s2LpIFg== X-Received: by 2002:a17:90a:d0c5:: with SMTP id y5mr14380593pjw.126.1580135459903; Mon, 27 Jan 2020 06:30:59 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id g24sm16515021pfk.92.2020.01.27.06.30.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jan 2020 06:30:58 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net v2 5/6] netdevsim: use __GFP_NOWARN to avoid memalloc warning Date: Mon, 27 Jan 2020 14:30:53 +0000 Message-Id: <20200127143053.1550-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 vfnum buffer size and binary_len buffer size is received by user-space. So, this buffer size could be too large. If so, kmalloc will internally print a warning message. This warning message is actually not necessary for the netdevsim module. So, this patch adds __GFP_NOWARN. Test commands: modprobe netdevsim echo 1 > /sys/bus/netdevsim/new_device echo 1000000000 > /sys/devices/netdevsim1/sriov_numvfs Splat looks like: [ 357.847266][ T1000] WARNING: CPU: 0 PID: 1000 at mm/page_alloc.c:4738 __alloc_pages_nodemask+0x2f3/0x740 [ 357.850273][ T1000] Modules linked in: netdevsim veth openvswitch nsh nf_conncount nf_nat nf_conntrack nf_defrx [ 357.852989][ T1000] CPU: 0 PID: 1000 Comm: bash Tainted: G B 5.5.0-rc5+ #270 [ 357.854334][ T1000] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006 [ 357.855703][ T1000] RIP: 0010:__alloc_pages_nodemask+0x2f3/0x740 [ 357.856669][ T1000] Code: 64 fe ff ff 65 48 8b 04 25 c0 0f 02 00 48 05 f0 12 00 00 41 be 01 00 00 00 49 89 47 0 [ 357.860272][ T1000] RSP: 0018:ffff8880b7f47bd8 EFLAGS: 00010246 [ 357.861009][ T1000] RAX: ffffed1016fe8f80 RBX: 1ffff11016fe8fae RCX: 0000000000000000 [ 357.861843][ T1000] RDX: 0000000000000000 RSI: 0000000000000017 RDI: 0000000000000000 [ 357.862661][ T1000] RBP: 0000000000040dc0 R08: 1ffff11016fe8f67 R09: dffffc0000000000 [ 357.863509][ T1000] R10: ffff8880b7f47d68 R11: fffffbfff2798180 R12: 1ffff11016fe8f80 [ 357.864355][ T1000] R13: 0000000000000017 R14: 0000000000000017 R15: ffff8880c2038d68 [ 357.865178][ T1000] FS: 00007fd9a5b8c740(0000) GS:ffff8880d9c00000(0000) knlGS:0000000000000000 [ 357.866248][ T1000] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 357.867531][ T1000] CR2: 000055ce01ba8100 CR3: 00000000b7dbe005 CR4: 00000000000606f0 [ 357.868972][ T1000] Call Trace: [ 357.869423][ T1000] ? lock_contended+0xcd0/0xcd0 [ 357.870001][ T1000] ? __alloc_pages_slowpath+0x21d0/0x21d0 [ 357.870673][ T1000] ? _kstrtoull+0x76/0x160 [ 357.871148][ T1000] ? alloc_pages_current+0xc1/0x1a0 [ 357.871704][ T1000] kmalloc_order+0x22/0x80 [ 357.872184][ T1000] kmalloc_order_trace+0x1d/0x140 [ 357.872733][ T1000] __kmalloc+0x302/0x3a0 [ 357.873204][ T1000] nsim_bus_dev_numvfs_store+0x1ab/0x260 [netdevsim] [ 357.873919][ T1000] ? kernfs_get_active+0x12c/0x180 [ 357.874459][ T1000] ? new_device_store+0x450/0x450 [netdevsim] [ 357.875111][ T1000] ? kernfs_get_parent+0x70/0x70 [ 357.875632][ T1000] ? sysfs_file_ops+0x160/0x160 [ 357.876152][ T1000] kernfs_fop_write+0x276/0x410 [ 357.876680][ T1000] ? __sb_start_write+0x1ba/0x2e0 [ 357.877225][ T1000] vfs_write+0x197/0x4a0 [ 357.877671][ T1000] ksys_write+0x141/0x1d0 [ ... ] Fixes: 79579220566c ("netdevsim: add SR-IOV functionality") Fixes: 82c93a87bf8b ("netdevsim: implement couple of testing devlink health reporters") Signed-off-by: Taehee Yoo Reviewed-by: Jakub Kicinski --- v1 -> v2: - This patch isn't changed drivers/net/netdevsim/bus.c | 2 +- drivers/net/netdevsim/health.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/netdevsim/bus.c b/drivers/net/netdevsim/bus.c index b1aed37a0574..dedd4ca60c74 100644 --- a/drivers/net/netdevsim/bus.c +++ b/drivers/net/netdevsim/bus.c @@ -29,7 +29,7 @@ static int nsim_bus_dev_vfs_enable(struct nsim_bus_dev *nsim_bus_dev, { nsim_bus_dev->vfconfigs = kcalloc(num_vfs, sizeof(struct nsim_vf_config), - GFP_KERNEL); + GFP_KERNEL | __GFP_NOWARN); if (!nsim_bus_dev->vfconfigs) return -ENOMEM; nsim_bus_dev->num_vfs = num_vfs; diff --git a/drivers/net/netdevsim/health.c b/drivers/net/netdevsim/health.c index 30595b1299bd..ba8d9ad60feb 100644 --- a/drivers/net/netdevsim/health.c +++ b/drivers/net/netdevsim/health.c @@ -82,7 +82,7 @@ static int nsim_dev_dummy_fmsg_put(struct devlink_fmsg *fmsg, u32 binary_len) if (err) return err; - binary = kmalloc(binary_len, GFP_KERNEL); + binary = kmalloc(binary_len, GFP_KERNEL | __GFP_NOWARN); if (!binary) return -ENOMEM; get_random_bytes(binary, binary_len); From patchwork Mon Jan 27 14:31: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: 1229875 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=LU9/gXGQ; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 485sck1Hsmz9sQp for ; Tue, 28 Jan 2020 01:31:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729140AbgA0ObR (ORCPT ); Mon, 27 Jan 2020 09:31:17 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:41704 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728939AbgA0ObR (ORCPT ); Mon, 27 Jan 2020 09:31:17 -0500 Received: by mail-pl1-f196.google.com with SMTP id t14so3809131plr.8 for ; Mon, 27 Jan 2020 06:31:16 -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=4lFy+Z3vbhpMmzpcZLstEix7Vd2C2/L8RiV4vAfWX6w=; b=LU9/gXGQ2PB5wC1LkEnRJr34gTs4Fn87pcSXr0Keu3d9hc2gDZuxyD4KYGE3l4Ub8w EEFl0LUJJfumBkIie+519S7FuuUQP3xITc3jOzgBj39c7MzzwzGeQGIFZrkHLcps30L2 x4kdIVKMt/QFQCpX6Mn1n+pGJ9cNbrbyyqJa82gpMmUxAhJ2Rvvh5dQ5C7duv8Z+IYMv 2nI1jXAK6A3dYMDYweUSO10EhhBamqKILvB9Abu40HP/PAGp3evdR+t+M82UJ/H1xF9n svD9w1BQA2uTcSBbJb1/3ARVffYzDSla7AQJaYclY7awLCkgOmABi6XwYqkd4BhLpcSB LjSA== 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=4lFy+Z3vbhpMmzpcZLstEix7Vd2C2/L8RiV4vAfWX6w=; b=aF2Qtg0hK7fT0ToyBYQhpxdxgmDGLTOv5WzTGNiqXoVhBcWYBRwTMaFWUZlk3atXDL LGBpiW+vZkKWY/3ksyN4qqmXzmoWemfZkXC3BedJT7coJkRRFyWQBkY6ojNY9TcmEVJM YdYp2c73pNrWi92mrpIt96U+SaPjp6TJ7tSV0CkbizrrKekPH5bXjstquSrgA3T9Sijx gUWQqinrde+6RQEgQ1ztB8+jdvKkxUt5E8VAb2FC4FVfFDYSOlejxZa7O10JeLMOPmZw Yi1MC9oipb5u1re4hubNmvRw5ShWUBRrckreywQW8U/oQUcuktfFsND+/C4o1G5KMLAm 5v3A== X-Gm-Message-State: APjAAAVAq2JDrJ5qX5/vJ18foSaqVqQLPk2Xhgd59tai9qpGOsbmDZns o9QtilCSSSDS+bWqiKfEfTw= X-Google-Smtp-Source: APXvYqxelmJPWCo8wd/XX83mqDeQMcXekZ/Qw6JMcITPv72clsNG+CBEvG4G37jH3U+bH+6PyXdTsA== X-Received: by 2002:a17:90a:c705:: with SMTP id o5mr14498836pjt.67.1580135476338; Mon, 27 Jan 2020 06:31:16 -0800 (PST) Received: from localhost.localdomain ([180.70.143.152]) by smtp.gmail.com with ESMTPSA id d189sm16366498pga.70.2020.01.27.06.31.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jan 2020 06:31:15 -0800 (PST) From: Taehee Yoo To: davem@davemloft.net, kuba@kernel.org, netdev@vger.kernel.org Cc: ap420073@gmail.com Subject: [PATCH net v2 6/6] netdevsim: remove unused sdev code Date: Mon, 27 Jan 2020 14:31:09 +0000 Message-Id: <20200127143109.1644-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 sdev.c code is merged into dev.c and is not used anymore. it would be removed. Signed-off-by: Taehee Yoo Reviewed-by: Jakub Kicinski --- drivers/net/netdevsim/sdev.c | 69 ------------------------------------ 1 file changed, 69 deletions(-) delete mode 100644 drivers/net/netdevsim/sdev.c diff --git a/drivers/net/netdevsim/sdev.c b/drivers/net/netdevsim/sdev.c deleted file mode 100644 index 6712da3340d6..000000000000 --- a/drivers/net/netdevsim/sdev.c +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2019 Mellanox Technologies. All rights reserved */ - -#include -#include -#include -#include - -#include "netdevsim.h" - -static struct dentry *nsim_sdev_ddir; - -static u32 nsim_sdev_id; - -struct netdevsim_shared_dev *nsim_sdev_get(struct netdevsim *joinns) -{ - struct netdevsim_shared_dev *sdev; - char sdev_ddir_name[10]; - int err; - - if (joinns) { - if (WARN_ON(!joinns->sdev)) - return ERR_PTR(-EINVAL); - sdev = joinns->sdev; - sdev->refcnt++; - return sdev; - } - - sdev = kzalloc(sizeof(*sdev), GFP_KERNEL); - if (!sdev) - return ERR_PTR(-ENOMEM); - sdev->refcnt = 1; - sdev->switch_id = nsim_sdev_id++; - - sprintf(sdev_ddir_name, "%u", sdev->switch_id); - sdev->ddir = debugfs_create_dir(sdev_ddir_name, nsim_sdev_ddir); - if (IS_ERR_OR_NULL(sdev->ddir)) { - err = PTR_ERR_OR_ZERO(sdev->ddir) ?: -EINVAL; - goto err_sdev_free; - } - - return sdev; - -err_sdev_free: - nsim_sdev_id--; - kfree(sdev); - return ERR_PTR(err); -} - -void nsim_sdev_put(struct netdevsim_shared_dev *sdev) -{ - if (--sdev->refcnt) - return; - debugfs_remove_recursive(sdev->ddir); - kfree(sdev); -} - -int nsim_sdev_init(void) -{ - nsim_sdev_ddir = debugfs_create_dir(DRV_NAME "_sdev", NULL); - if (IS_ERR_OR_NULL(nsim_sdev_ddir)) - return -ENOMEM; - return 0; -} - -void nsim_sdev_exit(void) -{ - debugfs_remove_recursive(nsim_sdev_ddir); -}