From nobody Thu Apr 9 23:26:38 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 682632F12AE for ; Thu, 5 Mar 2026 09:27:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772702858; cv=none; b=jfgWmDJy0/TcXdIdS27afdKxac5EjuEsJY8fKrxCKCpPC7mybPzKZInRac+sTaki/Ub0G4+jY0bZcob+2wzpc3gxZa5XkwroHV/zj0U+E7tBShiP5RZlC7u9YfyJOzhRGMvaH7PChYvcsc3fmOjDoPGhYBiqZ2haXl0zN2lwwxE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772702858; c=relaxed/simple; bh=dCKksn63Iwao5/9PDtyfSecGgF0qBWe7qMdJfO7cg18=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gtXl2iwZbApmpp1kbZHJZu+YrIF7FfPQ2H47mxoaqdCmJPxQi1Kp2ax9rF6eg7inRvpwifDVs/2FYo3ws/S4GcM8phW21GAGXcCbfuiW4+ZaXRQ6VCDGNdRY/dpZe/BwwR4YGY5BKcZMUGVOFqM4jGlPO/mRIDj2qySUTIdbOCk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmo-cybersecurity.com; spf=pass smtp.mailfrom=gmo-cybersecurity.com; dkim=pass (2048-bit key) header.d=gmo-cybersecurity.com header.i=@gmo-cybersecurity.com header.b=apjlGpC1; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmo-cybersecurity.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmo-cybersecurity.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmo-cybersecurity.com header.i=@gmo-cybersecurity.com header.b="apjlGpC1" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-8272a56b91cso6586150b3a.1 for ; Thu, 05 Mar 2026 01:27:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmo-cybersecurity.com; s=google; t=1772702857; x=1773307657; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZlZr/f1YfH8ETuaOzpKLszu0Ah6qy/QnffRr2RQOGS8=; b=apjlGpC1DKHuqe/sczI7YkRV0po/S13RocNGah+AStAZNOCXrGSqHjvZ00tgjTxcYn fE4uou8TYqGAU3jtb1YUF57xYng1tv/+OyWVYO9jXAyQ7NfBkJhHIBq8Aj7nBx9Bbf1L S6RAemwfUM5ABtEkOamL8lCCUNFAv/EfvAPp472Oc8vj9DY2jAOVPgshsMWjthCt980l RdSBwBxYQSee2GQBpLfICXx3uFUGbqMrmi6NVH+Jlpin2rPEAskhu8MUdmiKfx5+fVyK 4ObbIA3BvxCaK2DWbdvtq3DC1mzU9oECU1Sjoox8I9dbldPGzVhjSwbeotB26IUMjL7D pQvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772702857; x=1773307657; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ZlZr/f1YfH8ETuaOzpKLszu0Ah6qy/QnffRr2RQOGS8=; b=E2JOfgOCG85lOZ5Dgv/P83WdXYIL63J6/rw6bc/aRlQacfSbl3fg2xEtIdaBUzR6Ju Eu1Rvl7w7LzaH5SwcwVJIwexdDMK5Mk/xM8LJEulZPA/zDP/3Yxg6bL699mGGor9lteq MWLPAnfSS0Y+GQDqBjQcnZajulRu4nAsZceke992O3NI6Jb0yVUh3Oe2kHsy2ixO/wZG EBB75mEEGSK1WqD27J9halbaBIrbpMUll/+l5xG179jN3JZt9HLqWWs5d1GzjV+Jvb0A TUd09ozHgR5Ct9rY4tW51RaTCWlvQX79UzFzwIkxnct+Psz9jXP9211/+1EvTyZeMUYJ M72g== X-Gm-Message-State: AOJu0YxdzMD/E4vNIGA34YesTG4ZsggPyH9/+MbdOzDDAKnq9J8pW0c7 XlTZpOg2h815kvzwKLXPg1uKaeEa/cxcnMT7atghAKwxFq7NUq7684FhYX75WGXzGXQ= X-Gm-Gg: ATEYQzz94t/PA0bXkZaF8pgyQTr1/v0V9473oBXzNTV5eGIi5bUSzQl8Vvi9WFGmgqP 4/5Oo2XhZ7s5xrkYh2PrKUukntEUlqIZdTO0x/eQKD8CB2DsFEtbGWC5x7IMHpN1bTFGrgsFaPN Y926+7FsSUkzuQECw+NQHO/wz4pNdhy67BYatCqNkGjPfBJC0gT4NbOqMPPNCr6irYaamXbyec3 6J+/MmmCLI4hAn2fuZjPXyoIF1yQ7hZNAOrE0RjLC1F4ygW4bsB21BIV9g75nq9mV8vaaFeCX3i tLp6do1AEFBx9g0HXavu658lHPdUggFuOg7LR3elC4g000Z1ldvax856mpTE+Uo5z84LSf3e39g mD8QuOEQoyothds0bWGbfT++9EuakkI6XMolH3UHJ4GEqnbv2wH150kGDLpyHBTHdM4pWH8s8cB foNJAOa+CtU+8vtVuvzrHhj4Z8aIzgqIbZMKfGEOmmBjHyNSoB0tbTwQH9aEWaLHkRj0AzOjxT1 iuGqN7WEZYXwt+/SZhtLcg= X-Received: by 2002:a05:6a00:2303:b0:827:3d52:5d1a with SMTP id d2e1a72fcca58-829727299b5mr5320380b3a.0.1772702856651; Thu, 05 Mar 2026 01:27:36 -0800 (PST) Received: from cachyos.camel-monitor.ts.net (akacd-04p3-188.ppp11.odn.ad.jp. [210.237.248.188]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82974e75a4csm3606530b3a.30.2026.03.05.01.27.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Mar 2026 01:27:36 -0800 (PST) From: Kota Toda To: Kota Toda , Jay Vosburgh , Andy Gospodarek , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Yuki Koike Subject: [PATCH 1/2] net: bonding: fix type-confusion in bonding header_ops Date: Thu, 5 Mar 2026 18:27:03 +0900 Message-ID: <20260305092706.145085-2-kota.toda@gmo-cybersecurity.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260305092706.145085-1-kota.toda@gmo-cybersecurity.com> References: <20260305092706.145085-1-kota.toda@gmo-cybersecurity.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add two members to struct bonding, bond_header_ops and header_slave_dev, to avoid type-confusion while keeping track of the slave's header_ops. Signed-off-by: Kota Toda Co-developed-by: Yuki Koike Signed-off-by: Yuki Koike --- drivers/net/bonding/bond_main.c | 66 ++++++++++++++++++++++++++++++++- include/net/bonding.h | 5 +++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_mai= n.c index f17a170d1..2efad75ac 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1616,14 +1616,70 @@ static void bond_compute_features(struct bonding *b= ond) netdev_change_features(bond_dev); } +static int bond_hard_header(struct sk_buff *skb, struct net_device *dev, + unsigned short type, const void *daddr, + const void *saddr, unsigned int len) +{ + struct bonding *bond =3D netdev_priv(dev); + struct net_device *slave_dev; + + slave_dev =3D bond->header_slave_dev; + + return dev_hard_header(skb, slave_dev, type, daddr, saddr, len); +} + +static void bond_header_cache_update(struct hh_cache *hh, const +struct net_device *dev, + const unsigned char *haddr) +{ + const struct bonding *bond =3D netdev_priv(dev); + void (*cache_update)(struct hh_cache *hh, + const struct net_device *dev, + const unsigned char *haddr); + struct net_device *slave_dev; + + slave_dev =3D bond->header_slave_dev; + cache_update =3D READ_ONCE(slave_dev->header_ops->cache_update); + if (!slave_dev->header_ops || !cache_update) + return; + + cache_update(hh, slave_dev, haddr); +} + static void bond_setup_by_slave(struct net_device *bond_dev, struct net_device *slave_dev) { + struct bonding *bond =3D netdev_priv(bond_dev); bool was_up =3D !!(bond_dev->flags & IFF_UP); dev_close(bond_dev); - bond_dev->header_ops =3D slave_dev->header_ops; + /* Some functions are given dev as an argument + * while others not. When dev is not given, we cannot + * find out what is the slave device through struct bonding + * (the private data of bond_dev). Therefore, we need a raw + * header_ops variable instead of its pointer to const header_ops + * and assign slave's functions directly. + * For the other case, we set the wrapper functions that pass + * slave_dev to the wrapped functions. + */ + bond->bond_header_ops.create =3D bond_hard_header; + bond->bond_header_ops.cache_update =3D bond_header_cache_update; + if (slave_dev->header_ops) { + WRITE_ONCE(bond->bond_header_ops.parse, slave_dev->header_ops->parse); + WRITE_ONCE(bond->bond_header_ops.cache, slave_dev->header_ops->cache); + WRITE_ONCE(bond->bond_header_ops.validate, slave_dev->header_ops->valida= te); + WRITE_ONCE(bond->bond_header_ops.parse_protocol, + slave_dev->header_ops->parse_protocol); + } else { + WRITE_ONCE(bond->bond_header_ops.parse, NULL); + WRITE_ONCE(bond->bond_header_ops.cache, NULL); + WRITE_ONCE(bond->bond_header_ops.validate, NULL); + WRITE_ONCE(bond->bond_header_ops.parse_protocol, NULL); + } + + WRITE_ONCE(bond_dev->header_ops, &bond->bond_header_ops); + bond->header_slave_dev =3D slave_dev; bond_dev->type =3D slave_dev->type; bond_dev->hard_header_len =3D slave_dev->hard_header_len; @@ -2682,6 +2738,14 @@ static int bond_release_and_destroy(struct net_devic= e *bond_dev, struct bonding *bond =3D netdev_priv(bond_dev); int ret; + /* If slave_dev is the earliest registered one, we must clear + * the variables related to header_ops to avoid dangling pointer. + */ + if (bond->header_slave_dev =3D=3D slave_dev) { + WRITE_ONCE(bond_dev->header_ops, NULL); + bond->header_slave_dev =3D NULL; + } + ret =3D __bond_release_one(bond_dev, slave_dev, false, true); if (ret =3D=3D 0 && !bond_has_slaves(bond) && bond_dev->reg_state !=3D NETREG_UNREGISTERING) { diff --git a/include/net/bonding.h b/include/net/bonding.h index 95f67b308..cf8206187 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h @@ -215,6 +215,11 @@ struct bond_ipsec { */ struct bonding { struct net_device *dev; /* first - useful for panic debug */ + struct net_device *header_slave_dev; /* slave net_device for header_op= s */ + /* maintained as a non-const variable + * because bond's header_ops should change depending on slaves. + */ + struct header_ops bond_header_ops; struct slave __rcu *curr_active_slave; struct slave __rcu *current_arp_slave; struct slave __rcu *primary_slave; -- 2.53.0 From nobody Thu Apr 9 23:26:38 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 34E85378D8B for ; Thu, 5 Mar 2026 09:27:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772702871; cv=none; b=SaLywr2KbNkUNa7KC5icAsz+UJwBh9xAiq4x/UEmd9CLjBaN4Mwy7QYpjAH2WhNLCmPHtVpfekzp8u+HF6QMFLfA9QD0n9SlHtyKYJTLb1iemr3kXhUGEFPJdA9nzup5H9qM1noE5gEknUeatRIVZisszPjRU1bI02PleQy649c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772702871; c=relaxed/simple; bh=PvmK9cOjcXiTE+sYw8ns9MrJAVMaWeeyWvNTmOXTgX0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SJB+/JjcQcSuB2DfkGYSkE7o1GaifvJ81C76I7A89v+ArmRl0pCtBBwN8B8IPMeNmdtTXT/9NurZP2VSUPBjJT62mdmBG53h9R8WaxoX2a8tnYz8IDOoHKrFIWLCn7coCsOhQ3BOoC95AK+bCP6HoCo61c5odt1+Ib/pY06IREk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmo-cybersecurity.com; spf=pass smtp.mailfrom=gmo-cybersecurity.com; dkim=pass (2048-bit key) header.d=gmo-cybersecurity.com header.i=@gmo-cybersecurity.com header.b=Mtw4Dvoe; arc=none smtp.client-ip=209.85.210.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmo-cybersecurity.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmo-cybersecurity.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmo-cybersecurity.com header.i=@gmo-cybersecurity.com header.b="Mtw4Dvoe" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-82735a41985so4681298b3a.2 for ; Thu, 05 Mar 2026 01:27:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmo-cybersecurity.com; s=google; t=1772702869; x=1773307669; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RMOI/17+3RALblDHdAO/33R2niqItgZmhCfmqTfZ8wA=; b=Mtw4DvoegFdQwncOc4FmotZmRGrGJSWL81Nj9MxwCCo6pcuc5L9pzykof2u5GbA7Iq EINyIWNuEoD4aJzCw5VbSZFdnYbWvWKDDMr1+VPQRPbqUIoHkJqV3JupEBekZqAe7ycE FAbjM+q2usH34sXlCV148fBHpysXMhhSJHht8PnjmOvr4nXdzG/OCETgVE4sU86knJjg sDUi1vWiw5hGXXum8TyLjsKRaO8ItE5FlJLEfMFg6DBDnScUFb5SzDBZYjyF2J3lcfg+ wIGghR9zX41pKT2omZRj+5B0zP0/tJcm1khzLwCrmGHRUBsvH82qLoAbxZrwGoiozRYI fyCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772702869; x=1773307669; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=RMOI/17+3RALblDHdAO/33R2niqItgZmhCfmqTfZ8wA=; b=VLbyVIpTSrTwZW9wRPwA7huXb9Y+d6B6PfZxpJQcNmk0GE0jrR8ULdqxHDZuKPKu67 sKAraOwCVCdUkrN2T4IZCFZ+1xYGp+ji/oT/eb1i5WCI8SQbtOSNjMx5PkkZY0mXlEKj xCj3kyNCB8j7CCfbK/XdHX0LCJ8Zqughs7mQCfgYD1wgMTEr5Ms2SZjrp+HXZAAIG4jw cIRdlfGJ7tG/pJZWzjqLBWTNHEwyTqIz81/LgON1x7BWW31FVKANdMk/Jq5hA7+1r2nO EOMTgxeL3aCAw9TicygN8qw2xR+GXuxXCwA0797Hr80YRSihO8e0U789J+cIeyrvgsE0 AI3g== X-Gm-Message-State: AOJu0YyKxnIbLbCAEggIahNlkhrvsgBvfHrt1QwN4EncTtJM2Uk/xial GhfMv/WIsSGQJLdpG0DAqpMOd+HLGdksWJWb3h0qFkKNwjGNhZc96DnQuBkejTClKhA= X-Gm-Gg: ATEYQzw0lrI4hbBeA00zE+nWOVqSVEMXqJnyrdRw+2Lgc0bwX4mihAXrrrDcxNDN5VO 70/T463bheYjVVY/e2Fk1VQQ+U/4RnK6ugc5FYoXEkWmp8i1KLGcHPRe3rSJn78xniYk/9V+xN7 4j7LvINlxFqKqEtOnZMTMZma+EnFHh3f1Fa68B0Ej3taKjGapzcqgspc5pkwgYm+OcQ5W6YZX7S N0pbYKdHpDYuFP98daMdigF3+KaDIXMAtZODqFgpP36GLuOGA+y2UnNF0WzDEcF4SI5OG3lgcHg Zy4rDbruWMltvIgoQ81VIN5PGvxWzeV9kMHyeZZxiW4WJXyMTu8t/ybSQB9I2ZNkQLvmiTQB4Cx GlGLYmONLU/FrentL9Z5OzA2iey9uf4Dk8aLlMBIEOJNcNy+xnnrkyRaZoHRZo5/+ZhlthxtEG+ xUscjsDg8MSKBTadjlw9WuCFOUcorz2Yzg38zkFgcRPxxZ1m0hwln/TsHnelnuTMMkvJNPlbi5L py+34ZgJM+07BMunLqk9nXWBcjUuFTVdw== X-Received: by 2002:a05:6a21:4506:b0:35d:e4b2:b381 with SMTP id adf61e73a8af0-3982ded22b7mr5305867637.16.1772702869513; Thu, 05 Mar 2026 01:27:49 -0800 (PST) Received: from cachyos.camel-monitor.ts.net (akacd-04p3-188.ppp11.odn.ad.jp. [210.237.248.188]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82974e75a4csm3606530b3a.30.2026.03.05.01.27.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Mar 2026 01:27:49 -0800 (PST) From: Kota Toda To: Kota Toda , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Andrew Lunn , Alexander Aring , Stefan Schmidt , Miquel Raynal , David Ahern Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Yuki Koike , linux-wpan@vger.kernel.org Subject: [PATCH 2/2] net: add READ_ONCE for header_ops callbacks Date: Thu, 5 Mar 2026 18:27:04 +0900 Message-ID: <20260305092706.145085-3-kota.toda@gmo-cybersecurity.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260305092706.145085-1-kota.toda@gmo-cybersecurity.com> References: <20260305092706.145085-1-kota.toda@gmo-cybersecurity.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use READ_ONCE when loading header_ops callbacks to avoid races with concurrent updates. Signed-off-by: Kota Toda Co-developed-by: Yuki Koike Signed-off-by: Yuki Koike --- include/linux/netdevice.h | 28 +++++++++++++++++++--------- include/net/cfg802154.h | 2 +- net/core/neighbour.c | 6 +++--- net/ipv4/arp.c | 2 +- net/ipv6/ndisc.c | 2 +- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 77a99c8ab..f50b0a4e8 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3150,35 +3150,44 @@ static inline int dev_hard_header(struct sk_buff *s= kb, struct net_device *dev, const void *daddr, const void *saddr, unsigned int len) { - if (!dev->header_ops || !dev->header_ops->create) + int (*create)(struct sk_buff *skb, struct net_device *dev, + unsigned short type, const void *daddr, + const void *saddr, unsigned int len); + create =3D READ_ONCE(dev->header_ops->create); + if (!dev->header_ops || !create) return 0; - return dev->header_ops->create(skb, dev, type, daddr, saddr, len); + return create(skb, dev, type, daddr, saddr, len); } static inline int dev_parse_header(const struct sk_buff *skb, unsigned char *haddr) { + int (*parse)(const struct sk_buff *skb, unsigned char *haddr); const struct net_device *dev =3D skb->dev; - if (!dev->header_ops || !dev->header_ops->parse) + parse =3D READ_ONCE(dev->header_ops->parse); + if (!dev->header_ops || !parse) return 0; - return dev->header_ops->parse(skb, haddr); + return parse(skb, haddr); } static inline __be16 dev_parse_header_protocol(const struct sk_buff *skb) { + __be16 (*parse_protocol)(const struct sk_buff *skb); const struct net_device *dev =3D skb->dev; - if (!dev->header_ops || !dev->header_ops->parse_protocol) + parse_protocol =3D READ_ONCE(dev->header_ops->parse_protocol); + if (!dev->header_ops || !parse_protocol) return 0; - return dev->header_ops->parse_protocol(skb); + return parse_protocol(skb); } /* ll_header must have at least hard_header_len allocated */ static inline bool dev_validate_header(const struct net_device *dev, char *ll_header, int len) { + bool (*validate)(const char *ll_header, unsigned int len); if (likely(len >=3D dev->hard_header_len)) return true; if (len < dev->min_header_len) @@ -3189,15 +3198,16 @@ static inline bool dev_validate_header(const struct= net_device *dev, return true; } - if (dev->header_ops && dev->header_ops->validate) - return dev->header_ops->validate(ll_header, len); + validate =3D READ_ONCE(dev->header_ops->validate); + if (dev->header_ops && validate) + return validate(ll_header, len); return false; } static inline bool dev_has_header(const struct net_device *dev) { - return dev->header_ops && dev->header_ops->create; + return dev->header_ops && READ_ONCE(dev->header_ops->create); } /* diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h index 76d2cd2e2..dec638763 100644 --- a/include/net/cfg802154.h +++ b/include/net/cfg802154.h @@ -522,7 +522,7 @@ wpan_dev_hard_header(struct sk_buff *skb, struct net_de= vice *dev, { struct wpan_dev *wpan_dev =3D dev->ieee802154_ptr; - return wpan_dev->header_ops->create(skb, dev, daddr, saddr, len); + return READ_ONCE(wpan_dev->header_ops->create)(skb, dev, daddr, saddr, le= n); } #endif diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 96786016d..ff948e35e 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -1270,7 +1270,7 @@ static void neigh_update_hhs(struct neighbour *neigh) =3D NULL; if (neigh->dev->header_ops) - update =3D neigh->dev->header_ops->cache_update; + update =3D READ_ONCE(neigh->dev->header_ops->cache_update); if (update) { hh =3D &neigh->hh; @@ -1540,7 +1540,7 @@ static void neigh_hh_init(struct neighbour *n) * hh_cache entry. */ if (!hh->hh_len) - dev->header_ops->cache(n, hh, prot); + READ_ONCE(dev->header_ops->cache)(n, hh, prot); write_unlock_bh(&n->lock); } @@ -1556,7 +1556,7 @@ int neigh_resolve_output(struct neighbour *neigh, str= uct sk_buff *skb) struct net_device *dev =3D neigh->dev; unsigned int seq; - if (dev->header_ops->cache && !READ_ONCE(neigh->hh.hh_len)) + if (READ_ONCE(dev->header_ops->cache) && !READ_ONCE(neigh->hh.hh_len)) neigh_hh_init(neigh); do { diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 7822b2144..421bea6eb 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c @@ -278,7 +278,7 @@ static int arp_constructor(struct neighbour *neigh) memcpy(neigh->ha, dev->broadcast, dev->addr_len); } - if (dev->header_ops->cache) + if (READ_ONCE(dev->header_ops->cache)) neigh->ops =3D &arp_hh_ops; else neigh->ops =3D &arp_generic_ops; diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index d961e6c2d..d81f509ec 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -361,7 +361,7 @@ static int ndisc_constructor(struct neighbour *neigh) neigh->nud_state =3D NUD_NOARP; memcpy(neigh->ha, dev->broadcast, dev->addr_len); } - if (dev->header_ops->cache) + if (READ_ONCE(dev->header_ops->cache)) neigh->ops =3D &ndisc_hh_ops; else neigh->ops =3D &ndisc_generic_ops; -- 2.53.0