From owner-svn-src-all@freebsd.org Mon Oct 14 20:23:16 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id EA28D1367A7; Mon, 14 Oct 2019 20:23:16 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46sVPJ5rkjz3LW6; Mon, 14 Oct 2019 20:23:16 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id AC04FA910; Mon, 14 Oct 2019 20:23:16 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x9EKNGls069982; Mon, 14 Oct 2019 20:23:16 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x9EKNGUj069980; Mon, 14 Oct 2019 20:23:16 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201910142023.x9EKNGUj069980@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Mon, 14 Oct 2019 20:23:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r353505 - in head/sys/dev: mlx4/mlx4_en mlx5/mlx5_en X-SVN-Group: head X-SVN-Commit-Author: glebius X-SVN-Commit-Paths: in head/sys/dev: mlx4/mlx4_en mlx5/mlx5_en X-SVN-Commit-Revision: 353505 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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, 14 Oct 2019 20:23:17 -0000 Author: glebius Date: Mon Oct 14 20:23:16 2019 New Revision: 353505 URL: https://svnweb.freebsd.org/changeset/base/353505 Log: Convert to if_foreach_llmaddr() KPI. Reviewed by: hselasky Modified: head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c head/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c Modified: head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c ============================================================================== --- head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c Mon Oct 14 20:22:25 2019 (r353504) +++ head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c Mon Oct 14 20:23:16 2019 (r353505) @@ -617,31 +617,30 @@ static void mlx4_en_clear_uclist(struct net_device *de } } +static u_int mlx4_copy_addr(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + struct mlx4_en_priv *priv = arg; + struct mlx4_en_addr_list *tmp; + + if (sdl->sdl_alen != ETHER_ADDR_LEN) /* XXXGL: can that happen? */ + return (0); + tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC); + if (tmp == NULL) { + en_err(priv, "Failed to allocate address list\n"); + return (0); + } + memcpy(tmp->addr, LLADDR(sdl), ETH_ALEN); + list_add_tail(&tmp->list, &priv->uc_list); + + return (1); +} + static void mlx4_en_cache_uclist(struct net_device *dev) { struct mlx4_en_priv *priv = netdev_priv(dev); - struct mlx4_en_addr_list *tmp; - struct ifaddr *ifa; mlx4_en_clear_uclist(dev); - - if_addr_rlock(dev); - CK_STAILQ_FOREACH(ifa, &dev->if_addrhead, ifa_link) { - if (ifa->ifa_addr->sa_family != AF_LINK) - continue; - if (((struct sockaddr_dl *)ifa->ifa_addr)->sdl_alen != - ETHER_ADDR_LEN) - continue; - tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC); - if (tmp == NULL) { - en_err(priv, "Failed to allocate address list\n"); - break; - } - memcpy(tmp->addr, - LLADDR((struct sockaddr_dl *)ifa->ifa_addr), ETH_ALEN); - list_add_tail(&tmp->list, &priv->uc_list); - } - if_addr_runlock(dev); + if_foreach_lladdr(dev, mlx4_copy_addr, priv); } static void mlx4_en_clear_mclist(struct net_device *dev) @@ -655,31 +654,29 @@ static void mlx4_en_clear_mclist(struct net_device *de } } +static u_int mlx4_copy_maddr(void *arg, struct sockaddr_dl *sdl, u_int count) +{ + struct mlx4_en_priv *priv = arg; + struct mlx4_en_addr_list *tmp; + + if (sdl->sdl_alen != ETHER_ADDR_LEN) /* XXXGL: can that happen? */ + return (0); + tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC); + if (tmp == NULL) { + en_err(priv, "Failed to allocate address list\n"); + return (0); + } + memcpy(tmp->addr, LLADDR(sdl), ETH_ALEN); + list_add_tail(&tmp->list, &priv->mc_list); + return (1); +} + static void mlx4_en_cache_mclist(struct net_device *dev) { struct mlx4_en_priv *priv = netdev_priv(dev); - struct mlx4_en_addr_list *tmp; - struct ifmultiaddr *ifma; mlx4_en_clear_mclist(dev); - - if_maddr_rlock(dev); - CK_STAILQ_FOREACH(ifma, &dev->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - if (((struct sockaddr_dl *)ifma->ifma_addr)->sdl_alen != - ETHER_ADDR_LEN) - continue; - tmp = kzalloc(sizeof(struct mlx4_en_addr_list), GFP_ATOMIC); - if (tmp == NULL) { - en_err(priv, "Failed to allocate address list\n"); - break; - } - memcpy(tmp->addr, - LLADDR((struct sockaddr_dl *)ifma->ifma_addr), ETH_ALEN); - list_add_tail(&tmp->list, &priv->mc_list); - } - if_maddr_runlock(dev); + if_foreach_llmaddr(dev, mlx4_copy_maddr, priv); } static void update_addr_list_flags(struct mlx4_en_priv *priv, Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c ============================================================================== --- head/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c Mon Oct 14 20:22:25 2019 (r353504) +++ head/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c Mon Oct 14 20:23:16 2019 (r353505) @@ -787,44 +787,48 @@ mlx5e_remove_hn(struct mlx5e_eth_addr_hash_head *fh) return (hn); } +struct mlx5e_copy_addr_ctx { + struct mlx5e_eth_addr_hash_head *free; + struct mlx5e_eth_addr_hash_head *fill; + bool success; +}; + +static u_int +mlx5e_copy_addr(void *arg, struct sockaddr_dl *sdl, u_int cnt) +{ + struct mlx5e_copy_addr_ctx *ctx = arg; + struct mlx5e_eth_addr_hash_node *hn; + + hn = mlx5e_move_hn(ctx->free, ctx->fill); + if (hn == NULL) { + ctx->success = false; + return (0); + } + ether_addr_copy(hn->ai.addr, LLADDR(sdl)); + + return (1); +} + static void mlx5e_sync_ifp_addr(struct mlx5e_priv *priv) { + struct mlx5e_copy_addr_ctx ctx; struct mlx5e_eth_addr_hash_head head_free; struct mlx5e_eth_addr_hash_head head_uc; struct mlx5e_eth_addr_hash_head head_mc; struct mlx5e_eth_addr_hash_node *hn; struct ifnet *ifp = priv->ifp; - struct ifaddr *ifa; - struct ifmultiaddr *ifma; - bool success = false; size_t x; size_t num; PRIV_ASSERT_LOCKED(priv); +retry: LIST_INIT(&head_free); LIST_INIT(&head_uc); LIST_INIT(&head_mc); -retry: - num = 1; + num = 1 + if_lladdr_count(ifp) + if_llmaddr_count(ifp); - if_addr_rlock(ifp); - CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { - if (ifa->ifa_addr->sa_family != AF_LINK) - continue; - num++; - } - if_addr_runlock(ifp); - - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - num++; - } - if_maddr_runlock(ifp); - /* allocate place holders */ for (x = 0; x != num; x++) { hn = malloc(sizeof(*hn), M_MLX5EN, M_WAITOK | M_ZERO); @@ -834,38 +838,21 @@ retry: } hn = mlx5e_move_hn(&head_free, &head_uc); - if (hn == NULL) - goto cleanup; + MPASS(hn != NULL); ether_addr_copy(hn->ai.addr, LLADDR((struct sockaddr_dl *)(ifp->if_addr->ifa_addr))); - if_addr_rlock(ifp); - CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { - if (ifa->ifa_addr->sa_family != AF_LINK) - continue; - hn = mlx5e_move_hn(&head_free, &head_uc); - if (hn == NULL) - break; - ether_addr_copy(hn->ai.addr, - LLADDR((struct sockaddr_dl *)ifa->ifa_addr)); - } - if_addr_runlock(ifp); - if (ifa != NULL) + ctx.free = &head_free; + ctx.fill = &head_uc; + ctx.success = true; + if_foreach_lladdr(ifp, mlx5e_copy_addr, &ctx); + if (ctx.success == false) goto cleanup; - if_maddr_rlock(ifp); - CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - hn = mlx5e_move_hn(&head_free, &head_mc); - if (hn == NULL) - break; - ether_addr_copy(hn->ai.addr, - LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); - } - if_maddr_runlock(ifp); - if (ifma != NULL) + ctx.fill = &head_mc; + if_foreach_llmaddr(ifp, mlx5e_copy_addr, &ctx); + if (ctx.success == false) goto cleanup; /* insert L2 unicast addresses into hash list */ @@ -884,8 +871,6 @@ retry: continue; } - success = true; - cleanup: while ((hn = mlx5e_remove_hn(&head_uc)) != NULL) free(hn, M_MLX5EN); @@ -894,7 +879,7 @@ cleanup: while ((hn = mlx5e_remove_hn(&head_free)) != NULL) free(hn, M_MLX5EN); - if (success == false) + if (ctx.success == false) goto retry; }