From owner-svn-src-all@freebsd.org Mon Jun 24 21:25:50 2019 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6E16C15D9F24 for ; Mon, 24 Jun 2019 21:25:50 +0000 (UTC) (envelope-from glebius@freebsd.org) Received: from cell.glebi.us (glebi.us [162.251.186.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "cell.glebi.us", Issuer "cell.glebi.us" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4452289BB3; Mon, 24 Jun 2019 21:25:48 +0000 (UTC) (envelope-from glebius@freebsd.org) Received: from cell.glebi.us (localhost [127.0.0.1]) by cell.glebi.us (8.15.2/8.15.2) with ESMTPS id x5OLPeTK072090 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Mon, 24 Jun 2019 14:25:40 -0700 (PDT) (envelope-from glebius@freebsd.org) Received: (from glebius@localhost) by cell.glebi.us (8.15.2/8.15.2/Submit) id x5OLPeeN072089; Mon, 24 Jun 2019 14:25:40 -0700 (PDT) (envelope-from glebius@freebsd.org) X-Authentication-Warning: cell.glebi.us: glebius set sender to glebius@freebsd.org using -f Date: Mon, 24 Jun 2019 14:25:40 -0700 From: Gleb Smirnoff To: Gordon Tetlow Cc: src-committers@freebsd.org, svn-src-all@freebsd.org Subject: Re: svn commit: r349198 - releng/12.0/sys/net Message-ID: <20190624212540.GQ67242@FreeBSD.org> References: <201906191641.x5JGfIsY027804@repo.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201906191641.x5JGfIsY027804@repo.freebsd.org> User-Agent: Mutt/1.11.4 (2019-03-13) X-Rspamd-Queue-Id: 4452289BB3 X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.97 / 15.00]; local_wl_from(0.00)[freebsd.org]; NEURAL_HAM_MEDIUM(-1.00)[-0.999,0]; NEURAL_HAM_SHORT(-0.97)[-0.975,0]; ASN(0.00)[asn:27348, ipnet:162.251.186.0/24, country:US]; NEURAL_HAM_LONG(-1.00)[-1.000,0] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Jun 2019 21:25:50 -0000 Hi, On Wed, Jun 19, 2019 at 04:41:18PM +0000, Gordon Tetlow wrote: G> Author: gordon G> Date: Wed Jun 19 16:41:18 2019 G> New Revision: 349198 G> URL: https://svnweb.freebsd.org/changeset/base/349198 G> G> Log: G> Fix incorrect locking in networking stack. G> G> Approved by: so G> Security: FreeBSD-EN-19:11.net do I understand correct that problem isn't applicable to head, since it was accidentially covered in r340413? Either fix for stable or r340413 aren't a good looking code. My general comment about if_addr_rlock/if_maddr_lock is that they are my most hated functions, since they are one of biggest obstacles on making NIC drivers less aware of what's inside struct ifnet. In my non-finished projects/ifnet branch, there is a different KPI to achieve traversal of address lists: /* * Traversing through interface address lists. */ typedef void ifaddr_cb_t(void *, struct sockaddr *, struct sockaddr *, struct sockaddr *); typedef void ifmaddr_cb_t(void *, struct sockaddr *); void if_foreach_addr(if_t, ifaddr_cb_t, void *); void if_foreach_maddr(if_t, ifmaddr_cb_t, void *); The functions are internal to if.c and do whatever locking is approprite in our kernel. Mutexes before, and epoch now. And in the driver side this would look like this: static void bge_hash_maddr(void *arg, struct sockaddr *maddr) { struct sockaddr_dl *sdl = (struct sockaddr_dl *)maddr; uint32_t *hashes = arg; int h; if (sdl->sdl_family != AF_LINK) return; h = ether_crc32_le(LLADDR(sdl), ETHER_ADDR_LEN) & 0x7F; hashes[(h & 0x60) >> 5] |= 1 << (h & 0x1F); } static void bge_setmulti(struct bge_softc *sc) { uint32_t hashes[4] = { 0, 0, 0, 0 }; int i; BGE_LOCK_ASSERT(sc); if (sc->bge_if_flags & (IFF_ALLMULTI | IFF_PROMISC)) { for (i = 0; i < 4; i++) CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), 0xFFFFFFFF); return; } /* First, zot all the existing filters. */ for (i = 0; i < 4; i++) CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), 0); if_foreach_maddr(sc->bge_ifp, bge_hash_maddr, hashes); for (i = 0; i < 4; i++) CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), hashes[i]); } IMHO, much cleaner and independent of struct ifnet than if_maddr_lock() + traversal, and better than if_multiaddr_count + if_multiaddr_array since doesn't require allocating memory. I'd say that there have been enough pain around interface address traversal, so I would like to go forward with the following plan: 1) Introduce if_foreach_addr/if_foreach_maddr 2) Convert all drivers to this KPI. 3) Declare if_addr_lock/if_maddr_lock and if_multiaddr_count+if_multiaddr_array gone in 14.0 4) Indeed make them gone in head once stable/13 is forked. Any objections? -- Gleb Smirnoff