From owner-svn-src-all@freebsd.org Sun Oct 4 00:40:31 2020 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 C83CB3F4E31; Sun, 4 Oct 2020 00:40:31 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C3lJH4tRSz41Xg; Sun, 4 Oct 2020 00:40:31 +0000 (UTC) (envelope-from kib@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 8AED91BE72; Sun, 4 Oct 2020 00:40:31 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0940eV03048363; Sun, 4 Oct 2020 00:40:31 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0940eSm7048346; Sun, 4 Oct 2020 00:40:28 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010040040.0940eSm7048346@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Sun, 4 Oct 2020 00:40:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366418 - stable/12/usr.bin/procstat X-SVN-Group: stable-12 X-SVN-Commit-Author: kib X-SVN-Commit-Paths: stable/12/usr.bin/procstat X-SVN-Commit-Revision: 366418 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.33 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: Sun, 04 Oct 2020 00:40:31 -0000 Author: kib Date: Sun Oct 4 00:40:28 2020 New Revision: 366418 URL: https://svnweb.freebsd.org/changeset/base/366418 Log: MFC r366210: Consistently use __FBSDID("FreeBSD") for ids in usr.bin/procstat. Modified: stable/12/usr.bin/procstat/procstat.c stable/12/usr.bin/procstat/procstat_args.c stable/12/usr.bin/procstat/procstat_auxv.c stable/12/usr.bin/procstat/procstat_basic.c stable/12/usr.bin/procstat/procstat_bin.c stable/12/usr.bin/procstat/procstat_cred.c stable/12/usr.bin/procstat/procstat_cs.c stable/12/usr.bin/procstat/procstat_files.c stable/12/usr.bin/procstat/procstat_kstack.c stable/12/usr.bin/procstat/procstat_ptlwpinfo.c stable/12/usr.bin/procstat/procstat_rlimit.c stable/12/usr.bin/procstat/procstat_sigs.c stable/12/usr.bin/procstat/procstat_threads.c stable/12/usr.bin/procstat/procstat_vm.c Directory Properties: stable/12/ (props changed) Modified: stable/12/usr.bin/procstat/procstat.c ============================================================================== --- stable/12/usr.bin/procstat/procstat.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat.c Sun Oct 4 00:40:28 2020 (r366418) @@ -26,9 +26,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_args.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_args.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_args.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_auxv.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_auxv.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_auxv.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_basic.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_basic.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_basic.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_bin.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_bin.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_bin.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_cred.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_cred.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_cred.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_cs.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_cs.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_cs.c Sun Oct 4 00:40:28 2020 (r366418) @@ -23,9 +23,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_files.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_files.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_files.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_kstack.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_kstack.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_kstack.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_ptlwpinfo.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_ptlwpinfo.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_ptlwpinfo.c Sun Oct 4 00:40:28 2020 (r366418) @@ -22,10 +22,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * */ - #include - __FBSDID("$FreeBSD$"); + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_rlimit.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_rlimit.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_rlimit.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_sigs.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_sigs.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_sigs.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_threads.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_threads.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_threads.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include Modified: stable/12/usr.bin/procstat/procstat_vm.c ============================================================================== --- stable/12/usr.bin/procstat/procstat_vm.c Sat Oct 3 23:17:29 2020 (r366417) +++ stable/12/usr.bin/procstat/procstat_vm.c Sun Oct 4 00:40:28 2020 (r366418) @@ -25,9 +25,10 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD$ */ + +#include +__FBSDID("$FreeBSD$"); #include #include From owner-svn-src-all@freebsd.org Sun Oct 4 01:39:30 2020 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 6C3163F5C65; Sun, 4 Oct 2020 01:39:30 +0000 (UTC) (envelope-from kevans@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C3mcL23pHz43V3; Sun, 4 Oct 2020 01:39:30 +0000 (UTC) (envelope-from kevans@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 2A2071CA0E; Sun, 4 Oct 2020 01:39:30 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0941dUrF085158; Sun, 4 Oct 2020 01:39:30 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0941dU13085157; Sun, 4 Oct 2020 01:39:30 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <202010040139.0941dU13085157@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Sun, 4 Oct 2020 01:39:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-releng@freebsd.org Subject: svn commit: r366419 - releng/12.2/sys/netgraph/bluetooth/include X-SVN-Group: releng X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: releng/12.2/sys/netgraph/bluetooth/include X-SVN-Commit-Revision: 366419 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.33 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: Sun, 04 Oct 2020 01:39:30 -0000 Author: kevans Date: Sun Oct 4 01:39:29 2020 New Revision: 366419 URL: https://svnweb.freebsd.org/changeset/base/366419 Log: MFS r366395: Fix Typo in ng_hci_le_connection_complete_ep struct. Approved by: re (gjb) Modified: releng/12.2/sys/netgraph/bluetooth/include/ng_hci.h Directory Properties: releng/12.2/ (props changed) Modified: releng/12.2/sys/netgraph/bluetooth/include/ng_hci.h ============================================================================== --- releng/12.2/sys/netgraph/bluetooth/include/ng_hci.h Sun Oct 4 00:40:28 2020 (r366418) +++ releng/12.2/sys/netgraph/bluetooth/include/ng_hci.h Sun Oct 4 01:39:29 2020 (r366419) @@ -1955,7 +1955,7 @@ typedef struct { u_int16_t interval; u_int8_t latency; u_int16_t supervision_timeout; - u_int8_t master_clock_accracy; + u_int8_t master_clock_accuracy; } __attribute__ ((packed)) ng_hci_le_connection_complete_ep; From owner-svn-src-all@freebsd.org Sun Oct 4 03:31:36 2020 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 410F83F8B64; Sun, 4 Oct 2020 03:31:36 +0000 (UTC) (envelope-from cy@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C3q5h0vHyz48Bs; Sun, 4 Oct 2020 03:31:36 +0000 (UTC) (envelope-from cy@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 0274D1DEB8; Sun, 4 Oct 2020 03:31:36 +0000 (UTC) (envelope-from cy@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0943VZ3v056801; Sun, 4 Oct 2020 03:31:35 GMT (envelope-from cy@FreeBSD.org) Received: (from cy@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0943VZHI056800; Sun, 4 Oct 2020 03:31:35 GMT (envelope-from cy@FreeBSD.org) Message-Id: <202010040331.0943VZHI056800@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cy set sender to cy@FreeBSD.org using -f From: Cy Schubert Date: Sun, 4 Oct 2020 03:31:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r366420 - in stable: 11/contrib/ipfilter/ipsend 12/contrib/ipfilter/ipsend X-SVN-Group: stable-11 X-SVN-Commit-Author: cy X-SVN-Commit-Paths: in stable: 11/contrib/ipfilter/ipsend 12/contrib/ipfilter/ipsend X-SVN-Commit-Revision: 366420 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.33 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: Sun, 04 Oct 2020 03:31:36 -0000 Author: cy Date: Sun Oct 4 03:31:35 2020 New Revision: 366420 URL: https://svnweb.freebsd.org/changeset/base/366420 Log: MFC r366202: Continuing the effort started in r343701, #ifdef cleanup, remove never to be used again checks. Modified: stable/11/contrib/ipfilter/ipsend/iptests.c Directory Properties: stable/11/ (props changed) Changes in other areas also in this revision: Modified: stable/12/contrib/ipfilter/ipsend/iptests.c Directory Properties: stable/12/ (props changed) Modified: stable/11/contrib/ipfilter/ipsend/iptests.c ============================================================================== --- stable/11/contrib/ipfilter/ipsend/iptests.c Sun Oct 4 01:39:29 2020 (r366419) +++ stable/11/contrib/ipfilter/ipsend/iptests.c Sun Oct 4 03:31:35 2020 (r366420) @@ -27,7 +27,7 @@ typedef int boolean_t; # endif # define _KERNEL # define KERNEL -# if !defined(solaris) && !defined(linux) && !defined(__sgi) && !defined(hpux) +# if !defined(solaris) # include # else # ifdef solaris From owner-svn-src-all@freebsd.org Sun Oct 4 03:31:36 2020 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 927303F8D92; Sun, 4 Oct 2020 03:31:36 +0000 (UTC) (envelope-from cy@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C3q5h3Ljpz48kn; Sun, 4 Oct 2020 03:31:36 +0000 (UTC) (envelope-from cy@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 579E51DC60; Sun, 4 Oct 2020 03:31:36 +0000 (UTC) (envelope-from cy@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0943VanB056807; Sun, 4 Oct 2020 03:31:36 GMT (envelope-from cy@FreeBSD.org) Received: (from cy@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0943Vanp056806; Sun, 4 Oct 2020 03:31:36 GMT (envelope-from cy@FreeBSD.org) Message-Id: <202010040331.0943Vanp056806@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cy set sender to cy@FreeBSD.org using -f From: Cy Schubert Date: Sun, 4 Oct 2020 03:31:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366420 - in stable: 11/contrib/ipfilter/ipsend 12/contrib/ipfilter/ipsend X-SVN-Group: stable-12 X-SVN-Commit-Author: cy X-SVN-Commit-Paths: in stable: 11/contrib/ipfilter/ipsend 12/contrib/ipfilter/ipsend X-SVN-Commit-Revision: 366420 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.33 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: Sun, 04 Oct 2020 03:31:36 -0000 Author: cy Date: Sun Oct 4 03:31:35 2020 New Revision: 366420 URL: https://svnweb.freebsd.org/changeset/base/366420 Log: MFC r366202: Continuing the effort started in r343701, #ifdef cleanup, remove never to be used again checks. Modified: stable/12/contrib/ipfilter/ipsend/iptests.c Directory Properties: stable/12/ (props changed) Changes in other areas also in this revision: Modified: stable/11/contrib/ipfilter/ipsend/iptests.c Directory Properties: stable/11/ (props changed) Modified: stable/12/contrib/ipfilter/ipsend/iptests.c ============================================================================== --- stable/12/contrib/ipfilter/ipsend/iptests.c Sun Oct 4 01:39:29 2020 (r366419) +++ stable/12/contrib/ipfilter/ipsend/iptests.c Sun Oct 4 03:31:35 2020 (r366420) @@ -27,7 +27,7 @@ typedef int boolean_t; # endif # define _KERNEL # define KERNEL -# if !defined(solaris) && !defined(linux) && !defined(__sgi) && !defined(hpux) +# if !defined(solaris) # include # else # ifdef solaris From owner-svn-src-all@freebsd.org Sun Oct 4 03:33:05 2020 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 B7C293F8C3D; Sun, 4 Oct 2020 03:33:05 +0000 (UTC) (envelope-from cy@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C3q7P4TR2z49Fm; Sun, 4 Oct 2020 03:33:05 +0000 (UTC) (envelope-from cy@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 7B2821DC6E; Sun, 4 Oct 2020 03:33:05 +0000 (UTC) (envelope-from cy@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0943X531059415; Sun, 4 Oct 2020 03:33:05 GMT (envelope-from cy@FreeBSD.org) Received: (from cy@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0943X5Nt059414; Sun, 4 Oct 2020 03:33:05 GMT (envelope-from cy@FreeBSD.org) Message-Id: <202010040333.0943X5Nt059414@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cy set sender to cy@FreeBSD.org using -f From: Cy Schubert Date: Sun, 4 Oct 2020 03:33:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r366421 - in stable: 11/contrib/ipfilter/ipsend 12/contrib/ipfilter/ipsend X-SVN-Group: stable-11 X-SVN-Commit-Author: cy X-SVN-Commit-Paths: in stable: 11/contrib/ipfilter/ipsend 12/contrib/ipfilter/ipsend X-SVN-Commit-Revision: 366421 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.33 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: Sun, 04 Oct 2020 03:33:05 -0000 Author: cy Date: Sun Oct 4 03:33:05 2020 New Revision: 366421 URL: https://svnweb.freebsd.org/changeset/base/366421 Log: MFC r366203: Remove Linux and IRIX specific files. Deleted: stable/11/contrib/ipfilter/ipsend/larp.c stable/11/contrib/ipfilter/ipsend/linux.h stable/11/contrib/ipfilter/ipsend/lsock.c stable/11/contrib/ipfilter/ipsend/sirix.c stable/11/contrib/ipfilter/ipsend/slinux.c Modified: Directory Properties: stable/11/ (props changed) Changes in other areas also in this revision: Deleted: stable/12/contrib/ipfilter/ipsend/larp.c stable/12/contrib/ipfilter/ipsend/linux.h stable/12/contrib/ipfilter/ipsend/lsock.c stable/12/contrib/ipfilter/ipsend/sirix.c stable/12/contrib/ipfilter/ipsend/slinux.c Modified: Directory Properties: stable/12/ (props changed) From owner-svn-src-all@freebsd.org Sun Oct 4 03:33:06 2020 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 16CF03F8C42; Sun, 4 Oct 2020 03:33:06 +0000 (UTC) (envelope-from cy@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C3q7P6jH4z482X; Sun, 4 Oct 2020 03:33:05 +0000 (UTC) (envelope-from cy@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 C94521DC6F; Sun, 4 Oct 2020 03:33:05 +0000 (UTC) (envelope-from cy@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0943X5sr059420; Sun, 4 Oct 2020 03:33:05 GMT (envelope-from cy@FreeBSD.org) Received: (from cy@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0943X5p5059419; Sun, 4 Oct 2020 03:33:05 GMT (envelope-from cy@FreeBSD.org) Message-Id: <202010040333.0943X5p5059419@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cy set sender to cy@FreeBSD.org using -f From: Cy Schubert Date: Sun, 4 Oct 2020 03:33:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366421 - in stable: 11/contrib/ipfilter/ipsend 12/contrib/ipfilter/ipsend X-SVN-Group: stable-12 X-SVN-Commit-Author: cy X-SVN-Commit-Paths: in stable: 11/contrib/ipfilter/ipsend 12/contrib/ipfilter/ipsend X-SVN-Commit-Revision: 366421 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.33 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: Sun, 04 Oct 2020 03:33:06 -0000 Author: cy Date: Sun Oct 4 03:33:05 2020 New Revision: 366421 URL: https://svnweb.freebsd.org/changeset/base/366421 Log: MFC r366203: Remove Linux and IRIX specific files. Deleted: stable/12/contrib/ipfilter/ipsend/larp.c stable/12/contrib/ipfilter/ipsend/linux.h stable/12/contrib/ipfilter/ipsend/lsock.c stable/12/contrib/ipfilter/ipsend/sirix.c stable/12/contrib/ipfilter/ipsend/slinux.c Modified: Directory Properties: stable/12/ (props changed) Changes in other areas also in this revision: Deleted: stable/11/contrib/ipfilter/ipsend/larp.c stable/11/contrib/ipfilter/ipsend/linux.h stable/11/contrib/ipfilter/ipsend/lsock.c stable/11/contrib/ipfilter/ipsend/sirix.c stable/11/contrib/ipfilter/ipsend/slinux.c Modified: Directory Properties: stable/11/ (props changed) From owner-svn-src-all@freebsd.org Sun Oct 4 06:12:53 2020 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 126643FC20B; Sun, 4 Oct 2020 06:12:53 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C3tgm6n0Bz4HhW; Sun, 4 Oct 2020 06:12:52 +0000 (UTC) (envelope-from imp@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 CBFE71FE32; Sun, 4 Oct 2020 06:12:52 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0946CqlI056987; Sun, 4 Oct 2020 06:12:52 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0946Cqvk056985; Sun, 4 Oct 2020 06:12:52 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010040612.0946Cqvk056985@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Sun, 4 Oct 2020 06:12:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366422 - stable/12/stand/lua X-SVN-Group: stable-12 X-SVN-Commit-Author: imp X-SVN-Commit-Paths: stable/12/stand/lua X-SVN-Commit-Revision: 366422 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.33 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: Sun, 04 Oct 2020 06:12:53 -0000 Author: imp Date: Sun Oct 4 06:12:52 2020 New Revision: 366422 URL: https://svnweb.freebsd.org/changeset/base/366422 Log: MFC: r366228 Report the kernel console on the boot screen Report what console the boot loader is telling the kernel to use: o Dual (Serial Primary) o Dual (Video Primary) o Serial o Video and allow toggling between them. Modified: stable/12/stand/lua/core.lua stable/12/stand/lua/menu.lua Directory Properties: stable/12/ (props changed) Modified: stable/12/stand/lua/core.lua ============================================================================== --- stable/12/stand/lua/core.lua Sun Oct 4 03:33:05 2020 (r366421) +++ stable/12/stand/lua/core.lua Sun Oct 4 06:12:52 2020 (r366422) @@ -410,6 +410,40 @@ function core.popFrontTable(tbl) return first_value, new_tbl end +function core.getConsoleName() + if loader.getenv("boot_multicons") ~= nil then + if loader.getenv("boot_serial") ~= nil then + return "Dual (Serial primary)" + else + return "Dual (Video primary)" + end + else + if loader.getenv("boot_serial") ~= nil then + return "Serial" + else + return "Video" + end + end +end + +function core.nextConsoleChoice() + if loader.getenv("boot_multicons") ~= nil then + if loader.getenv("boot_serial") ~= nil then + loader.unsetenv("boot_serial") + else + loader.unsetenv("boot_multicons") + loader.setenv("boot_serial", "YES") + end + else + if loader.getenv("boot_serial") ~= nil then + loader.unsetenv("boot_serial") + else + loader.setenv("boot_multicons", "YES") + loader.setenv("boot_serial", "YES") + end + end +end + recordDefaults() hook.register("config.reloaded", core.clearCachedKernels) return core Modified: stable/12/stand/lua/menu.lua ============================================================================== --- stable/12/stand/lua/menu.lua Sun Oct 4 03:33:05 2020 (r366421) +++ stable/12/stand/lua/menu.lua Sun Oct 4 06:12:52 2020 (r366422) @@ -241,6 +241,7 @@ menu.welcome = { boot_entry_2, menu_entries.prompt, menu_entries.reboot, + menu_entries.console, { entry_type = core.MENU_SEPARATOR, }, @@ -279,6 +280,16 @@ menu.welcome = { core.boot() end, alias = {"s", "S"}, + }, + console = { + entry_type = core.MENU_ENTRY, + name = function() + return color.highlight("C") .. "ons: " .. core.getConsoleName() + end, + func = function() + core.nextConsoleChoice() + end, + alias = {"c", "C"}, }, prompt = { entry_type = core.MENU_RETURN, From owner-svn-src-all@freebsd.org Sun Oct 4 06:14:52 2020 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 1416A3FBEF6; Sun, 4 Oct 2020 06:14:52 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C3tk36sRGz4J18; Sun, 4 Oct 2020 06:14:51 +0000 (UTC) (envelope-from imp@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 CF46D1FC35; Sun, 4 Oct 2020 06:14:51 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0946Eped057120; Sun, 4 Oct 2020 06:14:51 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0946EpwX057119; Sun, 4 Oct 2020 06:14:51 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010040614.0946EpwX057119@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Sun, 4 Oct 2020 06:14:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366423 - stable/12/sys/kern X-SVN-Group: stable-12 X-SVN-Commit-Author: imp X-SVN-Commit-Paths: stable/12/sys/kern X-SVN-Commit-Revision: 366423 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.33 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: Sun, 04 Oct 2020 06:14:52 -0000 Author: imp Date: Sun Oct 4 06:14:51 2020 New Revision: 366423 URL: https://svnweb.freebsd.org/changeset/base/366423 Log: MFC: r366229 For mulitcons boot, report it and which console is primary Until we can do proper /etc/rc output on both consoles in multicons boot (or all of them if we ever generalize), report when we are booting multicons. Also report the primary console. This will be a big hint why output stops after this line (though some slow USB discovery still happens after mountroot / init starts). Reviewed by: scottl@, tsoome@ Differential Revision: https://reviews.freebsd.org/D26574 Modified: stable/12/sys/kern/init_main.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/kern/init_main.c ============================================================================== --- stable/12/sys/kern/init_main.c Sun Oct 4 06:12:52 2020 (r366422) +++ stable/12/sys/kern/init_main.c Sun Oct 4 06:14:51 2020 (r366423) @@ -743,6 +743,14 @@ start_init(void *dummy) p->p_vmspace->vm_maxsaddr = (caddr_t)addr; p->p_vmspace->vm_ssize = 1; + /* For Multicons, report which console is primary to both */ + if (boothowto & RB_MULTIPLE) { + if (boothowto & RB_SERIAL) + printf("Dual Console: Serial Primary, Video Secondary\n"); + else + printf("Dual Console: Video Primary, Serial Secondary\n"); + } + if ((var = kern_getenv("init_path")) != NULL) { strlcpy(init_path, var, sizeof(init_path)); freeenv(var); @@ -753,7 +761,7 @@ start_init(void *dummy) pathlen = strlen(path) + 1; if (bootverbose) printf("start_init: trying %s\n", path); - + /* * Move out the boot flag argument. */ From owner-svn-src-all@freebsd.org Sun Oct 4 13:24:59 2020 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 DF7ED42880B; Sun, 4 Oct 2020 13:24:59 +0000 (UTC) (envelope-from melifaro@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C44GM5dBXz4g5Z; Sun, 4 Oct 2020 13:24:59 +0000 (UTC) (envelope-from melifaro@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 A443A24EAB; Sun, 4 Oct 2020 13:24:59 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094DOxOj023168; Sun, 4 Oct 2020 13:24:59 GMT (envelope-from melifaro@FreeBSD.org) Received: (from melifaro@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094DOwRj023164; Sun, 4 Oct 2020 13:24:58 GMT (envelope-from melifaro@FreeBSD.org) Message-Id: <202010041324.094DOwRj023164@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: melifaro set sender to melifaro@FreeBSD.org using -f From: "Alexander V. Chernikov" Date: Sun, 4 Oct 2020 13:24:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366424 - in head: sys/net sys/net/route tests/sys/net/routing X-SVN-Group: head X-SVN-Commit-Author: melifaro X-SVN-Commit-Paths: in head: sys/net sys/net/route tests/sys/net/routing X-SVN-Commit-Revision: 366424 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.33 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: Sun, 04 Oct 2020 13:24:59 -0000 Author: melifaro Date: Sun Oct 4 13:24:58 2020 New Revision: 366424 URL: https://svnweb.freebsd.org/changeset/base/366424 Log: Fix route flags update during RTM_CHANGE. Nexthop lookup was not consireding rt_flags when doing structure comparison, which lead to an original nexthop selection when changing flags. Fix the case by adding rt_flags field into comparison and rearranging nhop_priv fields to allow for efficient matching. Fix `route change X/Y flags` case - recent changes disallowed specifying RTF_GATEWAY flag without actual gateway. It turns out, route(8) fills in RTF_GATEWAY by default, unless -interface flag is specified. Fix regression by clearing RTF_GATEWAY flag instead of failing. Fix route flag reporting in RTM_CHANGE messages by explicitly updating rtm_flags after operation competion. Add IPv4/IPv6 tests for flag-only route changes. Modified: head/sys/net/route/nhop_ctl.c head/sys/net/route/nhop_var.h head/sys/net/route/route_ctl.c head/sys/net/rtsock.c head/tests/sys/net/routing/test_rtsock_l3.c Modified: head/sys/net/route/nhop_ctl.c ============================================================================== --- head/sys/net/route/nhop_ctl.c Sun Oct 4 06:14:51 2020 (r366423) +++ head/sys/net/route/nhop_ctl.c Sun Oct 4 13:24:58 2020 (r366424) @@ -164,8 +164,7 @@ cmp_priv(const struct nhop_priv *_one, const struct nh if (memcmp(_one->nh, _two->nh, NHOP_END_CMP) != 0) return (0); - if ((_one->nh_type != _two->nh_type) || - (_one->nh_family != _two->nh_family)) + if (memcmp(_one, _two, NH_PRIV_END_CMP) != 0) return (0); return (1); Modified: head/sys/net/route/nhop_var.h ============================================================================== --- head/sys/net/route/nhop_var.h Sun Oct 4 06:14:51 2020 (r366423) +++ head/sys/net/route/nhop_var.h Sun Oct 4 13:24:58 2020 (r366424) @@ -74,19 +74,24 @@ struct nh_control { /* Control plane-only nhop data */ struct nhop_object; struct nhop_priv { - uint32_t nh_idx; /* nexthop index */ + /* nhop lookup comparison start */ uint8_t nh_family; /* address family of the lookup */ + uint8_t spare; uint16_t nh_type; /* nexthop type */ + uint32_t rt_flags; /* routing flags for the control plane */ + /* nhop lookup comparison end */ + uint32_t nh_idx; /* nexthop index */ void *cb_func; /* function handling additional rewrite caps */ u_int nh_refcnt; /* number of references, refcount(9) */ u_int nh_linked; /* refcount(9), == 2 if linked to the list */ - int rt_flags; /* routing flags for the control plane */ struct nhop_object *nh; /* backreference to the dataplane nhop */ struct nh_control *nh_control; /* backreference to the rnh */ struct nhop_priv *nh_next; /* hash table membership */ struct vnet *nh_vnet; /* vnet nhop belongs to */ struct epoch_context nh_epoch_ctx; /* epoch data for nhop */ }; + +#define NH_PRIV_END_CMP (__offsetof(struct nhop_priv, nh_idx)) #define NH_IS_PINNED(_nh) ((!NH_IS_NHGRP(_nh)) && \ ((_nh)->nh_priv->rt_flags & RTF_PINNED)) Modified: head/sys/net/route/route_ctl.c ============================================================================== --- head/sys/net/route/route_ctl.c Sun Oct 4 06:14:51 2020 (r366423) +++ head/sys/net/route/route_ctl.c Sun Oct 4 13:24:58 2020 (r366424) @@ -733,8 +733,15 @@ rib_change_route(uint32_t fibnum, struct rt_addrinfo * /* Check if updated gateway exists */ if ((info->rti_flags & RTF_GATEWAY) && - (info->rti_info[RTAX_GATEWAY] == NULL)) - return (EINVAL); + (info->rti_info[RTAX_GATEWAY] == NULL)) { + + /* + * route(8) adds RTF_GATEWAY flag if -interface is not set. + * Remove RTF_GATEWAY to enforce consistency and maintain + * compatibility.. + */ + info->rti_flags &= ~RTF_GATEWAY; + } /* * route change is done in multiple steps, with dropping and Modified: head/sys/net/rtsock.c ============================================================================== --- head/sys/net/rtsock.c Sun Oct 4 06:14:51 2020 (r366423) +++ head/sys/net/rtsock.c Sun Oct 4 13:24:58 2020 (r366424) @@ -965,6 +965,7 @@ route_output(struct mbuf *m, struct socket *so, ...) #endif nh = rc.rc_nh_new; rtm->rtm_index = nh->nh_ifp->if_index; + rtm->rtm_flags = rc.rc_rt->rte_flags | nhop_get_rtflags(nh); } break; Modified: head/tests/sys/net/routing/test_rtsock_l3.c ============================================================================== --- head/tests/sys/net/routing/test_rtsock_l3.c Sun Oct 4 06:14:51 2020 (r366423) +++ head/tests/sys/net/routing/test_rtsock_l3.c Sun Oct 4 13:24:58 2020 (r366424) @@ -431,8 +431,8 @@ ATF_TC_BODY(rtm_add_v4_gw_direct_success, tc) verify_route_message(rtm, RTM_ADD, (struct sockaddr *)&net4, (struct sockaddr *)&mask4, (struct sockaddr *)&gw4); - /* XXX: Currently kernel sets RTF_UP automatically but does NOT report it in the reply */ - verify_route_message_extra(rtm, c->ifindex, RTF_DONE | RTF_GATEWAY | RTF_STATIC); + verify_route_message_extra(rtm, c->ifindex, + RTF_UP | RTF_DONE | RTF_GATEWAY | RTF_STATIC); } ATF_TC_CLEANUP(rtm_add_v4_gw_direct_success, tc) @@ -568,7 +568,7 @@ ATF_TC_BODY(rtm_change_v4_gw_success, tc) (struct sockaddr *)&mask4, (struct sockaddr *)&gw4); verify_route_message_extra(rtm, if_nametoindex(c->ifnames[1]), - RTF_DONE | RTF_GATEWAY | RTF_STATIC); + RTF_UP | RTF_DONE | RTF_GATEWAY | RTF_STATIC); /* Verify the change has actually taken place */ prepare_route_message(rtm, RTM_GET, (struct sockaddr *)&net4, @@ -591,7 +591,7 @@ ATF_TC_BODY(rtm_change_v4_gw_success, tc) } RTM_DECLARE_ROOT_TEST(rtm_change_v4_mtu_success, - "Tests IPv4 path mtu change"); + "Tests IPv4 path mtu change"); ATF_TC_BODY(rtm_change_v4_mtu_success, tc) { @@ -639,7 +639,56 @@ ATF_TC_BODY(rtm_change_v4_mtu_success, tc) "expected mtu: %lu, got %lu", test_mtu, rtm->rtm_rmx.rmx_mtu); } +RTM_DECLARE_ROOT_TEST(rtm_change_v4_flags_success, + "Tests IPv4 path flags change"); +ATF_TC_BODY(rtm_change_v4_flags_success, tc) +{ + DECLARE_TEST_VARS; + + uint32_t test_flags = RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_STATIC; + uint32_t desired_flags; + + c = presetup_ipv4(tc); + + /* Create IPv4 subnetwork with smaller prefix */ + struct sockaddr_in mask4; + struct sockaddr_in net4; + struct sockaddr_in gw4; + prepare_v4_network(c, &net4, &mask4, &gw4); + + prepare_route_message(rtm, RTM_ADD, (struct sockaddr *)&net4, + (struct sockaddr *)&mask4, (struct sockaddr *)&gw4); + + /* Set test flags during route addition */ + desired_flags = RTF_UP | RTF_DONE | RTF_GATEWAY | test_flags; + rtm->rtm_flags |= test_flags; + rtsock_send_rtm(c->rtsock_fd, rtm); + rtm = rtsock_read_rtm_reply(c->rtsock_fd, buffer, sizeof(buffer), rtm->rtm_seq); + + /* Change flags */ + prepare_route_message(rtm, RTM_CHANGE, (struct sockaddr *)&net4, + (struct sockaddr *)&mask4, NULL); + rtm->rtm_flags &= ~test_flags; + desired_flags &= ~test_flags; + + rtsock_send_rtm(c->rtsock_fd, rtm); + rtm = rtsock_read_rtm_reply(c->rtsock_fd, buffer, sizeof(buffer), rtm->rtm_seq); + + /* Verify updated flags */ + verify_route_message_extra(rtm, c->ifindex, desired_flags | RTF_DONE); + + /* Verify the change has actually taken place */ + prepare_route_message(rtm, RTM_GET, (struct sockaddr *)&net4, + (struct sockaddr *)&mask4, NULL); + + rtsock_send_rtm(c->rtsock_fd, rtm); + rtm = rtsock_read_rtm_reply(c->rtsock_fd, buffer, sizeof(buffer), rtm->rtm_seq); + + verify_route_message_extra(rtm, c->ifindex, desired_flags | RTF_DONE); +} + + ATF_TC_WITH_CLEANUP(rtm_add_v6_gu_gw_gu_direct_success); ATF_TC_HEAD(rtm_add_v6_gu_gw_gu_direct_success, tc) { @@ -674,8 +723,8 @@ ATF_TC_BODY(rtm_add_v6_gu_gw_gu_direct_success, tc) verify_route_message(rtm, RTM_ADD, (struct sockaddr *)&net6, (struct sockaddr *)&mask6, (struct sockaddr *)&gw6); - /* XXX: Currently kernel sets RTF_UP automatically but does NOT report it in the reply */ - verify_route_message_extra(rtm, c->ifindex, RTF_DONE | RTF_GATEWAY | RTF_STATIC); + verify_route_message_extra(rtm, c->ifindex, + RTF_UP | RTF_DONE | RTF_GATEWAY | RTF_STATIC); } ATF_TC_CLEANUP(rtm_add_v6_gu_gw_gu_direct_success, tc) @@ -791,7 +840,7 @@ ATF_TC_BODY(rtm_change_v6_gw_success, tc) (struct sockaddr *)&mask6, (struct sockaddr *)&gw6); verify_route_message_extra(rtm, if_nametoindex(c->ifnames[1]), - RTF_DONE | RTF_GATEWAY | RTF_STATIC); + RTF_UP | RTF_DONE | RTF_GATEWAY | RTF_STATIC); /* Verify the change has actually taken place */ prepare_route_message(rtm, RTM_GET, (struct sockaddr *)&net6, @@ -862,6 +911,55 @@ ATF_TC_BODY(rtm_change_v6_mtu_success, tc) "expected mtu: %lu, got %lu", test_mtu, rtm->rtm_rmx.rmx_mtu); } +RTM_DECLARE_ROOT_TEST(rtm_change_v6_flags_success, + "Tests IPv6 path flags change"); + +ATF_TC_BODY(rtm_change_v6_flags_success, tc) +{ + DECLARE_TEST_VARS; + + uint32_t test_flags = RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_STATIC; + uint32_t desired_flags; + + c = presetup_ipv6(tc); + + /* Create IPv6 subnetwork with smaller prefix */ + struct sockaddr_in6 mask6; + struct sockaddr_in6 net6; + struct sockaddr_in6 gw6; + prepare_v6_network(c, &net6, &mask6, &gw6); + + prepare_route_message(rtm, RTM_ADD, (struct sockaddr *)&net6, + (struct sockaddr *)&mask6, (struct sockaddr *)&gw6); + + /* Set test flags during route addition */ + desired_flags = RTF_UP | RTF_DONE | RTF_GATEWAY | test_flags; + rtm->rtm_flags |= test_flags; + rtsock_send_rtm(c->rtsock_fd, rtm); + rtm = rtsock_read_rtm_reply(c->rtsock_fd, buffer, sizeof(buffer), rtm->rtm_seq); + + /* Change flags */ + prepare_route_message(rtm, RTM_CHANGE, (struct sockaddr *)&net6, + (struct sockaddr *)&mask6, NULL); + rtm->rtm_flags &= ~test_flags; + desired_flags &= ~test_flags; + + rtsock_send_rtm(c->rtsock_fd, rtm); + rtm = rtsock_read_rtm_reply(c->rtsock_fd, buffer, sizeof(buffer), rtm->rtm_seq); + + /* Verify updated flags */ + verify_route_message_extra(rtm, c->ifindex, desired_flags | RTF_DONE); + + /* Verify the change has actually taken place */ + prepare_route_message(rtm, RTM_GET, (struct sockaddr *)&net6, + (struct sockaddr *)&mask6, NULL); + + rtsock_send_rtm(c->rtsock_fd, rtm); + rtm = rtsock_read_rtm_reply(c->rtsock_fd, buffer, sizeof(buffer), rtm->rtm_seq); + + verify_route_message_extra(rtm, c->ifindex, desired_flags | RTF_DONE); +} + ATF_TC_WITH_CLEANUP(rtm_add_v4_temporal1_success); ATF_TC_HEAD(rtm_add_v4_temporal1_success, tc) { @@ -900,7 +998,8 @@ ATF_TC_BODY(rtm_add_v4_temporal1_success, tc) verify_route_message(rtm, RTM_DELETE, (struct sockaddr *)&net4, (struct sockaddr *)&mask4, (struct sockaddr *)&gw4); - verify_route_message_extra(rtm, c->ifindex, RTF_GATEWAY | RTF_DONE | RTF_STATIC); + verify_route_message_extra(rtm, c->ifindex, + RTF_DONE | RTF_GATEWAY | RTF_STATIC); } ATF_TC_CLEANUP(rtm_add_v4_temporal1_success, tc) @@ -946,9 +1045,8 @@ ATF_TC_BODY(rtm_add_v6_temporal1_success, tc) verify_route_message(rtm, RTM_DELETE, (struct sockaddr *)&net6, (struct sockaddr *)&mask6, (struct sockaddr *)&gw6); - - /* XXX: Currently kernel sets RTF_UP automatically but does NOT report it in the reply */ - verify_route_message_extra(rtm, c->ifindex, RTF_GATEWAY | RTF_DONE | RTF_STATIC); + verify_route_message_extra(rtm, c->ifindex, + RTF_DONE | RTF_GATEWAY | RTF_STATIC); } ATF_TC_CLEANUP(rtm_add_v6_temporal1_success, tc) @@ -1299,8 +1397,10 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, rtm_del_v6_gu_prefix_nogw_success); ATF_TP_ADD_TC(tp, rtm_change_v4_gw_success); ATF_TP_ADD_TC(tp, rtm_change_v4_mtu_success); + ATF_TP_ADD_TC(tp, rtm_change_v4_flags_success); ATF_TP_ADD_TC(tp, rtm_change_v6_gw_success); ATF_TP_ADD_TC(tp, rtm_change_v6_mtu_success); + ATF_TP_ADD_TC(tp, rtm_change_v6_flags_success); /* ifaddr tests */ ATF_TP_ADD_TC(tp, rtm_add_v6_gu_ifa_hostroute_success); ATF_TP_ADD_TC(tp, rtm_add_v6_gu_ifa_prefixroute_success); From owner-svn-src-all@freebsd.org Sun Oct 4 15:22:15 2020 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 230AB42B276; Sun, 4 Oct 2020 15:22:15 +0000 (UTC) (envelope-from tuexen@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C46sg0BCQz3bxL; Sun, 4 Oct 2020 15:22:15 +0000 (UTC) (envelope-from tuexen@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 DF1B626788; Sun, 4 Oct 2020 15:22:14 +0000 (UTC) (envelope-from tuexen@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094FMEZb001738; Sun, 4 Oct 2020 15:22:14 GMT (envelope-from tuexen@FreeBSD.org) Received: (from tuexen@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094FMEAh001737; Sun, 4 Oct 2020 15:22:14 GMT (envelope-from tuexen@FreeBSD.org) Message-Id: <202010041522.094FMEAh001737@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tuexen set sender to tuexen@FreeBSD.org using -f From: Michael Tuexen Date: Sun, 4 Oct 2020 15:22:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366425 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: tuexen X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366425 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.33 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: Sun, 04 Oct 2020 15:22:15 -0000 Author: tuexen Date: Sun Oct 4 15:22:14 2020 New Revision: 366425 URL: https://svnweb.freebsd.org/changeset/base/366425 Log: Cleanup, no functional change intended. MFC after: 3 days Modified: head/sys/netinet/sctp_indata.c Modified: head/sys/netinet/sctp_indata.c ============================================================================== --- head/sys/netinet/sctp_indata.c Sun Oct 4 13:24:58 2020 (r366424) +++ head/sys/netinet/sctp_indata.c Sun Oct 4 15:22:14 2020 (r366425) @@ -285,17 +285,15 @@ sctp_build_ctl_nchunk(struct sctp_inpcb *inp, struct s static void sctp_mark_non_revokable(struct sctp_association *asoc, uint32_t tsn) { - uint32_t gap, i, cumackp1; - int fnd = 0; - int in_r = 0, in_nr = 0; + uint32_t gap, i; + int in_r, in_nr; if (SCTP_BASE_SYSCTL(sctp_do_drain) == 0) { return; } - cumackp1 = asoc->cumulative_tsn + 1; - if (SCTP_TSN_GT(cumackp1, tsn)) { + if (SCTP_TSN_GE(asoc->cumulative_tsn, tsn)) { /* - * this tsn is behind the cum ack and thus we don't need to + * This tsn is behind the cum ack and thus we don't need to * worry about it being moved from one to the other. */ return; @@ -303,33 +301,27 @@ sctp_mark_non_revokable(struct sctp_association *asoc, SCTP_CALC_TSN_TO_GAP(gap, tsn, asoc->mapping_array_base_tsn); in_r = SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap); in_nr = SCTP_IS_TSN_PRESENT(asoc->nr_mapping_array, gap); - if ((in_r == 0) && (in_nr == 0)) { -#ifdef INVARIANTS - panic("Things are really messed up now"); -#else - SCTP_PRINTF("gap:%x tsn:%x\n", gap, tsn); - sctp_print_mapping_array(asoc); -#endif - } - if (in_nr == 0) + KASSERT(in_r || in_nr, ("%s: Things are really messed up now", __FUNCTION__)); + if (!in_nr) { SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, gap); - if (in_r) - SCTP_UNSET_TSN_PRESENT(asoc->mapping_array, gap); - if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) { - asoc->highest_tsn_inside_nr_map = tsn; + if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) { + asoc->highest_tsn_inside_nr_map = tsn; + } } - if (tsn == asoc->highest_tsn_inside_map) { - /* We must back down to see what the new highest is */ - for (i = tsn - 1; SCTP_TSN_GE(i, asoc->mapping_array_base_tsn); i--) { - SCTP_CALC_TSN_TO_GAP(gap, i, asoc->mapping_array_base_tsn); - if (SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap)) { - asoc->highest_tsn_inside_map = i; - fnd = 1; - break; + if (in_r) { + SCTP_UNSET_TSN_PRESENT(asoc->mapping_array, gap); + if (tsn == asoc->highest_tsn_inside_map) { + /* We must back down to see what the new highest is. */ + for (i = tsn - 1; SCTP_TSN_GE(i, asoc->mapping_array_base_tsn); i--) { + SCTP_CALC_TSN_TO_GAP(gap, i, asoc->mapping_array_base_tsn); + if (SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap)) { + asoc->highest_tsn_inside_map = i; + break; + } } - } - if (!fnd) { - asoc->highest_tsn_inside_map = asoc->mapping_array_base_tsn - 1; + if (!SCTP_TSN_GE(i, asoc->mapping_array_base_tsn)) { + asoc->highest_tsn_inside_map = asoc->mapping_array_base_tsn - 1; + } } } } From owner-svn-src-all@freebsd.org Sun Oct 4 15:37:35 2020 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 BB5C842BBA9; Sun, 4 Oct 2020 15:37:35 +0000 (UTC) (envelope-from tuexen@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C47CM4Vljz3cv7; Sun, 4 Oct 2020 15:37:35 +0000 (UTC) (envelope-from tuexen@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 7F3BF267B3; Sun, 4 Oct 2020 15:37:35 +0000 (UTC) (envelope-from tuexen@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094FbZNV008152; Sun, 4 Oct 2020 15:37:35 GMT (envelope-from tuexen@FreeBSD.org) Received: (from tuexen@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094FbZWK008151; Sun, 4 Oct 2020 15:37:35 GMT (envelope-from tuexen@FreeBSD.org) Message-Id: <202010041537.094FbZWK008151@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tuexen set sender to tuexen@FreeBSD.org using -f From: Michael Tuexen Date: Sun, 4 Oct 2020 15:37:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366426 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: tuexen X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366426 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.33 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: Sun, 04 Oct 2020 15:37:35 -0000 Author: tuexen Date: Sun Oct 4 15:37:34 2020 New Revision: 366426 URL: https://svnweb.freebsd.org/changeset/base/366426 Log: Use __func__ instead of __FUNCTION__ for consistency. MFC after: 3 days Modified: head/sys/netinet/sctp_bsd_addr.c head/sys/netinet/sctp_indata.c Modified: head/sys/netinet/sctp_bsd_addr.c ============================================================================== --- head/sys/netinet/sctp_bsd_addr.c Sun Oct 4 15:22:14 2020 (r366425) +++ head/sys/netinet/sctp_bsd_addr.c Sun Oct 4 15:37:34 2020 (r366426) @@ -373,7 +373,7 @@ sctp_get_mbuf_for_msg(unsigned int space_needed, int w m_freem(m); return (NULL); } - KASSERT(SCTP_BUF_NEXT(m) == NULL, ("%s: no chain allowed", __FUNCTION__)); + KASSERT(SCTP_BUF_NEXT(m) == NULL, ("%s: no chain allowed", __func__)); } #ifdef SCTP_MBUF_LOGGING if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) { Modified: head/sys/netinet/sctp_indata.c ============================================================================== --- head/sys/netinet/sctp_indata.c Sun Oct 4 15:22:14 2020 (r366425) +++ head/sys/netinet/sctp_indata.c Sun Oct 4 15:37:34 2020 (r366426) @@ -301,7 +301,7 @@ sctp_mark_non_revokable(struct sctp_association *asoc, SCTP_CALC_TSN_TO_GAP(gap, tsn, asoc->mapping_array_base_tsn); in_r = SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap); in_nr = SCTP_IS_TSN_PRESENT(asoc->nr_mapping_array, gap); - KASSERT(in_r || in_nr, ("%s: Things are really messed up now", __FUNCTION__)); + KASSERT(in_r || in_nr, ("%s: Things are really messed up now", __func__)); if (!in_nr) { SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, gap); if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) { From owner-svn-src-all@freebsd.org Sun Oct 4 16:27:50 2020 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 64AEF42C8B8; Sun, 4 Oct 2020 16:27:50 +0000 (UTC) (envelope-from markj@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C48KL1q0Pz3fsZ; Sun, 4 Oct 2020 16:27:50 +0000 (UTC) (envelope-from markj@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 21AC42703B; Sun, 4 Oct 2020 16:27:50 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094GRnvq038475; Sun, 4 Oct 2020 16:27:49 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094GRn8R038474; Sun, 4 Oct 2020 16:27:49 GMT (envelope-from markj@FreeBSD.org) Message-Id: <202010041627.094GRn8R038474@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Sun, 4 Oct 2020 16:27:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366427 - stable/12/sys/amd64/vmm/amd X-SVN-Group: stable-12 X-SVN-Commit-Author: markj X-SVN-Commit-Paths: stable/12/sys/amd64/vmm/amd X-SVN-Commit-Revision: 366427 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.33 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: Sun, 04 Oct 2020 16:27:50 -0000 Author: markj Date: Sun Oct 4 16:27:49 2020 New Revision: 366427 URL: https://svnweb.freebsd.org/changeset/base/366427 Log: MFC r366347: Remove svn:executable from a couple of vmm(4) source files. Modified: Directory Properties: stable/12/ (props changed) stable/12/sys/amd64/vmm/amd/amdvi_priv.h (props changed) stable/12/sys/amd64/vmm/amd/ivrs_drv.c (props changed) From owner-svn-src-all@freebsd.org Sun Oct 4 16:30:06 2020 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 6131C42CADF; Sun, 4 Oct 2020 16:30:06 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C48My1wCZz3frH; Sun, 4 Oct 2020 16:30:06 +0000 (UTC) (envelope-from kib@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 2501E271BA; Sun, 4 Oct 2020 16:30:06 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094GU6N5038651; Sun, 4 Oct 2020 16:30:06 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094GU5MQ038649; Sun, 4 Oct 2020 16:30:05 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010041630.094GU5MQ038649@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Sun, 4 Oct 2020 16:30:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366428 - in head/sys: kern sys X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: in head/sys: kern sys X-SVN-Commit-Revision: 366428 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.33 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: Sun, 04 Oct 2020 16:30:06 -0000 Author: kib Date: Sun Oct 4 16:30:05 2020 New Revision: 366428 URL: https://svnweb.freebsd.org/changeset/base/366428 Log: Refactor sleepq_catch_signals(). - Extract suspension check into sig_ast_checksusp() helper. - Extract signal check and calculation of the interruption errno into sig_ast_needsigchk() helper. The helpers are moved to kern_sig.c which is the proper place for signal-related code. Improve control flow in sleepq_catch_signals(), to handle ret == 0 (can sleep) and ret != 0 (interrupted) only once, by separating checking code into sleepq_check_ast_sq_locked(), which return value is interpreted at single location. Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D26628 Modified: head/sys/kern/kern_sig.c head/sys/kern/subr_sleepqueue.c head/sys/sys/signalvar.h Modified: head/sys/kern/kern_sig.c ============================================================================== --- head/sys/kern/kern_sig.c Sun Oct 4 16:27:49 2020 (r366427) +++ head/sys/kern/kern_sig.c Sun Oct 4 16:30:05 2020 (r366428) @@ -3139,6 +3139,71 @@ postsig(int sig) return (1); } +int +sig_ast_checksusp(struct thread *td) +{ + struct proc *p; + int ret; + + p = td->td_proc; + PROC_LOCK_ASSERT(p, MA_OWNED); + + if ((td->td_flags & TDF_NEEDSUSPCHK) == 0) + return (0); + + ret = thread_suspend_check(1); + MPASS(ret == 0 || ret == EINTR || ret == ERESTART); + return (ret); +} + +int +sig_ast_needsigchk(struct thread *td) +{ + struct proc *p; + struct sigacts *ps; + int ret, sig; + + p = td->td_proc; + PROC_LOCK_ASSERT(p, MA_OWNED); + + if ((td->td_flags & TDF_NEEDSIGCHK) == 0) + return (0); + + ps = p->p_sigacts; + mtx_lock(&ps->ps_mtx); + sig = cursig(td); + if (sig == -1) { + mtx_unlock(&ps->ps_mtx); + KASSERT((td->td_flags & TDF_SBDRY) != 0, ("lost TDF_SBDRY")); + KASSERT(TD_SBDRY_INTR(td), + ("lost TDF_SERESTART of TDF_SEINTR")); + KASSERT((td->td_flags & (TDF_SEINTR | TDF_SERESTART)) != + (TDF_SEINTR | TDF_SERESTART), + ("both TDF_SEINTR and TDF_SERESTART")); + ret = TD_SBDRY_ERRNO(td); + } else if (sig != 0) { + ret = SIGISMEMBER(ps->ps_sigintr, sig) ? EINTR : ERESTART; + mtx_unlock(&ps->ps_mtx); + } else { + mtx_unlock(&ps->ps_mtx); + ret = 0; + } + + /* + * Do not go into sleep if this thread was the ptrace(2) + * attach leader. cursig() consumed SIGSTOP from PT_ATTACH, + * but we usually act on the signal by interrupting sleep, and + * should do that here as well. + */ + if ((td->td_dbgflags & TDB_FSTP) != 0) { + if (ret == 0) + ret = EINTR; + td->td_dbgflags &= ~TDB_FSTP; + } + + return (ret); +} + void proc_wkilled(struct proc *p) { Modified: head/sys/kern/subr_sleepqueue.c ============================================================================== --- head/sys/kern/subr_sleepqueue.c Sun Oct 4 16:27:49 2020 (r366427) +++ head/sys/kern/subr_sleepqueue.c Sun Oct 4 16:30:05 2020 (r366428) @@ -433,33 +433,20 @@ sleepq_sleepcnt(const void *wchan, int queue) return (sq->sq_blockedcnt[queue]); } -/* - * Marks the pending sleep of the current thread as interruptible and - * makes an initial check for pending signals before putting a thread - * to sleep. Enters and exits with the thread lock held. Thread lock - * may have transitioned from the sleepq lock to a run lock. - */ static int -sleepq_catch_signals(const void *wchan, int pri) +sleepq_check_ast_sc_locked(struct thread *td, struct sleepqueue_chain *sc) { - struct sleepqueue_chain *sc; - struct sleepqueue *sq; - struct thread *td; struct proc *p; - struct sigacts *ps; - int sig, ret; + int ret; - ret = 0; - td = curthread; - p = curproc; - sc = SC_LOOKUP(wchan); mtx_assert(&sc->sc_lock, MA_OWNED); - MPASS(wchan != NULL); + + ret = 0; if ((td->td_pflags & TDP_WAKEUP) != 0) { td->td_pflags &= ~TDP_WAKEUP; ret = EINTR; thread_lock(td); - goto out; + return (0); } /* @@ -467,91 +454,89 @@ sleepq_catch_signals(const void *wchan, int pri) * thread. If not, we can switch immediately. */ thread_lock(td); - if ((td->td_flags & (TDF_NEEDSIGCHK | TDF_NEEDSUSPCHK)) != 0) { - thread_unlock(td); - mtx_unlock_spin(&sc->sc_lock); - CTR3(KTR_PROC, "sleepq catching signals: thread %p (pid %ld, %s)", - (void *)td, (long)p->p_pid, td->td_name); - PROC_LOCK(p); - /* - * Check for suspension first. Checking for signals and then - * suspending could result in a missed signal, since a signal - * can be delivered while this thread is suspended. - */ - if ((td->td_flags & TDF_NEEDSUSPCHK) != 0) { - ret = thread_suspend_check(1); - MPASS(ret == 0 || ret == EINTR || ret == ERESTART); - if (ret != 0) { - PROC_UNLOCK(p); - mtx_lock_spin(&sc->sc_lock); - thread_lock(td); - goto out; - } - } - if ((td->td_flags & TDF_NEEDSIGCHK) != 0) { - ps = p->p_sigacts; - mtx_lock(&ps->ps_mtx); - sig = cursig(td); - if (sig == -1) { - mtx_unlock(&ps->ps_mtx); - KASSERT((td->td_flags & TDF_SBDRY) != 0, - ("lost TDF_SBDRY")); - KASSERT(TD_SBDRY_INTR(td), - ("lost TDF_SERESTART of TDF_SEINTR")); - KASSERT((td->td_flags & - (TDF_SEINTR | TDF_SERESTART)) != - (TDF_SEINTR | TDF_SERESTART), - ("both TDF_SEINTR and TDF_SERESTART")); - ret = TD_SBDRY_ERRNO(td); - } else if (sig != 0) { - ret = SIGISMEMBER(ps->ps_sigintr, sig) ? - EINTR : ERESTART; - mtx_unlock(&ps->ps_mtx); - } else { - mtx_unlock(&ps->ps_mtx); - } + if ((td->td_flags & (TDF_NEEDSIGCHK | TDF_NEEDSUSPCHK)) == 0) + return (0); - /* - * Do not go into sleep if this thread was the - * ptrace(2) attach leader. cursig() consumed - * SIGSTOP from PT_ATTACH, but we usually act - * on the signal by interrupting sleep, and - * should do that here as well. - */ - if ((td->td_dbgflags & TDB_FSTP) != 0) { - if (ret == 0) - ret = EINTR; - td->td_dbgflags &= ~TDB_FSTP; - } - } - /* - * Lock the per-process spinlock prior to dropping the PROC_LOCK - * to avoid a signal delivery race. PROC_LOCK, PROC_SLOCK, and - * thread_lock() are currently held in tdsendsignal(). - */ - PROC_SLOCK(p); - mtx_lock_spin(&sc->sc_lock); + thread_unlock(td); + mtx_unlock_spin(&sc->sc_lock); + + p = td->td_proc; + CTR3(KTR_PROC, "sleepq catching signals: thread %p (pid %ld, %s)", + (void *)td, (long)p->p_pid, td->td_name); + PROC_LOCK(p); + + /* + * Check for suspension first. Checking for signals and then + * suspending could result in a missed signal, since a signal + * can be delivered while this thread is suspended. + */ + ret = sig_ast_checksusp(td); + if (ret != 0) { PROC_UNLOCK(p); + mtx_lock_spin(&sc->sc_lock); thread_lock(td); - PROC_SUNLOCK(p); + return (ret); } - if (ret == 0) { - sleepq_switch(wchan, pri); - return (0); - } -out: + + ret = sig_ast_needsigchk(td); + /* - * There were pending signals and this thread is still - * on the sleep queue, remove it from the sleep queue. + * Lock the per-process spinlock prior to dropping the + * PROC_LOCK to avoid a signal delivery race. + * PROC_LOCK, PROC_SLOCK, and thread_lock() are + * currently held in tdsendsignal(). */ - if (TD_ON_SLEEPQ(td)) { - sq = sleepq_lookup(wchan); - sleepq_remove_thread(sq, td); - } - MPASS(td->td_lock != &sc->sc_lock); - mtx_unlock_spin(&sc->sc_lock); - thread_unlock(td); + PROC_SLOCK(p); + mtx_lock_spin(&sc->sc_lock); + PROC_UNLOCK(p); + thread_lock(td); + PROC_SUNLOCK(p); + return (ret); +} + +/* + * Marks the pending sleep of the current thread as interruptible and + * makes an initial check for pending signals before putting a thread + * to sleep. Enters and exits with the thread lock held. Thread lock + * may have transitioned from the sleepq lock to a run lock. + */ +static int +sleepq_catch_signals(const void *wchan, int pri) +{ + struct thread *td; + struct sleepqueue_chain *sc; + struct sleepqueue *sq; + int ret; + + sc = SC_LOOKUP(wchan); + mtx_assert(&sc->sc_lock, MA_OWNED); + MPASS(wchan != NULL); + td = curthread; + + ret = sleepq_check_ast_sc_locked(td, sc); + THREAD_LOCK_ASSERT(td, MA_OWNED); + mtx_assert(&sc->sc_lock, MA_OWNED); + + if (ret == 0) { + /* + * No pending signals and no suspension requests found. + * Switch the thread off the cpu. + */ + sleepq_switch(wchan, pri); + } else { + /* + * There were pending signals and this thread is still + * on the sleep queue, remove it from the sleep queue. + */ + if (TD_ON_SLEEPQ(td)) { + sq = sleepq_lookup(wchan); + sleepq_remove_thread(sq, td); + } + MPASS(td->td_lock != &sc->sc_lock); + mtx_unlock_spin(&sc->sc_lock); + thread_unlock(td); + } return (ret); } Modified: head/sys/sys/signalvar.h ============================================================================== --- head/sys/sys/signalvar.h Sun Oct 4 16:27:49 2020 (r366427) +++ head/sys/sys/signalvar.h Sun Oct 4 16:30:05 2020 (r366428) @@ -399,6 +399,8 @@ void sigacts_copy(struct sigacts *dest, struct sigacts void sigacts_free(struct sigacts *ps); struct sigacts *sigacts_hold(struct sigacts *ps); int sigacts_shared(struct sigacts *ps); +int sig_ast_checksusp(struct thread *td); +int sig_ast_needsigchk(struct thread *td); void sig_drop_caught(struct proc *p); void sigexit(struct thread *td, int sig) __dead2; int sigev_findtd(struct proc *p, struct sigevent *sigev, struct thread **); From owner-svn-src-all@freebsd.org Sun Oct 4 16:33:43 2020 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 1655742CC32; Sun, 4 Oct 2020 16:33:43 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C48S66sBWz3g6j; Sun, 4 Oct 2020 16:33:42 +0000 (UTC) (envelope-from kib@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 CE92E272C9; Sun, 4 Oct 2020 16:33:42 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094GXgeE044464; Sun, 4 Oct 2020 16:33:42 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094GXg4l044462; Sun, 4 Oct 2020 16:33:42 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010041633.094GXg4l044462@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Sun, 4 Oct 2020 16:33:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366429 - in head/sys: kern sys X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: in head/sys: kern sys X-SVN-Commit-Revision: 366429 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.33 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: Sun, 04 Oct 2020 16:33:43 -0000 Author: kib Date: Sun Oct 4 16:33:42 2020 New Revision: 366429 URL: https://svnweb.freebsd.org/changeset/base/366429 Log: Add sig_intr(9). It gives the answer would the thread sleep according to current state of signals and suspensions. Of course the answer is racy and allows for false-negatives (no sleep when signal is delivered after process lock is dropped). Also the answer might change due to signal rescheduling among threads in multi-threaded process. Still it is the best approximation I can provide, to answering the question was the thread interrupted. Reviewed by: markj Tested by: pho, rmacklem Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D26628 Modified: head/sys/kern/kern_sig.c head/sys/sys/signalvar.h Modified: head/sys/kern/kern_sig.c ============================================================================== --- head/sys/kern/kern_sig.c Sun Oct 4 16:30:05 2020 (r366428) +++ head/sys/kern/kern_sig.c Sun Oct 4 16:33:42 2020 (r366429) @@ -3204,6 +3204,24 @@ sig_ast_needsigchk(struct thread *td) return (ret); } +int +sig_intr(void) +{ + struct thread *td; + struct proc *p; + int ret; + + td = curthread; + p = td->td_proc; + + PROC_LOCK(p); + ret = sig_ast_checksusp(td); + if (ret == 0) + ret = sig_ast_needsigchk(td); + PROC_UNLOCK(p); + return (ret); +} + void proc_wkilled(struct proc *p) { Modified: head/sys/sys/signalvar.h ============================================================================== --- head/sys/sys/signalvar.h Sun Oct 4 16:30:05 2020 (r366428) +++ head/sys/sys/signalvar.h Sun Oct 4 16:33:42 2020 (r366429) @@ -408,6 +408,7 @@ int sig_ffs(sigset_t *set); void sigfastblock_clear(struct thread *td); void sigfastblock_fetch(struct thread *td); void sigfastblock_setpend(struct thread *td, bool resched); +int sig_intr(void); void siginit(struct proc *p); void signotify(struct thread *td); void sigqueue_delete(struct sigqueue *queue, int sig); From owner-svn-src-all@freebsd.org Sun Oct 4 17:07:13 2020 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 E445342D569; Sun, 4 Oct 2020 17:07:13 +0000 (UTC) (envelope-from kevans@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C49Bn5jDBz3yVJ; Sun, 4 Oct 2020 17:07:13 +0000 (UTC) (envelope-from kevans@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 A777427B79; Sun, 4 Oct 2020 17:07:13 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094H7DVv063363; Sun, 4 Oct 2020 17:07:13 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094H7D2B063362; Sun, 4 Oct 2020 17:07:13 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <202010041707.094H7D2B063362@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Sun, 4 Oct 2020 17:07:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366430 - head/usr.sbin/ngctl X-SVN-Group: head X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: head/usr.sbin/ngctl X-SVN-Commit-Revision: 366430 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.33 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: Sun, 04 Oct 2020 17:07:14 -0000 Author: kevans Date: Sun Oct 4 17:07:13 2020 New Revision: 366430 URL: https://svnweb.freebsd.org/changeset/base/366430 Log: ngctl: add -c (compact output) for the dot command The output of "ngctl dot" is suitable for small netgraph networks. Even moderate complex netgraph setups (about a dozen nodes) are hard to understand from the .dot output, because each node and each hook are shown as a full blown structure. This patch allows to generate much more compact output and graphs by omitting the extra structures for the individual hooks. Instead the names of the hooks are labels to the edges. Submitted by: Lutz Donnerhacke Reviewed by: markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D21965 Modified: head/usr.sbin/ngctl/dot.c Modified: head/usr.sbin/ngctl/dot.c ============================================================================== --- head/usr.sbin/ngctl/dot.c Sun Oct 4 16:33:42 2020 (r366429) +++ head/usr.sbin/ngctl/dot.c Sun Oct 4 17:07:13 2020 (r366430) @@ -2,6 +2,7 @@ /* * dot.c * + * Copyright (c) 2019 Lutz Donnerhacke * Copyright (c) 2004 Brian Fundakowski Feldman * Copyright (c) 1996-1999 Whistle Communications, Inc. * All rights reserved. @@ -53,9 +54,11 @@ static int DotCmd(int ac, char **av); const struct ngcmd dot_cmd = { DotCmd, - "dot [outputfile]", + "dot [-c] [outputfile]", "Produce a GraphViz (.dot) of the entire netgraph.", - "If no outputfile is specified, stdout will be assumed.", + "If no outputfile is specified, stdout will be assumed." + " The optional -c argument generates a graph without separate" + " structures for edge names. Such a graph is more compact.", { "graphviz", "confdot" } }; @@ -66,12 +69,16 @@ DotCmd(int ac, char **av) struct namelist *nlist; FILE *f = stdout; int ch; + int compact = 0; u_int i; /* Get options */ optind = 1; - while ((ch = getopt(ac, av, "")) != -1) { + while ((ch = getopt(ac, av, "c")) != -1) { switch (ch) { + case 'c': + compact = 1; + break; case '?': default: return (CMDRTN_USAGE); @@ -109,9 +116,14 @@ DotCmd(int ac, char **av) } nlist = (struct namelist *)nlresp->data; - fprintf(f, "graph netgraph {\n"); - /* TODO: implement rank = same or subgraphs at some point */ - fprintf(f, "\tedge [ weight = 1.0 ];\n"); + if (compact) { + fprintf(f, "digraph netgraph {\n"); + fprintf(f, "\tedge [ dir = \"none\", fontsize = 10 ];\n"); + } else { + fprintf(f, "graph netgraph {\n"); + /* TODO: implement rank = same or subgraphs at some point */ + fprintf(f, "\tedge [ weight = 1.0 ];\n"); + } fprintf(f, "\tnode [ shape = record, fontsize = 12 ] {\n"); for (i = 0; i < nlist->numnames; i++) fprintf(f, "\t\t\"%jx\" [ label = \"{%s:|{%s|[%jx]:}}\" ];\n", @@ -159,30 +171,40 @@ DotCmd(int ac, char **av) continue; } - fprintf(f, "\tnode [ shape = octagon, fontsize = 10 ] {\n"); - for (j = 0; j < ninfo->hooks; j++) - fprintf(f, "\t\t\"%jx.%s\" [ label = \"%s\" ];\n", - (uintmax_t)nlist->nodeinfo[i].id, - hlist->link[j].ourhook, hlist->link[j].ourhook); - fprintf(f, "\t};\n"); + if (!compact) { + fprintf(f, "\tnode [ shape = octagon, fontsize = 10 ] {\n"); + for (j = 0; j < ninfo->hooks; j++) + fprintf(f, "\t\t\"%jx.%s\" [ label = \"%s\" ];\n", + (uintmax_t)nlist->nodeinfo[i].id, + hlist->link[j].ourhook, hlist->link[j].ourhook); + fprintf(f, "\t};\n"); - fprintf(f, "\t{\n\t\tedge [ weight = 2.0, style = bold ];\n"); - for (j = 0; j < ninfo->hooks; j++) - fprintf(f, "\t\t\"%jx\" -- \"%jx.%s\";\n", - (uintmax_t)nlist->nodeinfo[i].id, - (uintmax_t)nlist->nodeinfo[i].id, - hlist->link[j].ourhook); - fprintf(f, "\t};\n"); + fprintf(f, "\t{\n\t\tedge [ weight = 2.0, style = bold ];\n"); + for (j = 0; j < ninfo->hooks; j++) + fprintf(f, "\t\t\"%jx\" -- \"%jx.%s\";\n", + (uintmax_t)nlist->nodeinfo[i].id, + (uintmax_t)nlist->nodeinfo[i].id, + hlist->link[j].ourhook); + fprintf(f, "\t};\n"); + } for (j = 0; j < ninfo->hooks; j++) { /* Only print the edges going in one direction. */ if (hlist->link[j].nodeinfo.id > nlist->nodeinfo[i].id) continue; - fprintf(f, "\t\"%jx.%s\" -- \"%jx.%s\";\n", - (uintmax_t)nlist->nodeinfo[i].id, - hlist->link[j].ourhook, - (uintmax_t)hlist->link[j].nodeinfo.id, - hlist->link[j].peerhook); + if (compact) { + fprintf(f, "\t\"%jx\" -> \"%jx\" [ headlabel = \"%s\", taillabel = \"%s\" ] ;\n", + (uintmax_t)hlist->link[j].nodeinfo.id, + (uintmax_t)nlist->nodeinfo[i].id, + hlist->link[j].ourhook, + hlist->link[j].peerhook); + } else { + fprintf(f, "\t\"%jx.%s\" -- \"%jx.%s\";\n", + (uintmax_t)nlist->nodeinfo[i].id, + hlist->link[j].ourhook, + (uintmax_t)hlist->link[j].nodeinfo.id, + hlist->link[j].peerhook); + } } free(hlresp); } From owner-svn-src-all@freebsd.org Sun Oct 4 17:17:17 2020 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 64C7C42D8F4; Sun, 4 Oct 2020 17:17:17 +0000 (UTC) (envelope-from hselasky@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C49QP22P6z3yxy; Sun, 4 Oct 2020 17:17:17 +0000 (UTC) (envelope-from hselasky@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 29A6427DD0; Sun, 4 Oct 2020 17:17:17 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094HHHt0069579; Sun, 4 Oct 2020 17:17:17 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094HHH9d069578; Sun, 4 Oct 2020 17:17:17 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <202010041717.094HHH9d069578@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Sun, 4 Oct 2020 17:17:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366431 - head/sys/dev/usb/serial X-SVN-Group: head X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: head/sys/dev/usb/serial X-SVN-Commit-Revision: 366431 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.33 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: Sun, 04 Oct 2020 17:17:17 -0000 Author: hselasky Date: Sun Oct 4 17:17:16 2020 New Revision: 366431 URL: https://svnweb.freebsd.org/changeset/base/366431 Log: Add support for Google Cr50 (GSC) Closed Case Debugging UART interfaces to the USB generic serial port driver, ugensa. MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D21863 Submitted by: greg_unrelenting.technology (Greg V) Sponsored by: Mellanox Technologies // NVIDIA Networking Modified: head/sys/dev/usb/serial/ugensa.c Modified: head/sys/dev/usb/serial/ugensa.c ============================================================================== --- head/sys/dev/usb/serial/ugensa.c Sun Oct 4 17:07:13 2020 (r366430) +++ head/sys/dev/usb/serial/ugensa.c Sun Oct 4 17:17:16 2020 (r366431) @@ -161,6 +161,8 @@ static const STRUCT_USB_HOST_ID ugensa_devs[] = { {USB_VPI(USB_VENDOR_KYOCERA2, USB_PRODUCT_KYOCERA2_CDMA_MSM_K, 1)}, {USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_49GPLUS, 1)}, {USB_VPI(USB_VENDOR_NOVATEL2, USB_PRODUCT_NOVATEL2_FLEXPACKGPS, 3)}, + {USB_VENDOR(USB_VENDOR_GOOGLE), USB_IFACE_CLASS(UICLASS_VENDOR), + USB_IFACE_SUBCLASS(0x50), USB_IFACE_PROTOCOL(0x01), USB_DRIVER_INFO(10)}, }; DRIVER_MODULE(ugensa, uhub, ugensa_driver, ugensa_devclass, NULL, 0); From owner-svn-src-all@freebsd.org Sun Oct 4 17:23:40 2020 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 DDA7C42DF51; Sun, 4 Oct 2020 17:23:40 +0000 (UTC) (envelope-from hselasky@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C49Ym5YSyz40pl; Sun, 4 Oct 2020 17:23:40 +0000 (UTC) (envelope-from hselasky@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 A1F3F27C54; Sun, 4 Oct 2020 17:23:40 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094HNeAd075461; Sun, 4 Oct 2020 17:23:40 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094HNeSi075459; Sun, 4 Oct 2020 17:23:40 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <202010041723.094HNeSi075459@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Sun, 4 Oct 2020 17:23:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366432 - in head/sys: compat/linuxkpi/common/include/linux compat/linuxkpi/common/src sys X-SVN-Group: head X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: in head/sys: compat/linuxkpi/common/include/linux compat/linuxkpi/common/src sys X-SVN-Commit-Revision: 366432 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.33 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: Sun, 04 Oct 2020 17:23:40 -0000 Author: hselasky Date: Sun Oct 4 17:23:39 2020 New Revision: 366432 URL: https://svnweb.freebsd.org/changeset/base/366432 Log: Populate the acquire context field of a ww_mutex in the LinuxKPI. Bump the FreeBSD version to force recompilation of external kernel modules. MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D26657 Submitted by: greg_unrelenting.technology (Greg V) Sponsored by: Mellanox Technologies // NVIDIA Networking Modified: head/sys/compat/linuxkpi/common/include/linux/ww_mutex.h head/sys/compat/linuxkpi/common/src/linux_lock.c head/sys/sys/param.h Modified: head/sys/compat/linuxkpi/common/include/linux/ww_mutex.h ============================================================================== --- head/sys/compat/linuxkpi/common/include/linux/ww_mutex.h Sun Oct 4 17:17:16 2020 (r366431) +++ head/sys/compat/linuxkpi/common/include/linux/ww_mutex.h Sun Oct 4 17:23:39 2020 (r366432) @@ -76,7 +76,8 @@ ww_mutex_trylock(struct ww_mutex *lock) return (mutex_trylock(&lock->base)); } -extern int linux_ww_mutex_lock_sub(struct ww_mutex *, int catch_signal); +extern int linux_ww_mutex_lock_sub(struct ww_mutex *, + struct ww_acquire_ctx *, int catch_signal); static inline int ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) @@ -86,7 +87,7 @@ ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire else if ((struct thread *)SX_OWNER(lock->base.sx.sx_lock) == curthread) return (-EALREADY); else - return (linux_ww_mutex_lock_sub(lock, 0)); + return (linux_ww_mutex_lock_sub(lock, ctx, 0)); } static inline int @@ -97,7 +98,7 @@ ww_mutex_lock_interruptible(struct ww_mutex *lock, str else if ((struct thread *)SX_OWNER(lock->base.sx.sx_lock) == curthread) return (-EALREADY); else - return (linux_ww_mutex_lock_sub(lock, 1)); + return (linux_ww_mutex_lock_sub(lock, ctx, 1)); } extern void linux_ww_mutex_unlock_sub(struct ww_mutex *); Modified: head/sys/compat/linuxkpi/common/src/linux_lock.c ============================================================================== --- head/sys/compat/linuxkpi/common/src/linux_lock.c Sun Oct 4 17:17:16 2020 (r366431) +++ head/sys/compat/linuxkpi/common/src/linux_lock.c Sun Oct 4 17:23:39 2020 (r366432) @@ -71,7 +71,8 @@ linux_ww_unlock(void) /* lock a mutex with deadlock avoidance */ int -linux_ww_mutex_lock_sub(struct ww_mutex *lock, int catch_signal) +linux_ww_mutex_lock_sub(struct ww_mutex *lock, + struct ww_acquire_ctx *ctx, int catch_signal) { struct task_struct *task; struct ww_mutex_thread entry; @@ -126,6 +127,9 @@ done: if ((struct thread *)SX_OWNER(lock->base.sx.sx_lock) == NULL) cv_signal(&lock->condvar); } + + if (retval == 0) + lock->ctx = ctx; linux_ww_unlock(); return (retval); } @@ -135,6 +139,7 @@ linux_ww_mutex_unlock_sub(struct ww_mutex *lock) { /* protect ww_mutex ownership change */ linux_ww_lock(); + lock->ctx = NULL; sx_xunlock(&lock->base.sx); /* wakeup a lock waiter, if any */ cv_signal(&lock->condvar); Modified: head/sys/sys/param.h ============================================================================== --- head/sys/sys/param.h Sun Oct 4 17:17:16 2020 (r366431) +++ head/sys/sys/param.h Sun Oct 4 17:23:39 2020 (r366432) @@ -60,7 +60,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 1300118 /* Master, propagated to newvers */ +#define __FreeBSD_version 1300119 /* Master, propagated to newvers */ /* * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD, From owner-svn-src-all@freebsd.org Sun Oct 4 18:29:22 2020 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 69BB442F489; Sun, 4 Oct 2020 18:29:22 +0000 (UTC) (envelope-from mjguzik@gmail.com) Received: from mail-wm1-x342.google.com (mail-wm1-x342.google.com [IPv6:2a00:1450:4864:20::342]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4C1Z0Wpvz42y0; Sun, 4 Oct 2020 18:29:21 +0000 (UTC) (envelope-from mjguzik@gmail.com) Received: by mail-wm1-x342.google.com with SMTP id d4so6363325wmd.5; Sun, 04 Oct 2020 11:29:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=t6C3bLUb6CfOEFtd5Uk7287XXTnqGan5mBo/6Em8/aI=; b=OR+WUWPbNNssFy/OnQNX/mtfvoWQElvvW1cTpApqizTqD7FDx/+l9EwiwBZkF/FGCm EbAxhi5Cih4QzXPbc9lHcs4Sf2IHfMnbKy1JDApmUB7iZwLQEBe39ZHbiJJtMBT8Td9N 79xV9LytMQLXjf19Yaip12i2k9rEdyQBriFeS3zHOlSFQmcFs4oSOTYy7LB2g/BgJLn8 dxaI2Tpwvf/v3SKavOillpV4MMcUcI5FcyytEZaln05haDxSSPCh9PtnsctREw8hrgHF NzBmlLMsSvgOJUrBsAJ+JlRHhiGBuA0fHW5UhGWr5Bei8Cug/muQn2aHTx4bRvKag0qC xebQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=t6C3bLUb6CfOEFtd5Uk7287XXTnqGan5mBo/6Em8/aI=; b=FI1liOLI/3UXUW5mLd/BLNTKvx1GkJs0XVqR4RfaW4Wqdu3twFADJYZogUVcczW++E SO8fp3QpR5btNHl/WEgwhDFGb40kBXRhJv39EiU6jbNhu6k6qEycNRjserzE2KGyHd6M bMBvC8f+nI5NzDWXG7yAGfOYdjI5Rs3sPnyWZoRRuGTDPd1agfJr+P7b04Tx1ztLePs/ //f3K3JenJzyZdudrhHsstnaWII/rKtCYoMS2Rc+vZRaJgRNC5sVD9WF8qJfD60z6WmY ty/Ml55V70uJsq8qD1znGOSnNSNDJnSdNiZ71fgjKeZzzi+jHJkqhu5zobGaPrijcUnr SVQQ== X-Gm-Message-State: AOAM530ZdMk/y8SK2Gi9NxratSFiA1RA2dfRKCUkTy5YTiA+YUhieq5l Vc8+IJvLSjEB5egeUUyBATMRLhLERN6l5ock30jVZ6hQ/04= X-Google-Smtp-Source: ABdhPJxKp3xwDlQZJFUHXGAOeuj3ePO6HA0lwJWzB7CFWR4OHZG4UtlJvXpHzXhE/9IADfD9LFO23p1wUlN6KC+wWdw= X-Received: by 2002:a1c:dfd4:: with SMTP id w203mr12881474wmg.178.1601836159806; Sun, 04 Oct 2020 11:29:19 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a05:6000:187:0:0:0:0 with HTTP; Sun, 4 Oct 2020 11:29:18 -0700 (PDT) In-Reply-To: <202010041633.094GXg4l044462@repo.freebsd.org> References: <202010041633.094GXg4l044462@repo.freebsd.org> From: Mateusz Guzik Date: Sun, 4 Oct 2020 20:29:18 +0200 Message-ID: Subject: Re: svn commit: r366429 - in head/sys: kern sys To: Konstantin Belousov Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Content-Type: text/plain; charset="UTF-8" X-Rspamd-Queue-Id: 4C4C1Z0Wpvz42y0 X-Spamd-Bar: ---- Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:15169, ipnet:2a00:1450::/32, country:US] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Sun, 04 Oct 2020 18:29:22 -0000 Why is the process lock always taken? It looks like both routines just check a thread-local flag, so perhaps this can get away without serializing this process-wide? On 10/4/20, Konstantin Belousov wrote: > Author: kib > Date: Sun Oct 4 16:33:42 2020 > New Revision: 366429 > URL: https://svnweb.freebsd.org/changeset/base/366429 > > Log: > Add sig_intr(9). > > It gives the answer would the thread sleep according to current state > of signals and suspensions. Of course the answer is racy and allows > for false-negatives (no sleep when signal is delivered after process > lock is dropped). Also the answer might change due to signal > rescheduling among threads in multi-threaded process. > > Still it is the best approximation I can provide, to answering the > question was the thread interrupted. > > Reviewed by: markj > Tested by: pho, rmacklem > Sponsored by: The FreeBSD Foundation > MFC after: 2 weeks > Differential revision: https://reviews.freebsd.org/D26628 > > Modified: > head/sys/kern/kern_sig.c > head/sys/sys/signalvar.h > > Modified: head/sys/kern/kern_sig.c > ============================================================================== > --- head/sys/kern/kern_sig.c Sun Oct 4 16:30:05 2020 (r366428) > +++ head/sys/kern/kern_sig.c Sun Oct 4 16:33:42 2020 (r366429) > @@ -3204,6 +3204,24 @@ sig_ast_needsigchk(struct thread *td) > return (ret); > } > > +int > +sig_intr(void) > +{ > + struct thread *td; > + struct proc *p; > + int ret; > + > + td = curthread; > + p = td->td_proc; > + > + PROC_LOCK(p); > + ret = sig_ast_checksusp(td); > + if (ret == 0) > + ret = sig_ast_needsigchk(td); > + PROC_UNLOCK(p); > + return (ret); > +} > + > void > proc_wkilled(struct proc *p) > { > > Modified: head/sys/sys/signalvar.h > ============================================================================== > --- head/sys/sys/signalvar.h Sun Oct 4 16:30:05 2020 (r366428) > +++ head/sys/sys/signalvar.h Sun Oct 4 16:33:42 2020 (r366429) > @@ -408,6 +408,7 @@ int sig_ffs(sigset_t *set); > void sigfastblock_clear(struct thread *td); > void sigfastblock_fetch(struct thread *td); > void sigfastblock_setpend(struct thread *td, bool resched); > +int sig_intr(void); > void siginit(struct proc *p); > void signotify(struct thread *td); > void sigqueue_delete(struct sigqueue *queue, int sig); > _______________________________________________ > svn-src-all@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/svn-src-all > To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" > -- Mateusz Guzik From owner-svn-src-all@freebsd.org Sun Oct 4 19:37:17 2020 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 0AD484313B4; Sun, 4 Oct 2020 19:37:17 +0000 (UTC) (envelope-from freqlabs@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4DWw3yLrz47HT; Sun, 4 Oct 2020 19:37:16 +0000 (UTC) (envelope-from freqlabs@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 6BA119878; Sun, 4 Oct 2020 19:37:16 +0000 (UTC) (envelope-from freqlabs@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094JbGiU055587; Sun, 4 Oct 2020 19:37:16 GMT (envelope-from freqlabs@FreeBSD.org) Received: (from freqlabs@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094JbGZl055585; Sun, 4 Oct 2020 19:37:16 GMT (envelope-from freqlabs@FreeBSD.org) Message-Id: <202010041937.094JbGZl055585@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: freqlabs set sender to freqlabs@FreeBSD.org using -f From: Ryan Moeller Date: Sun, 4 Oct 2020 19:37:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366433 - in head/sys: contrib/ipfilter/netinet x86/bios X-SVN-Group: head X-SVN-Commit-Author: freqlabs X-SVN-Commit-Paths: in head/sys: contrib/ipfilter/netinet x86/bios X-SVN-Commit-Revision: 366433 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.33 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: Sun, 04 Oct 2020 19:37:17 -0000 Author: freqlabs Date: Sun Oct 4 19:37:15 2020 New Revision: 366433 URL: https://svnweb.freebsd.org/changeset/base/366433 Log: Explicit CTLFLAG_DYN not needed Dynamically created OIDs automatically get this flag set. Reviewed by: jhb MFC after: 1 week Sponsored by: iXsystems, Inc. Differential Revision: https://reviews.freebsd.org/D26561 Modified: head/sys/contrib/ipfilter/netinet/mlfk_ipl.c head/sys/x86/bios/vpd.c Modified: head/sys/contrib/ipfilter/netinet/mlfk_ipl.c ============================================================================== --- head/sys/contrib/ipfilter/netinet/mlfk_ipl.c Sun Oct 4 17:23:39 2020 (r366432) +++ head/sys/contrib/ipfilter/netinet/mlfk_ipl.c Sun Oct 4 19:37:15 2020 (r366433) @@ -88,19 +88,19 @@ SYSCTL_DECL(_net_inet); ptr, val, sysctl_ipf_int, "I", descr) #define SYSCTL_DYN_IPF_NAT(parent, nbr, name, access,ptr, val, descr) \ SYSCTL_ADD_OID(&ipf_clist, SYSCTL_STATIC_CHILDREN(parent), nbr, name, \ - CTLFLAG_DYN | CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_MPSAFE |access, \ + CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_MPSAFE |access, \ ptr, val, sysctl_ipf_int_nat, "I", descr) #define SYSCTL_DYN_IPF_STATE(parent, nbr, name, access,ptr, val, descr) \ SYSCTL_ADD_OID(&ipf_clist, SYSCTL_STATIC_CHILDREN(parent), nbr, name, \ - CTLFLAG_DYN | CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_MPSAFE | access, \ + CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_MPSAFE | access, \ ptr, val, sysctl_ipf_int_state, "I", descr) #define SYSCTL_DYN_IPF_FRAG(parent, nbr, name, access,ptr, val, descr) \ SYSCTL_ADD_OID(&ipf_clist, SYSCTL_STATIC_CHILDREN(parent), nbr, name, \ - CTLFLAG_DYN | CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_MPSAFE | access, \ + CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_MPSAFE | access, \ ptr, val, sysctl_ipf_int_frag, "I", descr) #define SYSCTL_DYN_IPF_AUTH(parent, nbr, name, access,ptr, val, descr) \ SYSCTL_ADD_OID(&ipf_clist, SYSCTL_STATIC_CHILDREN(parent), nbr, name, \ - CTLFLAG_DYN | CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_MPSAFE | access, \ + CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_MPSAFE | access, \ ptr, val, sysctl_ipf_int_auth, "I", descr) static struct sysctl_ctx_list ipf_clist; #define CTLFLAG_OFF 0x00800000 /* IPFilter must be disabled */ Modified: head/sys/x86/bios/vpd.c ============================================================================== --- head/sys/x86/bios/vpd.c Sun Oct 4 17:23:39 2020 (r366432) +++ head/sys/x86/bios/vpd.c Sun Oct 4 19:37:15 2020 (r366433) @@ -210,19 +210,19 @@ vpd_attach (device_t dev) sysctl_ctx_init(&sc->ctx); SYSCTL_ADD_STRING(&sc->ctx, SYSCTL_STATIC_CHILDREN(_hw_vpd_machine_type), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->MachineType, 0, NULL); + unit, CTLFLAG_RD, sc->MachineType, 0, NULL); SYSCTL_ADD_STRING(&sc->ctx, SYSCTL_STATIC_CHILDREN(_hw_vpd_machine_model), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->MachineModel, 0, NULL); + unit, CTLFLAG_RD, sc->MachineModel, 0, NULL); SYSCTL_ADD_STRING(&sc->ctx, SYSCTL_STATIC_CHILDREN(_hw_vpd_build_id), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->BuildID, 0, NULL); + unit, CTLFLAG_RD, sc->BuildID, 0, NULL); SYSCTL_ADD_STRING(&sc->ctx, SYSCTL_STATIC_CHILDREN(_hw_vpd_serial_box), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->BoxSerial, 0, NULL); + unit, CTLFLAG_RD, sc->BoxSerial, 0, NULL); SYSCTL_ADD_STRING(&sc->ctx, SYSCTL_STATIC_CHILDREN(_hw_vpd_serial_planar), OID_AUTO, - unit, CTLFLAG_RD|CTLFLAG_DYN, sc->PlanarSerial, 0, NULL); + unit, CTLFLAG_RD, sc->PlanarSerial, 0, NULL); device_printf(dev, "Machine Type: %.4s, Model: %.3s, Build ID: %.9s\n", sc->MachineType, sc->MachineModel, sc->BuildID); From owner-svn-src-all@freebsd.org Sun Oct 4 19:59:13 2020 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 4C69D431DA8; Sun, 4 Oct 2020 19:59:13 +0000 (UTC) (envelope-from kevans@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4F1F1LGdz4BqQ; Sun, 4 Oct 2020 19:59:13 +0000 (UTC) (envelope-from kevans@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 113E29F62; Sun, 4 Oct 2020 19:59:13 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094JxCCn069320; Sun, 4 Oct 2020 19:59:12 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094JxCqH069319; Sun, 4 Oct 2020 19:59:12 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <202010041959.094JxCqH069319@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Sun, 4 Oct 2020 19:59:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366434 - stable/12/sys/arm/broadcom/bcm2835 X-SVN-Group: stable-12 X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: stable/12/sys/arm/broadcom/bcm2835 X-SVN-Commit-Revision: 366434 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.33 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: Sun, 04 Oct 2020 19:59:13 -0000 Author: kevans Date: Sun Oct 4 19:59:12 2020 New Revision: 366434 URL: https://svnweb.freebsd.org/changeset/base/366434 Log: MFC r362421: raspberry pi 4: cpufreq support The submitter notes that the bcm2835_cpufreq driver really just needs the rpi4 compat string added to it; powerd subsequently works and the dev.cpu.0 sysctl values look sane and can be successfully manipulated. Modified: stable/12/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c ============================================================================== --- stable/12/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c Sun Oct 4 19:37:15 2020 (r366433) +++ stable/12/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c Sun Oct 4 19:59:12 2020 (r366434) @@ -129,6 +129,7 @@ static struct ofw_compat_data compat_data[] = { { "brcm,bcm2835", 1 }, { "brcm,bcm2836", 1 }, { "brcm,bcm2837", 1 }, + { "brcm,bcm2711", 1 }, { NULL, 0 } }; From owner-svn-src-all@freebsd.org Sun Oct 4 21:06:16 2020 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 16741433C4E; Sun, 4 Oct 2020 21:06:16 +0000 (UTC) (envelope-from rmacklem@uoguelph.ca) Received: from CAN01-TO1-obe.outbound.protection.outlook.com (mail-to1can01on062a.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe5d::62a]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mail.protection.outlook.com", Issuer "GlobalSign Organization Validation CA - SHA256 - G3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4GVZ32sfz4H6F; Sun, 4 Oct 2020 21:06:14 +0000 (UTC) (envelope-from rmacklem@uoguelph.ca) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WIwG2alDgHl/Zsc8xTI/D0hmryoGKPGnQYtnh4iTbadYKl3ZNlabSstkk51prwEe2zPIhfV9dTk9SRM3rrls2wmvCrji7hoMhTDWi1QoFHzLYqksCnQZTHc2VPxSb9dczHvESUUgQnrstkC7dTw8YrBT442IllPPF5kKnLmbCpD0eMvpX6PnQMnrEbv71JYGBVQrt7mikLYYuP/BRbxtvbSRYifSwIiBN6FoZBxWTUmxu1C2H/Y5NuQtMQeKMdBsr6rdd3aQDuaiAjJrwstQ5SEnOfWz4qEa9ZsNABpxvQQZHpmhdoTvHR/kH9fs5RJolcy3MEGdgI8GGBEk0+MaZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6rmRIKf2CXv3hoGMf0hGipzm9t4RioeKL0yCwBP6JuQ=; b=fbVZhCv4Cb+a+yG9djYuITb2KeuZw0om+ibdLiIuSpUQjkQsDWy4pyZf7S2FHZYlkQ2Ho/0wzGkFFXfArK2IWSxpXzo0BsYiFjXHZWkHMFqPFY+mqD8f/shNid4lB4Lez5t1qcIMexoL0v3vfvB7dsL9a71ydjKXNtUarS6JZOB7n7u5szqSgFtpoesMgWvpKWpdF5fchn9cN05J7ObSyp4kMCjNWqzswF6pOZfjaxN9Gm4JGaPFcuzrodgel6tH7WihPVga4f2FpqNuE7t023CWORKbEdz8boTJCK0QwnB5NEH/PBJnTu8fLBGil7POHHTfuQTVPokuDai09WjSpg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=uoguelph.ca; dmarc=pass action=none header.from=uoguelph.ca; dkim=pass header.d=uoguelph.ca; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uoguelph.ca; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6rmRIKf2CXv3hoGMf0hGipzm9t4RioeKL0yCwBP6JuQ=; b=Ft9y4i2E7DWk5tToUit+yrsqrre1yKTZYd8Ny3w8p+XKRXXsG2enY2nPalxIn+9t09QgbBwVeKGCflGgUFUszEMLPlKa9YE5SIMa4qDsxTg/pMrHJXiuD9xyjtEBdfwzW7AFk+lkmCIj9cwh6nnQphHclDw3YWdvSw3hcGN72Z47QVllbUmgCanBdVpcWS+uaOgMInM67WlNEn1U3F1IGJaw0GfOCQiuOBfevtatWzy1ZTbJrMsgJQtPrUQVW/oUSBeqoyTr+jjU9K6+/WKsyYbavGAaMryfIFWvPhDbqwOgv9LJTFQV0OBbMchouvVzkaXDPPfyyJZEw4ejZz60zg== Received: from YTBPR01MB3966.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:24::27) by YTOPR0101MB2124.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b00:1d::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3433.37; Sun, 4 Oct 2020 21:06:12 +0000 Received: from YTBPR01MB3966.CANPRD01.PROD.OUTLOOK.COM ([fe80::687f:d85a:a0a3:bd20]) by YTBPR01MB3966.CANPRD01.PROD.OUTLOOK.COM ([fe80::687f:d85a:a0a3:bd20%6]) with mapi id 15.20.3433.044; Sun, 4 Oct 2020 21:06:02 +0000 From: Rick Macklem To: Mateusz Guzik , Konstantin Belousov CC: "src-committers@freebsd.org" , "svn-src-all@freebsd.org" , "svn-src-head@freebsd.org" Subject: Re: svn commit: r366429 - in head/sys: kern sys Thread-Topic: svn commit: r366429 - in head/sys: kern sys Thread-Index: AQHWmmwkwGWcutQP9ECZTNSVKp4v5qmHw7EAgAArAUk= Date: Sun, 4 Oct 2020 21:06:02 +0000 Message-ID: References: <202010041633.094GXg4l044462@repo.freebsd.org>, In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 86a87d54-49f2-4040-8fee-08d868a94d2d x-ms-traffictypediagnostic: YTOPR0101MB2124: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:6108; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: tXBuSyfFb4A+HkWkD4SzDC/nnv4cRt895EJVy8KoQtA1bz/g3xj82Pe5RzVOwJjdJ+4609dLQJQAxXY2lZZQLODB1+fL1MIXRqDElRKQz1G/6Z5vOm4c4twixSCdcIjQbLuBpl3jymx3dGkgPY3jzQeTzKki0zbx7iOJADT0wyeS6zkZCJ2v7ldBo7B5sOSG4AagGfoOpffJ/dFAMTzPYgN9JJQ/aeWsTjCxlj7XxyHpu5/fwhRjocivCzWZl+WDP+YuYejy/ZSMLZOgxPMRv/ZaoNDoC3cCcGcq1+94Dc4/1jW+ylEaId4WB3kDeo6oBDH2jRoh55Oj6ssd0KbOTGm2Ozdt/gtJGvUbvxLG5m089tXsQZM7yKESP9jqWTJsQ/Yv2ktJU8eQZmta8x68FA== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:YTBPR01MB3966.CANPRD01.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(39850400004)(346002)(136003)(366004)(376002)(396003)(33656002)(4326008)(66556008)(71200400001)(66476007)(66946007)(7696005)(110136005)(83380400001)(8676002)(76116006)(478600001)(54906003)(316002)(86362001)(786003)(52536014)(186003)(6506007)(83080400001)(9686003)(8936002)(66446008)(64756008)(55016002)(2906002)(966005)(5660300002); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: jPppVEFkMWoFBct0DvIJByQa7sINbQq8X1XTH6gvD80IDFd6f0xdGgLnKzgEd0Dn5fgGQYVoGWjglXvNBhDebK7488p/HRu9zeB3uiJw6miEdGcmnxSI3+sPVL5OULnm/zbNlWNZBgR+C8Q9MiGKyXCy88jsDESw9YsxBeaxz7uDsuM+8lIrMtqL9woU+2Sp19lsByFdh8vLm7c3oBnsIlSUpoXwyGkqDUCEZo/jeGTlhVVSpROpKYx4hX3l6MzIwCaPU+GRWCHJ3jHRN0MFaEa16WviOpsZa1a9PAWHPTxmsM1ejE8APNii3U5w2sJ08mPO4uo11rDgupqnXSLDuFr8FpjSwDt7zOZRHT8avJ96r0m+g+RDAFaXTtWMUYt47zsdDKRUcuQgt8dJb4R7u/7XYYQlVwGNbF3diTJFDcoNDoxhrin/VfxDeQ3657iLr0wJJ+6fqsjgG/qCL8fwPlwqB9mgmCvq6/ljAbsL8FMS2cpAwNyoSBvZUpwMZ415kVDZayHnT6tyW1lnwXozaGVVgNUAkeJrKEFUcO9vXla7C6/EtZ4GP4ZMmJ1wCP9yRyKEcuPbxNGmDct46Ffn1Q+4C8MxupZr9ZmLNm5uyL4e8tM1kDP6FmEZX7q2y2Q41aWuIBIkeHa7wAd/WAiUbSdQlECKTsPIWkkvg/IP+8mpa5pWchkXTtxsw+79rE/f1UGUmHvT27x8nOmbLXWBQg== x-ms-exchange-transport-forked: True Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: uoguelph.ca X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: YTBPR01MB3966.CANPRD01.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 86a87d54-49f2-4040-8fee-08d868a94d2d X-MS-Exchange-CrossTenant-originalarrivaltime: 04 Oct 2020 21:06:02.5509 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: be62a12b-2cad-49a1-a5fa-85f4f3156a7d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 3D1uVLawcn8QugqFzNvbxcd/2AzeY9BEJHG0Y+VFk/oYX99U6W1oteM0zluf2KrAmWLD5y5CEY4sjKKQZEyx1A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: YTOPR0101MB2124 X-Rspamd-Queue-Id: 4C4GVZ32sfz4H6F X-Spamd-Bar: ------ Authentication-Results: mx1.freebsd.org; dkim=pass header.d=uoguelph.ca header.s=selector1 header.b=Ft9y4i2E; dmarc=pass (policy=none) header.from=uoguelph.ca; spf=pass (mx1.freebsd.org: domain of rmacklem@uoguelph.ca designates 2a01:111:f400:fe5d::62a as permitted sender) smtp.mailfrom=rmacklem@uoguelph.ca X-Spamd-Result: default: False [-6.04 / 15.00]; TO_DN_EQ_ADDR_SOME(0.00)[]; NEURAL_HAM_MEDIUM(-1.01)[-1.006]; R_DKIM_ALLOW(-0.20)[uoguelph.ca:s=selector1]; FREEFALL_USER(0.00)[rmacklem]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(-0.20)[+ip6:2a01:111:f400::/48]; NEURAL_HAM_LONG(-1.00)[-1.003]; MIME_GOOD(-0.10)[text/plain]; RCPT_COUNT_FIVE(0.00)[5]; DWL_DNSWL_LOW(-1.00)[uoguelph.ca:dkim]; RCVD_COUNT_THREE(0.00)[3]; TO_MATCH_ENVRCPT_SOME(0.00)[]; DKIM_TRACE(0.00)[uoguelph.ca:+]; DMARC_POLICY_ALLOW(-0.50)[uoguelph.ca,none]; NEURAL_HAM_SHORT(-1.03)[-1.029]; FREEMAIL_TO(0.00)[gmail.com,FreeBSD.org]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_TLS_LAST(0.00)[]; ASN(0.00)[asn:8075, ipnet:2a01:111:f000::/36, country:US]; ARC_ALLOW(-1.00)[microsoft.com:s=arcselector9901:i=1]; MAILMAN_DEST(0.00)[svn-src-all,svn-src-head] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Sun, 04 Oct 2020 21:06:16 -0000 Mateusz Guzik wrote:=0A= >Why is the process lock always taken? It looks like both routines just=0A= >check a thread-local flag, so perhaps this can get away without=0A= >serializing this process-wide?=0A= I did spot this slight difference between the initial version of sig_intr()= and=0A= this one. At least w.r.t. copy_file_range(2), the call happens infrequentl= y=0A= enough that the overhead of acquiring the lock is not significant.=0A= =0A= rick=0A= =0A= On 10/4/20, Konstantin Belousov wrote:=0A= > Author: kib=0A= > Date: Sun Oct 4 16:33:42 2020=0A= > New Revision: 366429=0A= > URL: https://svnweb.freebsd.org/changeset/base/366429=0A= >=0A= > Log:=0A= > Add sig_intr(9).=0A= >=0A= > It gives the answer would the thread sleep according to current state= =0A= > of signals and suspensions. Of course the answer is racy and allows=0A= > for false-negatives (no sleep when signal is delivered after process=0A= > lock is dropped). Also the answer might change due to signal=0A= > rescheduling among threads in multi-threaded process.=0A= >=0A= > Still it is the best approximation I can provide, to answering the=0A= > question was the thread interrupted.=0A= >=0A= > Reviewed by: markj=0A= > Tested by: pho, rmacklem=0A= > Sponsored by: The FreeBSD Foundation=0A= > MFC after: 2 weeks=0A= > Differential revision: https://reviews.freebsd.org/D26628=0A= >=0A= > Modified:=0A= > head/sys/kern/kern_sig.c=0A= > head/sys/sys/signalvar.h=0A= >=0A= > Modified: head/sys/kern/kern_sig.c=0A= > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=0A= > --- head/sys/kern/kern_sig.c Sun Oct 4 16:30:05 2020 (r366428)= =0A= > +++ head/sys/kern/kern_sig.c Sun Oct 4 16:33:42 2020 (r366429)= =0A= > @@ -3204,6 +3204,24 @@ sig_ast_needsigchk(struct thread *td)=0A= > return (ret);=0A= > }=0A= >=0A= > +int=0A= > +sig_intr(void)=0A= > +{=0A= > + struct thread *td;=0A= > + struct proc *p;=0A= > + int ret;=0A= > +=0A= > + td =3D curthread;=0A= > + p =3D td->td_proc;=0A= > +=0A= > + PROC_LOCK(p);=0A= > + ret =3D sig_ast_checksusp(td);=0A= > + if (ret =3D=3D 0)=0A= > + ret =3D sig_ast_needsigchk(td);=0A= > + PROC_UNLOCK(p);=0A= > + return (ret);=0A= > +}=0A= > +=0A= > void=0A= > proc_wkilled(struct proc *p)=0A= > {=0A= >=0A= > Modified: head/sys/sys/signalvar.h=0A= > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=0A= > --- head/sys/sys/signalvar.h Sun Oct 4 16:30:05 2020 (r366428)= =0A= > +++ head/sys/sys/signalvar.h Sun Oct 4 16:33:42 2020 (r366429)= =0A= > @@ -408,6 +408,7 @@ int sig_ffs(sigset_t *set);=0A= > void sigfastblock_clear(struct thread *td);=0A= > void sigfastblock_fetch(struct thread *td);=0A= > void sigfastblock_setpend(struct thread *td, bool resched);=0A= > +int sig_intr(void);=0A= > void siginit(struct proc *p);=0A= > void signotify(struct thread *td);=0A= > void sigqueue_delete(struct sigqueue *queue, int sig);=0A= > _______________________________________________=0A= > svn-src-all@freebsd.org mailing list=0A= > https://lists.freebsd.org/mailman/listinfo/svn-src-all=0A= > To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"=0A= >=0A= =0A= =0A= --=0A= Mateusz Guzik =0A= From owner-svn-src-all@freebsd.org Sun Oct 4 22:41:45 2020 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 D16BC435F13; Sun, 4 Oct 2020 22:41:45 +0000 (UTC) (envelope-from kevans@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4Jcn5dCKz4M19; Sun, 4 Oct 2020 22:41:45 +0000 (UTC) (envelope-from kevans@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 A45DEBB46; Sun, 4 Oct 2020 22:41:45 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 094MfjhM068835; Sun, 4 Oct 2020 22:41:45 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 094MfhOV068827; Sun, 4 Oct 2020 22:41:43 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <202010042241.094MfhOV068827@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Sun, 4 Oct 2020 22:41:43 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366435 - in head: . stand/lua X-SVN-Group: head X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: in head: . stand/lua X-SVN-Commit-Revision: 366435 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.33 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: Sun, 04 Oct 2020 22:41:45 -0000 Author: kevans Date: Sun Oct 4 22:41:43 2020 New Revision: 366435 URL: https://svnweb.freebsd.org/changeset/base/366435 Log: lualoader: improve the design of the brand-/logo- mechanism In the previous world order, any brand/logo was forced to pull in the drawer and call drawer.add{Brand,Logo} with the name their brand/logo is taking and a table describing it. In the new world order, these files just need to return a table that maps out graphics types to a table of the exact same format as what was previously being passed back into the drawer. The appeal here is not needing to grab a reference back to the drawer module and having a cleaner data-driven looking format for these. The format has been renamed to 'gfx-*' prefixes and each one can provide a logo and a brand. drawer.addBrand/drawer.addLogo will remain in place until FreeBSD 13, as there's no overhead to them and it's not yet worth the break in compatibility with any pre-existing brands and logos. Reviewed by: freqlabs MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D24966 Added: head/stand/lua/gfx-beastie.lua - copied, changed from r366434, head/stand/lua/logo-beastie.lua head/stand/lua/gfx-beastiebw.lua - copied, changed from r366434, head/stand/lua/logo-beastiebw.lua head/stand/lua/gfx-fbsdbw.lua - copied, changed from r366434, head/stand/lua/logo-fbsdbw.lua head/stand/lua/gfx-orb.lua - copied, changed from r366434, head/stand/lua/logo-orb.lua head/stand/lua/gfx-orbbw.lua - copied, changed from r366434, head/stand/lua/logo-orbbw.lua Deleted: head/stand/lua/logo-beastie.lua head/stand/lua/logo-beastiebw.lua head/stand/lua/logo-fbsdbw.lua head/stand/lua/logo-orb.lua head/stand/lua/logo-orbbw.lua Modified: head/ObsoleteFiles.inc head/stand/lua/Makefile head/stand/lua/drawer.lua Modified: head/ObsoleteFiles.inc ============================================================================== --- head/ObsoleteFiles.inc Sun Oct 4 19:59:12 2020 (r366434) +++ head/ObsoleteFiles.inc Sun Oct 4 22:41:43 2020 (r366435) @@ -36,6 +36,13 @@ # xargs -n1 | sort | uniq -d; # done +# 20201004: logo files renamed to type-agnostic gfx-*.lua +OLD_FILES+=boot/lua/logo-beastie.lua +OLD_FILES+=boot/lua/logo-beastiebw.lua +OLD_FILES+=boot/lua/logo-fbsdbw.lua +OLD_FILES+=boot/lua/logo-orb.lua +OLD_FILES+=boot/lua/logo-orbbw.lua + # 20200923: memfd_test moved to /usr/tests/sys/posixshm OLD_FILES+=usr/tests/sys/kern/memfd_test Modified: head/stand/lua/Makefile ============================================================================== --- head/stand/lua/Makefile Sun Oct 4 19:59:12 2020 (r366434) +++ head/stand/lua/Makefile Sun Oct 4 22:41:43 2020 (r366435) @@ -20,11 +20,11 @@ FILES= cli.lua \ drawer.lua \ hook.lua \ loader.lua \ - logo-beastie.lua \ - logo-beastiebw.lua \ - logo-fbsdbw.lua \ - logo-orb.lua \ - logo-orbbw.lua \ + gfx-beastie.lua \ + gfx-beastiebw.lua \ + gfx-fbsdbw.lua \ + gfx-orb.lua \ + gfx-orbbw.lua \ menu.lua \ password.lua \ screen.lua Modified: head/stand/lua/drawer.lua ============================================================================== --- head/stand/lua/drawer.lua Sun Oct 4 19:59:12 2020 (r366434) +++ head/stand/lua/drawer.lua Sun Oct 4 22:41:43 2020 (r366435) @@ -61,6 +61,35 @@ local function menuEntryName(drawing_menu, entry) return entry.name end +local function processFile(gfxname) + if gfxname == nil then + return false, "Missing filename" + end + + local ret = try_include('gfx-' .. gfxname) + if ret == nil then + return false, "Failed to include gfx-" .. gfxname + end + + -- Legacy format + if type(ret) ~= "table" then + return true + end + + for gfxtype, def in pairs(ret) do + if gfxtype == "brand" then + drawer.addBrand(gfxname, def) + elseif gfxtype == "logo" then + drawer.addLogo(gfxname, def) + else + return false, "Unknown graphics type '" .. gfxtype .. + "'" + end + end + + return true +end + local function getBranddef(brand) if brand == nil then return nil @@ -70,7 +99,18 @@ local function getBranddef(brand) -- Try to pull it in if branddef == nil then - try_include('brand-' .. brand) + local res, err = processFile(brand) + if not res then + -- This fallback should go away after FreeBSD 13. + try_include('brand-' .. brand) + -- If the fallback also failed, print whatever error + -- we encountered in the original processing. + if branddefs[brand] == nil then + print(err) + return nil + end + end + branddef = branddefs[brand] end @@ -86,7 +126,18 @@ local function getLogodef(logo) -- Try to pull it in if logodef == nil then - try_include('logo-' .. logo) + local res, err = processFile(logo) + if not res then + -- This fallback should go away after FreeBSD 13. + try_include('logo-' .. logo) + -- If the fallback also failed, print whatever error + -- we encountered in the original processing. + if logodefs[logo] == nil then + print(err) + return nil + end + end + logodef = logodefs[logo] end @@ -364,6 +415,8 @@ drawer.default_bw_logodef = 'orbbw' -- drawer module in case it's a filesystem issue. drawer.default_fallback_logodef = 'none' +-- These should go away after FreeBSD 13; only available for backwards +-- compatibility with old logo- files. function drawer.addBrand(name, def) branddefs[name] = def end Copied and modified: head/stand/lua/gfx-beastie.lua (from r366434, head/stand/lua/logo-beastie.lua) ============================================================================== --- head/stand/lua/logo-beastie.lua Sun Oct 4 19:59:12 2020 (r366434, copy source) +++ head/stand/lua/gfx-beastie.lua Sun Oct 4 22:41:43 2020 (r366435) @@ -27,33 +27,29 @@ -- $FreeBSD$ -- -local drawer = require("drawer") - -local beastie_color = { -" \027[31m, ,", -" /( )`", -" \\ \\___ / |", -" /- \027[37m_\027[31m `-/ '", -" (\027[37m/\\/ \\\027[31m \\ /\\", -" \027[37m/ / |\027[31m ` \\", -" \027[34mO O \027[37m) \027[31m/ |", -" \027[37m`-^--'\027[31m`< '", -" (_.) _ ) /", -" `.___/` /", -" `-----' /", -" \027[33m<----.\027[31m __ / __ \\", -" \027[33m<----|====\027[31mO)))\027[33m==\027[31m) \\) /\027[33m====|", -" \027[33m<----'\027[31m `--' `.__,' \\", -" | |", -" \\ / /\\", -" \027[36m______\027[31m( (_ / \\______/", -" \027[36m,' ,-----' |", -" `--{__________)\027[m" +return { + logo = { + graphic = { + " \027[31m, ,", + " /( )`", + " \\ \\___ / |", + " /- \027[37m_\027[31m `-/ '", + " (\027[37m/\\/ \\\027[31m \\ /\\", + " \027[37m/ / |\027[31m ` \\", + " \027[34mO O \027[37m) \027[31m/ |", + " \027[37m`-^--'\027[31m`< '", + " (_.) _ ) /", + " `.___/` /", + " `-----' /", + " \027[33m<----.\027[31m __ / __ \\", + " \027[33m<----|====\027[31mO)))\027[33m==\027[31m) \\) /\027[33m====|", + " \027[33m<----'\027[31m `--' `.__,' \\", + " | |", + " \\ / /\\", + " \027[36m______\027[31m( (_ / \\______/", + " \027[36m,' ,-----' |", + " `--{__________)\027[m", + }, + requires_color = true, + } } - -drawer.addLogo("beastie", { - requires_color = true, - graphic = beastie_color, -}) - -return true Copied and modified: head/stand/lua/gfx-beastiebw.lua (from r366434, head/stand/lua/logo-beastiebw.lua) ============================================================================== --- head/stand/lua/logo-beastiebw.lua Sun Oct 4 19:59:12 2020 (r366434, copy source) +++ head/stand/lua/gfx-beastiebw.lua Sun Oct 4 22:41:43 2020 (r366435) @@ -27,32 +27,28 @@ -- $FreeBSD$ -- -local drawer = require("drawer") - -local beastiebw = { -" , ,", -" /( )`", -" \\ \\___ / |", -" /- _ `-/ '", -" (/\\/ \\ \\ /\\", -" / / | ` \\", -" O O ) / |", -" `-^--'`< '", -" (_.) _ ) /", -" `.___/` /", -" `-----' /", -" <----. __ / __ \\", -" <----|====O)))==) \\) /====|", -" <----' `--' `.__,' \\", -" | |", -" \\ / /\\", -" ______( (_ / \\______/", -" ,' ,-----' |", -" `--{__________)" +return { + logo = { + graphic = { + " , ,", + " /( )`", + " \\ \\___ / |", + " /- _ `-/ '", + " (/\\/ \\ \\ /\\", + " / / | ` \\", + " O O ) / |", + " `-^--'`< '", + " (_.) _ ) /", + " `.___/` /", + " `-----' /", + " <----. __ / __ \\", + " <----|====O)))==) \\) /====|", + " <----' `--' `.__,' \\", + " | |", + " \\ / /\\", + " ______( (_ / \\______/", + " ,' ,-----' |", + " `--{__________)", + }, + } } - -drawer.addLogo("beastiebw", { - graphic = beastiebw, -}) - -return true Copied and modified: head/stand/lua/gfx-fbsdbw.lua (from r366434, head/stand/lua/logo-fbsdbw.lua) ============================================================================== --- head/stand/lua/logo-fbsdbw.lua Sun Oct 4 19:59:12 2020 (r366434, copy source) +++ head/stand/lua/gfx-fbsdbw.lua Sun Oct 4 22:41:43 2020 (r366435) @@ -27,27 +27,23 @@ -- $FreeBSD$ -- -local drawer = require("drawer") - -local fbsd_logo = { -" ______", -" | ____| __ ___ ___ ", -" | |__ | '__/ _ \\/ _ \\", -" | __|| | | __/ __/", -" | | | | | | |", -" |_| |_| \\___|\\___|", -" ____ _____ _____", -" | _ \\ / ____| __ \\", -" | |_) | (___ | | | |", -" | _ < \\___ \\| | | |", -" | |_) |____) | |__| |", -" | | | |", -" |____/|_____/|_____/" +return { + logo = { + graphic = { + " ______", + " | ____| __ ___ ___ ", + " | |__ | '__/ _ \\/ _ \\", + " | __|| | | __/ __/", + " | | | | | | |", + " |_| |_| \\___|\\___|", + " ____ _____ _____", + " | _ \\ / ____| __ \\", + " | |_) | (___ | | | |", + " | _ < \\___ \\| | | |", + " | |_) |____) | |__| |", + " | | | |", + " |____/|_____/|_____/", + }, + shift = {x = 5, y = 4}, + } } - -drawer.addLogo("fbsdbw", { - graphic = fbsd_logo, - shift = {x = 5, y = 4}, -}) - -return true Copied and modified: head/stand/lua/gfx-orb.lua (from r366434, head/stand/lua/logo-orb.lua) ============================================================================== --- head/stand/lua/logo-orb.lua Sun Oct 4 19:59:12 2020 (r366434, copy source) +++ head/stand/lua/gfx-orb.lua Sun Oct 4 22:41:43 2020 (r366435) @@ -27,30 +27,26 @@ -- $FreeBSD$ -- -local drawer = require("drawer") - -local orb_color = { -" \027[31m``` \027[31;1m`\027[31m", -" s` `.....---...\027[31;1m....--.``` -/\027[31m", -" +o .--` \027[31;1m/y:` +.\027[31m", -" yo`:. \027[31;1m:o `+-\027[31m", -" y/ \027[31;1m-/` -o/\027[31m", -" .- \027[31;1m::/sy+:.\027[31m", -" / \027[31;1m`-- /\027[31m", -" `: \027[31;1m:`\027[31m", -" `: \027[31;1m:`\027[31m", -" / \027[31;1m/\027[31m", -" .- \027[31;1m-.\027[31m", -" -- \027[31;1m-.\027[31m", -" `:` \027[31;1m`:`", -" \027[31;1m.-- `--.", -" .---.....----.\027[m" +return { + logo = { + graphic = { + " \027[31m``` \027[31;1m`\027[31m", + " s` `.....---...\027[31;1m....--.``` -/\027[31m", + " +o .--` \027[31;1m/y:` +.\027[31m", + " yo`:. \027[31;1m:o `+-\027[31m", + " y/ \027[31;1m-/` -o/\027[31m", + " .- \027[31;1m::/sy+:.\027[31m", + " / \027[31;1m`-- /\027[31m", + " `: \027[31;1m:`\027[31m", + " `: \027[31;1m:`\027[31m", + " / \027[31;1m/\027[31m", + " .- \027[31;1m-.\027[31m", + " -- \027[31;1m-.\027[31m", + " `:` \027[31;1m`:`", + " \027[31;1m.-- `--.", + " .---.....----.\027[m", + }, + requires_color = true, + shift = {x = 2, y = 4}, + } } - -drawer.addLogo("orb", { - requires_color = true, - graphic = orb_color, - shift = {x = 2, y = 4}, -}) - -return true Copied and modified: head/stand/lua/gfx-orbbw.lua (from r366434, head/stand/lua/logo-orbbw.lua) ============================================================================== --- head/stand/lua/logo-orbbw.lua Sun Oct 4 19:59:12 2020 (r366434, copy source) +++ head/stand/lua/gfx-orbbw.lua Sun Oct 4 22:41:43 2020 (r366435) @@ -27,29 +27,25 @@ -- $FreeBSD$ -- -local drawer = require("drawer") - -local orbbw = { -" ``` `", -" s` `.....---.......--.``` -/", -" +o .--` /y:` +.", -" yo`:. :o `+-", -" y/ -/` -o/", -" .- ::/sy+:.", -" / `-- /", -" `: :`", -" `: :`", -" / /", -" .- -.", -" -- -.", -" `:` `:`", -" .-- `--.", -" .---.....----." +return { + logo = { + graphic = { + " ``` `", + " s` `.....---.......--.``` -/", + " +o .--` /y:` +.", + " yo`:. :o `+-", + " y/ -/` -o/", + " .- ::/sy+:.", + " / `-- /", + " `: :`", + " `: :`", + " / /", + " .- -.", + " -- -.", + " `:` `:`", + " .-- `--.", + " .---.....----.", + }, + shift = {x = 2, y = 4}, + } } - -drawer.addLogo("orbbw", { - graphic = orbbw, - shift = {x = 2, y = 4}, -}) - -return true From owner-svn-src-all@freebsd.org Mon Oct 5 01:18:48 2020 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 CF7333F2132; Mon, 5 Oct 2020 01:18:48 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4N5z4yM9z4VP3; Mon, 5 Oct 2020 01:18:47 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from tom.home (kib@localhost [127.0.0.1]) by kib.kiev.ua (8.16.1/8.16.1) with ESMTPS id 0951IXOP044295 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Mon, 5 Oct 2020 04:18:37 +0300 (EEST) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.10.3 kib.kiev.ua 0951IXOP044295 Received: (from kostik@localhost) by tom.home (8.16.1/8.16.1/Submit) id 0951IXPN044294; Mon, 5 Oct 2020 04:18:33 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Mon, 5 Oct 2020 04:18:33 +0300 From: Konstantin Belousov To: Rick Macklem Cc: Mateusz Guzik , "src-committers@freebsd.org" , "svn-src-all@freebsd.org" , "svn-src-head@freebsd.org" Subject: Re: svn commit: r366429 - in head/sys: kern sys Message-ID: <20201005011833.GI2643@kib.kiev.ua> References: <202010041633.094GXg4l044462@repo.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FORGED_GMAIL_RCVD,FREEMAIL_FROM, NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on tom.home X-Rspamd-Queue-Id: 4C4N5z4yM9z4VP3 X-Spamd-Bar: + Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=fail reason="No valid SPF, No valid DKIM" header.from=gmail.com (policy=none); spf=softfail (mx1.freebsd.org: 2001:470:d5e7:1::1 is neither permitted nor denied by domain of kostikbel@gmail.com) smtp.mailfrom=kostikbel@gmail.com X-Spamd-Result: default: False [1.87 / 15.00]; ARC_NA(0.00)[]; FREEMAIL_ENVFROM(0.00)[gmail.com]; DMARC_POLICY_SOFTFAIL(0.10)[gmail.com : No valid SPF, No valid DKIM,none]; TO_DN_EQ_ADDR_SOME(0.00)[]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; FREEMAIL_FROM(0.00)[gmail.com]; RCVD_TLS_ALL(0.00)[]; MIME_GOOD(-0.10)[text/plain]; HAS_XAW(0.00)[]; R_SPF_SOFTFAIL(0.00)[~all:c]; RCPT_COUNT_FIVE(0.00)[5]; NEURAL_SPAM_MEDIUM(0.63)[0.628]; TO_MATCH_ENVRCPT_SOME(0.00)[]; NEURAL_SPAM_SHORT(0.47)[0.467]; NEURAL_SPAM_LONG(0.77)[0.772]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+]; ASN(0.00)[asn:6939, ipnet:2001:470::/32, country:US]; FREEMAIL_CC(0.00)[gmail.com,freebsd.org]; MAILMAN_DEST(0.00)[svn-src-all,svn-src-head]; RCVD_COUNT_TWO(0.00)[2] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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, 05 Oct 2020 01:18:48 -0000 On Sun, Oct 04, 2020 at 09:06:02PM +0000, Rick Macklem wrote: > Mateusz Guzik wrote: > >Why is the process lock always taken? It looks like both routines just > >check a thread-local flag, so perhaps this can get away without > >serializing this process-wide? > I did spot this slight difference between the initial version of sig_intr() and > this one. At least w.r.t. copy_file_range(2), the call happens infrequently > enough that the overhead of acquiring the lock is not significant. > Yes, the function should not be on any frequent path. That said, all signal delivery to process is covered by the process lock, so checks under process lock make the advisory answer provide less false negatives. If considered too importand in some cases (when ?), the following patch can be applied. diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 8108d4cb3a5..ed4dd52b66d 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -3212,6 +3212,9 @@ sig_intr(void) int ret; td = curthread; + if ((td->td_flags & (TDF_NEEDSIGCHK | TDF_NEEDSUSPCHK)) == 0) + return (0); + p = td->td_proc; PROC_LOCK(p); From owner-svn-src-all@freebsd.org Mon Oct 5 01:26:35 2020 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 4468C3F25BB; Mon, 5 Oct 2020 01:26:35 +0000 (UTC) (envelope-from 0mp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4NGz18R6z4VTc; Mon, 5 Oct 2020 01:26:35 +0000 (UTC) (envelope-from 0mp@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 0BE42D8F6; Mon, 5 Oct 2020 01:26:35 +0000 (UTC) (envelope-from 0mp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0951QYAd071893; Mon, 5 Oct 2020 01:26:34 GMT (envelope-from 0mp@FreeBSD.org) Received: (from 0mp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0951QYYU071892; Mon, 5 Oct 2020 01:26:34 GMT (envelope-from 0mp@FreeBSD.org) Message-Id: <202010050126.0951QYYU071892@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: 0mp set sender to 0mp@FreeBSD.org using -f From: Mateusz Piotrowski <0mp@FreeBSD.org> Date: Mon, 5 Oct 2020 01:26:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366436 - stable/12/stand/man X-SVN-Group: stable-12 X-SVN-Commit-Author: 0mp X-SVN-Commit-Paths: stable/12/stand/man X-SVN-Commit-Revision: 366436 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.33 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, 05 Oct 2020 01:26:35 -0000 Author: 0mp (doc,ports committer) Date: Mon Oct 5 01:26:34 2020 New Revision: 366436 URL: https://svnweb.freebsd.org/changeset/base/366436 Log: MFC r366364: Correct the documented size of kern.msgbufsize The correct value is 96KB after r226090. PR: 249971 Submitted by: johannes@jo-t.de Modified: stable/12/stand/man/loader.8 Directory Properties: stable/12/ (props changed) Modified: stable/12/stand/man/loader.8 ============================================================================== --- stable/12/stand/man/loader.8 Sun Oct 4 22:41:43 2020 (r366435) +++ stable/12/stand/man/loader.8 Mon Oct 5 01:26:34 2020 (r366436) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 15, 2018 +.Dd October 2, 2020 .Dt LOADER 8 .Os .Sh NAME @@ -646,7 +646,7 @@ Modifies .Dv VM_BCACHE_SIZE_MAX . .It Va kern.msgbufsize Sets the size of the kernel message buffer. -The default limit of 64KB is usually sufficient unless +The default limit of 96KB is usually sufficient unless large amounts of trace data need to be collected between opportunities to examine the buffer or dump it to a file. From owner-svn-src-all@freebsd.org Mon Oct 5 01:27:19 2020 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 3518A3F2161; Mon, 5 Oct 2020 01:27:19 +0000 (UTC) (envelope-from 0mp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4NHq0gsmz4VtY; Mon, 5 Oct 2020 01:27:19 +0000 (UTC) (envelope-from 0mp@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 EE966DC9A; Mon, 5 Oct 2020 01:27:18 +0000 (UTC) (envelope-from 0mp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0951RIQV071987; Mon, 5 Oct 2020 01:27:18 GMT (envelope-from 0mp@FreeBSD.org) Received: (from 0mp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0951RI1T071986; Mon, 5 Oct 2020 01:27:18 GMT (envelope-from 0mp@FreeBSD.org) Message-Id: <202010050127.0951RI1T071986@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: 0mp set sender to 0mp@FreeBSD.org using -f From: Mateusz Piotrowski <0mp@FreeBSD.org> Date: Mon, 5 Oct 2020 01:27:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r366437 - stable/11/stand/man X-SVN-Group: stable-11 X-SVN-Commit-Author: 0mp X-SVN-Commit-Paths: stable/11/stand/man X-SVN-Commit-Revision: 366437 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.33 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, 05 Oct 2020 01:27:19 -0000 Author: 0mp (doc,ports committer) Date: Mon Oct 5 01:27:18 2020 New Revision: 366437 URL: https://svnweb.freebsd.org/changeset/base/366437 Log: MFC r366364: Correct the documented size of kern.msgbufsize The correct value is 96KB after r226090. PR: 249971 Submitted by: johannes@jo-t.de Modified: stable/11/stand/man/loader.8 Directory Properties: stable/11/ (props changed) Modified: stable/11/stand/man/loader.8 ============================================================================== --- stable/11/stand/man/loader.8 Mon Oct 5 01:26:34 2020 (r366436) +++ stable/11/stand/man/loader.8 Mon Oct 5 01:27:18 2020 (r366437) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 20, 2019 +.Dd October 2, 2020 .Dt LOADER 8 .Os .Sh NAME @@ -646,7 +646,7 @@ Modifies .Dv VM_BCACHE_SIZE_MAX . .It Va kern.msgbufsize Sets the size of the kernel message buffer. -The default limit of 64KB is usually sufficient unless +The default limit of 96KB is usually sufficient unless large amounts of trace data need to be collected between opportunities to examine the buffer or dump it to a file. From owner-svn-src-all@freebsd.org Mon Oct 5 05:36:02 2020 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 A905D3F8643; Mon, 5 Oct 2020 05:36:02 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4Tpp41LPz4hXg; Mon, 5 Oct 2020 05:36:02 +0000 (UTC) (envelope-from np@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 6CFBB109DC; Mon, 5 Oct 2020 05:36:02 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0955a2uC025669; Mon, 5 Oct 2020 05:36:02 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0955a2QU025668; Mon, 5 Oct 2020 05:36:02 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010050536.0955a2QU025668@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 05:36:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366438 - stable/12/sys/dev/cxgbe/tom X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: stable/12/sys/dev/cxgbe/tom X-SVN-Commit-Revision: 366438 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.33 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, 05 Oct 2020 05:36:02 -0000 Author: np Date: Mon Oct 5 05:36:01 2020 New Revision: 366438 URL: https://svnweb.freebsd.org/changeset/base/366438 Log: MFC r366384: cxgbe(4): set up the firmware flowc for the tid before send_abort_rpl. Modified: stable/12/sys/dev/cxgbe/tom/t4_listen.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/dev/cxgbe/tom/t4_listen.c ============================================================================== --- stable/12/sys/dev/cxgbe/tom/t4_listen.c Mon Oct 5 01:27:18 2020 (r366437) +++ stable/12/sys/dev/cxgbe/tom/t4_listen.c Mon Oct 5 05:36:01 2020 (r366438) @@ -341,48 +341,32 @@ release_lctx(struct adapter *sc, struct listen_ctx *lc } static void -send_reset_synqe(struct toedev *tod, struct synq_entry *synqe) +send_flowc_wr_synqe(struct adapter *sc, struct synq_entry *synqe) { - struct adapter *sc = tod->tod_softc; struct mbuf *m = synqe->syn; struct ifnet *ifp = m->m_pkthdr.rcvif; struct vi_info *vi = ifp->if_softc; struct port_info *pi = vi->pi; - struct l2t_entry *e = &sc->l2t->l2tab[synqe->params.l2t_idx]; struct wrqe *wr; struct fw_flowc_wr *flowc; - struct cpl_abort_req *req; - int flowclen; struct sge_wrq *ofld_txq; struct sge_ofld_rxq *ofld_rxq; const int nparams = 6; + const int flowclen = sizeof(*flowc) + nparams * sizeof(struct fw_flowc_mnemval); const u_int pfvf = sc->pf << S_FW_VIID_PFN; INP_WLOCK_ASSERT(synqe->lctx->inp); + MPASS((synqe->flags & TPF_FLOWC_WR_SENT) == 0); - CTR5(KTR_CXGBE, "%s: synqe %p (0x%x), tid %d%s", - __func__, synqe, synqe->flags, synqe->tid, - synqe->flags & TPF_ABORT_SHUTDOWN ? - " (abort already in progress)" : ""); - if (synqe->flags & TPF_ABORT_SHUTDOWN) - return; /* abort already in progress */ - synqe->flags |= TPF_ABORT_SHUTDOWN; - ofld_txq = &sc->sge.ofld_txq[synqe->params.txq_idx]; ofld_rxq = &sc->sge.ofld_rxq[synqe->params.rxq_idx]; - /* The wrqe will have two WRs - a flowc followed by an abort_req */ - flowclen = sizeof(*flowc) + nparams * sizeof(struct fw_flowc_mnemval); - - wr = alloc_wrqe(roundup2(flowclen, EQ_ESIZE) + sizeof(*req), ofld_txq); + wr = alloc_wrqe(roundup2(flowclen, 16), ofld_txq); if (wr == NULL) { /* XXX */ panic("%s: allocation failure.", __func__); } flowc = wrtod(wr); - req = (void *)((caddr_t)flowc + roundup2(flowclen, EQ_ESIZE)); - - /* First the flowc ... */ memset(flowc, 0, wr->wr_len); flowc->op_to_nparams = htobe32(V_FW_WR_OP(FW_FLOWC_WR) | V_FW_FLOWC_WR_NPARAMS(nparams)); @@ -396,19 +380,47 @@ send_reset_synqe(struct toedev *tod, struct synq_entry flowc->mnemval[2].val = htobe32(pi->tx_chan); flowc->mnemval[3].mnemonic = FW_FLOWC_MNEM_IQID; flowc->mnemval[3].val = htobe32(ofld_rxq->iq.abs_id); - flowc->mnemval[4].mnemonic = FW_FLOWC_MNEM_SNDBUF; - flowc->mnemval[4].val = htobe32(512); - flowc->mnemval[5].mnemonic = FW_FLOWC_MNEM_MSS; - flowc->mnemval[5].val = htobe32(512); + flowc->mnemval[4].mnemonic = FW_FLOWC_MNEM_SNDBUF; + flowc->mnemval[4].val = htobe32(512); + flowc->mnemval[5].mnemonic = FW_FLOWC_MNEM_MSS; + flowc->mnemval[5].val = htobe32(512); + synqe->flags |= TPF_FLOWC_WR_SENT; + t4_wrq_tx(sc, wr); +} - /* ... then ABORT request */ +static void +send_reset_synqe(struct toedev *tod, struct synq_entry *synqe) +{ + struct adapter *sc = tod->tod_softc; + struct wrqe *wr; + struct cpl_abort_req *req; + + INP_WLOCK_ASSERT(synqe->lctx->inp); + + CTR5(KTR_CXGBE, "%s: synqe %p (0x%x), tid %d%s", + __func__, synqe, synqe->flags, synqe->tid, + synqe->flags & TPF_ABORT_SHUTDOWN ? + " (abort already in progress)" : ""); + if (synqe->flags & TPF_ABORT_SHUTDOWN) + return; /* abort already in progress */ + synqe->flags |= TPF_ABORT_SHUTDOWN; + + if (!(synqe->flags & TPF_FLOWC_WR_SENT)) + send_flowc_wr_synqe(sc, synqe); + + wr = alloc_wrqe(sizeof(*req), &sc->sge.ofld_txq[synqe->params.txq_idx]); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + req = wrtod(wr); INIT_TP_WR_MIT_CPL(req, CPL_ABORT_REQ, synqe->tid); req->rsvd0 = 0; /* don't have a snd_nxt */ req->rsvd1 = 1; /* no data sent yet */ req->cmd = CPL_ABORT_SEND_RST; - t4_l2t_send(sc, wr, e); + t4_l2t_send(sc, wr, &sc->l2t->l2tab[synqe->params.l2t_idx]); } static int @@ -888,6 +900,9 @@ do_abort_req_synqe(struct sge_iq *iq, const struct rss INP_WLOCK(inp); ofld_txq = &sc->sge.ofld_txq[synqe->params.txq_idx]; + + if (!(synqe->flags & TPF_FLOWC_WR_SENT)) + send_flowc_wr_synqe(sc, synqe); /* * If we'd initiated an abort earlier the reply to it is responsible for From owner-svn-src-all@freebsd.org Mon Oct 5 06:38:56 2020 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 CF2FF3F99D6; Mon, 5 Oct 2020 06:38:56 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4WCN55MDz4kvf; Mon, 5 Oct 2020 06:38:56 +0000 (UTC) (envelope-from np@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 747EF114C6; Mon, 5 Oct 2020 06:38:56 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0956cuSF062621; Mon, 5 Oct 2020 06:38:56 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0956cudH062620; Mon, 5 Oct 2020 06:38:56 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010050638.0956cudH062620@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 06:38:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366439 - stable/12/sys/sys X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: stable/12/sys/sys X-SVN-Commit-Revision: 366439 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.33 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, 05 Oct 2020 06:38:56 -0000 Author: np Date: Mon Oct 5 06:38:56 2020 New Revision: 366439 URL: https://svnweb.freebsd.org/changeset/base/366439 Log: MFC r365867: mbuf checksum flags and fields to support tunneling protocols. These are being added to support VXLAN but will work for GENEVE as well. ENCAP_RSVD1 will likely become ENCAP_GENEVE in the future. The size of struct mbuf does not change and that means this change can be MFC'd. If size wasn't a constraint a cleaner way may have been to add inner_csum_flags and inner_csum_data to go with csum_flags and csum_data. Reviewed by: kib@ Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D25873 Modified: stable/12/sys/sys/mbuf.h Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/sys/mbuf.h ============================================================================== --- stable/12/sys/sys/mbuf.h Mon Oct 5 05:36:01 2020 (r366438) +++ stable/12/sys/sys/mbuf.h Mon Oct 5 06:38:56 2020 (r366439) @@ -168,7 +168,10 @@ struct pkthdr { uint8_t l3hlen; /* layer 3 hdr len */ uint8_t l4hlen; /* layer 4 hdr len */ uint8_t l5hlen; /* layer 5 hdr len */ - uint32_t spare; + uint8_t inner_l2hlen; + uint8_t inner_l3hlen; + uint8_t inner_l4hlen; + uint8_t inner_l5hlen; }; }; union { @@ -497,7 +500,13 @@ struct mbuf { * Outbound flags that are set by upper protocol layers requesting lower * layers, or ideally the hardware, to perform these offloading tasks. * For outbound packets this field and its flags can be directly tested - * against ifnet if_hwassist. + * against ifnet if_hwassist. Note that the outbound and the inbound flags do + * not collide right now but they could be allowed to (as long as the flags are + * scrubbed appropriately when the direction of an mbuf changes). CSUM_BITS + * would also have to split into CSUM_BITS_TX and CSUM_BITS_RX. + * + * CSUM_INNER_ is the same as CSUM_ but it applies to the inner frame. + * The CSUM_ENCAP_ bits identify the outer encapsulation. */ #define CSUM_IP 0x00000001 /* IP header checksum offload */ #define CSUM_IP_UDP 0x00000002 /* UDP checksum offload */ @@ -506,13 +515,28 @@ struct mbuf { #define CSUM_IP_TSO 0x00000010 /* TCP segmentation offload */ #define CSUM_IP_ISCSI 0x00000020 /* iSCSI checksum offload */ +#define CSUM_INNER_IP6_UDP 0x00000040 +#define CSUM_INNER_IP6_TCP 0x00000080 +#define CSUM_INNER_IP6_TSO 0x00000100 #define CSUM_IP6_UDP 0x00000200 /* UDP checksum offload */ #define CSUM_IP6_TCP 0x00000400 /* TCP checksum offload */ #define CSUM_IP6_SCTP 0x00000800 /* SCTP checksum offload */ #define CSUM_IP6_TSO 0x00001000 /* TCP segmentation offload */ #define CSUM_IP6_ISCSI 0x00002000 /* iSCSI checksum offload */ +#define CSUM_INNER_IP 0x00004000 +#define CSUM_INNER_IP_UDP 0x00008000 +#define CSUM_INNER_IP_TCP 0x00010000 +#define CSUM_INNER_IP_TSO 0x00020000 + +#define CSUM_ENCAP_VXLAN 0x00040000 /* VXLAN outer encapsulation */ +#define CSUM_ENCAP_RSVD1 0x00080000 + /* Inbound checksum support where the checksum was verified by hardware. */ +#define CSUM_INNER_L3_CALC 0x00100000 +#define CSUM_INNER_L3_VALID 0x00200000 +#define CSUM_INNER_L4_CALC 0x00400000 +#define CSUM_INNER_L4_VALID 0x00800000 #define CSUM_L3_CALC 0x01000000 /* calculated layer 3 csum */ #define CSUM_L3_VALID 0x02000000 /* checksum is correct */ #define CSUM_L4_CALC 0x04000000 /* calculated layer 4 csum */ @@ -523,16 +547,31 @@ struct mbuf { #define CSUM_SND_TAG 0x80000000 /* Packet header has send tag */ +#define CSUM_FLAGS_TX (CSUM_IP | CSUM_IP_UDP | CSUM_IP_TCP | CSUM_IP_SCTP | \ + CSUM_IP_TSO | CSUM_IP_ISCSI | CSUM_INNER_IP6_UDP | CSUM_INNER_IP6_TCP | \ + CSUM_INNER_IP6_TSO | CSUM_IP6_UDP | CSUM_IP6_TCP | CSUM_IP6_SCTP | \ + CSUM_IP6_TSO | CSUM_IP6_ISCSI | CSUM_INNER_IP | CSUM_INNER_IP_UDP | \ + CSUM_INNER_IP_TCP | CSUM_INNER_IP_TSO | CSUM_ENCAP_VXLAN | \ + CSUM_ENCAP_RSVD1 | CSUM_SND_TAG) + +#define CSUM_FLAGS_RX (CSUM_INNER_L3_CALC | CSUM_INNER_L3_VALID | \ + CSUM_INNER_L4_CALC | CSUM_INNER_L4_VALID | CSUM_L3_CALC | CSUM_L3_VALID | \ + CSUM_L4_CALC | CSUM_L4_VALID | CSUM_L5_CALC | CSUM_L5_VALID | \ + CSUM_COALESCED) + /* * CSUM flag description for use with printf(9) %b identifier. */ #define CSUM_BITS \ "\20\1CSUM_IP\2CSUM_IP_UDP\3CSUM_IP_TCP\4CSUM_IP_SCTP\5CSUM_IP_TSO" \ - "\6CSUM_IP_ISCSI" \ - "\12CSUM_IP6_UDP\13CSUM_IP6_TCP\14CSUM_IP6_SCTP\15CSUM_IP6_TSO" \ - "\16CSUM_IP6_ISCSI" \ - "\31CSUM_L3_CALC\32CSUM_L3_VALID\33CSUM_L4_CALC\34CSUM_L4_VALID" \ - "\35CSUM_L5_CALC\36CSUM_L5_VALID\37CSUM_COALESCED\40CSUM_SND_TAG" + "\6CSUM_IP_ISCSI\7CSUM_INNER_IP6_UDP\10CSUM_INNER_IP6_TCP" \ + "\11CSUM_INNER_IP6_TSO\12CSUM_IP6_UDP\13CSUM_IP6_TCP\14CSUM_IP6_SCTP" \ + "\15CSUM_IP6_TSO\16CSUM_IP6_ISCSI\17CSUM_INNER_IP\20CSUM_INNER_IP_UDP" \ + "\21CSUM_INNER_IP_TCP\22CSUM_INNER_IP_TSO\23CSUM_ENCAP_VXLAN" \ + "\24CSUM_ENCAP_RSVD1\25CSUM_INNER_L3_CALC\26CSUM_INNER_L3_VALID" \ + "\27CSUM_INNER_L4_CALC\30CSUM_INNER_L4_VALID\31CSUM_L3_CALC" \ + "\32CSUM_L3_VALID\33CSUM_L4_CALC\34CSUM_L4_VALID\35CSUM_L5_CALC" \ + "\36CSUM_L5_VALID\37CSUM_COALESCED\40CSUM_SND_TAG" /* CSUM flags compatibility mappings. */ #define CSUM_IP_CHECKED CSUM_L3_CALC @@ -548,6 +587,7 @@ struct mbuf { #define CSUM_UDP CSUM_IP_UDP #define CSUM_SCTP CSUM_IP_SCTP #define CSUM_TSO (CSUM_IP_TSO|CSUM_IP6_TSO) +#define CSUM_INNER_TSO (CSUM_INNER_IP_TSO|CSUM_INNER_IP6_TSO) #define CSUM_UDP_IPV6 CSUM_IP6_UDP #define CSUM_TCP_IPV6 CSUM_IP6_TCP #define CSUM_SCTP_IPV6 CSUM_IP6_SCTP From owner-svn-src-all@freebsd.org Mon Oct 5 06:53:30 2020 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 2D52D3FA3E4; Mon, 5 Oct 2020 06:53:30 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4WXB0K5bz4lwQ; Mon, 5 Oct 2020 06:53:30 +0000 (UTC) (envelope-from np@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 E1FE211B39; Mon, 5 Oct 2020 06:53:29 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0956rTZj074442; Mon, 5 Oct 2020 06:53:29 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0956rTNb074441; Mon, 5 Oct 2020 06:53:29 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010050653.0956rTNb074441@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 06:53:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366440 - head/tools/tools/cxgbtool X-SVN-Group: head X-SVN-Commit-Author: np X-SVN-Commit-Paths: head/tools/tools/cxgbtool X-SVN-Commit-Revision: 366440 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.33 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, 05 Oct 2020 06:53:30 -0000 Author: np Date: Mon Oct 5 06:53:29 2020 New Revision: 366440 URL: https://svnweb.freebsd.org/changeset/base/366440 Log: Get tools/tools/cxgbtool to build with the latest clang. Reported by: olivier@ Modified: head/tools/tools/cxgbtool/Makefile Modified: head/tools/tools/cxgbtool/Makefile ============================================================================== --- head/tools/tools/cxgbtool/Makefile Mon Oct 5 06:38:56 2020 (r366439) +++ head/tools/tools/cxgbtool/Makefile Mon Oct 5 06:53:29 2020 (r366440) @@ -6,5 +6,6 @@ MAN= CFLAGS+= -I${.CURDIR}/../../../sys/dev/cxgb -I. CFLAGS+= -DCONFIG_T3_REGS -DCHELSIO_INTERNAL BINDIR?= /usr/sbin +WARNS?= 3 .include From owner-svn-src-all@freebsd.org Mon Oct 5 07:26:08 2020 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 0B1A53FAD9F; Mon, 5 Oct 2020 07:26:08 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4XFq58d8z4myx; Mon, 5 Oct 2020 07:26:07 +0000 (UTC) (envelope-from np@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 941D9120A2; Mon, 5 Oct 2020 07:26:07 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0957Q7Yd092795; Mon, 5 Oct 2020 07:26:07 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0957Q6Zp092791; Mon, 5 Oct 2020 07:26:06 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010050726.0957Q6Zp092791@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 07:26:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366441 - in stable/12: sbin/ifconfig sys/net X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: in stable/12: sbin/ifconfig sys/net X-SVN-Commit-Revision: 366441 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.33 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, 05 Oct 2020 07:26:08 -0000 Author: np Date: Mon Oct 5 07:26:06 2020 New Revision: 366441 URL: https://svnweb.freebsd.org/changeset/base/366441 Log: MFC r365868: Add two new ifnet capabilities for hw checksumming and TSO for VXLAN traffic. These are similar to the existing VLAN capabilities. Reviewed by: kib@ Sponsored by: Chelsio Communications Modified: stable/12/sbin/ifconfig/ifconfig.8 stable/12/sbin/ifconfig/ifconfig.c stable/12/sbin/ifconfig/ifvxlan.c stable/12/sys/net/if.h Directory Properties: stable/12/ (props changed) Modified: stable/12/sbin/ifconfig/ifconfig.8 ============================================================================== --- stable/12/sbin/ifconfig/ifconfig.8 Mon Oct 5 06:53:29 2020 (r366440) +++ stable/12/sbin/ifconfig/ifconfig.8 Mon Oct 5 07:26:06 2020 (r366441) @@ -28,7 +28,7 @@ .\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94 .\" $FreeBSD$ .\" -.Dd June 4, 2020 +.Dd September 17, 2020 .Dt IFCONFIG 8 .Os .Sh NAME @@ -559,7 +559,7 @@ If the driver offers user-configurable VLAN support, e reception of extended frames, tag processing in hardware, frame filtering in hardware, checksum offloading, or TSO on VLAN, respectively. -Note that this must be issued on a physical interface associated with +Note that this must be configured on a physical interface associated with .Xr vlan 4 , not on a .Xr vlan 4 @@ -569,6 +569,21 @@ If the driver offers user-configurable VLAN support, d reception of extended frames, tag processing in hardware, frame filtering in hardware, or TSO on VLAN, respectively. +.It Cm vxlanhwcsum , vxlanhwtso +If the driver offers user-configurable VXLAN support, enable inner checksum +offloading (receive and transmit) or TSO on VXLAN, respectively. +Note that this must be configured on a physical interface associated with +.Xr vxlan 4 , +not on a +.Xr vxlan 4 +interface itself. +The physical interface is either the interface specified as the vxlandev +or the interface hosting the vxlanlocal address. +The driver will offload as much checksum work and TSO as it can reliably +support, the exact level of offloading may vary between drivers. +.It Fl vxlanhwcsum , vxlanhwtso +If the driver offers user-configurable VXLAN support, disable checksum +offloading (receive and transmit) or TSO on VXLAN, respectively. .It Cm vnet Ar jail Move the interface to the .Xr jail 8 , Modified: stable/12/sbin/ifconfig/ifconfig.c ============================================================================== --- stable/12/sbin/ifconfig/ifconfig.c Mon Oct 5 06:53:29 2020 (r366440) +++ stable/12/sbin/ifconfig/ifconfig.c Mon Oct 5 07:26:06 2020 (r366441) @@ -1344,7 +1344,8 @@ unsetifdescr(const char *val, int value, int s, const "\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU\7POLLING" \ "\10VLAN_HWCSUM\11TSO4\12TSO6\13LRO\14WOL_UCAST\15WOL_MCAST\16WOL_MAGIC" \ "\17TOE4\20TOE6\21VLAN_HWFILTER\23VLAN_HWTSO\24LINKSTATE\25NETMAP" \ -"\26RXCSUM_IPV6\27TXCSUM_IPV6\31TXRTLMT\32HWRXTSTMP" +"\26RXCSUM_IPV6\27TXCSUM_IPV6\31TXRTLMT\32HWRXTSTMP" \ +"\36VXLAN_HWCSUM\37VXLAN_HWTSO" /* * Print the status of the interface. If an address family was Modified: stable/12/sbin/ifconfig/ifvxlan.c ============================================================================== --- stable/12/sbin/ifconfig/ifvxlan.c Mon Oct 5 06:53:29 2020 (r366440) +++ stable/12/sbin/ifconfig/ifvxlan.c Mon Oct 5 07:26:06 2020 (r366441) @@ -620,6 +620,11 @@ static struct cmd vxlan_cmds[] = { DEF_CMD("vxlanflush", 0, setvxlan_flush), DEF_CMD("vxlanflushall", 1, setvxlan_flush), + + DEF_CMD("vxlanhwcsum", IFCAP_VXLAN_HWCSUM, setifcap), + DEF_CMD("-vxlanhwcsum", -IFCAP_VXLAN_HWCSUM, setifcap), + DEF_CMD("vxlanhwtso", IFCAP_VXLAN_HWTSO, setifcap), + DEF_CMD("-vxlanhwtso", -IFCAP_VXLAN_HWTSO, setifcap), }; static struct afswtch af_vxlan = { Modified: stable/12/sys/net/if.h ============================================================================== --- stable/12/sys/net/if.h Mon Oct 5 06:53:29 2020 (r366440) +++ stable/12/sys/net/if.h Mon Oct 5 07:26:06 2020 (r366441) @@ -246,6 +246,8 @@ struct if_data { #define IFCAP_HWSTATS 0x800000 /* manages counters internally */ #define IFCAP_TXRTLMT 0x1000000 /* hardware supports TX rate limiting */ #define IFCAP_HWRXTSTMP 0x2000000 /* hardware rx timestamping */ +#define IFCAP_VXLAN_HWCSUM 0x20000000 /* can do IFCAN_HWCSUM on VXLANs */ +#define IFCAP_VXLAN_HWTSO 0x40000000 /* can do IFCAP_TSO on VXLANs */ #define IFCAP_HWCSUM_IPV6 (IFCAP_RXCSUM_IPV6 | IFCAP_TXCSUM_IPV6) From owner-svn-src-all@freebsd.org Mon Oct 5 08:51:05 2020 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 D35D13FC9A2; Mon, 5 Oct 2020 08:51:05 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4Z7s5YVfz4rfn; Mon, 5 Oct 2020 08:51:05 +0000 (UTC) (envelope-from np@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 A12BB12FA5; Mon, 5 Oct 2020 08:51:05 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0958p5pV046284; Mon, 5 Oct 2020 08:51:05 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0958p4HL046277; Mon, 5 Oct 2020 08:51:04 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010050851.0958p4HL046277@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 08:51:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366442 - in stable/12: share/man/man4 sys/dev/cxgbe sys/dev/cxgbe/common sys/dev/cxgbe/firmware X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: in stable/12: share/man/man4 sys/dev/cxgbe sys/dev/cxgbe/common sys/dev/cxgbe/firmware X-SVN-Commit-Revision: 366442 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.33 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, 05 Oct 2020 08:51:05 -0000 Author: np Date: Mon Oct 5 08:51:03 2020 New Revision: 366442 URL: https://svnweb.freebsd.org/changeset/base/366442 Log: MFC r365871. This needs a couple other revisions which aren't in stable/12 yet to actually work but is being committed out of order to ease other cxgbe MFCs. r365871: cxgbe(4): add support for stateless offloads for VXLAN traffic. Hardware assistance includes checksumming (tx and rx), TSO, and RSS on the inner traffic in a VXLAN tunnel. Sponsored by: Chelsio Communications Modified: stable/12/share/man/man4/cxgbe.4 stable/12/sys/dev/cxgbe/adapter.h stable/12/sys/dev/cxgbe/common/common.h stable/12/sys/dev/cxgbe/common/t4_hw.c stable/12/sys/dev/cxgbe/firmware/t6fw_cfg.txt stable/12/sys/dev/cxgbe/t4_main.c stable/12/sys/dev/cxgbe/t4_sge.c Directory Properties: stable/12/ (props changed) Modified: stable/12/share/man/man4/cxgbe.4 ============================================================================== --- stable/12/share/man/man4/cxgbe.4 Mon Oct 5 07:26:06 2020 (r366441) +++ stable/12/share/man/man4/cxgbe.4 Mon Oct 5 08:51:03 2020 (r366442) @@ -31,7 +31,7 @@ .\" .\" $FreeBSD$ .\" -.Dd Dec 10, 2019 +.Dd September 17, 2020 .Dt CXGBE 4 .Os .Sh NAME @@ -61,8 +61,8 @@ driver provides support for PCI Express Ethernet adapt the Chelsio Terminator 4, Terminator 5, and Terminator 6 ASICs (T4, T5, and T6). The driver supports Jumbo Frames, Transmit/Receive checksum offload, TCP segmentation offload (TSO), Large Receive Offload (LRO), VLAN -tag insertion/extraction, VLAN checksum offload, VLAN TSO, and -Receive Side Steering (RSS). +tag insertion/extraction, VLAN checksum offload, VLAN TSO, VXLAN checksum +offload, VXLAN TSO, and Receive Side Steering (RSS). For further hardware information and questions related to hardware requirements, see .Pa http://www.chelsio.com/ . Modified: stable/12/sys/dev/cxgbe/adapter.h ============================================================================== --- stable/12/sys/dev/cxgbe/adapter.h Mon Oct 5 07:26:06 2020 (r366441) +++ stable/12/sys/dev/cxgbe/adapter.h Mon Oct 5 08:51:03 2020 (r366442) @@ -121,6 +121,7 @@ enum { TX_SGL_SEGS = 39, TX_SGL_SEGS_TSO = 38, TX_SGL_SEGS_EO_TSO = 30, /* XXX: lower for IPv6. */ + TX_SGL_SEGS_VXLAN_TSO = 37, TX_WR_FLITS = SGE_MAX_WR_LEN / 8 }; @@ -286,6 +287,7 @@ struct port_info { int nvi; int up_vis; int uld_vis; + bool vxlan_tcam_entry; struct tx_sched_params *sched_params; @@ -593,6 +595,8 @@ struct sge_txq { uint64_t txpkts0_pkts; /* # of frames in type0 coalesced tx WRs */ uint64_t txpkts1_pkts; /* # of frames in type1 coalesced tx WRs */ uint64_t raw_wrs; /* # of raw work requests (alloc_wr_mbuf) */ + uint64_t vxlan_tso_wrs; /* # of VXLAN TSO work requests */ + uint64_t vxlan_txcsum; /* stats for not-that-common events */ } __aligned(CACHE_LINE_SIZE); @@ -611,6 +615,7 @@ struct sge_rxq { uint64_t rxcsum; /* # of times hardware assisted with checksum */ uint64_t vlan_extraction;/* # of times VLAN tag was extracted */ + uint64_t vxlan_rxcsum; /* stats for not-that-common events */ @@ -833,6 +838,11 @@ struct adapter { struct sge sge; int lro_timeout; int sc_do_rxcopy; + + int vxlan_port; + u_int vxlan_refcount; + int rawf_base; + int nrawf; struct taskqueue *tq[MAX_NCHAN]; /* General purpose taskqueues */ struct port_info *port[MAX_NPORTS]; Modified: stable/12/sys/dev/cxgbe/common/common.h ============================================================================== --- stable/12/sys/dev/cxgbe/common/common.h Mon Oct 5 07:26:06 2020 (r366441) +++ stable/12/sys/dev/cxgbe/common/common.h Mon Oct 5 08:51:03 2020 (r366442) @@ -249,7 +249,7 @@ struct tp_params { uint32_t max_rx_pdu; uint32_t max_tx_pdu; uint64_t hash_filter_mask; - __be16 err_vec_mask; + bool rx_pkt_encap; int8_t fcoe_shift; int8_t port_shift; Modified: stable/12/sys/dev/cxgbe/common/t4_hw.c ============================================================================== --- stable/12/sys/dev/cxgbe/common/t4_hw.c Mon Oct 5 07:26:06 2020 (r366441) +++ stable/12/sys/dev/cxgbe/common/t4_hw.c Mon Oct 5 08:51:03 2020 (r366442) @@ -9627,19 +9627,11 @@ int t4_init_tp_params(struct adapter *adap, bool sleep read_filter_mode_and_ingress_config(adap, sleep_ok); - /* - * Cache a mask of the bits that represent the error vector portion of - * rx_pkt.err_vec. T6+ can use a compressed error vector to make room - * for information about outer encapsulation (GENEVE/VXLAN/NVGRE). - */ - tpp->err_vec_mask = htobe16(0xffff); if (chip_id(adap) > CHELSIO_T5) { v = t4_read_reg(adap, A_TP_OUT_CONFIG); - if (v & F_CRXPKTENC) { - tpp->err_vec_mask = - htobe16(V_T6_COMPR_RXERR_VEC(M_T6_COMPR_RXERR_VEC)); - } - } + tpp->rx_pkt_encap = v & F_CRXPKTENC; + } else + tpp->rx_pkt_encap = false; rx_len = t4_read_reg(adap, A_TP_PMM_RX_PAGE_SIZE); tx_len = t4_read_reg(adap, A_TP_PMM_TX_PAGE_SIZE); Modified: stable/12/sys/dev/cxgbe/firmware/t6fw_cfg.txt ============================================================================== --- stable/12/sys/dev/cxgbe/firmware/t6fw_cfg.txt Mon Oct 5 07:26:06 2020 (r366441) +++ stable/12/sys/dev/cxgbe/firmware/t6fw_cfg.txt Mon Oct 5 08:51:03 2020 (r366442) @@ -146,7 +146,8 @@ nethctrl = 1024 neq = 2048 nqpcq = 8192 - nexactf = 456 + nexactf = 454 + nrawf = 2 cmask = all pmask = all ncrypto_lookaside = 16 @@ -272,7 +273,7 @@ [fini] version = 0x1 - checksum = 0x13640470 + checksum = 0xa92352a8 # # $FreeBSD$ # Modified: stable/12/sys/dev/cxgbe/t4_main.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_main.c Mon Oct 5 07:26:06 2020 (r366441) +++ stable/12/sys/dev/cxgbe/t4_main.c Mon Oct 5 08:51:03 2020 (r366442) @@ -41,9 +41,11 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include +#include #include #include #include @@ -1021,6 +1023,8 @@ t4_attach(device_t dev) sc->policy = NULL; rw_init(&sc->policy_lock, "connection offload policy"); + refcount_init(&sc->vxlan_refcount, 0); + rc = t4_map_bars_0_and_4(sc); if (rc != 0) goto done; /* error message displayed already */ @@ -1661,6 +1665,7 @@ cxgbe_vi_attach(device_t dev, struct vi_info *vi) { struct ifnet *ifp; struct sbuf *sb; + struct adapter *sc = vi->adapter; vi->xact_addr_filt = -1; callout_init(&vi->tick, 1); @@ -1691,23 +1696,31 @@ cxgbe_vi_attach(device_t dev, struct vi_info *vi) ifp->if_capabilities = T4_CAP; ifp->if_capenable = T4_CAP_ENABLE; + ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO | + CSUM_UDP_IPV6 | CSUM_TCP_IPV6; + if (chip_id(sc) >= CHELSIO_T6) { + ifp->if_capabilities |= IFCAP_VXLAN_HWCSUM | IFCAP_VXLAN_HWTSO; + ifp->if_capenable |= IFCAP_VXLAN_HWCSUM | IFCAP_VXLAN_HWTSO; + ifp->if_hwassist |= CSUM_INNER_IP6_UDP | CSUM_INNER_IP6_TCP | + CSUM_INNER_IP6_TSO | CSUM_INNER_IP | CSUM_INNER_IP_UDP | + CSUM_INNER_IP_TCP | CSUM_INNER_IP_TSO | CSUM_ENCAP_VXLAN; + } + #ifdef TCP_OFFLOAD if (vi->nofldrxq != 0) ifp->if_capabilities |= IFCAP_TOE; #endif #ifdef RATELIMIT - if (is_ethoffload(vi->adapter) && vi->nofldtxq != 0) { + if (is_ethoffload(sc) && vi->nofldtxq != 0) { ifp->if_capabilities |= IFCAP_TXRTLMT; ifp->if_capenable |= IFCAP_TXRTLMT; } #endif - ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO | - CSUM_UDP_IPV6 | CSUM_TCP_IPV6; ifp->if_hw_tsomax = IP_MAXPACKET; ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS_TSO; #ifdef RATELIMIT - if (is_ethoffload(vi->adapter) && vi->nofldtxq != 0) + if (is_ethoffload(sc) && vi->nofldtxq != 0) ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS_EO_TSO; #endif ifp->if_hw_tsomaxsegsize = 65536; @@ -2021,6 +2034,18 @@ cxgbe_ioctl(struct ifnet *ifp, unsigned long cmd, cadd if (mask & IFCAP_NOMAP) ifp->if_capenable ^= IFCAP_NOMAP; + if (mask & IFCAP_VXLAN_HWCSUM) { + ifp->if_capenable ^= IFCAP_VXLAN_HWCSUM; + ifp->if_hwassist ^= CSUM_INNER_IP6_UDP | + CSUM_INNER_IP6_TCP | CSUM_INNER_IP | + CSUM_INNER_IP_UDP | CSUM_INNER_IP_TCP; + } + if (mask & IFCAP_VXLAN_HWTSO) { + ifp->if_capenable ^= IFCAP_VXLAN_HWTSO; + ifp->if_hwassist ^= CSUM_INNER_IP6_TSO | + CSUM_INNER_IP_TSO; + } + #ifdef VLAN_CAPABILITIES VLAN_CAPABILITIES(ifp); #endif @@ -4231,6 +4256,19 @@ get_params__post_init(struct adapter *sc) MPASS(sc->tids.hpftid_base == 0); MPASS(sc->tids.tid_base == sc->tids.nhpftids); } + + param[0] = FW_PARAM_PFVF(RAWF_START); + param[1] = FW_PARAM_PFVF(RAWF_END); + rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val); + if (rc != 0) { + device_printf(sc->dev, + "failed to query rawf parameters: %d.\n", rc); + return (rc); + } + if ((int)val[1] > (int)val[0]) { + sc->rawf_base = val[0]; + sc->nrawf = val[1] - val[0] + 1; + } } /* @@ -4856,6 +4894,7 @@ update_mac_settings(struct ifnet *ifp, int flags) struct port_info *pi = vi->pi; struct adapter *sc = pi->adapter; int mtu = -1, promisc = -1, allmulti = -1, vlanex = -1; + uint8_t match_all_mac[ETHER_ADDR_LEN] = {0}; ASSERT_SYNCHRONIZED_OP(sc); KASSERT(flags, ("%s: not told what to update.", __func__)); @@ -4942,7 +4981,7 @@ update_mac_settings(struct ifnet *ifp, int flags) rc = -rc; for (j = 0; j < i; j++) { if_printf(ifp, - "failed to add mc address" + "failed to add mcast address" " %02x:%02x:%02x:" "%02x:%02x:%02x rc=%d\n", mcaddr[j][0], mcaddr[j][1], @@ -4952,15 +4991,37 @@ update_mac_settings(struct ifnet *ifp, int flags) } goto mcfail; } + del = 0; } rc = -t4_set_addr_hash(sc, sc->mbox, vi->viid, 0, hash, 0); if (rc != 0) - if_printf(ifp, "failed to set mc address hash: %d", rc); + if_printf(ifp, "failed to set mcast address hash: %d\n", + rc); + if (del == 0) { + /* We clobbered the VXLAN entry if there was one. */ + pi->vxlan_tcam_entry = false; + } mcfail: if_maddr_runlock(ifp); } + if (IS_MAIN_VI(vi) && sc->vxlan_refcount > 0 && + pi->vxlan_tcam_entry == false) { + rc = t4_alloc_raw_mac_filt(sc, vi->viid, match_all_mac, + match_all_mac, sc->rawf_base + pi->port_id, 1, pi->port_id, + true); + if (rc < 0) { + rc = -rc; + if_printf(ifp, "failed to add VXLAN TCAM entry: %d.\n", + rc); + } else { + MPASS(rc == sc->rawf_base + pi->port_id); + rc = 0; + pi->vxlan_tcam_entry = true; + } + } + return (rc); } @@ -10080,6 +10141,7 @@ clear_stats(struct adapter *sc, u_int port_id) #endif rxq->rxcsum = 0; rxq->vlan_extraction = 0; + rxq->vxlan_rxcsum = 0; rxq->fl.cl_allocated = 0; rxq->fl.cl_recycled = 0; @@ -10098,6 +10160,8 @@ clear_stats(struct adapter *sc, u_int port_id) txq->txpkts0_pkts = 0; txq->txpkts1_pkts = 0; txq->raw_wrs = 0; + txq->vxlan_tso_wrs = 0; + txq->vxlan_txcsum = 0; mp_ring_reset_stats(txq->r); } @@ -10873,6 +10937,116 @@ DB_FUNC(tcb, db_show_t4tcb, db_t4_table, CS_OWN, NULL) } #endif +static eventhandler_tag vxlan_start_evtag; +static eventhandler_tag vxlan_stop_evtag; + +struct vxlan_evargs { + struct ifnet *ifp; + uint16_t port; +}; + +static void +t4_vxlan_start(struct adapter *sc, void *arg) +{ + struct vxlan_evargs *v = arg; + struct port_info *pi; + uint8_t match_all_mac[ETHER_ADDR_LEN] = {0}; + int i, rc; + + if (sc->nrawf == 0 || chip_id(sc) <= CHELSIO_T5) + return; + if (begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4vxst") != 0) + return; + + if (sc->vxlan_refcount == 0) { + sc->vxlan_port = v->port; + sc->vxlan_refcount = 1; + t4_write_reg(sc, A_MPS_RX_VXLAN_TYPE, + V_VXLAN(v->port) | F_VXLAN_EN); + for_each_port(sc, i) { + pi = sc->port[i]; + if (pi->vxlan_tcam_entry == true) + continue; + rc = t4_alloc_raw_mac_filt(sc, pi->vi[0].viid, + match_all_mac, match_all_mac, + sc->rawf_base + pi->port_id, 1, pi->port_id, true); + if (rc < 0) { + rc = -rc; + log(LOG_ERR, + "%s: failed to add VXLAN TCAM entry: %d.\n", + device_get_name(pi->vi[0].dev), rc); + } else { + MPASS(rc == sc->rawf_base + pi->port_id); + rc = 0; + pi->vxlan_tcam_entry = true; + } + } + } else if (sc->vxlan_port == v->port) { + sc->vxlan_refcount++; + } else { + log(LOG_ERR, "%s: VXLAN already configured on port %d; " + "ignoring attempt to configure it on port %d\n", + device_get_nameunit(sc->dev), sc->vxlan_port, v->port); + } + end_synchronized_op(sc, 0); +} + +static void +t4_vxlan_stop(struct adapter *sc, void *arg) +{ + struct vxlan_evargs *v = arg; + + if (sc->nrawf == 0 || chip_id(sc) <= CHELSIO_T5) + return; + if (begin_synchronized_op(sc, NULL, SLEEP_OK | INTR_OK, "t4vxsp") != 0) + return; + + /* + * VXLANs may have been configured before the driver was loaded so we + * may see more stops than starts. This is not handled cleanly but at + * least we keep the refcount sane. + */ + if (sc->vxlan_port != v->port) + goto done; + if (sc->vxlan_refcount == 0) { + log(LOG_ERR, + "%s: VXLAN operation on port %d was stopped earlier; " + "ignoring attempt to stop it again.\n", + device_get_nameunit(sc->dev), sc->vxlan_port); + } else if (--sc->vxlan_refcount == 0) { + t4_set_reg_field(sc, A_MPS_RX_VXLAN_TYPE, F_VXLAN_EN, 0); + } +done: + end_synchronized_op(sc, 0); +} + +static void +t4_vxlan_start_handler(void *arg __unused, struct ifnet *ifp, + sa_family_t family, u_int port) +{ + struct vxlan_evargs v; + + MPASS(family == AF_INET || family == AF_INET6); + v.ifp = ifp; + v.port = port; + + t4_iterate(t4_vxlan_start, &v); +} + +static void +t4_vxlan_stop_handler(void *arg __unused, struct ifnet *ifp, sa_family_t family, + u_int port) +{ + struct vxlan_evargs v; + + MPASS(family == AF_INET || family == AF_INET6); + v.ifp = ifp; + v.port = port; + + t4_iterate(t4_vxlan_stop, &v); +} + + static struct sx mlu; /* mod load unload */ SX_SYSINIT(cxgbe_mlu, &mlu, "cxgbe mod load/unload"); @@ -10913,6 +11087,14 @@ mod_event(module_t mod, int cmd, void *arg) #endif t4_tracer_modload(); tweak_tunables(); + vxlan_start_evtag = + EVENTHANDLER_REGISTER(vxlan_start, + t4_vxlan_start_handler, NULL, + EVENTHANDLER_PRI_ANY); + vxlan_stop_evtag = + EVENTHANDLER_REGISTER(vxlan_stop, + t4_vxlan_stop_handler, NULL, + EVENTHANDLER_PRI_ANY); } sx_xunlock(&mlu); break; @@ -10949,6 +11131,10 @@ mod_event(module_t mod, int cmd, void *arg) sx_sunlock(&t4_list_lock); if (t4_sge_extfree_refs() == 0) { + EVENTHANDLER_DEREGISTER(vxlan_start, + vxlan_start_evtag); + EVENTHANDLER_DEREGISTER(vxlan_stop, + vxlan_stop_evtag); t4_tracer_modunload(); #ifdef INET6 t4_clip_modunload(); Modified: stable/12/sys/dev/cxgbe/t4_sge.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_sge.c Mon Oct 5 07:26:06 2020 (r366441) +++ stable/12/sys/dev/cxgbe/t4_sge.c Mon Oct 5 08:51:03 2020 (r366442) @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -271,8 +272,9 @@ static int find_refill_source(struct adapter *, int, b static void add_fl_to_sfl(struct adapter *, struct sge_fl *); static inline void get_pkt_gl(struct mbuf *, struct sglist *); -static inline u_int txpkt_len16(u_int, u_int); -static inline u_int txpkt_vm_len16(u_int, u_int); +static inline u_int txpkt_len16(u_int, const u_int); +static inline u_int txpkt_vm_len16(u_int, const u_int); +static inline void calculate_mbuf_len16(struct adapter *, struct mbuf *); static inline u_int txpkts0_len16(u_int); static inline u_int txpkts1_len16(void); static u_int write_raw_wr(struct sge_txq *, void *, struct mbuf *, u_int); @@ -1867,13 +1869,42 @@ eth_rx(struct adapter *sc, struct sge_rxq *rxq, const #if defined(INET) || defined(INET6) struct lro_ctrl *lro = &rxq->lro; #endif + uint16_t err_vec, tnl_type, tnlhdr_len; static const int sw_hashtype[4][2] = { {M_HASHTYPE_NONE, M_HASHTYPE_NONE}, {M_HASHTYPE_RSS_IPV4, M_HASHTYPE_RSS_IPV6}, {M_HASHTYPE_RSS_TCP_IPV4, M_HASHTYPE_RSS_TCP_IPV6}, {M_HASHTYPE_RSS_UDP_IPV4, M_HASHTYPE_RSS_UDP_IPV6}, }; + static const int sw_csum_flags[2][2] = { + { + /* IP, inner IP */ + CSUM_ENCAP_VXLAN | + CSUM_L3_CALC | CSUM_L3_VALID | + CSUM_L4_CALC | CSUM_L4_VALID | + CSUM_INNER_L3_CALC | CSUM_INNER_L3_VALID | + CSUM_INNER_L4_CALC | CSUM_INNER_L4_VALID, + /* IP, inner IP6 */ + CSUM_ENCAP_VXLAN | + CSUM_L3_CALC | CSUM_L3_VALID | + CSUM_L4_CALC | CSUM_L4_VALID | + CSUM_INNER_L4_CALC | CSUM_INNER_L4_VALID, + }, + { + /* IP6, inner IP */ + CSUM_ENCAP_VXLAN | + CSUM_L4_CALC | CSUM_L4_VALID | + CSUM_INNER_L3_CALC | CSUM_INNER_L3_VALID | + CSUM_INNER_L4_CALC | CSUM_INNER_L4_VALID, + + /* IP6, inner IP6 */ + CSUM_ENCAP_VXLAN | + CSUM_L4_CALC | CSUM_L4_VALID | + CSUM_INNER_L4_CALC | CSUM_INNER_L4_VALID, + }, + }; + MPASS(plen > sc->params.sge.fl_pktshift); m0 = get_fl_payload(sc, fl, plen); if (__predict_false(m0 == NULL)) @@ -1888,23 +1919,73 @@ eth_rx(struct adapter *sc, struct sge_rxq *rxq, const m0->m_pkthdr.flowid = be32toh(d->rss.hash_val); cpl = (const void *)(&d->rss + 1); - if (cpl->csum_calc && !(cpl->err_vec & sc->params.tp.err_vec_mask)) { - if (ifp->if_capenable & IFCAP_RXCSUM && - cpl->l2info & htobe32(F_RXF_IP)) { - m0->m_pkthdr.csum_flags = (CSUM_IP_CHECKED | - CSUM_IP_VALID | CSUM_DATA_VALID | CSUM_PSEUDO_HDR); + if (sc->params.tp.rx_pkt_encap) { + const uint16_t ev = be16toh(cpl->err_vec); + + err_vec = G_T6_COMPR_RXERR_VEC(ev); + tnl_type = G_T6_RX_TNL_TYPE(ev); + tnlhdr_len = G_T6_RX_TNLHDR_LEN(ev); + } else { + err_vec = be16toh(cpl->err_vec); + tnl_type = 0; + tnlhdr_len = 0; + } + if (cpl->csum_calc && err_vec == 0) { + int ipv6 = !!(cpl->l2info & htobe32(F_RXF_IP6)); + + /* checksum(s) calculated and found to be correct. */ + + MPASS((cpl->l2info & htobe32(F_RXF_IP)) ^ + (cpl->l2info & htobe32(F_RXF_IP6))); + m0->m_pkthdr.csum_data = be16toh(cpl->csum); + if (tnl_type == 0) { + if (!ipv6 && ifp->if_capenable & IFCAP_RXCSUM) { + m0->m_pkthdr.csum_flags = CSUM_L3_CALC | + CSUM_L3_VALID | CSUM_L4_CALC | + CSUM_L4_VALID; + } else if (ipv6 && ifp->if_capenable & IFCAP_RXCSUM_IPV6) { + m0->m_pkthdr.csum_flags = CSUM_L4_CALC | + CSUM_L4_VALID; + } rxq->rxcsum++; - } else if (ifp->if_capenable & IFCAP_RXCSUM_IPV6 && - cpl->l2info & htobe32(F_RXF_IP6)) { - m0->m_pkthdr.csum_flags = (CSUM_DATA_VALID_IPV6 | - CSUM_PSEUDO_HDR); - rxq->rxcsum++; - } + } else { + MPASS(tnl_type == RX_PKT_TNL_TYPE_VXLAN); + if (__predict_false(cpl->ip_frag)) { + /* + * csum_data is for the inner frame (which is an + * IP fragment) and is not 0xffff. There is no + * way to pass the inner csum_data to the stack. + * We don't want the stack to use the inner + * csum_data to validate the outer frame or it + * will get rejected. So we fix csum_data here + * and let sw do the checksum of inner IP + * fragments. + * + * XXX: Need 32b for csum_data2 in an rx mbuf. + * Maybe stuff it into rcv_tstmp? + */ + m0->m_pkthdr.csum_data = 0xffff; + if (ipv6) { + m0->m_pkthdr.csum_flags = CSUM_L4_CALC | + CSUM_L4_VALID; + } else { + m0->m_pkthdr.csum_flags = CSUM_L3_CALC | + CSUM_L3_VALID | CSUM_L4_CALC | + CSUM_L4_VALID; + } + } else { + int outer_ipv6; - if (__predict_false(cpl->ip_frag)) - m0->m_pkthdr.csum_data = be16toh(cpl->csum); - else - m0->m_pkthdr.csum_data = 0xffff; + MPASS(m0->m_pkthdr.csum_data == 0xffff); + + outer_ipv6 = tnlhdr_len >= + sizeof(struct ether_header) + + sizeof(struct ip6_hdr); + m0->m_pkthdr.csum_flags = + sw_csum_flags[outer_ipv6][ipv6]; + } + rxq->vxlan_rxcsum++; + } } if (cpl->vlan_ex) { @@ -1929,7 +2010,7 @@ eth_rx(struct adapter *sc, struct sge_rxq *rxq, const } #if defined(INET) || defined(INET6) - if (rxq->iq.flags & IQ_LRO_ENABLED && + if (rxq->iq.flags & IQ_LRO_ENABLED && tnl_type == 0 && (M_HASHTYPE_GET(m0) == M_HASHTYPE_RSS_TCP_IPV4 || M_HASHTYPE_GET(m0) == M_HASHTYPE_RSS_TCP_IPV6)) { if (sort_before_lro(lro)) { @@ -2101,10 +2182,10 @@ mbuf_nsegs(struct mbuf *m) { M_ASSERTPKTHDR(m); - KASSERT(m->m_pkthdr.l5hlen > 0, + KASSERT(m->m_pkthdr.inner_l5hlen > 0, ("%s: mbuf %p missing information on # of segments.", __func__, m)); - return (m->m_pkthdr.l5hlen); + return (m->m_pkthdr.inner_l5hlen); } static inline void @@ -2112,7 +2193,7 @@ set_mbuf_nsegs(struct mbuf *m, uint8_t nsegs) { M_ASSERTPKTHDR(m); - m->m_pkthdr.l5hlen = nsegs; + m->m_pkthdr.inner_l5hlen = nsegs; } static inline int @@ -2237,63 +2318,108 @@ alloc_wr_mbuf(int len, int how) return (m); } -static inline int +static inline bool needs_hwcsum(struct mbuf *m) { + const uint32_t csum_flags = CSUM_IP | CSUM_IP_UDP | CSUM_IP_TCP | + CSUM_IP_TSO | CSUM_INNER_IP | CSUM_INNER_IP_UDP | + CSUM_INNER_IP_TCP | CSUM_INNER_IP_TSO | CSUM_IP6_UDP | + CSUM_IP6_TCP | CSUM_IP6_TSO | CSUM_INNER_IP6_UDP | + CSUM_INNER_IP6_TCP | CSUM_INNER_IP6_TSO; M_ASSERTPKTHDR(m); - return (m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP | CSUM_IP | - CSUM_TSO | CSUM_UDP_IPV6 | CSUM_TCP_IPV6)); + return (m->m_pkthdr.csum_flags & csum_flags); } -static inline int +static inline bool needs_tso(struct mbuf *m) { + const uint32_t csum_flags = CSUM_IP_TSO | CSUM_IP6_TSO | + CSUM_INNER_IP_TSO | CSUM_INNER_IP6_TSO; M_ASSERTPKTHDR(m); - return (m->m_pkthdr.csum_flags & CSUM_TSO); + return (m->m_pkthdr.csum_flags & csum_flags); } -static inline int +static inline bool +needs_vxlan_csum(struct mbuf *m) +{ + + M_ASSERTPKTHDR(m); + + return (m->m_pkthdr.csum_flags & CSUM_ENCAP_VXLAN); +} + +static inline bool +needs_vxlan_tso(struct mbuf *m) +{ + const uint32_t csum_flags = CSUM_ENCAP_VXLAN | CSUM_INNER_IP_TSO | + CSUM_INNER_IP6_TSO; + + M_ASSERTPKTHDR(m); + + return ((m->m_pkthdr.csum_flags & csum_flags) != 0 && + (m->m_pkthdr.csum_flags & csum_flags) != CSUM_ENCAP_VXLAN); +} + +static inline bool +needs_inner_tcp_csum(struct mbuf *m) +{ + const uint32_t csum_flags = CSUM_INNER_IP_TSO | CSUM_INNER_IP6_TSO; + + M_ASSERTPKTHDR(m); + + return (m->m_pkthdr.csum_flags & csum_flags); +} + +static inline bool needs_l3_csum(struct mbuf *m) { + const uint32_t csum_flags = CSUM_IP | CSUM_IP_TSO | CSUM_INNER_IP | + CSUM_INNER_IP_TSO; M_ASSERTPKTHDR(m); - return (m->m_pkthdr.csum_flags & (CSUM_IP | CSUM_TSO)); + return (m->m_pkthdr.csum_flags & csum_flags); } -static inline int -needs_tcp_csum(struct mbuf *m) +static inline bool +needs_outer_tcp_csum(struct mbuf *m) { + const uint32_t csum_flags = CSUM_IP_TCP | CSUM_IP_TSO | CSUM_IP6_TCP | + CSUM_IP6_TSO; M_ASSERTPKTHDR(m); - return (m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_TCP_IPV6 | CSUM_TSO)); + + return (m->m_pkthdr.csum_flags & csum_flags); } #ifdef RATELIMIT -static inline int -needs_l4_csum(struct mbuf *m) +static inline bool +needs_outer_l4_csum(struct mbuf *m) { + const uint32_t csum_flags = CSUM_IP_UDP | CSUM_IP_TCP | CSUM_IP_TSO | + CSUM_IP6_UDP | CSUM_IP6_TCP | CSUM_IP6_TSO; M_ASSERTPKTHDR(m); - return (m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP | CSUM_UDP_IPV6 | - CSUM_TCP_IPV6 | CSUM_TSO)); + return (m->m_pkthdr.csum_flags & csum_flags); } -static inline int -needs_udp_csum(struct mbuf *m) +static inline bool +needs_outer_udp_csum(struct mbuf *m) { + const uint32_t csum_flags = CSUM_IP_UDP | CSUM_IP6_UDP; M_ASSERTPKTHDR(m); - return (m->m_pkthdr.csum_flags & (CSUM_UDP | CSUM_UDP_IPV6)); + + return (m->m_pkthdr.csum_flags & csum_flags); } #endif -static inline int +static inline bool needs_vlan_insertion(struct mbuf *m) { @@ -2440,6 +2566,23 @@ count_mbuf_nsegs(struct mbuf *m, int skip, uint8_t *cf } /* + * The maximum number of segments that can fit in a WR. + */ +static int +max_nsegs_allowed(struct mbuf *m) +{ + + if (needs_tso(m)) { + if (needs_vxlan_tso(m)) + return (TX_SGL_SEGS_VXLAN_TSO); + else + return (TX_SGL_SEGS_TSO); + } + + return (TX_SGL_SEGS); +} + +/* * Analyze the mbuf to determine its tx needs. The mbuf passed in may change: * a) caller can assume it's been freed if this function returns with an error. * b) it may get defragged up if the gather list is too long for the hardware. @@ -2474,7 +2617,7 @@ restart: M_ASSERTPKTHDR(m0); MPASS(m0->m_pkthdr.len > 0); nsegs = count_mbuf_nsegs(m0, 0, &cflags); - if (nsegs > (needs_tso(m0) ? TX_SGL_SEGS_TSO : TX_SGL_SEGS)) { + if (nsegs > max_nsegs_allowed(m0)) { if (defragged++ > 0) { rc = EFBIG; goto fail; @@ -2502,18 +2645,15 @@ restart: } set_mbuf_nsegs(m0, nsegs); set_mbuf_cflags(m0, cflags); - if (sc->flags & IS_VF) - set_mbuf_len16(m0, txpkt_vm_len16(nsegs, needs_tso(m0))); - else - set_mbuf_len16(m0, txpkt_len16(nsegs, needs_tso(m0))); + calculate_mbuf_len16(sc, m0); #ifdef RATELIMIT /* * Ethofld is limited to TCP and UDP for now, and only when L4 hw - * checksumming is enabled. needs_l4_csum happens to check for all the - * right things. + * checksumming is enabled. needs_outer_l4_csum happens to check for + * all the right things. */ - if (__predict_false(needs_eo(m0) && !needs_l4_csum(m0))) + if (__predict_false(needs_eo(m0) && !needs_outer_l4_csum(m0))) m0->m_pkthdr.snd_tag = NULL; #endif @@ -2541,21 +2681,27 @@ restart: switch (eh_type) { #ifdef INET6 case ETHERTYPE_IPV6: - { - struct ip6_hdr *ip6 = l3hdr; - - MPASS(!needs_tso(m0) || ip6->ip6_nxt == IPPROTO_TCP); - - m0->m_pkthdr.l3hlen = sizeof(*ip6); + m0->m_pkthdr.l3hlen = sizeof(struct ip6_hdr); break; - } #endif #ifdef INET case ETHERTYPE_IP: { struct ip *ip = l3hdr; - m0->m_pkthdr.l3hlen = ip->ip_hl * 4; + if (needs_vxlan_csum(m0)) { + /* Driver will do the outer IP hdr checksum. */ + ip->ip_sum = 0; + if (needs_vxlan_tso(m0)) { + const uint16_t ipl = ip->ip_len; + + ip->ip_len = 0; + ip->ip_sum = ~in_cksum_hdr(ip); + ip->ip_len = ipl; + } else + ip->ip_sum = in_cksum_hdr(ip); + } + m0->m_pkthdr.l3hlen = ip->ip_hl << 2; break; } #endif @@ -2565,8 +2711,59 @@ restart: __func__, eh_type); } + if (needs_vxlan_csum(m0)) { + m0->m_pkthdr.l4hlen = sizeof(struct udphdr); + m0->m_pkthdr.l5hlen = sizeof(struct vxlan_header); + + /* Inner headers. */ + eh = m_advance(&m, &offset, m0->m_pkthdr.l3hlen + + sizeof(struct udphdr) + sizeof(struct vxlan_header)); + eh_type = ntohs(eh->ether_type); + if (eh_type == ETHERTYPE_VLAN) { + struct ether_vlan_header *evh = (void *)eh; + + eh_type = ntohs(evh->evl_proto); + m0->m_pkthdr.inner_l2hlen = sizeof(*evh); + } else + m0->m_pkthdr.inner_l2hlen = sizeof(*eh); + l3hdr = m_advance(&m, &offset, m0->m_pkthdr.inner_l2hlen); + + switch (eh_type) { +#ifdef INET6 + case ETHERTYPE_IPV6: + m0->m_pkthdr.inner_l3hlen = sizeof(struct ip6_hdr); + break; +#endif +#ifdef INET + case ETHERTYPE_IP: + { + struct ip *ip = l3hdr; + + m0->m_pkthdr.inner_l3hlen = ip->ip_hl << 2; + break; + } +#endif + default: + panic("%s: VXLAN hw offload requested with unknown " + "ethertype 0x%04x. if_cxgbe must be compiled" + " with the same INET/INET6 options as the kernel.", + __func__, eh_type); + } #if defined(INET) || defined(INET6) - if (needs_tcp_csum(m0)) { + if (needs_inner_tcp_csum(m0)) { + tcp = m_advance(&m, &offset, m0->m_pkthdr.inner_l3hlen); + m0->m_pkthdr.inner_l4hlen = tcp->th_off * 4; + } +#endif + MPASS((m0->m_pkthdr.csum_flags & CSUM_SND_TAG) == 0); + m0->m_pkthdr.csum_flags &= CSUM_INNER_IP6_UDP | + CSUM_INNER_IP6_TCP | CSUM_INNER_IP6_TSO | CSUM_INNER_IP | + CSUM_INNER_IP_UDP | CSUM_INNER_IP_TCP | CSUM_INNER_IP_TSO | + CSUM_ENCAP_VXLAN; + } + +#if defined(INET) || defined(INET6) + if (needs_outer_tcp_csum(m0)) { tcp = m_advance(&m, &offset, m0->m_pkthdr.l3hlen); m0->m_pkthdr.l4hlen = tcp->th_off * 4; #ifdef RATELIMIT @@ -2576,7 +2773,7 @@ restart: V_FW_ETH_TX_EO_WR_TSOFF(sizeof(*tcp) / 2 + 1)); } else set_mbuf_eo_tsclk_tsoff(m0, 0); - } else if (needs_udp_csum(m)) { + } else if (needs_outer_udp_csum(m0)) { m0->m_pkthdr.l4hlen = sizeof(struct udphdr); #endif } @@ -3524,6 +3721,9 @@ alloc_rxq(struct vi_info *vi, struct sge_rxq *rxq, int SYSCTL_ADD_UQUAD(&vi->ctx, children, OID_AUTO, "vlan_extraction", CTLFLAG_RD, &rxq->vlan_extraction, "# of times hardware extracted 802.1Q tag"); + SYSCTL_ADD_UQUAD(&vi->ctx, children, OID_AUTO, "vxlan_rxcsum", + CTLFLAG_RD, &rxq->vxlan_rxcsum, + "# of times hardware assisted with inner checksum (VXLAN) "); add_fl_sysctls(sc, &vi->ctx, oid, &rxq->fl); @@ -4178,6 +4378,11 @@ alloc_txq(struct vi_info *vi, struct sge_txq *txq, int "# of frames tx'd using type1 txpkts work requests"); SYSCTL_ADD_UQUAD(&vi->ctx, children, OID_AUTO, "raw_wrs", CTLFLAG_RD, &txq->raw_wrs, "# of raw work requests (non-packets)"); + SYSCTL_ADD_UQUAD(&vi->ctx, children, OID_AUTO, "vxlan_tso_wrs", + CTLFLAG_RD, &txq->vxlan_tso_wrs, "# of VXLAN TSO work requests"); + SYSCTL_ADD_UQUAD(&vi->ctx, children, OID_AUTO, "vxlan_txcsum", + CTLFLAG_RD, &txq->vxlan_txcsum, + "# of times hardware assisted with inner checksums (VXLAN)"); mp_ring_sysctls(txq->r, &vi->ctx, children); @@ -4427,27 +4632,25 @@ get_pkt_gl(struct mbuf *m, struct sglist *gl) KASSERT(gl->sg_nseg == mbuf_nsegs(m), ("%s: nsegs changed for mbuf %p from %d to %d", __func__, m, mbuf_nsegs(m), gl->sg_nseg)); - KASSERT(gl->sg_nseg > 0 && - gl->sg_nseg <= (needs_tso(m) ? TX_SGL_SEGS_TSO : TX_SGL_SEGS), + KASSERT(gl->sg_nseg > 0 && gl->sg_nseg <= max_nsegs_allowed(m), ("%s: %d segments, should have been 1 <= nsegs <= %d", __func__, - gl->sg_nseg, needs_tso(m) ? TX_SGL_SEGS_TSO : TX_SGL_SEGS)); + gl->sg_nseg, max_nsegs_allowed(m))); } /* * len16 for a txpkt WR with a GL. Includes the firmware work request header. */ static inline u_int -txpkt_len16(u_int nsegs, u_int tso) +txpkt_len16(u_int nsegs, const u_int extra) { u_int n; MPASS(nsegs > 0); nsegs--; /* first segment is part of ulptx_sgl */ - n = sizeof(struct fw_eth_tx_pkt_wr) + sizeof(struct cpl_tx_pkt_core) + + n = extra + sizeof(struct fw_eth_tx_pkt_wr) + + sizeof(struct cpl_tx_pkt_core) + sizeof(struct ulptx_sgl) + 8 * ((3 * nsegs) / 2 + (nsegs & 1)); - if (tso) - n += sizeof(struct cpl_tx_pkt_lso_core); return (howmany(n, 16)); } @@ -4457,22 +4660,43 @@ txpkt_len16(u_int nsegs, u_int tso) * request header. */ static inline u_int -txpkt_vm_len16(u_int nsegs, u_int tso) +txpkt_vm_len16(u_int nsegs, const u_int extra) { u_int n; MPASS(nsegs > 0); nsegs--; /* first segment is part of ulptx_sgl */ - n = sizeof(struct fw_eth_tx_pkt_vm_wr) + + n = extra + sizeof(struct fw_eth_tx_pkt_vm_wr) + sizeof(struct cpl_tx_pkt_core) + sizeof(struct ulptx_sgl) + 8 * ((3 * nsegs) / 2 + (nsegs & 1)); - if (tso) - n += sizeof(struct cpl_tx_pkt_lso_core); return (howmany(n, 16)); } +static inline void *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-all@freebsd.org Mon Oct 5 09:03:18 2020 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 51FD13FD07F; Mon, 5 Oct 2020 09:03:18 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4ZPy1W6xz4sbB; Mon, 5 Oct 2020 09:03:18 +0000 (UTC) (envelope-from np@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 16DDC12FE5; Mon, 5 Oct 2020 09:03:18 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09593H79054445; Mon, 5 Oct 2020 09:03:17 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09593HJ6054441; Mon, 5 Oct 2020 09:03:17 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010050903.09593HJ6054441@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 09:03:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366443 - in stable/12: share/man/man4 sys/dev/cxgbe X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: in stable/12: share/man/man4 sys/dev/cxgbe X-SVN-Commit-Revision: 366443 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.33 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, 05 Oct 2020 09:03:18 -0000 Author: np Date: Mon Oct 5 09:03:17 2020 New Revision: 366443 URL: https://svnweb.freebsd.org/changeset/base/366443 Log: MFC r365993: cxgbe(4): let the PF driver use VM work requests for transmit. This allows the PF interfaces to communicate with the VF interfaces over the internal switch in the ASIC. Fix the GL limits for VM work requests while here. Sponsored by: Chelsio Communications Modified: stable/12/share/man/man4/cxgbe.4 stable/12/sys/dev/cxgbe/adapter.h stable/12/sys/dev/cxgbe/t4_main.c stable/12/sys/dev/cxgbe/t4_sge.c Directory Properties: stable/12/ (props changed) Modified: stable/12/share/man/man4/cxgbe.4 ============================================================================== --- stable/12/share/man/man4/cxgbe.4 Mon Oct 5 08:51:03 2020 (r366442) +++ stable/12/share/man/man4/cxgbe.4 Mon Oct 5 09:03:17 2020 (r366443) @@ -351,6 +351,17 @@ This tunable is for specialized applications only and normal operation. The capabilities for which hardware resources have been reserved are listed in dev..X.*caps sysctls. +.It Va hw.cxgbe.tx_vm_wr +Setting this to 1 instructs the driver to use VM work requests to transmit data. +This lets PF interfaces transmit frames to VF interfaces over the internal +switch in the ASIC. +Note that the +.Xr cxgbev 4 +VF driver always uses VM work requests and is not affected by this tunable. +The default value is 0 and should be changed only if PF and VF interfaces need +to communicate with each other. +Different interfaces can be assigned different values using the +dev..X.tx_vm_wr sysctl when the interface is administratively down. .El .Sh SUPPORT For general information and support, Modified: stable/12/sys/dev/cxgbe/adapter.h ============================================================================== --- stable/12/sys/dev/cxgbe/adapter.h Mon Oct 5 08:51:03 2020 (r366442) +++ stable/12/sys/dev/cxgbe/adapter.h Mon Oct 5 09:03:17 2020 (r366443) @@ -120,6 +120,8 @@ enum { SGE_MAX_WR_NDESC = SGE_MAX_WR_LEN / EQ_ESIZE, /* max WR size in desc */ TX_SGL_SEGS = 39, TX_SGL_SEGS_TSO = 38, + TX_SGL_SEGS_VM = 38, + TX_SGL_SEGS_VM_TSO = 37, TX_SGL_SEGS_EO_TSO = 30, /* XXX: lower for IPv6. */ TX_SGL_SEGS_VXLAN_TSO = 37, TX_WR_FLITS = SGE_MAX_WR_LEN / 8 @@ -174,6 +176,7 @@ enum { DOOMED = (1 << 0), VI_INIT_DONE = (1 << 1), VI_SYSCTL_CTX = (1 << 2), + TX_USES_VM_WR = (1 << 3), /* adapter debug_flags */ DF_DUMP_MBOX = (1 << 0), /* Log all mbox cmd/rpl. */ @@ -1238,7 +1241,7 @@ void t4_intr_evt(void *); void t4_wrq_tx_locked(struct adapter *, struct sge_wrq *, struct wrqe *); void t4_update_fl_bufsize(struct ifnet *); struct mbuf *alloc_wr_mbuf(int, int); -int parse_pkt(struct adapter *, struct mbuf **); +int parse_pkt(struct mbuf **, bool); void *start_wrq_wr(struct sge_wrq *, int, struct wrq_cookie *); void commit_wrq_wr(struct sge_wrq *, void *, struct wrq_cookie *); int tnl_cong(struct port_info *, int); Modified: stable/12/sys/dev/cxgbe/t4_main.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_main.c Mon Oct 5 08:51:03 2020 (r366442) +++ stable/12/sys/dev/cxgbe/t4_main.c Mon Oct 5 09:03:17 2020 (r366443) @@ -575,6 +575,10 @@ static int t4_panic_on_fatal_err = 0; SYSCTL_INT(_hw_cxgbe, OID_AUTO, panic_on_fatal_err, CTLFLAG_RDTUN, &t4_panic_on_fatal_err, 0, "panic on fatal errors"); +static int t4_tx_vm_wr = 0; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, tx_vm_wr, CTLFLAG_RWTUN, &t4_tx_vm_wr, 0, + "Use VM work requests to transmit packets."); + #ifdef TCP_OFFLOAD /* * TOE tunables. @@ -655,6 +659,7 @@ static int sysctl_bitfield_8b(SYSCTL_HANDLER_ARGS); static int sysctl_bitfield_16b(SYSCTL_HANDLER_ARGS); static int sysctl_btphy(SYSCTL_HANDLER_ARGS); static int sysctl_noflowq(SYSCTL_HANDLER_ARGS); +static int sysctl_tx_vm_wr(SYSCTL_HANDLER_ARGS); static int sysctl_holdoff_tmr_idx(SYSCTL_HANDLER_ARGS); static int sysctl_holdoff_pktc_idx(SYSCTL_HANDLER_ARGS); static int sysctl_qsize_rxq(SYSCTL_HANDLER_ARGS); @@ -1669,6 +1674,8 @@ cxgbe_vi_attach(device_t dev, struct vi_info *vi) vi->xact_addr_filt = -1; callout_init(&vi->tick, 1); + if (sc->flags & IS_VF || t4_tx_vm_wr != 0) + vi->flags |= TX_USES_VM_WR; /* Allocate an ifnet and set it up */ ifp = if_alloc(IFT_ETHER); @@ -1718,7 +1725,10 @@ cxgbe_vi_attach(device_t dev, struct vi_info *vi) #endif ifp->if_hw_tsomax = IP_MAXPACKET; - ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS_TSO; + if (vi->flags & TX_USES_VM_WR) + ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS_VM_TSO; + else + ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS_TSO; #ifdef RATELIMIT if (is_ethoffload(sc) && vi->nofldtxq != 0) ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS_EO_TSO; @@ -2096,7 +2106,7 @@ cxgbe_transmit(struct ifnet *ifp, struct mbuf *m) { struct vi_info *vi = ifp->if_softc; struct port_info *pi = vi->pi; - struct adapter *sc = pi->adapter; + struct adapter *sc; struct sge_txq *txq; void *items[1]; int rc; @@ -2109,7 +2119,7 @@ cxgbe_transmit(struct ifnet *ifp, struct mbuf *m) return (ENETDOWN); } - rc = parse_pkt(sc, &m); + rc = parse_pkt(&m, vi->flags & TX_USES_VM_WR); if (__predict_false(rc != 0)) { MPASS(m == NULL); /* was freed already */ atomic_add_int(&pi->tx_parse_error, 1); /* rare, atomic is ok */ @@ -2128,6 +2138,7 @@ cxgbe_transmit(struct ifnet *ifp, struct mbuf *m) #endif /* Select a txq. */ + sc = vi->adapter; txq = &sc->sge.txq[vi->first_txq]; if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) txq += ((m->m_pkthdr.flowid % (vi->ntxq - vi->rsrv_noflowq)) + @@ -6499,6 +6510,16 @@ vi_sysctls(struct vi_info *vi) "Reserve queue 0 for non-flowid packets"); } + if (vi->adapter->flags & IS_VF) { + MPASS(vi->flags & TX_USES_VM_WR); + SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "tx_vm_wr", CTLFLAG_RD, + NULL, 1, "use VM work requests for transmit"); + } else { + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_vm_wr", + CTLTYPE_INT | CTLFLAG_RW, vi, 0, + sysctl_tx_vm_wr, "I", "use VM work requestes for transmit"); + } + #ifdef TCP_OFFLOAD if (vi->nofldrxq != 0) { SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nofldrxq", CTLFLAG_RD, @@ -6920,6 +6941,63 @@ sysctl_noflowq(SYSCTL_HANDLER_ARGS) else vi->rsrv_noflowq = 0; + return (rc); +} + +static int +sysctl_tx_vm_wr(SYSCTL_HANDLER_ARGS) +{ + struct vi_info *vi = arg1; + struct adapter *sc = vi->adapter; + int rc, val, i; + + MPASS(!(sc->flags & IS_VF)); + + val = vi->flags & TX_USES_VM_WR ? 1 : 0; + rc = sysctl_handle_int(oidp, &val, 0, req); + if (rc != 0 || req->newptr == NULL) + return (rc); + + if (val != 0 && val != 1) + return (EINVAL); + + rc = begin_synchronized_op(sc, vi, HOLD_LOCK | SLEEP_OK | INTR_OK, + "t4txvm"); + if (rc) + return (rc); + if (vi->ifp->if_drv_flags & IFF_DRV_RUNNING) { + /* + * We don't want parse_pkt to run with one setting (VF or PF) + * and then eth_tx to see a different setting but still use + * stale information calculated by parse_pkt. + */ + rc = EBUSY; + } else { + struct port_info *pi = vi->pi; + struct sge_txq *txq; + uint32_t ctrl0; + uint8_t npkt = sc->params.max_pkts_per_eth_tx_pkts_wr; + + if (val) { + vi->flags |= TX_USES_VM_WR; + vi->ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS_VM_TSO; + ctrl0 = htobe32(V_TXPKT_OPCODE(CPL_TX_PKT_XT) | + V_TXPKT_INTF(pi->tx_chan)); + if (!(sc->flags & IS_VF)) + npkt--; + } else { + vi->flags &= ~TX_USES_VM_WR; + vi->ifp->if_hw_tsomaxsegcount = TX_SGL_SEGS_TSO; + ctrl0 = htobe32(V_TXPKT_OPCODE(CPL_TX_PKT_XT) | + V_TXPKT_INTF(pi->tx_chan) | V_TXPKT_PF(sc->pf) | + V_TXPKT_VF(vi->vin) | V_TXPKT_VF_VLD(vi->vfvld)); + } + for_each_txq(vi, i, txq) { + txq->cpl_ctrl0 = ctrl0; + txq->txp.max_npkt = npkt; + } + } + end_synchronized_op(sc, LOCK_HELD); return (rc); } Modified: stable/12/sys/dev/cxgbe/t4_sge.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_sge.c Mon Oct 5 08:51:03 2020 (r366442) +++ stable/12/sys/dev/cxgbe/t4_sge.c Mon Oct 5 09:03:17 2020 (r366443) @@ -274,7 +274,7 @@ static void add_fl_to_sfl(struct adapter *, struct sge static inline void get_pkt_gl(struct mbuf *, struct sglist *); static inline u_int txpkt_len16(u_int, const u_int); static inline u_int txpkt_vm_len16(u_int, const u_int); -static inline void calculate_mbuf_len16(struct adapter *, struct mbuf *); +static inline void calculate_mbuf_len16(struct mbuf *, bool); static inline u_int txpkts0_len16(u_int); static inline u_int txpkts1_len16(void); static u_int write_raw_wr(struct sge_txq *, void *, struct mbuf *, u_int); @@ -2229,6 +2229,7 @@ set_mbuf_len16(struct mbuf *m, uint8_t len16) { M_ASSERTPKTHDR(m); + MPASS(len16 > 0 && len16 <= SGE_MAX_WR_LEN / 16); m->m_pkthdr.PH_loc.eight[0] = len16; } @@ -2569,9 +2570,15 @@ count_mbuf_nsegs(struct mbuf *m, int skip, uint8_t *cf * The maximum number of segments that can fit in a WR. */ static int -max_nsegs_allowed(struct mbuf *m) +max_nsegs_allowed(struct mbuf *m, bool vm_wr) { + if (vm_wr) { + if (needs_tso(m)) + return (TX_SGL_SEGS_VM_TSO); + return (TX_SGL_SEGS_VM); + } + if (needs_tso(m)) { if (needs_vxlan_tso(m)) return (TX_SGL_SEGS_VXLAN_TSO); @@ -2588,7 +2595,7 @@ max_nsegs_allowed(struct mbuf *m) * b) it may get defragged up if the gather list is too long for the hardware. */ int -parse_pkt(struct adapter *sc, struct mbuf **mp) +parse_pkt(struct mbuf **mp, bool vm_wr) { struct mbuf *m0 = *mp, *m; int rc, nsegs, defragged = 0, offset; @@ -2617,7 +2624,7 @@ restart: M_ASSERTPKTHDR(m0); MPASS(m0->m_pkthdr.len > 0); nsegs = count_mbuf_nsegs(m0, 0, &cflags); - if (nsegs > max_nsegs_allowed(m0)) { + if (nsegs > max_nsegs_allowed(m0, vm_wr)) { if (defragged++ > 0) { rc = EFBIG; goto fail; @@ -2645,7 +2652,7 @@ restart: } set_mbuf_nsegs(m0, nsegs); set_mbuf_cflags(m0, cflags); - calculate_mbuf_len16(sc, m0); + calculate_mbuf_len16(m0, vm_wr); #ifdef RATELIMIT /* @@ -3053,7 +3060,7 @@ eth_tx(struct mp_ring *r, u_int cidx, u_int pidx, bool if (txp->npkt > 0 || remaining > 1 || txp->score > 3 || atomic_load_int(&txq->eq.equiq) != 0) { - if (sc->flags & IS_VF) + if (vi->flags & TX_USES_VM_WR) rc = add_to_txpkts_vf(sc, txq, m0, avail, &snd); else rc = add_to_txpkts_pf(sc, txq, m0, avail, &snd); @@ -3069,14 +3076,14 @@ eth_tx(struct mp_ring *r, u_int cidx, u_int pidx, bool if (txp->score++ >= 10) txp->score = 10; MPASS(avail >= tx_len16_to_desc(txp->len16)); - if (sc->flags & IS_VF) + if (vi->flags & TX_USES_VM_WR) n = write_txpkts_vm_wr(sc, txq); else n = write_txpkts_wr(sc, txq); } else { MPASS(avail >= tx_len16_to_desc(mbuf_len16(txp->mb[0]))); - if (sc->flags & IS_VF) + if (vi->flags & TX_USES_VM_WR) n = write_txpkt_vm_wr(sc, txq, txp->mb[0]); else @@ -3118,7 +3125,7 @@ eth_tx(struct mp_ring *r, u_int cidx, u_int pidx, bool break; /* out of descriptors */ } ETHER_BPF_MTAP(ifp, m0); - if (sc->flags & IS_VF) + if (vi->flags & TX_USES_VM_WR) n = write_txpkt_vm_wr(sc, txq, m0); else n = write_txpkt_wr(sc, txq, m0, avail); @@ -3161,14 +3168,14 @@ send_txpkts: ETHER_BPF_MTAP(ifp, txp->mb[i]); if (txp->npkt > 1) { MPASS(avail >= tx_len16_to_desc(txp->len16)); - if (sc->flags & IS_VF) + if (vi->flags & TX_USES_VM_WR) n = write_txpkts_vm_wr(sc, txq); else n = write_txpkts_wr(sc, txq); } else { MPASS(avail >= tx_len16_to_desc(mbuf_len16(txp->mb[0]))); - if (sc->flags & IS_VF) + if (vi->flags & TX_USES_VM_WR) n = write_txpkt_vm_wr(sc, txq, txp->mb[0]); else n = write_txpkt_wr(sc, txq, txp->mb[0], avail); @@ -4307,7 +4314,7 @@ alloc_txq(struct vi_info *vi, struct sge_txq *txq, int TASK_INIT(&txq->tx_reclaim_task, 0, tx_reclaim, eq); txq->ifp = vi->ifp; txq->gl = sglist_alloc(TX_SGL_SEGS, M_WAITOK); - if (sc->flags & IS_VF) + if (vi->flags & TX_USES_VM_WR) txq->cpl_ctrl0 = htobe32(V_TXPKT_OPCODE(CPL_TX_PKT_XT) | V_TXPKT_INTF(pi->tx_chan)); else @@ -4323,6 +4330,8 @@ alloc_txq(struct vi_info *vi, struct sge_txq *txq, int MPASS(nitems(txp->mb) >= sc->params.max_pkts_per_eth_tx_pkts_wr); txq->txp.max_npkt = min(nitems(txp->mb), sc->params.max_pkts_per_eth_tx_pkts_wr); + if (vi->flags & TX_USES_VM_WR && !(sc->flags & IS_VF)) + txq->txp.max_npkt--; snprintf(name, sizeof(name), "%d", idx); oid = SYSCTL_ADD_NODE(&vi->ctx, children, OID_AUTO, name, CTLFLAG_RD, @@ -4632,9 +4641,11 @@ get_pkt_gl(struct mbuf *m, struct sglist *gl) KASSERT(gl->sg_nseg == mbuf_nsegs(m), ("%s: nsegs changed for mbuf %p from %d to %d", __func__, m, mbuf_nsegs(m), gl->sg_nseg)); - KASSERT(gl->sg_nseg > 0 && gl->sg_nseg <= max_nsegs_allowed(m), +#if 0 /* vm_wr not readily available here. */ + KASSERT(gl->sg_nseg > 0 && gl->sg_nseg <= max_nsegs_allowed(m, vm_wr), ("%s: %d segments, should have been 1 <= nsegs <= %d", __func__, - gl->sg_nseg, max_nsegs_allowed(m))); + gl->sg_nseg, max_nsegs_allowed(m, vm_wr))); +#endif } /* @@ -4675,12 +4686,12 @@ txpkt_vm_len16(u_int nsegs, const u_int extra) } static inline void -calculate_mbuf_len16(struct adapter *sc, struct mbuf *m) +calculate_mbuf_len16(struct mbuf *m, bool vm_wr) { const int lso = sizeof(struct cpl_tx_pkt_lso_core); const int tnl_lso = sizeof(struct cpl_tx_tnl_lso); - if (sc->flags & IS_VF) { + if (vm_wr) { if (needs_tso(m)) set_mbuf_len16(m, txpkt_vm_len16(mbuf_nsegs(m), lso)); else @@ -5183,8 +5194,6 @@ add_to_txpkts_vf(struct adapter *sc, struct sge_txq *t int avail, bool *send) { struct txpkts *txp = &txq->txp; - - MPASS(sc->flags & IS_VF); /* Cannot have TSO and coalesce at the same time. */ if (cannot_use_txpkts(m)) { From owner-svn-src-all@freebsd.org Mon Oct 5 10:16:40 2020 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 D3A483FEA89; Mon, 5 Oct 2020 10:16:40 +0000 (UTC) (envelope-from gbe@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4c2c5Fv4z3SZZ; Mon, 5 Oct 2020 10:16:40 +0000 (UTC) (envelope-from gbe@freebsd.org) Received: from localhost (p4fd3acce.dip0.t-ipconnect.de [79.211.172.206]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: gbe) by smtp.freebsd.org (Postfix) with ESMTPSA id 3F24B1E4B5; Mon, 5 Oct 2020 10:16:40 +0000 (UTC) (envelope-from gbe@freebsd.org) Date: Mon, 5 Oct 2020 12:16:39 +0200 From: Gordon Bergling To: xtouqh@hotmail.com Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r366403 - head/bin/ls Message-ID: <20201005101639.GA34424@lion.0xfce3.net> References: <202010031834.093IYO3r026370@repo.freebsd.org> <20201003192916.GA41544@lion.0xfce3.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Url: X-Operating-System: FreeBSD 12.2-STABLE amd64 X-Host-Uptime: 12:09PM up 18 days, 1:16, 3 users, load averages: 0.51, 0.29, 0.20 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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, 05 Oct 2020 10:16:40 -0000 On Sat, Oct 03, 2020 at 10:33:28PM +0300, xtouqh@hotmail.com wrote: > Gordon Bergling wrote: > > On Sat, Oct 03, 2020 at 09:47:48PM +0300, xtouqh@hotmail.com wrote: > >> Gordon Bergling wrote: > >>> Author: gbe (doc committer) > >>> Date: Sat Oct 3 18:34:24 2020 > >>> New Revision: 366403 > >>> URL: https://svnweb.freebsd.org/changeset/base/366403 > >>> > >>> Log: > >>> ls(1): Bugfix for an issue reported by mandoc > >>> > >>> - no blank before trailing delimiter > >>> > >>> MFC after: 1 week > >>> > >>> Modified: > >>> head/bin/ls/ls.1 > >>> > >>> Modified: head/bin/ls/ls.1 > >>> ============================================================================== > >>> --- head/bin/ls/ls.1 Sat Oct 3 18:30:01 2020 (r366402) > >>> +++ head/bin/ls/ls.1 Sat Oct 3 18:34:24 2020 (r366403) > >>> @@ -40,7 +40,7 @@ > >>> .Nd list directory contents > >>> .Sh SYNOPSIS > >>> .Nm > >>> -.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, > >>> +.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1 , > >> > >> This makes the "," appear after the "]", how about using the following > >> instead: > >> > >> .Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1\&, > > > > The comma is appearing right before the ']', like it was before. I'll check > > the recommended syntax regarding '\&' tomorrow. > > That's not what I'm seeing: > > polaris:xtouqh:/usr/src$ svnlite info bin/ls/ls.1 > Path: bin/ls/ls.1 > Name: ls.1 > Working Copy Root Path: /usr/src > URL: svn://svn.freebsd.org/base/head/bin/ls/ls.1 > Relative URL: ^/head/bin/ls/ls.1 > Repository Root: svn://svn.freebsd.org/base > Repository UUID: ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f > Revision: 366414 > Node Kind: file > Schedule: normal > Last Changed Author: gbe > Last Changed Rev: 366403 > Last Changed Date: 2020-10-03 18:34:24 +0000 (Sat, 03 Oct 2020) > Text Last Updated: 2020-10-03 18:51:31 +0000 (Sat, 03 Oct 2020) > Checksum: 72fe092ab2b5ac3363ea0681cfda216876d24fcd > > $ man bin/ls/ls.1 | head > LS(1) FreeBSD General Commands Manual > LS(1) > > NAME > ls – list directory contents > > SYNOPSIS > ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1], [--color=when] [-D > format] > [file ...] > > DESCRIPTION That is strange. I have checked the output from mandoc and man, and with r366403 applied, it is always the following: ------------------------------------------------------------------------------- LS(1) FreeBSD General Commands Manual LS(1) NAME ls – list directory contents SYNOPSIS ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [--color=when] [-D format] [file ...] DESCRIPTION ------------------------------------------------------------------------------- --Gordon From owner-svn-src-all@freebsd.org Mon Oct 5 11:46:19 2020 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 2EC1D421325; Mon, 5 Oct 2020 11:46:19 +0000 (UTC) (envelope-from ronald-lists@klop.ws) Received: from smtp-relay-int.realworks.nl (smtp-relay-int.realworks.nl [194.109.157.24]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4f225pycz3X8x; Mon, 5 Oct 2020 11:46:18 +0000 (UTC) (envelope-from ronald-lists@klop.ws) Date: Mon, 5 Oct 2020 13:46:14 +0200 (CEST) From: Ronald Klop To: Hans Petter Selasky Cc: svn-src-all@freebsd.org, svn-src-head@freebsd.org, src-committers@freebsd.org Message-ID: <476286772.120.1601898374873@localhost> In-Reply-To: <202010041717.094HHH9d069578@repo.freebsd.org> References: <202010041717.094HHH9d069578@repo.freebsd.org> Subject: Re: svn commit: r366431 - head/sys/dev/usb/serial MIME-Version: 1.0 X-Mailer: Realworks (528.767.4b26219e445) Importance: Normal X-Priority: 3 (Normal) X-Rspamd-Queue-Id: 4C4f225pycz3X8x X-Spamd-Bar: ---- Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:3265, ipnet:194.109.0.0/16, country:NL] Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.33 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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, 05 Oct 2020 11:46:19 -0000 Hi, I was interested by this commit. But the commit and commit message don't have much information. I was surprised that the "Differential Revision" link contains a lot of info about this. How permanent is this review.freebsd.org server? Wil it stay after the git migration? Ronald. Van: Hans Petter Selasky Datum: zondag, 4 oktober 2020 19:17 Aan: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Onderwerp: svn commit: r366431 - head/sys/dev/usb/serial > > Author: hselasky > Date: Sun Oct 4 17:17:16 2020 > New Revision: 366431 > URL: https://svnweb.freebsd.org/changeset/base/366431 > > Log: > Add support for Google Cr50 (GSC) Closed Case Debugging UART interfaces to > the USB generic serial port driver, ugensa. > > MFC after: 1 week > Differential Revision: https://reviews.freebsd.org/D21863 > Submitted by: greg_unrelenting.technology (Greg V) > Sponsored by: Mellanox Technologies // NVIDIA Networking > > Modified: > head/sys/dev/usb/serial/ugensa.c > > Modified: head/sys/dev/usb/serial/ugensa.c > ============================================================================== > --- head/sys/dev/usb/serial/ugensa.c Sun Oct 4 17:07:13 2020 (r366430) > +++ head/sys/dev/usb/serial/ugensa.c Sun Oct 4 17:17:16 2020 (r366431) > @@ -161,6 +161,8 @@ static const STRUCT_USB_HOST_ID ugensa_devs[] = { > {USB_VPI(USB_VENDOR_KYOCERA2, USB_PRODUCT_KYOCERA2_CDMA_MSM_K, 1)}, > {USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_49GPLUS, 1)}, > {USB_VPI(USB_VENDOR_NOVATEL2, USB_PRODUCT_NOVATEL2_FLEXPACKGPS, 3)}, > + {USB_VENDOR(USB_VENDOR_GOOGLE), USB_IFACE_CLASS(UICLASS_VENDOR), > + USB_IFACE_SUBCLASS(0x50), USB_IFACE_PROTOCOL(0x01), USB_DRIVER_INFO(10)}, > }; > > DRIVER_MODULE(ugensa, uhub, ugensa_driver, ugensa_devclass, NULL, 0); > _______________________________________________ > svn-src-all@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/svn-src-all > To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" > > > From owner-svn-src-all@freebsd.org Mon Oct 5 12:37:17 2020 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 2E5E14235F8; Mon, 5 Oct 2020 12:37:17 +0000 (UTC) (envelope-from carpeddiem@gmail.com) Received: from mail-io1-f67.google.com (mail-io1-f67.google.com [209.85.166.67]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4g8q61Hpz3Zq4; Mon, 5 Oct 2020 12:37:15 +0000 (UTC) (envelope-from carpeddiem@gmail.com) Received: by mail-io1-f67.google.com with SMTP id y13so8921471iow.4; Mon, 05 Oct 2020 05:37:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=Ruj7YXqcHJ0ni/R9UmL0/eL7NwcVrTCuUSZjxFrDC4k=; b=XbLvVr5wcjmbi8kVWiofvtonHzH6bKDnj5GOqBHQdmEXKRJyZo6JAcTVZsf7tQGh7j 7czS0zJcXlo0/q3DiLv4SIV0BoNCcE5uqyLI4BySmeuQu9PAdftj7HJaaGw1i0qAUCZ5 CEENdqym0uMKMY1tU9A3jZ8ojocnm6I1lV5LfyRWVwjFd1ZO/jtrOfFTYWnfyLVr9ePw dOe0nKhIO1N11GngVB/Xhx88x/BZ3u854VKOyMF95VuaYievU1OB4TADk46dtfACBTXm gxt4bhsfoBUirLH5J7BbEVV/zd/ilxcHrOkKi+yeNZzWX1w9ru8yEhLCg003r5MdwoG0 lrzQ== X-Gm-Message-State: AOAM531VKIEfOYJgYLYDKg91TcFLXbbqB1xc+SjTfxLqWHoE107Rv9/n gj5PEGvYGX52TZ9439t68n74ZgjY9P6DJd9e4g6c9PTy X-Google-Smtp-Source: ABdhPJwB3Nq3dUyXx9doZJ/G3iw3wPDfh64w5AwnAKFdSLLkeoESbAhvPW8AD79Oy3JCK0guzQq5cEk9i8AdpRSLcyQ= X-Received: by 2002:a05:6638:14c8:: with SMTP id l8mr13042649jak.136.1601901434055; Mon, 05 Oct 2020 05:37:14 -0700 (PDT) MIME-Version: 1.0 References: <202010041717.094HHH9d069578@repo.freebsd.org> <476286772.120.1601898374873@localhost> In-Reply-To: <476286772.120.1601898374873@localhost> From: Ed Maste Date: Mon, 5 Oct 2020 08:37:02 -0400 Message-ID: Subject: Re: svn commit: r366431 - head/sys/dev/usb/serial To: Ronald Klop Cc: Hans Petter Selasky , svn-src-all , svn-src-head , src-committers Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 4C4g8q61Hpz3Zq4 X-Spamd-Bar: - Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=none; spf=pass (mx1.freebsd.org: domain of carpeddiem@gmail.com designates 209.85.166.67 as permitted sender) smtp.mailfrom=carpeddiem@gmail.com X-Spamd-Result: default: False [-1.74 / 15.00]; RCVD_TLS_ALL(0.00)[]; ARC_NA(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; FREEFALL_USER(0.00)[carpeddiem]; FROM_HAS_DN(0.00)[]; R_SPF_ALLOW(-0.20)[+ip4:209.85.128.0/17]; NEURAL_HAM_LONG(-0.91)[-0.909]; MIME_GOOD(-0.10)[text/plain]; DMARC_NA(0.00)[freebsd.org]; NEURAL_HAM_MEDIUM(-0.97)[-0.965]; RCPT_COUNT_FIVE(0.00)[5]; TO_MATCH_ENVRCPT_SOME(0.00)[]; TO_DN_ALL(0.00)[]; RCVD_IN_DNSWL_NONE(0.00)[209.85.166.67:from]; NEURAL_SPAM_SHORT(0.14)[0.137]; FORGED_SENDER(0.30)[emaste@freebsd.org,carpeddiem@gmail.com]; RWL_MAILSPIKE_POSSIBLE(0.00)[209.85.166.67:from]; R_DKIM_NA(0.00)[]; FREEMAIL_ENVFROM(0.00)[gmail.com]; ASN(0.00)[asn:15169, ipnet:209.85.128.0/17, country:US]; MIME_TRACE(0.00)[0:+]; FROM_NEQ_ENVFROM(0.00)[emaste@freebsd.org,carpeddiem@gmail.com]; MAILMAN_DEST(0.00)[svn-src-all,svn-src-head] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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, 05 Oct 2020 12:37:17 -0000 On Mon, 5 Oct 2020 at 07:46, Ronald Klop wrote: > > Hi, > > I was interested by this commit. But the commit and commit message don't = have much information. I was surprised that the "Differential Revision" lin= k contains a lot of info about this. How permanent is this review.freebsd.o= rg server? Wil it stay after the git migration? It will remain, but commit messages ought to contain all of the information necessary to make sense of the commit even in the absence of reviews.freebsd.org. From owner-svn-src-all@freebsd.org Mon Oct 5 13:35:34 2020 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 AB887424CE9; Mon, 5 Oct 2020 13:35:34 +0000 (UTC) (envelope-from fernape@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4hS644CXz3dZ5; Mon, 5 Oct 2020 13:35:34 +0000 (UTC) (envelope-from fernape@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 6EF5616791; Mon, 5 Oct 2020 13:35:34 +0000 (UTC) (envelope-from fernape@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095DZYLv020446; Mon, 5 Oct 2020 13:35:34 GMT (envelope-from fernape@FreeBSD.org) Received: (from fernape@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095DZYhO020445; Mon, 5 Oct 2020 13:35:34 GMT (envelope-from fernape@FreeBSD.org) Message-Id: <202010051335.095DZYhO020445@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: fernape set sender to fernape@FreeBSD.org using -f From: =?UTF-8?Q?Fernando_Apestegu=c3=ada?= Date: Mon, 5 Oct 2020 13:35:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366444 - head/bin/pwait X-SVN-Group: head X-SVN-Commit-Author: fernape X-SVN-Commit-Paths: head/bin/pwait X-SVN-Commit-Revision: 366444 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.33 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, 05 Oct 2020 13:35:34 -0000 Author: fernape (ports committer) Date: Mon Oct 5 13:35:34 2020 New Revision: 366444 URL: https://svnweb.freebsd.org/changeset/base/366444 Log: pwait(1): Add EXAMPLES section to man page * Add small EXAMPLES section to the man page showing the different flags and exit codes. * Complete description for -v flag. Approved by: manpages (bcr@) Modified: head/bin/pwait/pwait.1 Modified: head/bin/pwait/pwait.1 ============================================================================== --- head/bin/pwait/pwait.1 Mon Oct 5 09:03:17 2020 (r366443) +++ head/bin/pwait/pwait.1 Mon Oct 5 13:35:34 2020 (r366444) @@ -32,7 +32,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 26, 2020 +.Dd October 5, 2020 .Dt PWAIT 1 .Os .Sh NAME @@ -73,7 +73,9 @@ minutes hours .El .It Fl v -Print the exit status when each process terminates. +Print the exit status when each process terminates or +.Ql timeout +if the timer goes off earlier. .El .Sh EXIT STATUS The @@ -85,6 +87,52 @@ If the flag is specified and a timeout occurs, the exit status will be 124. .Pp Invalid pids elicit a warning message but are otherwise ignored. +.Sh EXAMPLES +Start two +.Xr sleep 1 +processes in the background. +The first one will sleep for 30 seconds and the second one for one hour. +Wait for any of them to finish but no more than 5 seconds. +Since a timeout occurs the exit status is 124: +.Bd -literal -offset indent +$ sleep 30 & sleep 3600 & +[1] 1646 +[2] 1647 +$ pwait -o -t5 1646 1647 +$? +124 +.Ed +.Pp +Same as above but try to obtain the exit status of the processes. +In this case +.Ql timeout +is shown and the exit status is 124: +.Bd -literal -offset indent +$ sleep 30 & sleep 3600 & +[1] 1652 +[2] 1653 +$ pwait -v -t 5 1652 1653 +timeout +$? +124 +.Ed +.Pp +Start two +.Xr sleep 1 +processes in the background sleeping for 30 and 40 seconds respectively. +Wait 60 seconds for any of them to finish and get their exit codes: +.Bd -literal -offset indent +$ sleep 30 & sleep 40 & +[1] 1674 +[2] 1675 +$ pwait -v -t 60 1674 1675 +1674: exited with status 0. +1675: exited with status 0. +[1]- Done sleep 30 +[2]+ Done sleep 40 +$ echo $? +0 +.Ed .Sh SEE ALSO .Xr kill 1 , .Xr pkill 1 , From owner-svn-src-all@freebsd.org Mon Oct 5 13:39:38 2020 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 A3B05424D6E; Mon, 5 Oct 2020 13:39:38 +0000 (UTC) (envelope-from fernape@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4hXp3tqFz3f20; Mon, 5 Oct 2020 13:39:38 +0000 (UTC) (envelope-from fernape@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 67E07162B7; Mon, 5 Oct 2020 13:39:38 +0000 (UTC) (envelope-from fernape@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095DdcoC020656; Mon, 5 Oct 2020 13:39:38 GMT (envelope-from fernape@FreeBSD.org) Received: (from fernape@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095DdcO1020655; Mon, 5 Oct 2020 13:39:38 GMT (envelope-from fernape@FreeBSD.org) Message-Id: <202010051339.095DdcO1020655@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: fernape set sender to fernape@FreeBSD.org using -f From: =?UTF-8?Q?Fernando_Apestegu=c3=ada?= Date: Mon, 5 Oct 2020 13:39:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366445 - head/bin/df X-SVN-Group: head X-SVN-Commit-Author: fernape X-SVN-Commit-Paths: head/bin/df X-SVN-Commit-Revision: 366445 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.33 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, 05 Oct 2020 13:39:38 -0000 Author: fernape (ports committer) Date: Mon Oct 5 13:39:37 2020 New Revision: 366445 URL: https://svnweb.freebsd.org/changeset/base/366445 Log: df(1): Add EXAMPLES section to man page * Add EXAMPLES section with four simple examples. * Simplify -H flag description. This makes easy to see the difference between this flag and -h * While here, fix .Tn deprecated macro. Approved by: manpages (bcr@) Differential Revision: https://reviews.freebsd.org/D26662 Modified: head/bin/df/df.1 Modified: head/bin/df/df.1 ============================================================================== --- head/bin/df/df.1 Mon Oct 5 13:35:34 2020 (r366444) +++ head/bin/df/df.1 Mon Oct 5 13:39:37 2020 (r366445) @@ -29,7 +29,7 @@ .\" @(#)df.1 8.3 (Berkeley) 5/8/95 .\" $FreeBSD$ .\" -.Dd August 8, 2017 +.Dd October 5, 2020 .Dt DF 1 .Os .Sh NAME @@ -98,12 +98,9 @@ Use unit suffixes: Byte, Kibibyte, Mebibyte, Gibibyte, Pebibyte (based on powers of 1024) in order to reduce the number of digits to four or fewer. .It Fl H , Fl Fl si -.Dq Human-readable -output. -Use unit suffixes: Byte, Kilobyte, Megabyte, -Gigabyte, Terabyte and Petabyte (based on powers of 1000) in order to -reduce the number of -digits to four or fewer. +Same as +.Fl h +but based on powers of 1000. .It Fl i Include statistics on the number of free and used inodes. In conjunction with the @@ -159,10 +156,7 @@ command: df -t nonfs,nullfs .Ed .Pp -lists all file systems except those of type -.Tn NFS -and -.Tn NULLFS . +lists all file systems except those of type NFS and NULLFS. The .Xr lsvfs 1 command can be used to find out the types of file systems @@ -193,6 +187,52 @@ which allows units of bytes or numbers scaled with the The allowed range is 512 bytes to 1 GB. If the value is outside, it will be set to the appropriate limit. .El +.Sh EXAMPLES +Show human readable free disk space for all mount points including file system +type: +.Bd -literal -offset indent +$ df -ahT +Filesystem Type Size Used Avail Capacity Mounted on +/dev/ada1p2 ufs 213G 152G 44G 78% / +devfs devfs 1.0K 1.0K 0B 100% /dev +/dev/ada0p1 ufs 1.8T 168G 1.5T 10% /data +linsysfs linsysfs 4.0K 4.0K 0B 100% /compat/linux/sys +/dev/da0 msdosfs 7.6G 424M 7.2G 5% /mnt/usb +.Ed +.Pp +Show previously collected data including inode statistics except for devfs or +linsysfs file systems. +Note that the +.Dq no +prefix affects all the file systems in the list and the +.Fl t +option can be specified only once: +.Bd -literal -offset indent +$ df -i -n -t nodevfs,linsysfs +Filesystem 1K-blocks Used Avail Capacity iused ifree %iused +Mounted on +/dev/ada1p2 223235736 159618992 45757888 78% 1657590 27234568 6% / +/dev/ada0p1 1892163184 176319420 1564470712 10% 1319710 243300576 1% +/data +/dev/da0 7989888 433664 7556224 5% 0 0 100% +/mnt/usb +.Ed +.Pp +Show human readable information for the file system containing the file +.Pa /etc/rc.conf +: +.Bd -literal -offset indent +$ df -h /etc/rc.conf +Filesystem Size Used Avail Capacity Mounted on +/dev/ada1p2 213G 152G 44G 78% / +.Ed +.Pp +Same as above but specifying some file system: +.Bd -literal -offset indent +$ df -h /dev/ada1p2 +Filesystem Size Used Avail Capacity Mounted on +/dev/ada1p2 213G 152G 44G 78% / +.Ed .Sh SEE ALSO .Xr lsvfs 1 , .Xr quota 1 , From owner-svn-src-all@freebsd.org Mon Oct 5 13:46:20 2020 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 2EE28425125; Mon, 5 Oct 2020 13:46:20 +0000 (UTC) (envelope-from fernape@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4hhX0Xsrz3fkK; Mon, 5 Oct 2020 13:46:20 +0000 (UTC) (envelope-from fernape@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 EA69F16892; Mon, 5 Oct 2020 13:46:19 +0000 (UTC) (envelope-from fernape@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095DkJ4g026658; Mon, 5 Oct 2020 13:46:19 GMT (envelope-from fernape@FreeBSD.org) Received: (from fernape@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095DkJ4Z026657; Mon, 5 Oct 2020 13:46:19 GMT (envelope-from fernape@FreeBSD.org) Message-Id: <202010051346.095DkJ4Z026657@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: fernape set sender to fernape@FreeBSD.org using -f From: =?UTF-8?Q?Fernando_Apestegu=c3=ada?= Date: Mon, 5 Oct 2020 13:46:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366446 - head/bin/hostname X-SVN-Group: head X-SVN-Commit-Author: fernape X-SVN-Commit-Paths: head/bin/hostname X-SVN-Commit-Revision: 366446 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.33 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, 05 Oct 2020 13:46:20 -0000 Author: fernape (ports committer) Date: Mon Oct 5 13:46:19 2020 New Revision: 366446 URL: https://svnweb.freebsd.org/changeset/base/366446 Log: hostname(1): Add EXAMPLES to man page Add a very simple set of examples Approved by: manpages (bcr@) Differential Revision: https://reviews.freebsd.org/D26663 Modified: head/bin/hostname/hostname.1 Modified: head/bin/hostname/hostname.1 ============================================================================== --- head/bin/hostname/hostname.1 Mon Oct 5 13:39:37 2020 (r366445) +++ head/bin/hostname/hostname.1 Mon Oct 5 13:46:19 2020 (r366446) @@ -29,7 +29,7 @@ .\" @(#)hostname.1 8.2 (Berkeley) 4/28/95 .\" $FreeBSD$ .\" -.Dd November 10, 2016 +.Dd October 5, 2020 .Dt HOSTNAME 1 .Os .Sh NAME @@ -66,6 +66,25 @@ name. .It Fl d Only print domain information. .El +.Sh EXAMPLES +Set the host name of the machine and check the result: +.Bd -literal -offset indent +$ hostname beastie.localdomain.org +$ hostname +beastie.localdomain.org +.Ed +.Pp +Do not show domain information: +.Bd -literal -offset indent +$ hostname -s +beastie +.Ed +.Pp +Show only domain information: +.Bd -literal -offset indent +$ hostname -d +localdomain.org +.Ed .Sh SEE ALSO .Xr gethostname 3 , .Xr rc.conf 5 From owner-svn-src-all@freebsd.org Mon Oct 5 13:49:46 2020 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 30C1F425403; Mon, 5 Oct 2020 13:49:46 +0000 (UTC) (envelope-from fernape@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4hmV0XLGz3fSn; Mon, 5 Oct 2020 13:49:46 +0000 (UTC) (envelope-from fernape@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 E572316352; Mon, 5 Oct 2020 13:49:45 +0000 (UTC) (envelope-from fernape@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095DnjsI026845; Mon, 5 Oct 2020 13:49:45 GMT (envelope-from fernape@FreeBSD.org) Received: (from fernape@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095Dnj3G026844; Mon, 5 Oct 2020 13:49:45 GMT (envelope-from fernape@FreeBSD.org) Message-Id: <202010051349.095Dnj3G026844@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: fernape set sender to fernape@FreeBSD.org using -f From: =?UTF-8?Q?Fernando_Apestegu=c3=ada?= Date: Mon, 5 Oct 2020 13:49:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366447 - head/bin/kenv X-SVN-Group: head X-SVN-Commit-Author: fernape X-SVN-Commit-Paths: head/bin/kenv X-SVN-Commit-Revision: 366447 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.33 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, 05 Oct 2020 13:49:46 -0000 Author: fernape (ports committer) Date: Mon Oct 5 13:49:45 2020 New Revision: 366447 URL: https://svnweb.freebsd.org/changeset/base/366447 Log: kenv(1): Add EXAMPLES to man page Add EXAMPLES section covering all the options Approved by: manpages (bcr@) Differential Revision: https://reviews.freebsd.org/D26664 Modified: head/bin/kenv/kenv.1 Modified: head/bin/kenv/kenv.1 ============================================================================== --- head/bin/kenv/kenv.1 Mon Oct 5 13:46:19 2020 (r366446) +++ head/bin/kenv/kenv.1 Mon Oct 5 13:49:45 2020 (r366447) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 11, 2012 +.Dd October 5, 2020 .Dt KENV 1 .Os .Sh NAME @@ -102,6 +102,44 @@ Almost any printable character except .Sq = is acceptable as part of a name. Quotes are optional and necessary only if the value contains whitespace. +.Sh EXAMPLES +Show kernel probe hints variable names and filter for the uart +device +.Bd -literal -offset indent +$ kenv -h -N | grep uart +hint.uart.0.at +hint.uart.0.flags +hint.uart.0.irq +hint.uart.0.port +hint.uart.1.at +hint.uart.1.irq +hint.uart.1.port +.Ed +.Pp +Show the value of a specific variable: +.Bd -literal -offset indent +$ kenv hint.uart.1.at +isa +.Ed +.Pp +Same as above but adding the name of the variable in the report: +.Bd -literal -offset indent +$ kenv -v hint.uart.1.at +hint.uart.1.at="isa" +.Ed +.Pp +Try to delete a variable and suppress warnings if any: +.Bd -literal -offset indent +$ kenv -q -u hint.uart.1.at +.Ed +.Pp +Set the value of the +.Ev verbose_loading +variable +.Bd -literal -offset indent +$ kenv verbose_loading="YES" +verbose_loading="YES" +.Ed .Sh SEE ALSO .Xr kenv 2 , .Xr config 5 , From owner-svn-src-all@freebsd.org Mon Oct 5 13:52:31 2020 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 AE341425511; Mon, 5 Oct 2020 13:52:31 +0000 (UTC) (envelope-from fernape@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4hqg4D3Vz3gKd; Mon, 5 Oct 2020 13:52:31 +0000 (UTC) (envelope-from fernape@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 7444D16852; Mon, 5 Oct 2020 13:52:31 +0000 (UTC) (envelope-from fernape@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095DqV9I032712; Mon, 5 Oct 2020 13:52:31 GMT (envelope-from fernape@FreeBSD.org) Received: (from fernape@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095DqVlf032711; Mon, 5 Oct 2020 13:52:31 GMT (envelope-from fernape@FreeBSD.org) Message-Id: <202010051352.095DqVlf032711@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: fernape set sender to fernape@FreeBSD.org using -f From: =?UTF-8?Q?Fernando_Apestegu=c3=ada?= Date: Mon, 5 Oct 2020 13:52:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366448 - head/bin/pkill X-SVN-Group: head X-SVN-Commit-Author: fernape X-SVN-Commit-Paths: head/bin/pkill X-SVN-Commit-Revision: 366448 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.33 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, 05 Oct 2020 13:52:31 -0000 Author: fernape (ports committer) Date: Mon Oct 5 13:52:31 2020 New Revision: 366448 URL: https://svnweb.freebsd.org/changeset/base/366448 Log: pkill(1): Add EXAMPLES section to man page Add a dozen of examples to the EXAMPLES section for pgrep(1) and pkill(1). Flags covered: -f, -F, -n, -j, -l, -S, -x Approved by: mandoc (bcr@) Differential Revision: pkill(1): Add EXAMPLES section to man page Modified: head/bin/pkill/pkill.1 Modified: head/bin/pkill/pkill.1 ============================================================================== --- head/bin/pkill/pkill.1 Mon Oct 5 13:49:45 2020 (r366447) +++ head/bin/pkill/pkill.1 Mon Oct 5 13:52:31 2020 (r366448) @@ -29,7 +29,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd December 3, 2018 +.Dd October 5, 2020 .Dt PKILL 1 .Os .Sh NAME @@ -270,6 +270,111 @@ Invalid options were specified on the command line. .It 3 An internal error occurred. .El +.Sh EXAMPLES +Show the pid of the process holding the +.Pa /tmp/.X0-lock +pid file: +.Bd -literal -offset indent +$ pgrep -F /tmp/.X0-lock +1211 +.Ed +.Pp +Show the pid and the name of the process including kernel threads in the +search: +.Bd -literal -offset indent +$ pgrep -lS vnlru +37 vnlru +.Ed +.Pp +Search for processes including kernel threads that match the extended regular +expression pattern: +.Bd -literal -offset indent +$ pgrep -S 'crypto.*[2-3]' +20 +19 +6 +5 +.Ed +.Pp +Show long output for firefox processes: +.Bd -literal -offset indent +$ pgrep -l firefox +1312 firefox +1309 firefox +1288 firefox +1280 firefox +1279 firefox +1278 firefox +1277 firefox +1264 firefox +.Ed +.Pp +Same as above but just showing the pid of the most recent process: +.Bd -literal -offset indent +$ pgrep -n firefox +1312 +.Ed +.Pp +Look for vim processes. +Match against the full argument list: +.Bd -literal -offset indent +$ pgrep -f vim +44968 +30790 +.Ed +.Pp +Same as above but matching against the +.Ql list +word and showing the full argument list: +.Bd -literal -offset indent +$ pgrep -f -l list +30790 vim list.txt +.Ed +.Pp +Send +.Va SIGSTOP +signal to processes that are an exact match: +.Bd -literal -offset indent +$ pkill -SIGSTOP -f -x "vim list.txt" +.Ed +.Pp +Without +.Fl f +names over 19 characters will silently fail: +.Bd -literal -offset indent +$ vim this_is_a_very_long_file_name & +[1] 36689 +$ + +[1]+ Stopped vim this_is_a_very_long_file_name +$ pgrep "vim this" +$ +.Ed +.Pp +Same as above using the +.Fl f +flag: +.Bd -literal -offset indent +$ pgrep -f "vim this" +36689 +.Ed +.Pp +Find the +.Xr top 1 +command running in any jail: +.Bd -literal -offset indent +$ pgrep -j any top +34498 +.Ed +.Pp +Show all processes running in jail ID 58: +.Bd -literal -offset indent +$ pgrep -l -j58 '.*' +28397 pkg-static +28396 pkg-static +28255 sh +28254 make +.Ed .Sh COMPATIBILITY Historically the option .Dq Fl j Li 0 From owner-svn-src-all@freebsd.org Mon Oct 5 14:02:47 2020 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 71CDD425B83 for ; Mon, 5 Oct 2020 14:02:47 +0000 (UTC) (envelope-from fernando.apesteguia@gmail.com) Received: from mail-ua1-x929.google.com (mail-ua1-x929.google.com [IPv6:2607:f8b0:4864:20::929]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4j3V4cLpz3yK6 for ; Mon, 5 Oct 2020 14:02:46 +0000 (UTC) (envelope-from fernando.apesteguia@gmail.com) Received: by mail-ua1-x929.google.com with SMTP id o64so2539874uao.1 for ; Mon, 05 Oct 2020 07:02:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=QOe/2hE8DruigwDBtCSFEN5q4ujoqd1eryhwpl3Kqzw=; b=BNcW/ppV75IGibFyApEytQQZO3N1qyLye40dsCuLd8pdeoQ0cG7FX/y2OHzNv4ExXj 1fAGIiLF0wam/mwvZcEAe5Wx0eGnjUOsmXQSNp9fO27CXTDAR4trO612PEPVxcSh3zK+ 6/cjqH+KqJH8frYSyRrvY1VT+nAfLrpwc2+8Z9qjzaN4fI+qKeNuwzXQjzJ7BEhruUKe A8D6YHC6JgSPM75c5FhS9Ue9hpjrmEFK4XYoc/fWvbXqDWWVFkZpPoSrSJr7pujFQMah +cWmtFHIpcBTf4m1D704xJMWMC1Pu/swZ4I7Gh3C3NyX6e6LIMuhW4ai8g8dorKqaaw6 E2Zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=QOe/2hE8DruigwDBtCSFEN5q4ujoqd1eryhwpl3Kqzw=; b=OWLcj8qg5nEX9jprXMo+EDMfj8W94EQpa+YoqgPV+5mBSEv26FRZUZmvBcZCKg9p4d Shly0e9BlyUU//IWOeR75VTwQajRmE+ZedSdZxrwvfvwXOYJFnsnah+StSXfb+OJvTQ2 80qJXVMnp5NYHMEzrV/eeTyWFv0IhhQT0sr4Kvd6a9qikLg/UQRIUjo/9BfiPIgdRcTb Qb1lmaIr5lt2215lVB0v69CqYoNJJnuxHiYL83J9HO8lhnEpn9pbGpHWfnoINBVlkfhq IMNBxlRkHRMlaiDp5uvOZiATSuDAQZ9d/HOZZlrsBvhZ3D3bPQB1xt0LWf+cvzxoqObA c6SA== X-Gm-Message-State: AOAM531g/GJuoz6XecUHbNx7DR29rl0zvf986azWlmFGEwvKxZZWabYr svVttZmBK/4p5pX1EpRvCcPDoMOMtrhbhTUcoo2FtvZrMMcm2g== X-Google-Smtp-Source: ABdhPJzS7VRF3cZQlQntxQ7nllrzm1bctatEbj5HnGT0Fs85ACtvC+3TWzdrBuhkMkj+7I9/f6/UlcV8VADJHK0/P0Q= X-Received: by 2002:ab0:6dc8:: with SMTP id r8mr5012076uaf.73.1601906562796; Mon, 05 Oct 2020 07:02:42 -0700 (PDT) MIME-Version: 1.0 From: =?UTF-8?Q?Fernando_Apestegu=C3=ADa?= Date: Mon, 5 Oct 2020 17:00:56 +0200 Message-ID: Subject: r366448 differential review To: svn-src-all@freebsd.org Content-Type: text/plain; charset="UTF-8" X-Rspamd-Queue-Id: 4C4j3V4cLpz3yK6 X-Spamd-Bar: - Authentication-Results: mx1.freebsd.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=BNcW/ppV; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (mx1.freebsd.org: domain of fernandoapesteguia@gmail.com designates 2607:f8b0:4864:20::929 as permitted sender) smtp.mailfrom=fernandoapesteguia@gmail.com X-Spamd-Result: default: False [-1.99 / 15.00]; FREEMAIL_FROM(0.00)[gmail.com]; R_SPF_ALLOW(-0.20)[+ip6:2607:f8b0:4000::/36]; TO_DN_NONE(0.00)[]; DKIM_TRACE(0.00)[gmail.com:+]; DMARC_POLICY_ALLOW(-0.50)[gmail.com,none]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; R_MIXED_CHARSET(1.00)[subject]; FREEMAIL_ENVFROM(0.00)[gmail.com]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; TAGGED_FROM(0.00)[]; DWL_DNSWL_NONE(0.00)[gmail.com:dkim]; ARC_NA(0.00)[]; NEURAL_HAM_MEDIUM(-1.02)[-1.024]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20161025]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; NEURAL_HAM_LONG(-1.04)[-1.041]; MIME_GOOD(-0.10)[text/plain]; PREVIOUSLY_DELIVERED(0.00)[svn-src-all@freebsd.org]; RCPT_COUNT_ONE(0.00)[1]; NEURAL_SPAM_SHORT(0.07)[0.075]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::929:from]; RCVD_COUNT_TWO(0.00)[2]; RCVD_TLS_ALL(0.00)[]; MAILMAN_DEST(0.00)[svn-src-all] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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, 05 Oct 2020 14:02:47 -0000 It should have been this: https://reviews.freebsd.org/D26665 It seems my selection buffer is misbehaving. Sorry about that. From owner-svn-src-all@freebsd.org Mon Oct 5 14:07:33 2020 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 3DE71425ABD; Mon, 5 Oct 2020 14:07:33 +0000 (UTC) (envelope-from fernape@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4j910zG1z3yMr; Mon, 5 Oct 2020 14:07:33 +0000 (UTC) (envelope-from fernape@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 05942167F0; Mon, 5 Oct 2020 14:07:33 +0000 (UTC) (envelope-from fernape@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095E7WPD039275; Mon, 5 Oct 2020 14:07:32 GMT (envelope-from fernape@FreeBSD.org) Received: (from fernape@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095E7WBV039274; Mon, 5 Oct 2020 14:07:32 GMT (envelope-from fernape@FreeBSD.org) Message-Id: <202010051407.095E7WBV039274@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: fernape set sender to fernape@FreeBSD.org using -f From: =?UTF-8?Q?Fernando_Apestegu=c3=ada?= Date: Mon, 5 Oct 2020 14:07:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366449 - head/usr.bin/procstat X-SVN-Group: head X-SVN-Commit-Author: fernape X-SVN-Commit-Paths: head/usr.bin/procstat X-SVN-Commit-Revision: 366449 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.33 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, 05 Oct 2020 14:07:33 -0000 Author: fernape (ports committer) Date: Mon Oct 5 14:07:32 2020 New Revision: 366449 URL: https://svnweb.freebsd.org/changeset/base/366449 Log: procstat(1): Add EXAMPLES section * Add some examples showing binary, arguments and file info from living processes. * Show information from core dumps including an attempt using an old core file. * While here, fix warning 'no blank before trailing delimiter' reported by igor. Approved by: manpages (0mp@) Differential Revision: https://reviews.freebsd.org/D25467 Modified: head/usr.bin/procstat/procstat.1 Modified: head/usr.bin/procstat/procstat.1 ============================================================================== --- head/usr.bin/procstat/procstat.1 Mon Oct 5 13:52:31 2020 (r366448) +++ head/usr.bin/procstat/procstat.1 Mon Oct 5 14:07:32 2020 (r366449) @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 14, 2020 +.Dd October 5, 2020 .Dt PROCSTAT 1 .Os .Sh NAME @@ -710,6 +710,51 @@ auxiliary vector value .El .Sh EXIT STATUS .Ex -std +.Sh EXAMPLES +Show binary information about the current shell: +.Bd -literal -offset indent +$ procstat binary $$ + PID COMM OSREL PATH +46620 bash 1201000 /usr/local/bin/bash +.Ed +.Pp +Same as above but showing information about open file descriptors: +.Bd -literal -offset indent +$ procstat files $$ + PID COMM FD T V FLAGS REF OFFSET PRO NAME +46620 bash text v r r------- - - - /usr/local/bin/bash +46620 bash ctty v c rw------ - - - /dev/pts/12 +46620 bash cwd v d r------- - - - /tmp +46620 bash root v d r------- - - - / +46620 bash 0 v c rw------ 7 372071 - /dev/pts/12 +46620 bash 1 v c rw------ 7 372071 - /dev/pts/12 +46620 bash 2 v c rw------ 7 372071 - /dev/pts/12 +46620 bash 255 v c rw------ 7 372071 - /dev/pts/12 +.Ed +.Pp +Show the arguments used to launch +.Xr init 8 : +.Bd -literal -offset indent +$ procstat arguments 1 + PID COMM ARGS + 1 init /sbin/init -- +.Ed +.Pp +Extract binary information from a core dump: +.Bd -literal -offset indent +$ procstat binary core.36642 + PID COMM OSREL PATH +36642 top 1201000 /usr/bin/top +.Ed +.Pp +Trying to extract information from a core file generated in a different major +.Fx +version might show an error like this: +.Bd -literal -offset indent +$ procstat mplayer.core +procstat: kinfo_proc structure size mismatch +procstat: procstat_getprocs() +.Ed .Sh SEE ALSO .Xr fstat 1 , .Xr ps 1 , From owner-svn-src-all@freebsd.org Mon Oct 5 15:54:20 2020 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 21504428240; Mon, 5 Oct 2020 15:54:20 +0000 (UTC) (envelope-from markj@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4lXD02HHz44Xt; Mon, 5 Oct 2020 15:54:20 +0000 (UTC) (envelope-from markj@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 D890D17F6F; Mon, 5 Oct 2020 15:54:19 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095FsJll008672; Mon, 5 Oct 2020 15:54:19 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095FsJ8h008671; Mon, 5 Oct 2020 15:54:19 GMT (envelope-from markj@FreeBSD.org) Message-Id: <202010051554.095FsJ8h008671@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Mon, 5 Oct 2020 15:54:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366450 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: markj X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366450 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.33 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, 05 Oct 2020 15:54:20 -0000 Author: markj Date: Mon Oct 5 15:54:19 2020 New Revision: 366450 URL: https://svnweb.freebsd.org/changeset/base/366450 Log: Remove sysctl_kern_consmute() It is a trivial wrapper for sysctl_handle_int() since r184521. Also remove the NEEDGIANT flag, cn_mute is accessed locklessly. MFC after: 1 week Modified: head/sys/kern/kern_cons.c Modified: head/sys/kern/kern_cons.c ============================================================================== --- head/sys/kern/kern_cons.c Mon Oct 5 14:07:32 2020 (r366449) +++ head/sys/kern/kern_cons.c Mon Oct 5 15:54:19 2020 (r366450) @@ -93,7 +93,11 @@ int cons_avail_mask = 0; /* Bit mask. Each registered * (i.e., if it is in graphics mode) will have * this bit cleared. */ + static int cn_mute; +SYSCTL_INT(_kern, OID_AUTO, consmute, CTLFLAG_RW, &cn_mute, 0, + "State of the console muting"); + static char *consbuf; /* buffer used by `consmsgbuf' */ static struct callout conscallout; /* callout for outputting to constty */ struct msgbuf consmsgbuf; /* message buffer for console tty */ @@ -364,26 +368,6 @@ SYSCTL_PROC(_kern, OID_AUTO, console, CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_NEEDGIANT, 0, 0, sysctl_kern_console, "A", "Console device control"); - -/* - * User has changed the state of the console muting. - * This may require us to open or close the device in question. - */ -static int -sysctl_kern_consmute(SYSCTL_HANDLER_ARGS) -{ - int error; - - error = sysctl_handle_int(oidp, &cn_mute, 0, req); - if (error != 0 || req->newptr == NULL) - return (error); - return (error); -} - -SYSCTL_PROC(_kern, OID_AUTO, consmute, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, 0, sizeof(cn_mute), - sysctl_kern_consmute, "I", - "State of the console muting"); void cngrab() From owner-svn-src-all@freebsd.org Mon Oct 5 16:39:39 2020 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 A4F8A4291E7; Mon, 5 Oct 2020 16:39:39 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4mXW3m1nz46P7; Mon, 5 Oct 2020 16:39:39 +0000 (UTC) (envelope-from np@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 5FDA0188D5; Mon, 5 Oct 2020 16:39:39 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095Gddso033548; Mon, 5 Oct 2020 16:39:39 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095Gdd8G033547; Mon, 5 Oct 2020 16:39:39 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010051639.095Gdd8G033547@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 16:39:39 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-releng@freebsd.org Subject: svn commit: r366451 - releng/12.2/sys/dev/cxgbe/tom X-SVN-Group: releng X-SVN-Commit-Author: np X-SVN-Commit-Paths: releng/12.2/sys/dev/cxgbe/tom X-SVN-Commit-Revision: 366451 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.33 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, 05 Oct 2020 16:39:39 -0000 Author: np Date: Mon Oct 5 16:39:38 2020 New Revision: 366451 URL: https://svnweb.freebsd.org/changeset/base/366451 Log: MFS r366438: cxgbe(4): set up the firmware flowc for the tid before send_abort_rpl. Approved by: re@ (gjb@) Sponsored by: Chelsio Communications Modified: releng/12.2/sys/dev/cxgbe/tom/t4_listen.c Directory Properties: releng/12.2/ (props changed) Modified: releng/12.2/sys/dev/cxgbe/tom/t4_listen.c ============================================================================== --- releng/12.2/sys/dev/cxgbe/tom/t4_listen.c Mon Oct 5 15:54:19 2020 (r366450) +++ releng/12.2/sys/dev/cxgbe/tom/t4_listen.c Mon Oct 5 16:39:38 2020 (r366451) @@ -341,48 +341,32 @@ release_lctx(struct adapter *sc, struct listen_ctx *lc } static void -send_reset_synqe(struct toedev *tod, struct synq_entry *synqe) +send_flowc_wr_synqe(struct adapter *sc, struct synq_entry *synqe) { - struct adapter *sc = tod->tod_softc; struct mbuf *m = synqe->syn; struct ifnet *ifp = m->m_pkthdr.rcvif; struct vi_info *vi = ifp->if_softc; struct port_info *pi = vi->pi; - struct l2t_entry *e = &sc->l2t->l2tab[synqe->params.l2t_idx]; struct wrqe *wr; struct fw_flowc_wr *flowc; - struct cpl_abort_req *req; - int flowclen; struct sge_wrq *ofld_txq; struct sge_ofld_rxq *ofld_rxq; const int nparams = 6; + const int flowclen = sizeof(*flowc) + nparams * sizeof(struct fw_flowc_mnemval); const u_int pfvf = sc->pf << S_FW_VIID_PFN; INP_WLOCK_ASSERT(synqe->lctx->inp); + MPASS((synqe->flags & TPF_FLOWC_WR_SENT) == 0); - CTR5(KTR_CXGBE, "%s: synqe %p (0x%x), tid %d%s", - __func__, synqe, synqe->flags, synqe->tid, - synqe->flags & TPF_ABORT_SHUTDOWN ? - " (abort already in progress)" : ""); - if (synqe->flags & TPF_ABORT_SHUTDOWN) - return; /* abort already in progress */ - synqe->flags |= TPF_ABORT_SHUTDOWN; - ofld_txq = &sc->sge.ofld_txq[synqe->params.txq_idx]; ofld_rxq = &sc->sge.ofld_rxq[synqe->params.rxq_idx]; - /* The wrqe will have two WRs - a flowc followed by an abort_req */ - flowclen = sizeof(*flowc) + nparams * sizeof(struct fw_flowc_mnemval); - - wr = alloc_wrqe(roundup2(flowclen, EQ_ESIZE) + sizeof(*req), ofld_txq); + wr = alloc_wrqe(roundup2(flowclen, 16), ofld_txq); if (wr == NULL) { /* XXX */ panic("%s: allocation failure.", __func__); } flowc = wrtod(wr); - req = (void *)((caddr_t)flowc + roundup2(flowclen, EQ_ESIZE)); - - /* First the flowc ... */ memset(flowc, 0, wr->wr_len); flowc->op_to_nparams = htobe32(V_FW_WR_OP(FW_FLOWC_WR) | V_FW_FLOWC_WR_NPARAMS(nparams)); @@ -396,19 +380,47 @@ send_reset_synqe(struct toedev *tod, struct synq_entry flowc->mnemval[2].val = htobe32(pi->tx_chan); flowc->mnemval[3].mnemonic = FW_FLOWC_MNEM_IQID; flowc->mnemval[3].val = htobe32(ofld_rxq->iq.abs_id); - flowc->mnemval[4].mnemonic = FW_FLOWC_MNEM_SNDBUF; - flowc->mnemval[4].val = htobe32(512); - flowc->mnemval[5].mnemonic = FW_FLOWC_MNEM_MSS; - flowc->mnemval[5].val = htobe32(512); + flowc->mnemval[4].mnemonic = FW_FLOWC_MNEM_SNDBUF; + flowc->mnemval[4].val = htobe32(512); + flowc->mnemval[5].mnemonic = FW_FLOWC_MNEM_MSS; + flowc->mnemval[5].val = htobe32(512); + synqe->flags |= TPF_FLOWC_WR_SENT; + t4_wrq_tx(sc, wr); +} - /* ... then ABORT request */ +static void +send_reset_synqe(struct toedev *tod, struct synq_entry *synqe) +{ + struct adapter *sc = tod->tod_softc; + struct wrqe *wr; + struct cpl_abort_req *req; + + INP_WLOCK_ASSERT(synqe->lctx->inp); + + CTR5(KTR_CXGBE, "%s: synqe %p (0x%x), tid %d%s", + __func__, synqe, synqe->flags, synqe->tid, + synqe->flags & TPF_ABORT_SHUTDOWN ? + " (abort already in progress)" : ""); + if (synqe->flags & TPF_ABORT_SHUTDOWN) + return; /* abort already in progress */ + synqe->flags |= TPF_ABORT_SHUTDOWN; + + if (!(synqe->flags & TPF_FLOWC_WR_SENT)) + send_flowc_wr_synqe(sc, synqe); + + wr = alloc_wrqe(sizeof(*req), &sc->sge.ofld_txq[synqe->params.txq_idx]); + if (wr == NULL) { + /* XXX */ + panic("%s: allocation failure.", __func__); + } + req = wrtod(wr); INIT_TP_WR_MIT_CPL(req, CPL_ABORT_REQ, synqe->tid); req->rsvd0 = 0; /* don't have a snd_nxt */ req->rsvd1 = 1; /* no data sent yet */ req->cmd = CPL_ABORT_SEND_RST; - t4_l2t_send(sc, wr, e); + t4_l2t_send(sc, wr, &sc->l2t->l2tab[synqe->params.l2t_idx]); } static int @@ -888,6 +900,9 @@ do_abort_req_synqe(struct sge_iq *iq, const struct rss INP_WLOCK(inp); ofld_txq = &sc->sge.ofld_txq[synqe->params.txq_idx]; + + if (!(synqe->flags & TPF_FLOWC_WR_SENT)) + send_flowc_wr_synqe(sc, synqe); /* * If we'd initiated an abort earlier the reply to it is responsible for From owner-svn-src-all@freebsd.org Mon Oct 5 18:08:53 2020 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 C952342BAC6; Mon, 5 Oct 2020 18:08:53 +0000 (UTC) (envelope-from dim@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4pWT4qvmz4Hwc; Mon, 5 Oct 2020 18:08:53 +0000 (UTC) (envelope-from dim@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 89519195F1; Mon, 5 Oct 2020 18:08:53 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095I8r9p093101; Mon, 5 Oct 2020 18:08:53 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095I8rXN093099; Mon, 5 Oct 2020 18:08:53 GMT (envelope-from dim@FreeBSD.org) Message-Id: <202010051808.095I8rXN093099@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Mon, 5 Oct 2020 18:08:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366452 - in stable: 11/contrib/llvm-project/clang/lib/Basic/Targets 11/contrib/llvm-project/llvm/lib/Target/X86 12/contrib/llvm-project/clang/lib/Basic/Targets 12/contrib/llvm-project/... X-SVN-Group: stable-12 X-SVN-Commit-Author: dim X-SVN-Commit-Paths: in stable: 11/contrib/llvm-project/clang/lib/Basic/Targets 11/contrib/llvm-project/llvm/lib/Target/X86 12/contrib/llvm-project/clang/lib/Basic/Targets 12/contrib/llvm-project/llvm/lib/Target/X86 X-SVN-Commit-Revision: 366452 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.33 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, 05 Oct 2020 18:08:53 -0000 Author: dim Date: Mon Oct 5 18:08:52 2020 New Revision: 366452 URL: https://svnweb.freebsd.org/changeset/base/366452 Log: Merge commit 0fac1c191 from llvm git (by Craig Topper): [X86] Allow Yz inline assembly constraint to choose ymm0 or zmm0 when avx/avx512 are enabled and type is 256 or 512 bits gcc supports selecting ymm0/zmm0 for the Yz constraint when used with 256 or 512 bit vector types. Fixes PR45806 Differential Revision: https://reviews.llvm.org/D79448 This should fix 'fatal error: error in backend: Cannot select' errors if assertions are disabled, or 'Assertion failed: (isVector() && "Invalid vector type!"), function getVectorNumElements, file /usr/src/contrib/llvm-project/llvm/include/llvm/CodeGen/ValueTypes.h, line 276.', when building the audio/lsp-plugins-lv2 port. Direct commit to stable/{11,12} since head has clang 11.0.0, which already includes this fix. Reported by: yuri PR: 232911 Modified: stable/12/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp stable/12/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp Changes in other areas also in this revision: Modified: stable/11/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp stable/11/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp Modified: stable/12/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp ============================================================================== --- stable/12/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp Mon Oct 5 16:39:38 2020 (r366451) +++ stable/12/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp Mon Oct 5 18:08:52 2020 (r366452) @@ -1772,8 +1772,14 @@ bool X86TargetInfo::validateOperandSize(const llvm::St return Size <= 64; case 'z': case '0': - // XMM0 - if (FeatureMap.lookup("sse")) + // XMM0/YMM/ZMM0 + if (FeatureMap.lookup("avx512f")) + // ZMM0 can be used if target supports AVX512F. + return Size <= 512U; + else if (FeatureMap.lookup("avx")) + // YMM0 can be used if target supports AVX. + return Size <= 256U; + else if (FeatureMap.lookup("sse")) return Size <= 128U; return false; case 'i': Modified: stable/12/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp ============================================================================== --- stable/12/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp Mon Oct 5 16:39:38 2020 (r366451) +++ stable/12/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp Mon Oct 5 18:08:52 2020 (r366452) @@ -46555,7 +46555,9 @@ TargetLowering::ConstraintWeight // XMM0 case 'z': case '0': - if ((type->getPrimitiveSizeInBits() == 128) && Subtarget.hasSSE1()) + if (((type->getPrimitiveSizeInBits() == 128) && Subtarget.hasSSE1()) || + ((type->getPrimitiveSizeInBits() == 256) && Subtarget.hasAVX()) || + ((type->getPrimitiveSizeInBits() == 512) && Subtarget.hasAVX512())) return CW_SpecificReg; return CW_Invalid; // Conditional OpMask regs (AVX512) @@ -47005,6 +47007,8 @@ X86TargetLowering::getRegForInlineAsmConstraint(const if (Subtarget.hasAVX()) return std::make_pair(0U, &X86::VR256RegClass); break; + case MVT::v64i8: + case MVT::v32i16: case MVT::v8f64: case MVT::v16f32: case MVT::v16i32: @@ -47030,7 +47034,42 @@ X86TargetLowering::getRegForInlineAsmConstraint(const case 'z': case '0': if (!Subtarget.hasSSE1()) break; - return std::make_pair(X86::XMM0, &X86::VR128RegClass); + switch (VT.SimpleTy) { + default: break; + // Scalar SSE types. + case MVT::f32: + case MVT::i32: + return std::make_pair(X86::XMM0, &X86::FR32RegClass); + case MVT::f64: + case MVT::i64: + return std::make_pair(X86::XMM0, &X86::FR64RegClass); + case MVT::f128: + case MVT::v16i8: + case MVT::v8i16: + case MVT::v4i32: + case MVT::v2i64: + case MVT::v4f32: + case MVT::v2f64: + return std::make_pair(X86::XMM0, &X86::VR128RegClass); + // AVX types. + case MVT::v32i8: + case MVT::v16i16: + case MVT::v8i32: + case MVT::v4i64: + case MVT::v8f32: + case MVT::v4f64: + if (Subtarget.hasAVX()) + return std::make_pair(X86::YMM0, &X86::VR256RegClass); + break; + case MVT::v8f64: + case MVT::v16f32: + case MVT::v16i32: + case MVT::v8i64: + if (Subtarget.hasAVX512()) + return std::make_pair(X86::ZMM0, &X86::VR512_0_15RegClass); + break; + } + break; case 'k': // This register class doesn't allocate k0 for masked vector operation. if (Subtarget.hasAVX512()) { From owner-svn-src-all@freebsd.org Mon Oct 5 18:08:54 2020 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 77CBB42B5FA; Mon, 5 Oct 2020 18:08:54 +0000 (UTC) (envelope-from dim@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4pWV2cbQz4Hp9; Mon, 5 Oct 2020 18:08:54 +0000 (UTC) (envelope-from dim@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 3DC0D19866; Mon, 5 Oct 2020 18:08:54 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095I8sOA093108; Mon, 5 Oct 2020 18:08:54 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095I8rQI093106; Mon, 5 Oct 2020 18:08:53 GMT (envelope-from dim@FreeBSD.org) Message-Id: <202010051808.095I8rQI093106@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Mon, 5 Oct 2020 18:08:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r366452 - in stable: 11/contrib/llvm-project/clang/lib/Basic/Targets 11/contrib/llvm-project/llvm/lib/Target/X86 12/contrib/llvm-project/clang/lib/Basic/Targets 12/contrib/llvm-project/... X-SVN-Group: stable-11 X-SVN-Commit-Author: dim X-SVN-Commit-Paths: in stable: 11/contrib/llvm-project/clang/lib/Basic/Targets 11/contrib/llvm-project/llvm/lib/Target/X86 12/contrib/llvm-project/clang/lib/Basic/Targets 12/contrib/llvm-project/llvm/lib/Target/X86 X-SVN-Commit-Revision: 366452 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.33 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, 05 Oct 2020 18:08:54 -0000 Author: dim Date: Mon Oct 5 18:08:52 2020 New Revision: 366452 URL: https://svnweb.freebsd.org/changeset/base/366452 Log: Merge commit 0fac1c191 from llvm git (by Craig Topper): [X86] Allow Yz inline assembly constraint to choose ymm0 or zmm0 when avx/avx512 are enabled and type is 256 or 512 bits gcc supports selecting ymm0/zmm0 for the Yz constraint when used with 256 or 512 bit vector types. Fixes PR45806 Differential Revision: https://reviews.llvm.org/D79448 This should fix 'fatal error: error in backend: Cannot select' errors if assertions are disabled, or 'Assertion failed: (isVector() && "Invalid vector type!"), function getVectorNumElements, file /usr/src/contrib/llvm-project/llvm/include/llvm/CodeGen/ValueTypes.h, line 276.', when building the audio/lsp-plugins-lv2 port. Direct commit to stable/{11,12} since head has clang 11.0.0, which already includes this fix. Reported by: yuri PR: 232911 Modified: stable/11/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp stable/11/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp Changes in other areas also in this revision: Modified: stable/12/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp stable/12/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp Modified: stable/11/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp ============================================================================== --- stable/11/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp Mon Oct 5 16:39:38 2020 (r366451) +++ stable/11/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp Mon Oct 5 18:08:52 2020 (r366452) @@ -1772,8 +1772,14 @@ bool X86TargetInfo::validateOperandSize(const llvm::St return Size <= 64; case 'z': case '0': - // XMM0 - if (FeatureMap.lookup("sse")) + // XMM0/YMM/ZMM0 + if (FeatureMap.lookup("avx512f")) + // ZMM0 can be used if target supports AVX512F. + return Size <= 512U; + else if (FeatureMap.lookup("avx")) + // YMM0 can be used if target supports AVX. + return Size <= 256U; + else if (FeatureMap.lookup("sse")) return Size <= 128U; return false; case 'i': Modified: stable/11/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp ============================================================================== --- stable/11/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp Mon Oct 5 16:39:38 2020 (r366451) +++ stable/11/contrib/llvm-project/llvm/lib/Target/X86/X86ISelLowering.cpp Mon Oct 5 18:08:52 2020 (r366452) @@ -46555,7 +46555,9 @@ TargetLowering::ConstraintWeight // XMM0 case 'z': case '0': - if ((type->getPrimitiveSizeInBits() == 128) && Subtarget.hasSSE1()) + if (((type->getPrimitiveSizeInBits() == 128) && Subtarget.hasSSE1()) || + ((type->getPrimitiveSizeInBits() == 256) && Subtarget.hasAVX()) || + ((type->getPrimitiveSizeInBits() == 512) && Subtarget.hasAVX512())) return CW_SpecificReg; return CW_Invalid; // Conditional OpMask regs (AVX512) @@ -47005,6 +47007,8 @@ X86TargetLowering::getRegForInlineAsmConstraint(const if (Subtarget.hasAVX()) return std::make_pair(0U, &X86::VR256RegClass); break; + case MVT::v64i8: + case MVT::v32i16: case MVT::v8f64: case MVT::v16f32: case MVT::v16i32: @@ -47030,7 +47034,42 @@ X86TargetLowering::getRegForInlineAsmConstraint(const case 'z': case '0': if (!Subtarget.hasSSE1()) break; - return std::make_pair(X86::XMM0, &X86::VR128RegClass); + switch (VT.SimpleTy) { + default: break; + // Scalar SSE types. + case MVT::f32: + case MVT::i32: + return std::make_pair(X86::XMM0, &X86::FR32RegClass); + case MVT::f64: + case MVT::i64: + return std::make_pair(X86::XMM0, &X86::FR64RegClass); + case MVT::f128: + case MVT::v16i8: + case MVT::v8i16: + case MVT::v4i32: + case MVT::v2i64: + case MVT::v4f32: + case MVT::v2f64: + return std::make_pair(X86::XMM0, &X86::VR128RegClass); + // AVX types. + case MVT::v32i8: + case MVT::v16i16: + case MVT::v8i32: + case MVT::v4i64: + case MVT::v8f32: + case MVT::v4f64: + if (Subtarget.hasAVX()) + return std::make_pair(X86::YMM0, &X86::VR256RegClass); + break; + case MVT::v8f64: + case MVT::v16f32: + case MVT::v16i32: + case MVT::v8i64: + if (Subtarget.hasAVX512()) + return std::make_pair(X86::ZMM0, &X86::VR512_0_15RegClass); + break; + } + break; case 'k': // This register class doesn't allocate k0 for masked vector operation. if (Subtarget.hasAVX512()) { From owner-svn-src-all@freebsd.org Mon Oct 5 18:17:51 2020 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 6402A42C1F0; Mon, 5 Oct 2020 18:17:51 +0000 (UTC) (envelope-from chs@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4pjq1yD3z4Jxq; Mon, 5 Oct 2020 18:17:51 +0000 (UTC) (envelope-from chs@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 233FA19E81; Mon, 5 Oct 2020 18:17:51 +0000 (UTC) (envelope-from chs@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095IHpnB099085; Mon, 5 Oct 2020 18:17:51 GMT (envelope-from chs@FreeBSD.org) Received: (from chs@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095IHpSF099084; Mon, 5 Oct 2020 18:17:51 GMT (envelope-from chs@FreeBSD.org) Message-Id: <202010051817.095IHpSF099084@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: chs set sender to chs@FreeBSD.org using -f From: Chuck Silvers Date: Mon, 5 Oct 2020 18:17:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366453 - head/sys/ufs/ufs X-SVN-Group: head X-SVN-Commit-Author: chs X-SVN-Commit-Paths: head/sys/ufs/ufs X-SVN-Commit-Revision: 366453 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.33 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, 05 Oct 2020 18:17:51 -0000 Author: chs Date: Mon Oct 5 18:17:50 2020 New Revision: 366453 URL: https://svnweb.freebsd.org/changeset/base/366453 Log: ufs: restore uniqueness of st_dev as returned by ufs_stat() switch ufs_stat() to use the same value for st_dev as was used by the previous ufs_getattr() stat path. Submitted by: gallatin Reviewed by: mjg, imp, kib, mckusick Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D26596 Modified: head/sys/ufs/ufs/ufs_vnops.c Modified: head/sys/ufs/ufs/ufs_vnops.c ============================================================================== --- head/sys/ufs/ufs/ufs_vnops.c Mon Oct 5 18:08:52 2020 (r366452) +++ head/sys/ufs/ufs/ufs_vnops.c Mon Oct 5 18:17:50 2020 (r366453) @@ -498,7 +498,7 @@ ufs_stat(struct vop_stat_args *ap) } VI_UNLOCK(vp); - sb->st_dev = vp->v_mount->mnt_stat.f_fsid.val[0]; + sb->st_dev = dev2udev(ITOUMP(ip)->um_dev); sb->st_ino = ip->i_number; sb->st_mode = (ip->i_mode & ~IFMT) | VTTOIF(vp->v_type); sb->st_nlink = ip->i_effnlink; From owner-svn-src-all@freebsd.org Mon Oct 5 18:41:35 2020 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 D042F42CA46; Mon, 5 Oct 2020 18:41:35 +0000 (UTC) (envelope-from trasz@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4qFC59CBz4LDd; Mon, 5 Oct 2020 18:41:35 +0000 (UTC) (envelope-from trasz@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 95FF41A0CE; Mon, 5 Oct 2020 18:41:35 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095IfZna015001; Mon, 5 Oct 2020 18:41:35 GMT (envelope-from trasz@FreeBSD.org) Received: (from trasz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095IfZU1015000; Mon, 5 Oct 2020 18:41:35 GMT (envelope-from trasz@FreeBSD.org) Message-Id: <202010051841.095IfZU1015000@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: trasz set sender to trasz@FreeBSD.org using -f From: Edward Tomasz Napierala Date: Mon, 5 Oct 2020 18:41:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366454 - head/sys/riscv/riscv X-SVN-Group: head X-SVN-Commit-Author: trasz X-SVN-Commit-Paths: head/sys/riscv/riscv X-SVN-Commit-Revision: 366454 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.33 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, 05 Oct 2020 18:41:35 -0000 Author: trasz Date: Mon Oct 5 18:41:35 2020 New Revision: 366454 URL: https://svnweb.freebsd.org/changeset/base/366454 Log: Drop useless assignment, and add a KASSERT to make sure it really was useless. Reviewed by: nick, jhb Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D26649 Modified: head/sys/riscv/riscv/trap.c Modified: head/sys/riscv/riscv/trap.c ============================================================================== --- head/sys/riscv/riscv/trap.c Mon Oct 5 18:17:50 2020 (r366453) +++ head/sys/riscv/riscv/trap.c Mon Oct 5 18:41:35 2020 (r366454) @@ -163,7 +163,9 @@ svc_handler(struct trapframe *frame) struct thread *td; td = curthread; - td->td_frame = frame; + + KASSERT(td->td_frame == frame, + ("%s: td_frame %p != frame %p", __func__, td->td_frame, frame)); syscallenter(td); syscallret(td); From owner-svn-src-all@freebsd.org Mon Oct 5 18:45:33 2020 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 3598142CB4A; Mon, 5 Oct 2020 18:45:33 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4qKn0VpKz4LcQ; Mon, 5 Oct 2020 18:45:33 +0000 (UTC) (envelope-from np@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 E48E81A330; Mon, 5 Oct 2020 18:45:32 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095IjWi5017626; Mon, 5 Oct 2020 18:45:32 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095IjWgk017625; Mon, 5 Oct 2020 18:45:32 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010051845.095IjWgk017625@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 18:45:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366455 - stable/12/sys/dev/cxgbe X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: stable/12/sys/dev/cxgbe X-SVN-Commit-Revision: 366455 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.33 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, 05 Oct 2020 18:45:33 -0000 Author: np Date: Mon Oct 5 18:45:32 2020 New Revision: 366455 URL: https://svnweb.freebsd.org/changeset/base/366455 Log: MFC r366242: cxgbe(4): fixes for netmap operation with only some queues active. - Only active netmap receive queues should be in the RSS lookup table. - The RSS table should be restored for NIC operation when the last active netmap queue is switched off, not the first one. - Support repeated netmap ON/OFF on a subset of the queues. This works whether the the queues being enabled and disabled are the only ones active or not. Some kring indexes have to be reset in the driver for the second case. Sponsored by: Chelsio Communications Modified: stable/12/sys/dev/cxgbe/t4_netmap.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/dev/cxgbe/t4_netmap.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:41:35 2020 (r366454) +++ stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:45:32 2020 (r366455) @@ -347,6 +347,180 @@ free_nm_txq_hwq(struct vi_info *vi, struct sge_nm_txq } static int +cxgbe_netmap_simple_rss(struct adapter *sc, struct vi_info *vi, + struct ifnet *ifp, struct netmap_adapter *na) +{ + struct netmap_kring *kring; + struct sge_nm_rxq *nm_rxq; + int rc, i, j, nm_state, defq; + uint16_t *rss; + + /* + * Check if there's at least one active (or about to go active) netmap + * rx queue. + */ + defq = -1; + for_each_nm_rxq(vi, j, nm_rxq) { + nm_state = atomic_load_int(&nm_rxq->nm_state); + kring = na->rx_rings[nm_rxq->nid]; + if ((nm_state != NM_OFF && !nm_kring_pending_off(kring)) || + (nm_state == NM_OFF && nm_kring_pending_on(kring))) { + MPASS(nm_rxq->iq_cntxt_id != INVALID_NM_RXQ_CNTXT_ID); + if (defq == -1) { + defq = nm_rxq->iq_abs_id; + break; + } + } + } + + if (defq == -1) { + /* No active netmap queues. Switch back to NIC queues. */ + rss = vi->rss; + defq = vi->rss[0]; + } else { + for (i = 0; i < vi->rss_size;) { + for_each_nm_rxq(vi, j, nm_rxq) { + nm_state = atomic_load_int(&nm_rxq->nm_state); + kring = na->rx_rings[nm_rxq->nid]; + if ((nm_state != NM_OFF && + !nm_kring_pending_off(kring)) || + (nm_state == NM_OFF && + nm_kring_pending_on(kring))) { + MPASS(nm_rxq->iq_cntxt_id != + INVALID_NM_RXQ_CNTXT_ID); + vi->nm_rss[i++] = nm_rxq->iq_abs_id; + if (i == vi->rss_size) + break; + } + } + } + rss = vi->nm_rss; + } + + rc = -t4_config_rss_range(sc, sc->mbox, vi->viid, 0, vi->rss_size, rss, + vi->rss_size); + if (rc != 0) + if_printf(ifp, "netmap rss_config failed: %d\n", rc); + + rc = -t4_config_vi_rss(sc, sc->mbox, vi->viid, vi->hashen, defq, 0, 0); + if (rc != 0) { + if_printf(ifp, "netmap defaultq config failed: %d\n", rc); + } + + return (rc); +} + +/* + * Odd number of rx queues work best for split RSS mode as the first queue can + * be dedicated for non-RSS traffic and the rest divided into two equal halves. + */ +static int +cxgbe_netmap_split_rss(struct adapter *sc, struct vi_info *vi, + struct ifnet *ifp, struct netmap_adapter *na) +{ + struct netmap_kring *kring; + struct sge_nm_rxq *nm_rxq; + int rc, i, j, nm_state, defq; + int nactive[2] = {0, 0}; + int dq[2] = {-1, -1}; + bool dq_norss; /* default queue should not be in RSS table. */ + + MPASS(nm_split_rss != 0); + MPASS(vi->nnmrxq > 1); + + for_each_nm_rxq(vi, i, nm_rxq) { + j = i / ((vi->nnmrxq + 1) / 2); + nm_state = atomic_load_int(&nm_rxq->nm_state); + kring = na->rx_rings[nm_rxq->nid]; + if ((nm_state != NM_OFF && !nm_kring_pending_off(kring)) || + (nm_state == NM_OFF && nm_kring_pending_on(kring))) { + MPASS(nm_rxq->iq_cntxt_id != INVALID_NM_RXQ_CNTXT_ID); + nactive[j]++; + if (dq[j] == -1) { + dq[j] = nm_rxq->iq_abs_id; + break; + } + } + } + + if (nactive[0] == 0 || nactive[1] == 0) + return (cxgbe_netmap_simple_rss(sc, vi, ifp, na)); + + MPASS(dq[0] != -1 && dq[1] != -1); + if (nactive[0] > nactive[1]) { + defq = dq[0]; + dq_norss = true; + } else if (nactive[0] < nactive[1]) { + defq = dq[1]; + dq_norss = true; + } else { + defq = dq[0]; + dq_norss = false; + } + + i = 0; + nm_rxq = &sc->sge.nm_rxq[vi->first_nm_rxq]; + while (i < vi->rss_size / 2) { + for (j = 0; j < (vi->nnmrxq + 1) / 2; j++) { + nm_state = atomic_load_int(&nm_rxq[j].nm_state); + kring = na->rx_rings[nm_rxq[j].nid]; + if ((nm_state == NM_OFF && + !nm_kring_pending_on(kring)) || + (nm_state == NM_ON && + nm_kring_pending_off(kring))) { + continue; + } + MPASS(nm_rxq[j].iq_cntxt_id != INVALID_NM_RXQ_CNTXT_ID); + if (dq_norss && defq == nm_rxq[j].iq_abs_id) + continue; + vi->nm_rss[i++] = nm_rxq[j].iq_abs_id; + if (i == vi->rss_size / 2) + break; + } + } + while (i < vi->rss_size) { + for (j = (vi->nnmrxq + 1) / 2; j < vi->nnmrxq; j++) { + nm_state = atomic_load_int(&nm_rxq[j].nm_state); + kring = na->rx_rings[nm_rxq[j].nid]; + if ((nm_state == NM_OFF && + !nm_kring_pending_on(kring)) || + (nm_state == NM_ON && + nm_kring_pending_off(kring))) { + continue; + } + MPASS(nm_rxq[j].iq_cntxt_id != INVALID_NM_RXQ_CNTXT_ID); + if (dq_norss && defq == nm_rxq[j].iq_abs_id) + continue; + vi->nm_rss[i++] = nm_rxq[j].iq_abs_id; + if (i == vi->rss_size) + break; + } + } + + rc = -t4_config_rss_range(sc, sc->mbox, vi->viid, 0, vi->rss_size, + vi->nm_rss, vi->rss_size); + if (rc != 0) + if_printf(ifp, "netmap split_rss_config failed: %d\n", rc); + + rc = -t4_config_vi_rss(sc, sc->mbox, vi->viid, vi->hashen, defq, 0, 0); + if (rc != 0) + if_printf(ifp, "netmap defaultq config failed: %d\n", rc); + + return (rc); +} + +static inline int +cxgbe_netmap_rss(struct adapter *sc, struct vi_info *vi, struct ifnet *ifp, + struct netmap_adapter *na) +{ + + if (nm_split_rss == 0 || vi->nnmrxq == 1) + return (cxgbe_netmap_simple_rss(sc, vi, ifp, na)); + else + return (cxgbe_netmap_split_rss(sc, vi, ifp, na)); +} + +static int cxgbe_netmap_on(struct adapter *sc, struct vi_info *vi, struct ifnet *ifp, struct netmap_adapter *na) { @@ -354,10 +528,12 @@ cxgbe_netmap_on(struct adapter *sc, struct vi_info *vi struct netmap_kring *kring; struct sge_nm_rxq *nm_rxq; struct sge_nm_txq *nm_txq; - int rc, i, j, hwidx, defq, nrssq; + int i, j, hwidx; struct rx_buf_info *rxb; ASSERT_SYNCHRONIZED_OP(sc); + MPASS(vi->nnmrxq > 0); + MPASS(vi->nnmtxq > 0); if ((vi->flags & VI_INIT_DONE) == 0 || (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) @@ -430,72 +606,7 @@ cxgbe_netmap_on(struct adapter *sc, struct vi_info *vi M_ZERO | M_WAITOK); } - MPASS(vi->nnmrxq > 0); - if (nm_split_rss == 0 || vi->nnmrxq == 1) { - for (i = 0; i < vi->rss_size;) { - for_each_nm_rxq(vi, j, nm_rxq) { - vi->nm_rss[i++] = nm_rxq->iq_abs_id; - if (i == vi->rss_size) - break; - } - } - defq = vi->nm_rss[0]; - } else { - /* We have multiple queues and we want to split the table. */ - MPASS(nm_split_rss != 0); - MPASS(vi->nnmrxq > 1); - - nm_rxq = &sc->sge.nm_rxq[vi->first_nm_rxq]; - nrssq = vi->nnmrxq; - if (vi->nnmrxq & 1) { - /* - * Odd number of queues. The first rxq is designated the - * default queue, the rest are split evenly. - */ - defq = nm_rxq->iq_abs_id; - nm_rxq++; - nrssq--; - } else { - /* - * Even number of queues split into two halves. The - * first rxq in one of the halves is designated the - * default queue. - */ -#if 1 - /* First rxq in the first half. */ - defq = nm_rxq->iq_abs_id; -#else - /* First rxq in the second half. */ - defq = nm_rxq[vi->nnmrxq / 2].iq_abs_id; -#endif - } - - i = 0; - while (i < vi->rss_size / 2) { - for (j = 0; j < nrssq / 2; j++) { - vi->nm_rss[i++] = nm_rxq[j].iq_abs_id; - if (i == vi->rss_size / 2) - break; - } - } - while (i < vi->rss_size) { - for (j = nrssq / 2; j < nrssq; j++) { - vi->nm_rss[i++] = nm_rxq[j].iq_abs_id; - if (i == vi->rss_size) - break; - } - } - } - rc = -t4_config_rss_range(sc, sc->mbox, vi->viid, 0, vi->rss_size, - vi->nm_rss, vi->rss_size); - if (rc != 0) - if_printf(ifp, "netmap rss_config failed: %d\n", rc); - - rc = -t4_config_vi_rss(sc, sc->mbox, vi->viid, vi->hashen, defq, 0, 0); - if (rc != 0) - if_printf(ifp, "netmap rss hash/defaultq config failed: %d\n", rc); - - return (rc); + return (cxgbe_netmap_rss(sc, vi, ifp, na)); } static int @@ -503,11 +614,13 @@ cxgbe_netmap_off(struct adapter *sc, struct vi_info *v struct netmap_adapter *na) { struct netmap_kring *kring; - int rc, i; + int rc, i, nm_state, nactive; struct sge_nm_txq *nm_txq; struct sge_nm_rxq *nm_rxq; ASSERT_SYNCHRONIZED_OP(sc); + MPASS(vi->nnmrxq > 0); + MPASS(vi->nnmtxq > 0); if (!nm_netmap_on(na)) return (0); @@ -515,14 +628,10 @@ cxgbe_netmap_off(struct adapter *sc, struct vi_info *v if ((vi->flags & VI_INIT_DONE) == 0) return (0); - rc = -t4_config_rss_range(sc, sc->mbox, vi->viid, 0, vi->rss_size, - vi->rss, vi->rss_size); + /* First remove the queues that are stopping from the RSS table. */ + rc = cxgbe_netmap_rss(sc, vi, ifp, na); if (rc != 0) - if_printf(ifp, "failed to restore RSS config: %d\n", rc); - rc = -t4_config_vi_rss(sc, sc->mbox, vi->viid, vi->hashen, vi->rss[0], 0, 0); - if (rc != 0) - if_printf(ifp, "failed to restore RSS hash/defaultq: %d\n", rc); - nm_clear_native_flags(na); + return (rc); /* error message logged already. */ for_each_nm_txq(vi, i, nm_txq) { struct sge_qstat *spg = (void *)&nm_txq->desc[nm_txq->sidx]; @@ -541,18 +650,33 @@ cxgbe_netmap_off(struct adapter *sc, struct vi_info *v pause("nmcidx", 1); free_nm_txq_hwq(vi, nm_txq); + + /* XXX: netmap, not the driver, should do this. */ + kring->rhead = kring->rcur = kring->nr_hwcur = 0; + kring->rtail = kring->nr_hwtail = kring->nkr_num_slots - 1; } + nactive = 0; for_each_nm_rxq(vi, i, nm_rxq) { + nm_state = atomic_load_int(&nm_rxq->nm_state); kring = na->rx_rings[nm_rxq->nid]; - if (!nm_kring_pending_off(kring) || - nm_rxq->iq_cntxt_id == INVALID_NM_RXQ_CNTXT_ID) + if (nm_state != NM_OFF && !nm_kring_pending_off(kring)) + nactive++; + if (nm_state == NM_OFF || !nm_kring_pending_off(kring)) continue; + MPASS(nm_rxq->iq_cntxt_id != INVALID_NM_RXQ_CNTXT_ID); while (!atomic_cmpset_int(&nm_rxq->nm_state, NM_ON, NM_OFF)) pause("nmst", 1); free_nm_rxq_hwq(vi, nm_rxq); + + /* XXX: netmap, not the driver, should do this. */ + kring->rhead = kring->rcur = kring->nr_hwcur = 0; + kring->rtail = kring->nr_hwtail = 0; } + netmap_krings_mode_commit(na, 0); + if (nactive == 0) + nm_clear_native_flags(na); return (rc); } From owner-svn-src-all@freebsd.org Mon Oct 5 18:46:14 2020 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 A639642CB60; Mon, 5 Oct 2020 18:46:14 +0000 (UTC) (envelope-from trasz@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4qLZ3z10z4LSR; Mon, 5 Oct 2020 18:46:14 +0000 (UTC) (envelope-from trasz@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 6C9931A034; Mon, 5 Oct 2020 18:46:14 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095IkE9O017717; Mon, 5 Oct 2020 18:46:14 GMT (envelope-from trasz@FreeBSD.org) Received: (from trasz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095IkEqo017716; Mon, 5 Oct 2020 18:46:14 GMT (envelope-from trasz@FreeBSD.org) Message-Id: <202010051846.095IkEqo017716@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: trasz set sender to trasz@FreeBSD.org using -f From: Edward Tomasz Napierala Date: Mon, 5 Oct 2020 18:46:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366456 - head/sys/arm64/arm64 X-SVN-Group: head X-SVN-Commit-Author: trasz X-SVN-Commit-Paths: head/sys/arm64/arm64 X-SVN-Commit-Revision: 366456 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.33 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, 05 Oct 2020 18:46:14 -0000 Author: trasz Date: Mon Oct 5 18:46:14 2020 New Revision: 366456 URL: https://svnweb.freebsd.org/changeset/base/366456 Log: Tweak arm64's cpu_fetch_syscall_args(). This should make it possible for the compiler to inline the memcpy(). Reviewed by: andrew Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D26629 Modified: head/sys/arm64/arm64/trap.c Modified: head/sys/arm64/arm64/trap.c ============================================================================== --- head/sys/arm64/arm64/trap.c Mon Oct 5 18:45:32 2020 (r366455) +++ head/sys/arm64/arm64/trap.c Mon Oct 5 18:46:14 2020 (r366456) @@ -123,30 +123,31 @@ int cpu_fetch_syscall_args(struct thread *td) { struct proc *p; - register_t *ap; + register_t *ap, *dst_ap; struct syscall_args *sa; - int nap; - nap = MAXARGS; p = td->td_proc; - ap = td->td_frame->tf_x; sa = &td->td_sa; + ap = td->td_frame->tf_x; + dst_ap = &sa->args[0]; sa->code = td->td_frame->tf_x[8]; - if (sa->code == SYS_syscall || sa->code == SYS___syscall) { + if (__predict_false(sa->code == SYS_syscall || sa->code == SYS___syscall)) { sa->code = *ap++; - nap--; + } else { + *dst_ap++ = *ap++; } - if (sa->code >= p->p_sysent->sv_size) + if (__predict_false(sa->code >= p->p_sysent->sv_size)) sa->callp = &p->p_sysent->sv_table[0]; else sa->callp = &p->p_sysent->sv_table[sa->code]; - memcpy(sa->args, ap, nap * sizeof(register_t)); - if (sa->callp->sy_narg > nap) - panic("ARM64TODO: Could we have more than %d args?", MAXARGS); + KASSERT(sa->callp->sy_narg <= nitems(sa->args), + ("Syscall %d takes too many arguments", sa->code)); + + memcpy(dst_ap, ap, (MAXARGS - 1) * sizeof(register_t)); td->td_retval[0] = 0; td->td_retval[1] = 0; From owner-svn-src-all@freebsd.org Mon Oct 5 18:47:12 2020 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 B199E42D020; Mon, 5 Oct 2020 18:47:12 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4qMh4HCtz4Lf1; Mon, 5 Oct 2020 18:47:12 +0000 (UTC) (envelope-from np@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 754E019EE6; Mon, 5 Oct 2020 18:47:12 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095IlC5l017851; Mon, 5 Oct 2020 18:47:12 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095IlCRR017850; Mon, 5 Oct 2020 18:47:12 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010051847.095IlCRR017850@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 18:47:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366457 - stable/12/sys/dev/cxgbe X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: stable/12/sys/dev/cxgbe X-SVN-Commit-Revision: 366457 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.33 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, 05 Oct 2020 18:47:12 -0000 Author: np Date: Mon Oct 5 18:47:12 2020 New Revision: 366457 URL: https://svnweb.freebsd.org/changeset/base/366457 Log: MFC r366244: cxgbe(4): display an error message when netmap cannot be enabled because the interface is down. Sponsored by: Chelsio Communications Modified: stable/12/sys/dev/cxgbe/t4_netmap.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/dev/cxgbe/t4_netmap.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:46:14 2020 (r366456) +++ stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:47:12 2020 (r366457) @@ -536,8 +536,11 @@ cxgbe_netmap_on(struct adapter *sc, struct vi_info *vi MPASS(vi->nnmtxq > 0); if ((vi->flags & VI_INIT_DONE) == 0 || - (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + if_printf(ifp, "cannot enable netmap operation because " + "interface is not UP.\n"); return (EAGAIN); + } rxb = &sc->sge.rx_buf_info[0]; for (i = 0; i < SW_ZONE_SIZES; i++, rxb++) { From owner-svn-src-all@freebsd.org Mon Oct 5 18:49:55 2020 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 EAC9042CD6D; Mon, 5 Oct 2020 18:49:55 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4qQq5wxqz4LvF; Mon, 5 Oct 2020 18:49:55 +0000 (UTC) (envelope-from np@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 AEF6C1A037; Mon, 5 Oct 2020 18:49:55 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095Intld018112; Mon, 5 Oct 2020 18:49:55 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095IntW9018109; Mon, 5 Oct 2020 18:49:55 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010051849.095IntW9018109@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 18:49:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366458 - stable/12/sys/dev/cxgbe X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: stable/12/sys/dev/cxgbe X-SVN-Commit-Revision: 366458 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.33 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, 05 Oct 2020 18:49:56 -0000 Author: np Date: Mon Oct 5 18:49:55 2020 New Revision: 366458 URL: https://svnweb.freebsd.org/changeset/base/366458 Log: MFC r366245: cxgbe(4): adjust the doorbell threshold for netmap freelists to match the maximum burst size used when fetching descriptors from the list. Sponsored by: Chelsio Communications Modified: stable/12/sys/dev/cxgbe/adapter.h stable/12/sys/dev/cxgbe/t4_netmap.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/dev/cxgbe/adapter.h ============================================================================== --- stable/12/sys/dev/cxgbe/adapter.h Mon Oct 5 18:47:12 2020 (r366457) +++ stable/12/sys/dev/cxgbe/adapter.h Mon Oct 5 18:49:55 2020 (r366458) @@ -716,6 +716,7 @@ struct sge_nm_rxq { uint32_t fl_sidx2; /* copy of fl_sidx */ uint32_t fl_db_val; u_int fl_db_saved; + u_int fl_db_threshold; /* in descriptors */ u_int fl_hwidx:4; /* Modified: stable/12/sys/dev/cxgbe/t4_netmap.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:47:12 2020 (r366457) +++ stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:49:55 2020 (r366458) @@ -196,6 +196,9 @@ alloc_nm_rxq_hwq(struct vi_info *vi, struct sge_nm_rxq nm_rxq->fl_cntxt_id = be16toh(c.fl0id); nm_rxq->fl_pidx = nm_rxq->fl_cidx = 0; + nm_rxq->fl_db_saved = 0; + /* matches the X_FETCHBURSTMAX_512B or X_FETCHBURSTMAX_256B above. */ + nm_rxq->fl_db_threshold = chip_id(sc) <= CHELSIO_T5 ? 8 : 4; MPASS(nm_rxq->fl_sidx == na->num_rx_desc); cntxt_id = nm_rxq->fl_cntxt_id - sc->sge.eq_start; if (cntxt_id >= sc->sge.neq) { @@ -1063,7 +1066,7 @@ cxgbe_netmap_rxsync(struct netmap_kring *kring, int fl fl_pidx = 0; slot = &ring->slot[0]; } - if (++dbinc == 8 && n >= 32) { + if (++dbinc == nm_rxq->fl_db_threshold) { wmb(); if (starve_fl) nm_rxq->fl_db_saved += dbinc; From owner-svn-src-all@freebsd.org Mon Oct 5 18:57:39 2020 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 8FFE042CE5D for ; Mon, 5 Oct 2020 18:57:39 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: from mail-qv1-xf44.google.com (mail-qv1-xf44.google.com [IPv6:2607:f8b0:4864:20::f44]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4qbk60TQz4MFP for ; Mon, 5 Oct 2020 18:57:38 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: by mail-qv1-xf44.google.com with SMTP id z18so6538439qvp.6 for ; Mon, 05 Oct 2020 11:57:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=JGg8r7lZ8V62j/xVQicFyv/B4AuhWwGhb2kFocJgrYo=; b=yn+l+Rm9/PgsKCKMB4gX6EMn86nCS++kOtv52okKQ+j/Nzi8zWlJorNKfCOGMax6lD A3GHItQNiMevY3JlRqHmlxrFeS8QmWVh0eIEmsl64FBiBBepOUnS86R1hBTS++UZ4XDP se5Bxo7emTJdt6TZqLwARhoWB/ZkWMiHLcXpWAxLynYx2zYcpR68rDZ8KJ4zL5mGExfD ZalHcd4NbnqpW2owx0qGhCAjM+EW+3hTG5IZuIEqkarH3smFBjcfwBBNDpvhaDykwe7N tNoNfUqn1sadgC9XvO93OLjZ+hl7KQjXU9w1AeoAFpFq6TJo5sgqe6ERIKf6oR6RhXP4 7YCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=JGg8r7lZ8V62j/xVQicFyv/B4AuhWwGhb2kFocJgrYo=; b=BjfejFKzUf2KCg3vBIp+vY0TUMg6GirOevjxYQrezgf7xiyNiokZnY86rHGLg0v4l4 TqlH/OYSoybpKUMuzEJYU+n8Y0is9STbcqPhC8Q6pPXErmZHsDnwFt3yCuzg5rsT14IG 8dhumAHdoB5xuLnktJ7CiQhGaMn/V8jFoxVyki1aGz8w8I48XrEznRyE7mrzMTStAY8K Edhc8+Fsiu7utWfSGfSu9h5FhKPgWiSCvjLNksIhS4b/C2CrRtfLFuGLNH9YMTK/Uc+b o1nUxERS7EcZo++0lhETaRpttJ0lZNX0HmRdGsDS25Bi1eS+tYHAb1QlfwxrZN2G0OGJ UCBQ== X-Gm-Message-State: AOAM5333ZpNoViQpE3Q77CGBtNiPvwlyYf1jNSFfT1PPukZx+yOalweC 9tQZGzlWkRed1vJynIwvNlU/f44uUZPCTFIZqsOjKg== X-Google-Smtp-Source: ABdhPJzEHnzZRNTVK9f3XSzSQz2TioF3diWDCY+1FWcslj8Be+X2yRz3sq3KNRWl+3/vEQgR+FuAdaPqhVS432xdwS8= X-Received: by 2002:a05:6214:174f:: with SMTP id dc15mr1054554qvb.26.1601924258029; Mon, 05 Oct 2020 11:57:38 -0700 (PDT) MIME-Version: 1.0 References: <202010041717.094HHH9d069578@repo.freebsd.org> <476286772.120.1601898374873@localhost> In-Reply-To: <476286772.120.1601898374873@localhost> From: Warner Losh Date: Mon, 5 Oct 2020 12:57:26 -0600 Message-ID: Subject: Re: svn commit: r366431 - head/sys/dev/usb/serial To: Ronald Klop Cc: Hans Petter Selasky , svn-src-all , svn-src-head , src-committers X-Rspamd-Queue-Id: 4C4qbk60TQz4MFP X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=bsdimp-com.20150623.gappssmtp.com header.s=20150623 header.b=yn+l+Rm9; dmarc=none; spf=none (mx1.freebsd.org: domain of wlosh@bsdimp.com has no SPF policy when checking 2607:f8b0:4864:20::f44) smtp.mailfrom=wlosh@bsdimp.com X-Spamd-Result: default: False [-2.02 / 15.00]; RCVD_TLS_ALL(0.00)[]; ARC_NA(0.00)[]; R_DKIM_ALLOW(-0.20)[bsdimp-com.20150623.gappssmtp.com:s=20150623]; NEURAL_HAM_MEDIUM(-0.94)[-0.940]; FROM_HAS_DN(0.00)[]; NEURAL_HAM_LONG(-0.90)[-0.898]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; PREVIOUSLY_DELIVERED(0.00)[svn-src-all@freebsd.org]; DMARC_NA(0.00)[bsdimp.com]; RCPT_COUNT_FIVE(0.00)[5]; TO_MATCH_ENVRCPT_SOME(0.00)[]; TO_DN_ALL(0.00)[]; DKIM_TRACE(0.00)[bsdimp-com.20150623.gappssmtp.com:+]; NEURAL_HAM_SHORT(-0.19)[-0.187]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::f44:from]; R_SPF_NA(0.00)[no SPF record]; FORGED_SENDER(0.30)[imp@bsdimp.com,wlosh@bsdimp.com]; MIME_TRACE(0.00)[0:+,1:+,2:~]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; FROM_NEQ_ENVFROM(0.00)[imp@bsdimp.com,wlosh@bsdimp.com]; MAILMAN_DEST(0.00)[svn-src-all]; RCVD_COUNT_TWO(0.00)[2] Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.33 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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, 05 Oct 2020 18:57:39 -0000 On Mon, Oct 5, 2020 at 5:46 AM Ronald Klop wrote: > Hi, > > I was interested by this commit. But the commit and commit message don't > have much information. I was surprised that the "Differential Revision" > link contains a lot of info about this. How permanent is this > review.freebsd.org server? Wil it stay after the git migration? > Yes. It's anticipated that we'll keep it around forever. Warner > Ronald. > > > *Van:* Hans Petter Selasky > *Datum:* zondag, 4 oktober 2020 19:17 > *Aan:* src-committers@freebsd.org, svn-src-all@freebsd.org, > svn-src-head@freebsd.org > *Onderwerp:* svn commit: r366431 - head/sys/dev/usb/serial > > Author: hselasky > Date: Sun Oct 4 17:17:16 2020 > New Revision: 366431 > URL: https://svnweb.freebsd.org/changeset/base/366431 > > Log: > Add support for Google Cr50 (GSC) Closed Case Debugging UART interfaces > to > the USB generic serial port driver, ugensa. > > MFC after: 1 week > Differential Revision: https://reviews.freebsd.org/D21863 > Submitted by: greg_unrelenting.technology (Greg V) > Sponsored by: Mellanox Technologies // NVIDIA Networking > > Modified: > head/sys/dev/usb/serial/ugensa.c > > Modified: head/sys/dev/usb/serial/ugensa.c > > ============================================================================== > --- head/sys/dev/usb/serial/ugensa.c Sun Oct 4 17:07:13 2020 > (r366430) > +++ head/sys/dev/usb/serial/ugensa.c Sun Oct 4 17:17:16 2020 > (r366431) > @@ -161,6 +161,8 @@ static const STRUCT_USB_HOST_ID ugensa_devs[] = { > {USB_VPI(USB_VENDOR_KYOCERA2, USB_PRODUCT_KYOCERA2_CDMA_MSM_K, 1)}, > {USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_49GPLUS, 1)}, > {USB_VPI(USB_VENDOR_NOVATEL2, USB_PRODUCT_NOVATEL2_FLEXPACKGPS, 3)}, > + {USB_VENDOR(USB_VENDOR_GOOGLE), USB_IFACE_CLASS(UICLASS_VENDOR), > + USB_IFACE_SUBCLASS(0x50), USB_IFACE_PROTOCOL(0x01), > USB_DRIVER_INFO(10)}, > }; > > DRIVER_MODULE(ugensa, uhub, ugensa_driver, ugensa_devclass, NULL, 0); > _______________________________________________ > svn-src-all@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/svn-src-all > To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" > ------------------------------ > > From owner-svn-src-all@freebsd.org Mon Oct 5 18:59:11 2020 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 4F1F842D0E8; Mon, 5 Oct 2020 18:59:11 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4qdW1Rxtz4MWL; Mon, 5 Oct 2020 18:59:11 +0000 (UTC) (envelope-from np@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 107441A602; Mon, 5 Oct 2020 18:59:11 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095IxAC4024059; Mon, 5 Oct 2020 18:59:10 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095IxAbo024058; Mon, 5 Oct 2020 18:59:10 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010051859.095IxAbo024058@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 18:59:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366459 - stable/12/sys/dev/cxgbe X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: stable/12/sys/dev/cxgbe X-SVN-Commit-Revision: 366459 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.33 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, 05 Oct 2020 18:59:11 -0000 Author: np Date: Mon Oct 5 18:59:10 2020 New Revision: 366459 URL: https://svnweb.freebsd.org/changeset/base/366459 Log: MFC r366246: Remove duplicate line. Modified: stable/12/sys/dev/cxgbe/t4_netmap.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/dev/cxgbe/t4_netmap.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:49:55 2020 (r366458) +++ stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:59:10 2020 (r366459) @@ -216,9 +216,6 @@ alloc_nm_rxq_hwq(struct vi_info *vi, struct sge_nm_rxq param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) | V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_CONM_CTXT) | V_FW_PARAMS_PARAM_YZ(nm_rxq->iq_cntxt_id); - param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) | - V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_CONM_CTXT) | - V_FW_PARAMS_PARAM_YZ(nm_rxq->iq_cntxt_id); if (cong == 0) val = 1 << 19; else { From owner-svn-src-all@freebsd.org Mon Oct 5 19:22:28 2020 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 D4E9042DC2F; Mon, 5 Oct 2020 19:22:28 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4r8N5JyHz4PB6; Mon, 5 Oct 2020 19:22:28 +0000 (UTC) (envelope-from np@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 99E561A8AA; Mon, 5 Oct 2020 19:22:28 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095JMSNh040278; Mon, 5 Oct 2020 19:22:28 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095JMSFn040277; Mon, 5 Oct 2020 19:22:28 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010051922.095JMSFn040277@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 19:22:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366460 - stable/12/sys/dev/cxgbe X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: stable/12/sys/dev/cxgbe X-SVN-Commit-Revision: 366460 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.33 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, 05 Oct 2020 19:22:28 -0000 Author: np Date: Mon Oct 5 19:22:28 2020 New Revision: 366460 URL: https://svnweb.freebsd.org/changeset/base/366460 Log: MFC r366247: cxgbe(4): Avoid unnecessary work in the firmware during netmap tx. Bind the netmap tx queues to a special '0xff' scheduling class which makes the firmware skip some processing related to rate limiting on the outgoing traffic. Future firmwares will do this automatically. Sponsored by: Chelsio Communications Modified: stable/12/sys/dev/cxgbe/t4_netmap.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/dev/cxgbe/t4_netmap.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 18:59:10 2020 (r366459) +++ stable/12/sys/dev/cxgbe/t4_netmap.c Mon Oct 5 19:22:28 2020 (r366460) @@ -329,6 +329,22 @@ alloc_nm_txq_hwq(struct vi_info *vi, struct sge_nm_txq nm_txq->udb = (volatile void *)udb; } + if (sc->params.fw_vers < FW_VERSION32(1, 25, 1, 0)) { + uint32_t param, val; + + param = V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DMAQ) | + V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DMAQ_EQ_SCHEDCLASS_ETH) | + V_FW_PARAMS_PARAM_YZ(nm_txq->cntxt_id); + val = 0xff; + rc = -t4_set_params(sc, sc->mbox, sc->pf, 0, 1, ¶m, &val); + if (rc != 0) { + device_printf(vi->dev, + "failed to bind netmap txq %d to class 0xff: %d\n", + nm_txq->cntxt_id, rc); + rc = 0; + } + } + return (rc); } From owner-svn-src-all@freebsd.org Mon Oct 5 19:26:55 2020 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 4016E42DC64; Mon, 5 Oct 2020 19:26:55 +0000 (UTC) (envelope-from kp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4rFW0ym4z4PN6; Mon, 5 Oct 2020 19:26:55 +0000 (UTC) (envelope-from kp@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 049521A7F4; Mon, 5 Oct 2020 19:26:55 +0000 (UTC) (envelope-from kp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095JQs1U042934; Mon, 5 Oct 2020 19:26:54 GMT (envelope-from kp@FreeBSD.org) Received: (from kp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095JQsIP042933; Mon, 5 Oct 2020 19:26:54 GMT (envelope-from kp@FreeBSD.org) Message-Id: <202010051926.095JQsIP042933@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kp set sender to kp@FreeBSD.org using -f From: Kristof Provost Date: Mon, 5 Oct 2020 19:26:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366461 - head/sbin/devfs X-SVN-Group: head X-SVN-Commit-Author: kp X-SVN-Commit-Paths: head/sbin/devfs X-SVN-Commit-Revision: 366461 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.33 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, 05 Oct 2020 19:26:55 -0000 Author: kp Date: Mon Oct 5 19:26:54 2020 New Revision: 366461 URL: https://svnweb.freebsd.org/changeset/base/366461 Log: devfs.rules: unhide pf in vnet jails /dev/pf is usable in vnet jails, so don't hide the node there. We shouldn't expose /dev/pf in regular jails, as that gives them control over the host (or parent vnet jail) firewall. Reviewed by: bz Differential Revision: https://reviews.freebsd.org/D26537 Modified: head/sbin/devfs/devfs.rules Modified: head/sbin/devfs/devfs.rules ============================================================================== --- head/sbin/devfs/devfs.rules Mon Oct 5 19:22:28 2020 (r366460) +++ head/sbin/devfs/devfs.rules Mon Oct 5 19:26:54 2020 (r366461) @@ -86,3 +86,7 @@ add include $devfsrules_unhide_basic add include $devfsrules_unhide_login add path fuse unhide add path zfs unhide + +[devfsrules_jail_vnet=5] +add include $devfsrules_jail +add path pf unhide From owner-svn-src-all@freebsd.org Mon Oct 5 19:35:56 2020 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 058AB42E281; Mon, 5 Oct 2020 19:35:56 +0000 (UTC) (envelope-from mjguzik@gmail.com) Received: from mail-wm1-x341.google.com (mail-wm1-x341.google.com [IPv6:2a00:1450:4864:20::341]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4rRt6rrxz4PtY; Mon, 5 Oct 2020 19:35:54 +0000 (UTC) (envelope-from mjguzik@gmail.com) Received: by mail-wm1-x341.google.com with SMTP id e2so710780wme.1; Mon, 05 Oct 2020 12:35:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=TR3xq2GtggHSdOO4TnUu85QEXUnEasNf3WMFvNpQBLM=; b=q6S/R1jcaR4KcHTLP8OfTqGd4UeZLF8C9z4cwWY6YUnrxhR3nOCOqIRRDvosalqkvk 1lZg1uwlen3On9UbK5jHBc/7hnOeiJ1vRu9rBa3A0k7zygvIn/MS0pzuaK/JB1jhDdTR 38npj1M8sEVUwC/dKpR+MGJewNqhmP8kUaogVVoiSJjNiKNCRVihVsDtXjyDPuZBbaBj +q0uzLh7c2lWVQq5YFSTohJld5ul2uFBuMnZZi5lc7BFbNTfQO3HHiiyaqKiZiSbPUpB AGuwGK+cHRCTikCZzXd+8Cv0wk8BKqv78KDvjdzI/D+Dj3VIrQg4/WgkbwXU8j7RqK4r c/eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=TR3xq2GtggHSdOO4TnUu85QEXUnEasNf3WMFvNpQBLM=; b=FpLZJ/ThpKLuD5Ff2R13IAmUnOIgsRbONOHcwoS/K0dxFlHDLCX+lcamIUALfQFZu9 bcW0ArokIhVlqEBcRVImjCWvOsS8uBKANwW+OHGb7AYVx7UkAOoNnj5K/8l/pN2CrbeJ DrYLnXZNNfPJDSoV91OekuxFxuBMn3zSasCCN+YN08fcWYHFXHQz79S3yU3zqua3dsqk PqsF5Mcay4L6lytnodqRu9e8hAMg1icN2UKlxF/LbDbXJYY0pPFIN45BGW4EcTSfHvGp 4JIwT8MxymwOjEiWfwiYEiTMk2JTnXSJWMQ2nTOvVA3yLK3TXtvCZdFgtbgCqe74PqBg Zf+w== X-Gm-Message-State: AOAM531ky+6JsUgwgj4sKaIM8AkZ+ptfzfRHIfKtHsz0XNJoZgmzmth9 ITvShiIE9MOAtDJIfBvHYsRYK/6Zs8mdwK+0rRk= X-Google-Smtp-Source: ABdhPJy1ra/8/1a0sPEC61i8Iqc53A87YWyflo5IFKho+BLQ1nPLf3CqvkrIbd2MTdQrdMxfYkMpIJYI5t83azxCPq4= X-Received: by 2002:a1c:98d4:: with SMTP id a203mr963282wme.83.1601926552727; Mon, 05 Oct 2020 12:35:52 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a05:6000:187:0:0:0:0 with HTTP; Mon, 5 Oct 2020 12:35:51 -0700 (PDT) In-Reply-To: <20201005011833.GI2643@kib.kiev.ua> References: <202010041633.094GXg4l044462@repo.freebsd.org> <20201005011833.GI2643@kib.kiev.ua> From: Mateusz Guzik Date: Mon, 5 Oct 2020 21:35:51 +0200 Message-ID: Subject: Re: svn commit: r366429 - in head/sys: kern sys To: Konstantin Belousov Cc: Rick Macklem , "src-committers@freebsd.org" , "svn-src-all@freebsd.org" , "svn-src-head@freebsd.org" Content-Type: text/plain; charset="UTF-8" X-Rspamd-Queue-Id: 4C4rRt6rrxz4PtY X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=q6S/R1jc; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (mx1.freebsd.org: domain of mjguzik@gmail.com designates 2a00:1450:4864:20::341 as permitted sender) smtp.mailfrom=mjguzik@gmail.com X-Spamd-Result: default: False [-2.55 / 15.00]; TO_DN_EQ_ADDR_SOME(0.00)[]; ARC_NA(0.00)[]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20161025]; RCVD_TLS_ALL(0.00)[]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; FREEMAIL_FROM(0.00)[gmail.com]; R_SPF_ALLOW(-0.20)[+ip6:2a00:1450:4000::/36]; MIME_GOOD(-0.10)[text/plain]; NEURAL_SPAM_SHORT(0.46)[0.464]; NEURAL_HAM_LONG(-1.02)[-1.016]; RCPT_COUNT_FIVE(0.00)[5]; TO_MATCH_ENVRCPT_SOME(0.00)[]; DKIM_TRACE(0.00)[gmail.com:+]; DMARC_POLICY_ALLOW(-0.50)[gmail.com,none]; RCVD_IN_DNSWL_NONE(0.00)[2a00:1450:4864:20::341:from]; NEURAL_HAM_MEDIUM(-1.00)[-1.000]; FREEMAIL_TO(0.00)[gmail.com]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; FREEMAIL_ENVFROM(0.00)[gmail.com]; ASN(0.00)[asn:15169, ipnet:2a00:1450::/32, country:US]; RCVD_COUNT_TWO(0.00)[2]; MAILMAN_DEST(0.00)[svn-src-all,svn-src-head]; DWL_DNSWL_NONE(0.00)[gmail.com:dkim] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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, 05 Oct 2020 19:35:56 -0000 On 10/5/20, Konstantin Belousov wrote: > On Sun, Oct 04, 2020 at 09:06:02PM +0000, Rick Macklem wrote: >> Mateusz Guzik wrote: >> >Why is the process lock always taken? It looks like both routines just >> >check a thread-local flag, so perhaps this can get away without >> >serializing this process-wide? >> I did spot this slight difference between the initial version of >> sig_intr() and >> this one. At least w.r.t. copy_file_range(2), the call happens >> infrequently >> enough that the overhead of acquiring the lock is not significant. >> > Yes, the function should not be on any frequent path. > > That said, all signal delivery to process is covered by the process lock, > so checks under process lock make the advisory answer provide less false > negatives. If considered too importand in some cases (when ?), the > following > patch can be applied. > > diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c > index 8108d4cb3a5..ed4dd52b66d 100644 > --- a/sys/kern/kern_sig.c > +++ b/sys/kern/kern_sig.c > @@ -3212,6 +3212,9 @@ sig_intr(void) > int ret; > > td = curthread; > + if ((td->td_flags & (TDF_NEEDSIGCHK | TDF_NEEDSUSPCHK)) == 0) > + return (0); > + > p = td->td_proc; > > PROC_LOCK(p); > I presume copy_file_range will not be the only consumer going forward. The default for all new code should be to avoid locks or other atomics if it can be helped, otherwise it's just never ending whack-a-mole and this is bound to become a bottleneck at some point. So happens process lock is already quite contended (e.g., when running poudriere) and adding to it is the wrong way to go. -- Mateusz Guzik From owner-svn-src-all@freebsd.org Mon Oct 5 19:38:52 2020 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 6C97942E508; Mon, 5 Oct 2020 19:38:52 +0000 (UTC) (envelope-from mjg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4rWJ2Kc8z4Q2h; Mon, 5 Oct 2020 19:38:52 +0000 (UTC) (envelope-from mjg@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 1925F1AA2B; Mon, 5 Oct 2020 19:38:52 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095Jcp4W049333; Mon, 5 Oct 2020 19:38:51 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095Jcp7v049331; Mon, 5 Oct 2020 19:38:51 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010051938.095Jcp7v049331@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Mon, 5 Oct 2020 19:38:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366462 - in head/sys: kern sys X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: in head/sys: kern sys X-SVN-Commit-Revision: 366462 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.33 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, 05 Oct 2020 19:38:52 -0000 Author: mjg Date: Mon Oct 5 19:38:51 2020 New Revision: 366462 URL: https://svnweb.freebsd.org/changeset/base/366462 Log: cache: fix pwd use-after-free in setting up fallback Since the code exits smr section prior to calling pwd_hold, the used pwd can be freed and a new one allocated with the same address, making the comparison erroneously true. Note it is very unlikely anyone ran into it. Modified: head/sys/kern/kern_descrip.c head/sys/kern/vfs_cache.c head/sys/sys/filedesc.h Modified: head/sys/kern/kern_descrip.c ============================================================================== --- head/sys/kern/kern_descrip.c Mon Oct 5 19:26:54 2020 (r366461) +++ head/sys/kern/kern_descrip.c Mon Oct 5 19:38:51 2020 (r366462) @@ -3344,6 +3344,17 @@ pwd_hold_filedesc(struct filedesc *fdp) return (pwd); } +bool +pwd_hold_smr(struct pwd *pwd) +{ + + MPASS(pwd != NULL); + if (__predict_true(refcount_acquire_if_not_zero(&pwd->pwd_refcount))) { + return (true); + } + return (false); +} + struct pwd * pwd_hold(struct thread *td) { @@ -3354,8 +3365,7 @@ pwd_hold(struct thread *td) vfs_smr_enter(); pwd = vfs_smr_entered_load(&fdp->fd_pwd); - MPASS(pwd != NULL); - if (__predict_true(refcount_acquire_if_not_zero(&pwd->pwd_refcount))) { + if (pwd_hold_smr(pwd)) { vfs_smr_exit(); return (pwd); } Modified: head/sys/kern/vfs_cache.c ============================================================================== --- head/sys/kern/vfs_cache.c Mon Oct 5 19:26:54 2020 (r366461) +++ head/sys/kern/vfs_cache.c Mon Oct 5 19:38:51 2020 (r366462) @@ -3484,25 +3484,24 @@ cache_fplookup_partial_setup(struct cache_fpl *fpl) ndp = fpl->ndp; cnp = fpl->cnp; + pwd = fpl->pwd; dvp = fpl->dvp; dvp_seqc = fpl->dvp_seqc; - dvs = vget_prep_smr(dvp); - if (__predict_false(dvs == VGET_NONE)) { + if (!pwd_hold_smr(pwd)) { cache_fpl_smr_exit(fpl); return (cache_fpl_aborted(fpl)); } + dvs = vget_prep_smr(dvp); cache_fpl_smr_exit(fpl); - - vget_finish_ref(dvp, dvs); - if (!vn_seqc_consistent(dvp, dvp_seqc)) { - vrele(dvp); + if (__predict_false(dvs == VGET_NONE)) { + pwd_drop(pwd); return (cache_fpl_aborted(fpl)); } - pwd = pwd_hold(curthread); - if (fpl->pwd != pwd) { + vget_finish_ref(dvp, dvs); + if (!vn_seqc_consistent(dvp, dvp_seqc)) { vrele(dvp); pwd_drop(pwd); return (cache_fpl_aborted(fpl)); Modified: head/sys/sys/filedesc.h ============================================================================== --- head/sys/sys/filedesc.h Mon Oct 5 19:26:54 2020 (r366461) +++ head/sys/sys/filedesc.h Mon Oct 5 19:38:51 2020 (r366462) @@ -302,6 +302,7 @@ void pwd_ensure_dirs(void); void pwd_set_rootvnode(void); struct pwd *pwd_hold_filedesc(struct filedesc *fdp); +bool pwd_hold_smr(struct pwd *pwd); struct pwd *pwd_hold(struct thread *td); void pwd_drop(struct pwd *pwd); static inline void From owner-svn-src-all@freebsd.org Mon Oct 5 19:45:12 2020 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 4049042E34C; Mon, 5 Oct 2020 19:45:12 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4rfc0m31z4QTM; Mon, 5 Oct 2020 19:45:12 +0000 (UTC) (envelope-from np@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 ECBF11ABDE; Mon, 5 Oct 2020 19:45:11 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095JjB3c055527; Mon, 5 Oct 2020 19:45:11 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095JjBTh055526; Mon, 5 Oct 2020 19:45:11 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010051945.095JjBTh055526@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 19:45:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366463 - stable/12/sys/dev/cxgbe X-SVN-Group: stable-12 X-SVN-Commit-Author: np X-SVN-Commit-Paths: stable/12/sys/dev/cxgbe X-SVN-Commit-Revision: 366463 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.33 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, 05 Oct 2020 19:45:12 -0000 Author: np Date: Mon Oct 5 19:45:11 2020 New Revision: 366463 URL: https://svnweb.freebsd.org/changeset/base/366463 Log: MFC r366354: cxgbe(4): validate largest_rx_cluster and safest_rx_cluster. These tunables can only be set to a valid cluster size (2K, 4K, 9K, or 16K) as documented in the man page. Anything else could lead to a panic on interface up. Reported by: mav@ Sponsored by: Chelsio Communications Modified: stable/12/sys/dev/cxgbe/t4_sge.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/dev/cxgbe/t4_sge.c ============================================================================== --- stable/12/sys/dev/cxgbe/t4_sge.c Mon Oct 5 19:38:51 2020 (r366462) +++ stable/12/sys/dev/cxgbe/t4_sge.c Mon Oct 5 19:45:11 2020 (r366463) @@ -538,6 +538,28 @@ t4_sge_modload(void) tscale = 1; } + if (largest_rx_cluster != MCLBYTES && +#if MJUMPAGESIZE != MCLBYTES + largest_rx_cluster != MJUMPAGESIZE && +#endif + largest_rx_cluster != MJUM9BYTES && + largest_rx_cluster != MJUM16BYTES) { + printf("Invalid hw.cxgbe.largest_rx_cluster value (%d)," + " using %d instead.\n", largest_rx_cluster, MJUM16BYTES); + largest_rx_cluster = MJUM16BYTES; + } + + if (safest_rx_cluster != MCLBYTES && +#if MJUMPAGESIZE != MCLBYTES + safest_rx_cluster != MJUMPAGESIZE && +#endif + safest_rx_cluster != MJUM9BYTES && + safest_rx_cluster != MJUM16BYTES) { + printf("Invalid hw.cxgbe.safest_rx_cluster value (%d)," + " using %d instead.\n", safest_rx_cluster, MJUMPAGESIZE); + safest_rx_cluster = MJUMPAGESIZE; + } + extfree_refs = counter_u64_alloc(M_WAITOK); extfree_rels = counter_u64_alloc(M_WAITOK); pullups = counter_u64_alloc(M_WAITOK); From owner-svn-src-all@freebsd.org Mon Oct 5 19:58:56 2020 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 866E142E5EE; Mon, 5 Oct 2020 19:58:56 +0000 (UTC) (envelope-from markj@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4ryS2x86z4RJ0; Mon, 5 Oct 2020 19:58:56 +0000 (UTC) (envelope-from markj@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 43EDB1B20E; Mon, 5 Oct 2020 19:58:56 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095JwuDJ061855; Mon, 5 Oct 2020 19:58:56 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095Jwtwr061852; Mon, 5 Oct 2020 19:58:55 GMT (envelope-from markj@FreeBSD.org) Message-Id: <202010051958.095Jwtwr061852@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Mon, 5 Oct 2020 19:58:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366464 - in head/sys/dev: re rl X-SVN-Group: head X-SVN-Commit-Author: markj X-SVN-Commit-Paths: in head/sys/dev: re rl X-SVN-Commit-Revision: 366464 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.33 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, 05 Oct 2020 19:58:56 -0000 Author: markj Date: Mon Oct 5 19:58:55 2020 New Revision: 366464 URL: https://svnweb.freebsd.org/changeset/base/366464 Log: re(4): Add a 8168-compatible device ID This is described in RealTek's driver as a "RTL8168 Series add-on card." PR: 250037 Submitted by: Hiroshi HASEGAWA MFC after: 1 week Modified: head/sys/dev/re/if_re.c head/sys/dev/rl/if_rlreg.h Modified: head/sys/dev/re/if_re.c ============================================================================== --- head/sys/dev/re/if_re.c Mon Oct 5 19:45:11 2020 (r366463) +++ head/sys/dev/re/if_re.c Mon Oct 5 19:58:55 2020 (r366464) @@ -186,6 +186,8 @@ static const struct rl_type re_devs[] = { "RealTek 810xE PCIe 10/100baseTX" }, { RT_VENDORID, RT_DEVICEID_8168, 0, "RealTek 8168/8111 B/C/CP/D/DP/E/F/G PCIe Gigabit Ethernet" }, + { RT_VENDORID, RT_DEVICEID_8161, 0, + "RealTek 8168 Gigabit Ethernet" }, { NCUBE_VENDORID, RT_DEVICEID_8168, 0, "TP-Link TG-3468 v2 (RTL8168) Gigabit Ethernet" }, { RT_VENDORID, RT_DEVICEID_8169, 0, Modified: head/sys/dev/rl/if_rlreg.h ============================================================================== --- head/sys/dev/rl/if_rlreg.h Mon Oct 5 19:45:11 2020 (r366463) +++ head/sys/dev/rl/if_rlreg.h Mon Oct 5 19:58:55 2020 (r366464) @@ -999,6 +999,7 @@ struct rl_softc { #define RT_DEVICEID_8138 0x8138 #define RT_DEVICEID_8139 0x8139 #define RT_DEVICEID_8169SC 0x8167 +#define RT_DEVICEID_8161 0x8161 #define RT_DEVICEID_8168 0x8168 #define RT_DEVICEID_8169 0x8169 #define RT_DEVICEID_8100 0x8100 From owner-svn-src-all@freebsd.org Mon Oct 5 20:13:24 2020 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 344B342EE4F; Mon, 5 Oct 2020 20:13:24 +0000 (UTC) (envelope-from freqlabs@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4sH80StRz4S3b; Mon, 5 Oct 2020 20:13:24 +0000 (UTC) (envelope-from freqlabs@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 E75621B3C4; Mon, 5 Oct 2020 20:13:23 +0000 (UTC) (envelope-from freqlabs@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095KDNGL073904; Mon, 5 Oct 2020 20:13:23 GMT (envelope-from freqlabs@FreeBSD.org) Received: (from freqlabs@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095KDNHJ073900; Mon, 5 Oct 2020 20:13:23 GMT (envelope-from freqlabs@FreeBSD.org) Message-Id: <202010052013.095KDNHJ073900@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: freqlabs set sender to freqlabs@FreeBSD.org using -f From: Ryan Moeller Date: Mon, 5 Oct 2020 20:13:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366465 - in head: sbin/sysctl sys/kern sys/sys usr.bin/truss X-SVN-Group: head X-SVN-Commit-Author: freqlabs X-SVN-Commit-Paths: in head: sbin/sysctl sys/kern sys/sys usr.bin/truss X-SVN-Commit-Revision: 366465 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.33 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, 05 Oct 2020 20:13:24 -0000 Author: freqlabs Date: Mon Oct 5 20:13:22 2020 New Revision: 366465 URL: https://svnweb.freebsd.org/changeset/base/366465 Log: Enable iterating all sysctls, even ones with CTLFLAG_SKIP Add an "nextnoskip" sysctl that allows for listing of sysctls intended to be normally skipped for cost reasons. This makes it so the names/descriptions of those sysctls can be discovered with sysctl -aN/sysctl -ad/sysctl -at. It also makes it so children are visited when a node flagged with CTLFLAG_SKIP is explicitly requested. The intended use case is to mark the root "kstat" node with CTLFLAG_SKIP so that the extensive and expensive stats are skipped by default but may still be easily obtained without having to know them all (which may not even be possible) and request each one-by-one. Reviewed by: jhb MFC after: 2 weeks Relnotes: yes Sponsored by: iXsystems, Inc. Differential Revision: https://reviews.freebsd.org/D26560 Modified: head/sbin/sysctl/sysctl.c head/sys/kern/kern_sysctl.c head/sys/sys/sysctl.h head/usr.bin/truss/syscalls.c Modified: head/sbin/sysctl/sysctl.c ============================================================================== --- head/sbin/sysctl/sysctl.c Mon Oct 5 19:58:55 2020 (r366464) +++ head/sbin/sysctl/sysctl.c Mon Oct 5 20:13:22 2020 (r366465) @@ -81,7 +81,7 @@ static int Nflag, nflag, oflag, qflag, tflag, Tflag, W static int oidfmt(int *, int, char *, u_int *); static int parsefile(const char *); static int parse(const char *, int); -static int show_var(int *, int); +static int show_var(int *, int, bool); static int sysctl_all(int *oid, int len); static int name2oid(const char *, int *); @@ -428,13 +428,13 @@ parse(const char *string, int lineno) if (newvalstr == NULL || dflag) { if ((kind & CTLTYPE) == CTLTYPE_NODE) { if (dflag) { - i = show_var(mib, len); + i = show_var(mib, len, false); if (!i && !bflag) putchar('\n'); } sysctl_all(mib, len); } else { - i = show_var(mib, len); + i = show_var(mib, len, false); if (!i && !bflag) putchar('\n'); } @@ -504,7 +504,7 @@ parse(const char *string, int lineno) break; } - i = show_var(mib, len); + i = show_var(mib, len, false); if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { free(newbuf); if (!i && !bflag) @@ -532,7 +532,7 @@ parse(const char *string, int lineno) printf(" -> "); i = nflag; nflag = 1; - j = show_var(mib, len); + j = show_var(mib, len, false); if (!j && !bflag) putchar('\n'); nflag = i; @@ -942,7 +942,7 @@ oidfmt(int *oid, int len, char *fmt, u_int *kind) * Return minus one if we had errors. */ static int -show_var(int *oid, int nlen) +show_var(int *oid, int nlen, bool honor_skip) { u_char buf[BUFSIZ], *val, *oval, *p; char name[BUFSIZ], fmt[BUFSIZ]; @@ -976,11 +976,11 @@ show_var(int *oid, int nlen) oidfmt(oid, nlen, fmt, &kind); /* if Wflag then only list sysctls that are writeable and not stats. */ if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0)) - return 1; + return (1); /* if Tflag then only list sysctls that are tuneables. */ if (Tflag && (kind & CTLFLAG_TUN) == 0) - return 1; + return (1); if (Nflag) { printf("%s", name); @@ -1013,6 +1013,10 @@ show_var(int *oid, int nlen) return (0); } + /* bail before fetching the value if we're honoring skip */ + if (honor_skip && (kind & CTLFLAG_SKIP) != 0) + return (1); + /* don't fetch opaques that we don't know how to print */ if (ctltype == CTLTYPE_OPAQUE) { if (strcmp(fmt, "S,clockinfo") == 0) @@ -1195,15 +1199,17 @@ sysctl_all(int *oid, int len) int name1[22], name2[22]; int i, j; size_t l1, l2; + bool honor_skip = false; - name1[0] = 0; - name1[1] = 2; + name1[0] = CTL_SYSCTL; + name1[1] = (oid != NULL || Nflag || dflag || tflag) ? + CTL_SYSCTL_NEXTNOSKIP : CTL_SYSCTL_NEXT; l1 = 2; if (len) { - memcpy(name1+2, oid, len * sizeof(int)); + memcpy(name1 + 2, oid, len * sizeof(int)); l1 += len; } else { - name1[2] = 1; + name1[2] = CTL_KERN; l1++; } for (;;) { @@ -1225,11 +1231,12 @@ sysctl_all(int *oid, int len) if (name2[i] != oid[i]) return (0); - i = show_var(name2, l2); + i = show_var(name2, l2, honor_skip); if (!i && !bflag) putchar('\n'); - memcpy(name1+2, name2, l2 * sizeof(int)); + memcpy(name1 + 2, name2, l2 * sizeof(int)); l1 = 2 + l2; + honor_skip = true; } } Modified: head/sys/kern/kern_sysctl.c ============================================================================== --- head/sys/kern/kern_sysctl.c Mon Oct 5 19:58:55 2020 (r366464) +++ head/sys/kern/kern_sysctl.c Mon Oct 5 20:13:22 2020 (r366465) @@ -950,7 +950,8 @@ SYSINIT(sysctl, SI_SUB_KMEM, SI_ORDER_FIRST, sysctl_re * {CTL_SYSCTL, CTL_SYSCTL_DEBUG} printf the entire MIB-tree. * {CTL_SYSCTL, CTL_SYSCTL_NAME, ...} return the name of the "..." * OID. - * {CTL_SYSCTL, CTL_SYSCTL_NEXT, ...} return the next OID. + * {CTL_SYSCTL, CTL_SYSCTL_NEXT, ...} return the next OID, honoring + * CTLFLAG_SKIP. * {CTL_SYSCTL, CTL_SYSCTL_NAME2OID} return the OID of the name in * "new" * {CTL_SYSCTL, CTL_SYSCTL_OIDFMT, ...} return the kind & format info @@ -959,6 +960,8 @@ SYSINIT(sysctl, SI_SUB_KMEM, SI_ORDER_FIRST, sysctl_re * "..." OID. * {CTL_SYSCTL, CTL_SYSCTL_OIDLABEL, ...} return the aggregation label of * the "..." OID. + * {CTL_SYSCTL, CTL_SYSCTL_NEXTNOSKIP, ...} return the next OID, ignoring + * CTLFLAG_SKIP. */ #ifdef SYSCTL_DEBUG @@ -1099,7 +1102,7 @@ static SYSCTL_NODE(_sysctl, CTL_SYSCTL_NAME, name, CTL static int sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int *name, u_int namelen, - int *next, int *len, int level, struct sysctl_oid **oidpp) + int *next, int *len, int level, struct sysctl_oid **oidpp, bool honor_skip) { struct sysctl_oid *oidp; @@ -1109,9 +1112,12 @@ sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int *next = oidp->oid_number; *oidpp = oidp; - if ((oidp->oid_kind & (CTLFLAG_SKIP | CTLFLAG_DORMANT)) != 0) + if ((oidp->oid_kind & CTLFLAG_DORMANT) != 0) continue; + if (honor_skip && (oidp->oid_kind & CTLFLAG_SKIP) != 0) + continue; + if (!namelen) { if ((oidp->oid_kind & CTLTYPE) != CTLTYPE_NODE) return (0); @@ -1120,7 +1126,7 @@ sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int return (0); lsp = SYSCTL_CHILDREN(oidp); if (!sysctl_sysctl_next_ls(lsp, 0, 0, next+1, - len, level+1, oidpp)) + len, level+1, oidpp, honor_skip)) return (0); goto emptynode; } @@ -1135,7 +1141,7 @@ sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int return (0); lsp = SYSCTL_CHILDREN(oidp); if (!sysctl_sysctl_next_ls(lsp, name+1, namelen-1, - next+1, len, level+1, oidpp)) + next+1, len, level+1, oidpp, honor_skip)) return (0); goto next; } @@ -1147,14 +1153,14 @@ sysctl_sysctl_next_ls(struct sysctl_oid_list *lsp, int lsp = SYSCTL_CHILDREN(oidp); if (!sysctl_sysctl_next_ls(lsp, name+1, namelen-1, next+1, - len, level+1, oidpp)) + len, level+1, oidpp, honor_skip)) return (0); next: namelen = 1; emptynode: *len = level; } - return (1); + return (ENOENT); } static int @@ -1162,18 +1168,19 @@ sysctl_sysctl_next(SYSCTL_HANDLER_ARGS) { int *name = (int *) arg1; u_int namelen = arg2; - int i, j, error; + int len, error; struct sysctl_oid *oid; struct sysctl_oid_list *lsp = &sysctl__children; struct rm_priotracker tracker; - int newoid[CTL_MAXNAME]; + int next[CTL_MAXNAME]; SYSCTL_RLOCK(&tracker); - i = sysctl_sysctl_next_ls(lsp, name, namelen, newoid, &j, 1, &oid); + error = sysctl_sysctl_next_ls(lsp, name, namelen, next, &len, 1, &oid, + oidp->oid_number == CTL_SYSCTL_NEXT); SYSCTL_RUNLOCK(&tracker); - if (i) - return (ENOENT); - error = SYSCTL_OUT(req, newoid, j * sizeof (int)); + if (error) + return (error); + error = SYSCTL_OUT(req, next, len * sizeof (int)); return (error); } @@ -1184,6 +1191,9 @@ sysctl_sysctl_next(SYSCTL_HANDLER_ARGS) static SYSCTL_NODE(_sysctl, CTL_SYSCTL_NEXT, next, CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_CAPRD, sysctl_sysctl_next, ""); +static SYSCTL_NODE(_sysctl, CTL_SYSCTL_NEXTNOSKIP, nextnoskip, CTLFLAG_RD | + CTLFLAG_MPSAFE | CTLFLAG_CAPRD, sysctl_sysctl_next, ""); + static int name2oid(char *name, int *oid, int *len, struct sysctl_oid **oidpp) { @@ -2726,10 +2736,10 @@ db_show_sysctl_all(int *oid, size_t len, int flags) name1[1] = CTL_SYSCTL_NEXT; l1 = 2; if (len) { - memcpy(name1+2, oid, len * sizeof(int)); - l1 +=len; + memcpy(name1 + 2, oid, len * sizeof(int)); + l1 += len; } else { - name1[2] = 1; + name1[2] = CTL_KERN; l1++; } for (;;) { @@ -2742,7 +2752,7 @@ db_show_sysctl_all(int *oid, size_t len, int flags) if (error == ENOENT) return (0); else - db_error("sysctl(getnext)"); + db_error("sysctl(next)"); } l2 /= sizeof(int); Modified: head/sys/sys/sysctl.h ============================================================================== --- head/sys/sys/sysctl.h Mon Oct 5 19:58:55 2020 (r366464) +++ head/sys/sys/sysctl.h Mon Oct 5 20:13:22 2020 (r366465) @@ -934,11 +934,12 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry); */ #define CTL_SYSCTL_DEBUG 0 /* printf all nodes */ #define CTL_SYSCTL_NAME 1 /* string name of OID */ -#define CTL_SYSCTL_NEXT 2 /* next OID */ +#define CTL_SYSCTL_NEXT 2 /* next OID, honoring CTLFLAG_SKIP */ #define CTL_SYSCTL_NAME2OID 3 /* int array of name */ #define CTL_SYSCTL_OIDFMT 4 /* OID's kind and format */ #define CTL_SYSCTL_OIDDESCR 5 /* OID's description */ #define CTL_SYSCTL_OIDLABEL 6 /* aggregation label */ +#define CTL_SYSCTL_NEXTNOSKIP 7 /* next OID, ignoring CTLFLAG_SKIP */ /* * CTL_KERN identifiers Modified: head/usr.bin/truss/syscalls.c ============================================================================== --- head/usr.bin/truss/syscalls.c Mon Oct 5 19:58:55 2020 (r366464) +++ head/usr.bin/truss/syscalls.c Mon Oct 5 20:13:22 2020 (r366465) @@ -2360,6 +2360,9 @@ print_arg(struct syscall_args *sc, unsigned long *args fprintf(fp, "oidlabel "); print_sysctl(fp, oid + 2, len - 2); break; + case CTL_SYSCTL_NEXTNOSKIP: + fprintf(fp, "nextnoskip"); + break; default: print_sysctl(fp, oid + 1, len - 1); } From owner-svn-src-all@freebsd.org Mon Oct 5 20:57:45 2020 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 37C3142F933; Mon, 5 Oct 2020 20:57:45 +0000 (UTC) (envelope-from kevans@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4tGK0jpGz4TV3; Mon, 5 Oct 2020 20:57:45 +0000 (UTC) (envelope-from kevans@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 F14541BD15; Mon, 5 Oct 2020 20:57:44 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095KviiB098470; Mon, 5 Oct 2020 20:57:44 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095Kvi7e098469; Mon, 5 Oct 2020 20:57:44 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <202010052057.095Kvi7e098469@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Mon, 5 Oct 2020 20:57:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366466 - head/usr.sbin/crunch/crunchgen X-SVN-Group: head X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: head/usr.sbin/crunch/crunchgen X-SVN-Commit-Revision: 366466 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.33 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, 05 Oct 2020 20:57:45 -0000 Author: kevans Date: Mon Oct 5 20:57:44 2020 New Revision: 366466 URL: https://svnweb.freebsd.org/changeset/base/366466 Log: crunchgen: fix MK_AUTO_OBJ logic after r364166 r364166 converted echo -n `/bin/pwd` to a raw pwd invocation, leaving a trailing newline at the end of path. This caused a later stat() of it to erroneously fail and the fallback to MK_AUTO_OBJ=no logic proceeded as unexpected. Harry Schmalzbauer bissected the resulting build failure he experienced (stable/12 host, -HEAD build) down to r365887. This change is mostly unrelated, except it switches the build to bootstrapped crunchgen - clue! I then bissected recent crunchgen changes going back a bit since we wouldn't observe the failure immediately with -CURRENT in most configurations, which landed me on r364166. After many intense head-scratching minutes and printf debugging, I realized that the newline was the difference. This is where our tale ends. Reported by: Harry Schmalzbauer, O. Hartmann, Mike Tancsa, kevans MFC after: 3 days Modified: head/usr.sbin/crunch/crunchgen/crunchgen.c Modified: head/usr.sbin/crunch/crunchgen/crunchgen.c ============================================================================== --- head/usr.sbin/crunch/crunchgen/crunchgen.c Mon Oct 5 20:13:22 2020 (r366465) +++ head/usr.sbin/crunch/crunchgen/crunchgen.c Mon Oct 5 20:57:44 2020 (r366466) @@ -666,6 +666,8 @@ fillin_program(prog_t *p) if (!*path) errx(1, "Can't perform pwd on: %s\n", p->srcdir); + /* Chop off trailing newline. */ + path[strlen(path) - 1] = '\0'; p->realsrcdir = strdup(path); } From owner-svn-src-all@freebsd.org Mon Oct 5 21:39:14 2020 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 58F3E4307A4; Mon, 5 Oct 2020 21:39:14 +0000 (UTC) (envelope-from danfe@freebsd.org) Received: from freefall.freebsd.org (freefall.freebsd.org [96.47.72.132]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "freefall.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C4vBB1VDSz4WK1; Mon, 5 Oct 2020 21:39:14 +0000 (UTC) (envelope-from danfe@freebsd.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1601933954; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=gdqVwIQFHE8F9uq5mnfAT+tG0rLekitLmSBSfFmEjPM=; b=fnGG+1GhtohV1lr2Uykm5zDWN8v+PFeyurnabDcVjGLqYYkVS2MdMGMUyUyEBOWxKQHuzG uotWoLNN3x+gU+OqB6FXSM7kTBd/HeTvhJS0n9v8ML7hOOFla9b1VmGXWa8QWlDWfbopYX 20t09XHXW1nurQZGCr6qubRoZTRS+1ZBsL9DTwk3H9FbShJzcXOM5e0g6qfYvgMpJAAlzd mfG08P/y3RRkr0t0wuwXZV9Spa4wODJwls9HovvLRSwxGLP8W/yrg1kHUqZ/qZ5pkO1VOt npMVyT9arQVRVjM9MIPFyQ/re+x8L5eDzUYffWLSSrfxib4VqI+a3uGwiGG7tA== Received: by freefall.freebsd.org (Postfix, from userid 1033) id 2475C1CBAD; Mon, 5 Oct 2020 21:39:14 +0000 (UTC) Date: Mon, 5 Oct 2020 21:39:14 +0000 From: Alexey Dokuchaev To: Kyle Evans Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r366466 - head/usr.sbin/crunch/crunchgen Message-ID: <20201005213914.GA28182@FreeBSD.org> References: <202010052057.095Kvi7e098469@repo.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <202010052057.095Kvi7e098469@repo.freebsd.org> ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1601933954; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=gdqVwIQFHE8F9uq5mnfAT+tG0rLekitLmSBSfFmEjPM=; b=hwo4GWdzcek4uOhGW5ayfdNXrU70fLBXcHKTphAxvmIawDrP3yu8z6mPfv3Cv63dEPQoh5 W+a8LO5orHfHCSsrdHmxjlj9apA1pFU5Ax3SA5F0NaQUFrFWm/Gy4WHpoMC3GR1nBpjh0X U57nbFmDFiKXZ+3i5RMtGYSbTdqOIF1gsuARh3qcOcO0hCB4mB7eNi+zyqOZsb6ycUdKBb UvxOXzgjIKKRfG4+BdzFRqQKKKudUSgPiVdHEjqudiM2a0ugqqkDrSg9c7GN2f/NivbqDm S1l8orylnEDqFrFohydcnRZaA3Y5EJvbswR72ov2EzvHoijeRZUpjSdohnACSQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1601933954; a=rsa-sha256; cv=none; b=SDJU5unH7De+lv8yRCmBRWxpL+xHRm0BPw8nf11RvzZUD17YpZRgJ+Z+fiE7n0OoHNKV5c loPeV4VZrWZoGk11HqnWL7kGPTkYtBkRZucG0FZ3PExjRTazy0H2OZ3/t4Uv6iZ/S0TE11 Y6QSnOTFm4FdSIEUm33DAC/6h+bzWnPtYr0n74NpH9ni5Cn52lQGFHQ/0NOzex3coyTYhN A3wdpXptsa6OwHng2eIJmmD/9VI+JxZ6OIcRWqpn97QBaJpNAFdGiIUR2QC+XY2mTlTIbS sZFNZlbTGNNiBUC7NMTJzs+uIPwiV5rBlENCq2y+trg0tT2KoHeG6I5PAmGavQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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, 05 Oct 2020 21:39:14 -0000 On Mon, Oct 05, 2020 at 08:57:44PM +0000, Kyle Evans wrote: > New Revision: 366466 > URL: https://svnweb.freebsd.org/changeset/base/366466 > > Log: > crunchgen: fix MK_AUTO_OBJ logic after r364166 > > r364166 converted echo -n `/bin/pwd` to a raw pwd invocation, leaving a > trailing newline at the end of path. This caused a later stat() of it to > erroneously fail and the fallback to MK_AUTO_OBJ=no logic proceeded as > unexpected. [...] @@ -648,8 +653,7 @@ /* Determine the actual srcdir (maybe symlinked). */ if (p->srcdir) { - snprintf(line, MAXLINELEN, "cd %s && echo -n `/bin/pwd`", - p->srcdir); + snprintf(line, MAXLINELEN, "cd %s && pwd", p->srcdir); f = popen(line,"r"); Calling popen("cd somedir && pwd") in a C program to resolve symlinks, seriously? Why not simply call realpath(3) instead? :-/ ./danfe From owner-svn-src-all@freebsd.org Mon Oct 5 22:18:05 2020 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 08D9743198E; Mon, 5 Oct 2020 22:18:05 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C4w306qZwz4Yv5; Mon, 5 Oct 2020 22:18:04 +0000 (UTC) (envelope-from np@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 C91251CD0D; Mon, 5 Oct 2020 22:18:04 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 095MI4Ws047530; Mon, 5 Oct 2020 22:18:04 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 095MI499047528; Mon, 5 Oct 2020 22:18:04 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010052218.095MI499047528@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Mon, 5 Oct 2020 22:18:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366467 - head/sys/dev/cxgbe X-SVN-Group: head X-SVN-Commit-Author: np X-SVN-Commit-Paths: head/sys/dev/cxgbe X-SVN-Commit-Revision: 366467 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.33 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, 05 Oct 2020 22:18:05 -0000 Author: np Date: Mon Oct 5 22:18:04 2020 New Revision: 366467 URL: https://svnweb.freebsd.org/changeset/base/366467 Log: cxgbe(4) sysctls do not need Giant. Sponsored by: Chelsio Communications Modified: head/sys/dev/cxgbe/t4_main.c head/sys/dev/cxgbe/t4_sge.c Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Mon Oct 5 20:57:44 2020 (r366466) +++ head/sys/dev/cxgbe/t4_main.c Mon Oct 5 22:18:04 2020 (r366467) @@ -6327,7 +6327,7 @@ t4_sysctls(struct adapter *sc) sc->params.nports, "# of ports"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "doorbells", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, doorbells, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, doorbells, (uintptr_t)&sc->doorbells, sysctl_bitfield_8b, "A", "available doorbells"); @@ -6335,12 +6335,12 @@ t4_sysctls(struct adapter *sc) sc->params.vpd.cclk, "core clock frequency (in KHz)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_timers", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc->params.sge.timer_val, sizeof(sc->params.sge.timer_val), sysctl_int_array, "A", "interrupt holdoff timer values (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pkt_counts", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc->params.sge.counter_val, sizeof(sc->params.sge.counter_val), sysctl_int_array, "A", "interrupt holdoff packet counter values"); @@ -6400,7 +6400,7 @@ t4_sysctls(struct adapter *sc) #define SYSCTL_CAP(name, n, text) \ SYSCTL_ADD_PROC(ctx, children, OID_AUTO, #name, \ - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, caps_decoder[n], \ + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, caps_decoder[n], \ (uintptr_t)&sc->name, sysctl_bitfield_16b, "A", \ "available " text " capabilities") @@ -6419,27 +6419,27 @@ t4_sysctls(struct adapter *sc) NULL, sc->tids.nftids, "number of filters"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "temperature", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_temperature, "I", "chip temperature (in Celsius)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "reset_sensor", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0, sysctl_reset_sensor, "I", "reset the chip's temperature sensor."); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "loadavg", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_loadavg, "A", "microprocessor load averages (debug firmwares only)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "core_vdd", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, sysctl_vdd, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_vdd, "I", "core Vdd (in mV)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "local_cpus", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, LOCAL_CPUS, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, LOCAL_CPUS, sysctl_cpus, "A", "local CPUs"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "intr_cpus", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, INTR_CPUS, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, INTR_CPUS, sysctl_cpus, "A", "preferred CPUs for interrupts"); SYSCTL_ADD_INT(ctx, children, OID_AUTO, "swintr", CTLFLAG_RW, @@ -6454,175 +6454,175 @@ t4_sysctls(struct adapter *sc) children = SYSCTL_CHILDREN(oid); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cctrl", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_cctrl, "A", "congestion control"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_tp0", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_cim_ibq_obq, "A", "CIM IBQ 0 (TP0)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_tp1", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 1, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 1, sysctl_cim_ibq_obq, "A", "CIM IBQ 1 (TP1)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_ulp", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 2, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 2, sysctl_cim_ibq_obq, "A", "CIM IBQ 2 (ULP)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_sge0", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 3, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 3, sysctl_cim_ibq_obq, "A", "CIM IBQ 3 (SGE0)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_sge1", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 4, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 4, sysctl_cim_ibq_obq, "A", "CIM IBQ 4 (SGE1)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ibq_ncsi", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 5, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 5, sysctl_cim_ibq_obq, "A", "CIM IBQ 5 (NCSI)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_la", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_cim_la, "A", "CIM logic analyzer"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_ma_la", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_cim_ma_la, "A", "CIM MA logic analyzer"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp0", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 0 (ULP0)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp1", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 1 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 1 (ULP1)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp2", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 2 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 2 (ULP2)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ulp3", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 3 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 3 (ULP3)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 4 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 4 (SGE)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_ncsi", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 5 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 5 (NCSI)"); if (chip_id(sc) > CHELSIO_T4) { SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge0_rx", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 6 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 6 (SGE0-RX)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_obq_sge1_rx", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 7 + CIM_NUM_IBQ, sysctl_cim_ibq_obq, "A", "CIM OBQ 7 (SGE1-RX)"); } SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_pif_la", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_cim_pif_la, "A", "CIM PIF logic analyzer"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cim_qcfg", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_cim_qcfg, "A", "CIM queue configuration"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cpl_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_cpl_stats, "A", "CPL statistics"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "ddp_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_ddp_stats, "A", "non-TCP DDP statistics"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "devlog", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_devlog, "A", "firmware's device log"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fcoe_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_fcoe_stats, "A", "FCoE statistics"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "hw_sched", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_hw_sched, "A", "hardware scheduler "); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "l2t", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_l2t, "A", "hardware L2 table"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "smt", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_smt, "A", "hardware source MAC table"); #ifdef INET6 SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "clip", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_clip, "A", "active CLIP table entries"); #endif SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "lb_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_lb_stats, "A", "loopback statistics"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "meminfo", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_meminfo, "A", "memory regions"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "mps_tcam", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, chip_id(sc) <= CHELSIO_T5 ? sysctl_mps_tcam : sysctl_mps_tcam_t6, "A", "MPS TCAM entries"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "path_mtus", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_path_mtus, "A", "path MTUs"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "pm_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_pm_stats, "A", "PM statistics"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rdma_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_rdma_stats, "A", "RDMA statistics"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tcp_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_tcp_stats, "A", "TCP statistics"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tids", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_tids, "A", "TID information"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_err_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_tp_err_stats, "A", "TP error statistics"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_la_mask", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0, sysctl_tp_la_mask, "I", "TP logic analyzer event capture mask"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tp_la", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_tp_la, "A", "TP logic analyzer"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_rate", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_tx_rate, "A", "Tx rate"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "ulprx_la", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_ulprx_la, "A", "ULPRX logic analyzer"); if (chip_id(sc) >= CHELSIO_T5) { SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "wcwr_stats", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_wcwr_stats, "A", "write combined work requests"); } @@ -6679,11 +6679,11 @@ t4_sysctls(struct adapter *sc) sc->tt.tls = 0; SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tls", CTLTYPE_INT | - CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0, sysctl_tls, "I", + CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0, sysctl_tls, "I", "Inline TLS allowed"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tls_rx_ports", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0, sysctl_tls_rx_ports, "I", "TCP ports that use inline TLS+TOE RX"); @@ -6708,72 +6708,72 @@ t4_sysctls(struct adapter *sc) "autorcvbuf increment"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "timer_tick", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_tp_tick, "A", "TP timer tick (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "timestamp_tick", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 1, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 1, sysctl_tp_tick, "A", "TCP timestamp tick (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "dack_tick", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 2, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 2, sysctl_tp_tick, "A", "DACK tick (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "dack_timer", - CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_tp_dack_timer, "IU", "DACK timer (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rexmt_min", - CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, A_TP_RXT_MIN, sysctl_tp_timer, "LU", "Minimum retransmit interval (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rexmt_max", - CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, A_TP_RXT_MAX, sysctl_tp_timer, "LU", "Maximum retransmit interval (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "persist_min", - CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, A_TP_PERS_MIN, sysctl_tp_timer, "LU", "Persist timer min (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "persist_max", - CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, A_TP_PERS_MAX, sysctl_tp_timer, "LU", "Persist timer max (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "keepalive_idle", - CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, A_TP_KEEP_IDLE, sysctl_tp_timer, "LU", "Keepalive idle timer (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "keepalive_interval", - CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, A_TP_KEEP_INTVL, sysctl_tp_timer, "LU", "Keepalive interval timer (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "initial_srtt", - CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, A_TP_INIT_SRTT, sysctl_tp_timer, "LU", "Initial SRTT (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "finwait2_timer", - CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_ULONG | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, A_TP_FINWAIT2_TIMER, sysctl_tp_timer, "LU", "FINWAIT2 timer (us)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "syn_rexmt_count", - CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, S_SYNSHIFTMAX, sysctl_tp_shift_cnt, "IU", "Number of SYN retransmissions before abort"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rexmt_count", - CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, S_RXTSHIFTMAXR2, sysctl_tp_shift_cnt, "IU", "Number of retransmissions before abort"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "keepalive_count", - CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, S_KEEPALIVEMAXR2, sysctl_tp_shift_cnt, "IU", "Number of keepalive probes before abort"); @@ -6784,7 +6784,7 @@ t4_sysctls(struct adapter *sc) for (i = 0; i < 16; i++) { snprintf(s, sizeof(s), "%u", i); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, s, - CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, i, sysctl_tp_backoff, "IU", "TOE retransmit backoff"); } @@ -6824,7 +6824,7 @@ vi_sysctls(struct vi_info *vi) if (IS_MAIN_VI(vi)) { SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rsrv_noflowq", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, 0, sysctl_noflowq, "IU", "Reserve queue 0 for non-flowid packets"); } @@ -6835,7 +6835,7 @@ vi_sysctls(struct vi_info *vi) NULL, 1, "use VM work requests for transmit"); } else { SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "tx_vm_wr", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, 0, sysctl_tx_vm_wr, "I", "use VM work requestes for transmit"); } @@ -6848,11 +6848,11 @@ vi_sysctls(struct vi_info *vi) CTLFLAG_RD, &vi->first_ofld_rxq, 0, "index of first TOE rx queue"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_tmr_idx_ofld", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, 0, sysctl_holdoff_tmr_idx_ofld, "I", "holdoff timer index for TOE queues"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pktc_idx_ofld", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, 0, sysctl_holdoff_pktc_idx_ofld, "I", "holdoff packet counter index for TOE queues"); } @@ -6883,17 +6883,17 @@ vi_sysctls(struct vi_info *vi) #endif SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_tmr_idx", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, 0, sysctl_holdoff_tmr_idx, "I", "holdoff timer index"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "holdoff_pktc_idx", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, 0, sysctl_holdoff_pktc_idx, "I", "holdoff packet counter index"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "qsize_rxq", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, 0, sysctl_qsize_rxq, "I", "rx queue size"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "qsize_txq", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, 0, sysctl_qsize_txq, "I", "tx queue size"); } @@ -6917,30 +6917,30 @@ cxgbe_sysctls(struct port_info *pi) children = SYSCTL_CHILDREN(oid); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "linkdnrc", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, pi, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, pi, 0, sysctl_linkdnrc, "A", "reason why link is down"); if (pi->port_type == FW_PORT_TYPE_BT_XAUI) { SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "temperature", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, pi, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, pi, 0, sysctl_btphy, "I", "PHY temperature (in Celsius)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fw_version", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, pi, 1, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, pi, 1, sysctl_btphy, "I", "PHY firmware version"); } SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "pause_settings", - CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_NEEDGIANT, pi, 0, + CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_MPSAFE, pi, 0, sysctl_pause_settings, "A", "PAUSE settings (bit 0 = rx_pause, 1 = tx_pause, 2 = pause_autoneg)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "fec", - CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_NEEDGIANT, pi, 0, + CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_MPSAFE, pi, 0, sysctl_fec, "A", "FECs to use (bit 0 = RS, 1 = FC, 2 = none, 5 = auto, 6 = module)"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "module_fec", - CTLTYPE_STRING | CTLFLAG_NEEDGIANT, pi, 0, sysctl_module_fec, "A", + CTLTYPE_STRING | CTLFLAG_MPSAFE, pi, 0, sysctl_module_fec, "A", "FEC recommended by the cable/transceiver"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "autoneg", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, pi, 0, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, pi, 0, sysctl_autoneg, "I", "autonegotiation (-1 = not supported)"); @@ -6982,12 +6982,12 @@ cxgbe_sysctls(struct port_info *pi) SYSCTL_CHILDREN(oid), OID_AUTO, name, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "traffic class")); SYSCTL_ADD_PROC(ctx, children2, OID_AUTO, "flags", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, tc_flags, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, tc_flags, (uintptr_t)&tc->flags, sysctl_bitfield_8b, "A", "flags"); SYSCTL_ADD_UINT(ctx, children2, OID_AUTO, "refcount", CTLFLAG_RD, &tc->refcount, 0, "references to this class"); SYSCTL_ADD_PROC(ctx, children2, OID_AUTO, "params", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, (pi->port_id << 16) | i, sysctl_tc_params, "A", "traffic class parameters"); } @@ -7004,7 +7004,7 @@ cxgbe_sysctls(struct port_info *pi) #define SYSCTL_ADD_T4_REG64(pi, name, desc, reg) \ SYSCTL_ADD_OID(ctx, children, OID_AUTO, name, \ - CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, reg, \ + CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, reg, \ sysctl_handle_t4_reg64, "QU", desc) SYSCTL_ADD_T4_REG64(pi, "tx_octets", "# of octets in good frames", Modified: head/sys/dev/cxgbe/t4_sge.c ============================================================================== --- head/sys/dev/cxgbe/t4_sge.c Mon Oct 5 20:57:44 2020 (r366466) +++ head/sys/dev/cxgbe/t4_sge.c Mon Oct 5 22:18:04 2020 (r366467) @@ -963,7 +963,7 @@ t4_sge_sysctls(struct adapter *sc, struct sysctl_ctx_l struct sge_params *sp = &sc->params.sge; SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "buffer_sizes", - CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, sc, 0, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, sysctl_bufsizes, "A", "freelist buffer sizes"); SYSCTL_ADD_INT(ctx, children, OID_AUTO, "fl_pktshift", CTLFLAG_RD, @@ -3698,13 +3698,13 @@ add_iq_sysctls(struct sysctl_ctx_list *ctx, struct sys SYSCTL_ADD_INT(ctx, children, OID_AUTO, "dmalen", CTLFLAG_RD, NULL, iq->qsize * IQ_ESIZE, "descriptor ring size in bytes"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "abs_id", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &iq->abs_id, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &iq->abs_id, 0, sysctl_uint16, "I", "absolute id of the queue"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cntxt_id", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &iq->cntxt_id, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &iq->cntxt_id, 0, sysctl_uint16, "I", "SGE context id of the queue"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cidx", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &iq->cidx, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &iq->cidx, 0, sysctl_uint16, "I", "consumer index"); } @@ -3724,7 +3724,7 @@ add_fl_sysctls(struct adapter *sc, struct sysctl_ctx_l fl->sidx * EQ_ESIZE + sc->params.sge.spg_len, "desc ring size in bytes"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cntxt_id", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &fl->cntxt_id, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &fl->cntxt_id, 0, sysctl_uint16, "I", "SGE context id of the freelist"); SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "padding", CTLFLAG_RD, NULL, fl_pad ? 1 : 0, "padding enabled"); @@ -3988,13 +3988,13 @@ alloc_nm_rxq(struct vi_info *vi, struct sge_nm_rxq *nm children = SYSCTL_CHILDREN(oid); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "abs_id", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &nm_rxq->iq_abs_id, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &nm_rxq->iq_abs_id, 0, sysctl_uint16, "I", "absolute id of the queue"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cntxt_id", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &nm_rxq->iq_cntxt_id, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &nm_rxq->iq_cntxt_id, 0, sysctl_uint16, "I", "SGE context id of the queue"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cidx", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &nm_rxq->iq_cidx, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &nm_rxq->iq_cidx, 0, sysctl_uint16, "I", "consumer index"); children = SYSCTL_CHILDREN(oid); @@ -4003,7 +4003,7 @@ alloc_nm_rxq(struct vi_info *vi, struct sge_nm_rxq *nm children = SYSCTL_CHILDREN(oid); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cntxt_id", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &nm_rxq->fl_cntxt_id, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &nm_rxq->fl_cntxt_id, 0, sysctl_uint16, "I", "SGE context id of the freelist"); SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "cidx", CTLFLAG_RD, &nm_rxq->fl_cidx, 0, "consumer index"); @@ -4071,10 +4071,10 @@ alloc_nm_txq(struct vi_info *vi, struct sge_nm_txq *nm SYSCTL_ADD_UINT(&vi->ctx, children, OID_AUTO, "cntxt_id", CTLFLAG_RD, &nm_txq->cntxt_id, 0, "SGE context id of the queue"); SYSCTL_ADD_PROC(&vi->ctx, children, OID_AUTO, "cidx", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &nm_txq->cidx, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &nm_txq->cidx, 0, sysctl_uint16, "I", "consumer index"); SYSCTL_ADD_PROC(&vi->ctx, children, OID_AUTO, "pidx", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &nm_txq->pidx, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &nm_txq->pidx, 0, sysctl_uint16, "I", "producer index"); return (rc); @@ -4392,10 +4392,10 @@ alloc_wrq(struct adapter *sc, struct vi_info *vi, stru SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "cntxt_id", CTLFLAG_RD, &wrq->eq.cntxt_id, 0, "SGE context id of the queue"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "cidx", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &wrq->eq.cidx, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &wrq->eq.cidx, 0, sysctl_uint16, "I", "consumer index"); SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "pidx", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &wrq->eq.pidx, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &wrq->eq.pidx, 0, sysctl_uint16, "I", "producer index"); SYSCTL_ADD_INT(ctx, children, OID_AUTO, "sidx", CTLFLAG_RD, NULL, wrq->eq.sidx, "status page index"); @@ -4495,16 +4495,16 @@ alloc_txq(struct vi_info *vi, struct sge_txq *txq, int SYSCTL_ADD_UINT(&vi->ctx, children, OID_AUTO, "cntxt_id", CTLFLAG_RD, &eq->cntxt_id, 0, "SGE context id of the queue"); SYSCTL_ADD_PROC(&vi->ctx, children, OID_AUTO, "cidx", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &eq->cidx, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &eq->cidx, 0, sysctl_uint16, "I", "consumer index"); SYSCTL_ADD_PROC(&vi->ctx, children, OID_AUTO, "pidx", - CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, &eq->pidx, 0, + CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, &eq->pidx, 0, sysctl_uint16, "I", "producer index"); SYSCTL_ADD_INT(&vi->ctx, children, OID_AUTO, "sidx", CTLFLAG_RD, NULL, eq->sidx, "status page index"); SYSCTL_ADD_PROC(&vi->ctx, children, OID_AUTO, "tc", - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, vi, idx, sysctl_tc, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, vi, idx, sysctl_tc, "I", "traffic class (-1 means none)"); SYSCTL_ADD_UQUAD(&vi->ctx, children, OID_AUTO, "txcsum", CTLFLAG_RD, From owner-svn-src-all@freebsd.org Tue Oct 6 01:33:57 2020 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 5884D436084; Tue, 6 Oct 2020 01:33:57 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C50P11hQdz3VZF; Tue, 6 Oct 2020 01:33:57 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: from mail-qt1-f175.google.com (mail-qt1-f175.google.com [209.85.160.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) (Authenticated sender: kevans) by smtp.freebsd.org (Postfix) with ESMTPSA id 1940325F08; Tue, 6 Oct 2020 01:33:57 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: by mail-qt1-f175.google.com with SMTP id r8so11627865qtp.13; Mon, 05 Oct 2020 18:33:57 -0700 (PDT) X-Gm-Message-State: AOAM530uEBjYUF3S0fkE9yPdaKB6EDFYW3kvDtsg5SvaunaFfoWQgPEm F4SpMNeYZ1usK+s/zdK1/HSpZY5DqMEZZg/6ECY= X-Google-Smtp-Source: ABdhPJxw5blr3hrnRTjn4glTwiDzAZGPQ3rmdm+zhA2+XK8CqLAfwCtBWzbWUnnI2I8I9mD2xy35rpeyOyK0THbdvzI= X-Received: by 2002:ac8:a0e:: with SMTP id b14mr307900qti.242.1601948036524; Mon, 05 Oct 2020 18:33:56 -0700 (PDT) MIME-Version: 1.0 References: <202010052057.095Kvi7e098469@repo.freebsd.org> <20201005213914.GA28182@FreeBSD.org> In-Reply-To: <20201005213914.GA28182@FreeBSD.org> From: Kyle Evans Date: Mon, 5 Oct 2020 20:33:45 -0500 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: svn commit: r366466 - head/usr.sbin/crunch/crunchgen To: Alexey Dokuchaev Cc: src-committers , svn-src-all , svn-src-head , Alex Richardson Content-Type: text/plain; charset="UTF-8" X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Tue, 06 Oct 2020 01:33:57 -0000 On Mon, Oct 5, 2020 at 4:39 PM Alexey Dokuchaev wrote: > > On Mon, Oct 05, 2020 at 08:57:44PM +0000, Kyle Evans wrote: > > New Revision: 366466 > > URL: https://svnweb.freebsd.org/changeset/base/366466 > > > > Log: > > crunchgen: fix MK_AUTO_OBJ logic after r364166 > > > > r364166 converted echo -n `/bin/pwd` to a raw pwd invocation, leaving a > > trailing newline at the end of path. This caused a later stat() of it to > > erroneously fail and the fallback to MK_AUTO_OBJ=no logic proceeded as > > unexpected. > > [...] > @@ -648,8 +653,7 @@ > > /* Determine the actual srcdir (maybe symlinked). */ > if (p->srcdir) { > - snprintf(line, MAXLINELEN, "cd %s && echo -n `/bin/pwd`", > - p->srcdir); > + snprintf(line, MAXLINELEN, "cd %s && pwd", p->srcdir); > f = popen(line,"r"); > > Calling popen("cd somedir && pwd") in a C program to resolve symlinks, > seriously? Why not simply call realpath(3) instead? :-/ > Excellent question. :-) CC'ing Alex, because he might have looked at this more in-depth. I don't see any real reason for the status quo vs. realpath(3) off the top of my head, but I'm not familiar with the history and don't quite have the time to track down the ramifications of the change. Thanks, Kyle Evans From owner-svn-src-all@freebsd.org Tue Oct 6 02:03:35 2020 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 46C8843771F; Tue, 6 Oct 2020 02:03:35 +0000 (UTC) (envelope-from scottl@samsco.org) Received: from out2-smtp.messagingengine.com (out2-smtp.messagingengine.com [66.111.4.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4C513B3k3Tz3Xb5; Tue, 6 Oct 2020 02:03:34 +0000 (UTC) (envelope-from scottl@samsco.org) Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) by mailout.nyi.internal (Postfix) with ESMTP id 814E85C013F; Mon, 5 Oct 2020 22:03:33 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute2.internal (MEProxy); Mon, 05 Oct 2020 22:03:33 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsco.org; h= content-type:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; s=fm1; bh=E GeGg5fc8OsZ4dyBbdi7m4txftTtZk/zOoQB0+dnL3g=; b=xim1MKt4hs9t0aQko hPcS026qTmQBnlGaRPx95kBasjzDXVVX7c3TFUIvFDQu+w5YepgZcm4LnjNnGU5+ S537SLQOYk+FMah+RtQzZtYUBrw56f5n18Mg6Y9LEvLGibA7uui6tFFKpIj5aoBN 2SokCAQAusl51uywuxfcq8f4qPXWoTsP++zd5DfHPdTWRmGg/2gOCv7sGc5x47zO fCRQM56mzBEvXLmK1JfUJlVSycHnQubEP+KLQZpWXgm/fE6QG8ozqEglNkaOA5GM rz3lLHjOF7VpbUmo8DZ+ioV/rdn7x9vllA+QDXaU9CvvDGmvdVeb5X4aa5y7PsHK WARNQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm1; bh=EGeGg5fc8OsZ4dyBbdi7m4txftTtZk/zOoQB0+dnL 3g=; b=gQ+qVyuwZwX5uAn1d8O2ZR6+wBAhZhmscZV75p6TQjGLZY4YXY1M0oBeY 1agm7naNHOHQaZACtBO8OJE2HaWuXfCa/epPEbr7a/EbfJpyE8EpIQ+91SewLlMk vbCuZJGSrOBAmf2GJiaEpCSZFjFqKz8qiExh7JOiweJyK/hpbUXbhJlV4fhDDMOJ YyskS4bgm3dCQfKQICnsnMjjaQ3y1fFphvPEYMNZIr+C68fM1z9viURAmpCNXd9C +9IvxF33NULkzyPgqzigAhc69TJwbZffTZ8RhJHDjaI0fHQU9fQb9WWqBzQr6wNr Ddfly6ki0VhXK74RbrVRHrZ6cBytA== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedrgeefgdehgecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpegtggfuhfgjfffgkfhfvffosehtqhhmtdhhtdejnecuhfhrohhmpefutghothht ucfnohhnghcuoehstghothhtlhesshgrmhhstghordhorhhgqeenucggtffrrghtthgvrh hnpeefjeeggfejhffgtdejveejkeegveeileeuheejgfduteevgfdttefggfeggfdvgeen ucfkphepkedrgeeirdekledrvddufeenucevlhhushhtvghrufhiiigvpedtnecurfgrrh grmhepmhgrihhlfhhrohhmpehstghothhtlhesshgrmhhstghordhorhhg X-ME-Proxy: Received: from [192.168.0.114] (unknown [8.46.89.213]) by mail.messagingengine.com (Postfix) with ESMTPA id 979113064680; Mon, 5 Oct 2020 22:03:32 -0400 (EDT) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.1\)) Subject: Re: svn commit: r366429 - in head/sys: kern sys From: Scott Long In-Reply-To: Date: Mon, 5 Oct 2020 20:03:31 -0600 Cc: Konstantin Belousov , Rick Macklem , "src-committers@freebsd.org" , "svn-src-all@freebsd.org" , "svn-src-head@freebsd.org" Content-Transfer-Encoding: quoted-printable Message-Id: <33690A29-E145-44B7-AA9B-5FDE05F5C459@samsco.org> References: <202010041633.094GXg4l044462@repo.freebsd.org> <20201005011833.GI2643@kib.kiev.ua> To: Mateusz Guzik X-Mailer: Apple Mail (2.3608.120.23.2.1) X-Rspamd-Queue-Id: 4C513B3k3Tz3Xb5 X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=samsco.org header.s=fm1 header.b=xim1MKt4; dkim=pass header.d=messagingengine.com header.s=fm1 header.b=gQ+qVyuw; dmarc=none; spf=pass (mx1.freebsd.org: domain of scottl@samsco.org designates 66.111.4.26 as permitted sender) smtp.mailfrom=scottl@samsco.org X-Spamd-Result: default: False [-2.76 / 15.00]; TO_DN_EQ_ADDR_SOME(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; TO_DN_SOME(0.00)[]; MV_CASE(0.50)[]; R_SPF_ALLOW(-0.20)[+ip4:66.111.4.26]; RWL_MAILSPIKE_GOOD(0.00)[66.111.4.26:from]; RCPT_COUNT_FIVE(0.00)[6]; RCVD_COUNT_THREE(0.00)[4]; DKIM_TRACE(0.00)[samsco.org:+,messagingengine.com:+]; NEURAL_HAM_SHORT(-0.61)[-0.611]; FREEMAIL_TO(0.00)[gmail.com]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_TLS_LAST(0.00)[]; ASN(0.00)[asn:11403, ipnet:66.111.4.0/24, country:US]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_IN_DNSWL_LOW(-0.10)[66.111.4.26:from]; ARC_NA(0.00)[]; NEURAL_HAM_MEDIUM(-1.00)[-1.004]; R_DKIM_ALLOW(-0.20)[samsco.org:s=fm1,messagingengine.com:s=fm1]; FREEFALL_USER(0.00)[scottl]; FROM_HAS_DN(0.00)[]; NEURAL_HAM_LONG(-1.04)[-1.043]; MIME_GOOD(-0.10)[text/plain]; DMARC_NA(0.00)[samsco.org]; TO_MATCH_ENVRCPT_SOME(0.00)[]; FREEMAIL_CC(0.00)[gmail.com,uoguelph.ca,freebsd.org]; MAILMAN_DEST(0.00)[svn-src-all,svn-src-head] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Tue, 06 Oct 2020 02:03:35 -0000 > On Oct 5, 2020, at 1:35 PM, Mateusz Guzik wrote: >=20 > On 10/5/20, Konstantin Belousov wrote: >> On Sun, Oct 04, 2020 at 09:06:02PM +0000, Rick Macklem wrote: >>> Mateusz Guzik wrote: >>>> Why is the process lock always taken? It looks like both routines = just >>>> check a thread-local flag, so perhaps this can get away without >>>> serializing this process-wide? >>> I did spot this slight difference between the initial version of >>> sig_intr() and >>> this one. At least w.r.t. copy_file_range(2), the call happens >>> infrequently >>> enough that the overhead of acquiring the lock is not significant. >>>=20 >> Yes, the function should not be on any frequent path. >>=20 >> That said, all signal delivery to process is covered by the process = lock, >> so checks under process lock make the advisory answer provide less = false >> negatives. If considered too importand in some cases (when ?), the >> following >> patch can be applied. >>=20 >> diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c >> index 8108d4cb3a5..ed4dd52b66d 100644 >> --- a/sys/kern/kern_sig.c >> +++ b/sys/kern/kern_sig.c >> @@ -3212,6 +3212,9 @@ sig_intr(void) >> int ret; >>=20 >> td =3D curthread; >> + if ((td->td_flags & (TDF_NEEDSIGCHK | TDF_NEEDSUSPCHK)) =3D=3D = 0) >> + return (0); >> + >> p =3D td->td_proc; >>=20 >> PROC_LOCK(p); >>=20 >=20 > I presume copy_file_range will not be the only consumer going forward. >=20 > The default for all new code should be to avoid locks or other atomics > if it can be helped, otherwise it's just never ending whack-a-mole and > this is bound to become a bottleneck at some point. >=20 > So happens process lock is already quite contended (e.g., when running > poudriere) and adding to it is the wrong way to go. >=20 > --=20 >=20 Agreed. After all of the work that=E2=80=99s been done in the last 20 = years to make SMP work well on FreeBSD, I=E2=80=99m not sure why it=E2=80=99s ok to = wave ones hand and say that serializing locks are still ok, or that they don=E2=80=99t = matter. The bias needs to be against adding more serialization points, even if it=E2=80=99s not = convenient. Scott From owner-svn-src-all@freebsd.org Tue Oct 6 02:57:38 2020 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 773E93F8E35; Tue, 6 Oct 2020 02:57:38 +0000 (UTC) (envelope-from mjg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C52FZ2XtVz3b0r; Tue, 6 Oct 2020 02:57:38 +0000 (UTC) (envelope-from mjg@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 3B09120101; Tue, 6 Oct 2020 02:57:38 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0962vc1u019503; Tue, 6 Oct 2020 02:57:38 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0962vcxS019502; Tue, 6 Oct 2020 02:57:38 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010060257.0962vcxS019502@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Tue, 6 Oct 2020 02:57:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366468 - head/lib/libkvm X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: head/lib/libkvm X-SVN-Commit-Revision: 366468 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.33 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: Tue, 06 Oct 2020 02:57:38 -0000 Author: mjg Date: Tue Oct 6 02:57:37 2020 New Revision: 366468 URL: https://svnweb.freebsd.org/changeset/base/366468 Log: libkvm: catch up with pre-subtracated per-cpu addresses Only concerns amd64. Reported by: imp Modified: head/lib/libkvm/kvm_pcpu.c Modified: head/lib/libkvm/kvm_pcpu.c ============================================================================== --- head/lib/libkvm/kvm_pcpu.c Mon Oct 5 22:18:04 2020 (r366467) +++ head/lib/libkvm/kvm_pcpu.c Tue Oct 6 02:57:37 2020 (r366468) @@ -50,15 +50,23 @@ __FBSDID("$FreeBSD$"); #include "kvm_private.h" +#ifdef __amd64__ +#define __OFFSET_BY_PCPU +#endif + static struct nlist kvm_pcpu_nl[] = { { .n_name = "_cpuid_to_pcpu" }, { .n_name = "_mp_maxcpus" }, { .n_name = "_mp_ncpus" }, +#ifdef __OFFSET_BY_PCPU + { .n_name = "___pcpu" }, +#endif { .n_name = NULL }, }; #define NL_CPUID_TO_PCPU 0 #define NL_MP_MAXCPUS 1 #define NL_MP_NCPUS 2 +#define NL___PCPU 3 /* * Kernel per-CPU data state. We cache this stuff on the first @@ -71,6 +79,9 @@ static struct nlist kvm_pcpu_nl[] = { static void **pcpu_data; static int maxcpu; static int mp_ncpus; +#ifdef __OFFSET_BY_PCPU +static unsigned long __pcpu; +#endif static int _kvm_pcpu_init(kvm_t *kd) @@ -103,6 +114,17 @@ _kvm_pcpu_init(kvm_t *kd) _kvm_err(kd, kd->program, "cannot read mp_ncpus"); return (-1); } +#ifdef __OFFSET_BY_PCPU + if (kvm_pcpu_nl[NL___PCPU].n_value == 0) { + _kvm_err(kd, kd->program, "unable to find __pcpu"); + return (-1); + } + if (kvm_read(kd, kvm_pcpu_nl[NL___PCPU].n_value, &__pcpu, + sizeof(__pcpu)) != sizeof(__pcpu)) { + _kvm_err(kd, kd->program, "cannot read __pcpu"); + return (-1); + } +#endif len = max * sizeof(void *); data = malloc(len); if (data == NULL) { @@ -329,6 +351,13 @@ kvm_read_zpcpu(kvm_t *kd, u_long base, void *buf, size if (!kvm_native(kd)) return (-1); + if (mp_ncpus == 0) + if (_kvm_pcpu_init(kd) < 0) + return (0); + +#ifdef __OFFSET_BY_PCPU + base += __pcpu; +#endif return (kvm_read(kd, (uintptr_t)(base + sizeof(struct pcpu) * cpu), buf, size)); } From owner-svn-src-all@freebsd.org Tue Oct 6 04:18:42 2020 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 D23E93F9D4A; Tue, 6 Oct 2020 04:18:42 +0000 (UTC) (envelope-from lwhsu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C543652dfz3dck; Tue, 6 Oct 2020 04:18:42 +0000 (UTC) (envelope-from lwhsu@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 918FC20C4B; Tue, 6 Oct 2020 04:18:42 +0000 (UTC) (envelope-from lwhsu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0964Ig0A069296; Tue, 6 Oct 2020 04:18:42 GMT (envelope-from lwhsu@FreeBSD.org) Received: (from lwhsu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0964Igjq069295; Tue, 6 Oct 2020 04:18:42 GMT (envelope-from lwhsu@FreeBSD.org) Message-Id: <202010060418.0964Igjq069295@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: lwhsu set sender to lwhsu@FreeBSD.org using -f From: Li-Wen Hsu Date: Tue, 6 Oct 2020 04:18:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366469 - head/tests/sys/kern X-SVN-Group: head X-SVN-Commit-Author: lwhsu X-SVN-Commit-Paths: head/tests/sys/kern X-SVN-Commit-Revision: 366469 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.33 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: Tue, 06 Oct 2020 04:18:42 -0000 Author: lwhsu Date: Tue Oct 6 04:18:42 2020 New Revision: 366469 URL: https://svnweb.freebsd.org/changeset/base/366469 Log: Clear the dmesg buffer to prevent rotating causes issues This is a workaround for the current continuously failing test case sys.kern.sonewconn_overflow.sonewconn_overflow_01 The side effect is the dmesg buffer got cleared and may effect other tests depends on dmesg output running in parallel. The better solution would be tailing the log file like /var/log/debug.log Sponsored by: The FreeBSD Foundation Modified: head/tests/sys/kern/sonewconn_overflow.py Modified: head/tests/sys/kern/sonewconn_overflow.py ============================================================================== --- head/tests/sys/kern/sonewconn_overflow.py Tue Oct 6 02:57:37 2020 (r366468) +++ head/tests/sys/kern/sonewconn_overflow.py Tue Oct 6 04:18:42 2020 (r366469) @@ -85,6 +85,8 @@ class UnixTest(GenericTest): class LogChecker(): def __init__(self): + # Clear the dmesg buffer to prevent rotating causes issues + os.system('/sbin/dmesg -c > /dev/null') # Figure out how big the dmesg buffer is. self.dmesgOff = len(check_output("/sbin/dmesg")) From owner-svn-src-all@freebsd.org Tue Oct 6 06:45:53 2020 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 946C142A704; Tue, 6 Oct 2020 06:45:53 +0000 (UTC) (envelope-from lwhsu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C57Jx3JQxz43M0; Tue, 6 Oct 2020 06:45:53 +0000 (UTC) (envelope-from lwhsu@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 5050D22368; Tue, 6 Oct 2020 06:45:53 +0000 (UTC) (envelope-from lwhsu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0966jrMR061208; Tue, 6 Oct 2020 06:45:53 GMT (envelope-from lwhsu@FreeBSD.org) Received: (from lwhsu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0966jqaO061204; Tue, 6 Oct 2020 06:45:52 GMT (envelope-from lwhsu@FreeBSD.org) Message-Id: <202010060645.0966jqaO061204@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: lwhsu set sender to lwhsu@FreeBSD.org using -f From: Li-Wen Hsu Date: Tue, 6 Oct 2020 06:45:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366470 - in head: share/mk tests/sys/capsicum X-SVN-Group: head X-SVN-Commit-Author: lwhsu X-SVN-Commit-Paths: in head: share/mk tests/sys/capsicum X-SVN-Commit-Revision: 366470 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.33 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: Tue, 06 Oct 2020 06:45:53 -0000 Author: lwhsu Date: Tue Oct 6 06:45:52 2020 New Revision: 366470 URL: https://svnweb.freebsd.org/changeset/base/366470 Log: Make capsicum test cases fine-grained Add a wrapping script to use ATF to run tests written with Googletest one by one. This helps locating and tracking the failing case in CI easier. This is a temporarily solution while Googletest support in Kyua is developing. We will revert this once Kyua+Googletest integration is ready. Reviewed by: emaste Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D25896 Added: head/tests/sys/capsicum/functional.sh (contents, props changed) Modified: head/share/mk/bsd.test.mk head/share/mk/googletest.test.mk head/tests/sys/capsicum/Makefile Modified: head/share/mk/bsd.test.mk ============================================================================== --- head/share/mk/bsd.test.mk Tue Oct 6 04:18:42 2020 (r366469) +++ head/share/mk/bsd.test.mk Tue Oct 6 06:45:52 2020 (r366470) @@ -62,10 +62,11 @@ TESTS_ENV+= LD_LIBRARY_PATH=${TESTS_LD_LIBRARY_PATH:tW _TESTS= # Pull in the definitions of all supported test interfaces. -.include .include .include .include +# Include atf last to let other test framework use it +.include # Sort the tests alphabetically, so the results are deterministically formed # across runs. Modified: head/share/mk/googletest.test.mk ============================================================================== --- head/share/mk/googletest.test.mk Tue Oct 6 04:18:42 2020 (r366469) +++ head/share/mk/googletest.test.mk Tue Oct 6 06:45:52 2020 (r366470) @@ -30,12 +30,18 @@ GTESTS?= .include PROGS_CXX+= ${GTESTS} -_TESTS+= ${GTESTS} .for _T in ${GTESTS} BINDIR.${_T}= ${TESTSDIR} CXXFLAGS.${_T}+= ${GTESTS_CXXFLAGS} MAN.${_T}?= # empty SRCS.${_T}?= ${_T}.cc +.if !empty(GTESTS_WRAPPER_SH.${_T}) +# A stopgap/workaround to let kyua execute test case one by one +ATF_TESTS_SH+= ${GTESTS_WRAPPER_SH.${_T}} +.else +_TESTS+= ${_T} TEST_INTERFACE.${_T}= plain +.endif + .endfor .endif Modified: head/tests/sys/capsicum/Makefile ============================================================================== --- head/tests/sys/capsicum/Makefile Tue Oct 6 04:18:42 2020 (r366469) +++ head/tests/sys/capsicum/Makefile Tue Oct 6 06:45:52 2020 (r366470) @@ -14,6 +14,7 @@ CFLAGS+= -I${SRCTOP}/tests .PATH: ${SRCTOP}/contrib/capsicum-test GTESTS+= capsicum-test +GTESTS_WRAPPER_SH.capsicum-test= functional SRCS.capsicum-test+= \ capsicum-test-main.cc \ @@ -50,6 +51,6 @@ BINMODE.mini-me.setuid= 4555 WARNS.capsicum-test= 3 -.endif +.endif # MK_GOOGLETEST .include Added: head/tests/sys/capsicum/functional.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/tests/sys/capsicum/functional.sh Tue Oct 6 06:45:52 2020 (r366470) @@ -0,0 +1,68 @@ +#- +# SPDX-License-Identifier: BSD-2-Clause-FreeBSD +# +# Copyright (c) 2020 The FreeBSD Foundation +# +# This software was developed by Li-Wen Hsu +# under sponsorship from the FreeBSD Foundation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +SRCDIR=$(atf_get_srcdir) +CAPSICUM_TEST_BIN=capsicum-test + +check() +{ + local tc=${1} + + atf_check -s exit:0 -o match:PASSED -e ignore \ + ${SRCDIR}/${CAPSICUM_TEST_BIN} --gtest_filter=${tc} +} + +add_testcase() +{ + local tc=${1} + local tc_escaped word + + tc_escaped=$(echo ${tc} | sed -e 's/\./__/') + + atf_test_case ${tc_escaped} + eval "${tc_escaped}_body() { check ${tc}; }" + atf_add_test_case ${tc_escaped} +} + +list_tests() +{ + ${SRCDIR}/${CAPSICUM_TEST_BIN} --gtest_list_tests | awk ' + /^[^ ]/ { CAT=$0 } + /^[ ]/ { print CAT $1}' +} + +atf_init_test_cases() +{ + local t + for t in `list_tests`; do + add_testcase $t + done +} From owner-svn-src-all@freebsd.org Tue Oct 6 08:05:20 2020 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 7F8BB42B751; Tue, 6 Oct 2020 08:05:20 +0000 (UTC) (envelope-from bapt@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C594c2rplz46g3; Tue, 6 Oct 2020 08:05:20 +0000 (UTC) (envelope-from bapt@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 41C7A23A8C; Tue, 6 Oct 2020 08:05:20 +0000 (UTC) (envelope-from bapt@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09685K5m009788; Tue, 6 Oct 2020 08:05:20 GMT (envelope-from bapt@FreeBSD.org) Received: (from bapt@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09685J6l009787; Tue, 6 Oct 2020 08:05:19 GMT (envelope-from bapt@FreeBSD.org) Message-Id: <202010060805.09685J6l009787@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bapt set sender to bapt@FreeBSD.org using -f From: Baptiste Daroussin Date: Tue, 6 Oct 2020 08:05:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366471 - head/usr.bin/backlight X-SVN-Group: head X-SVN-Commit-Author: bapt X-SVN-Commit-Paths: head/usr.bin/backlight X-SVN-Commit-Revision: 366471 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.33 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: Tue, 06 Oct 2020 08:05:20 -0000 Author: bapt Date: Tue Oct 6 08:05:19 2020 New Revision: 366471 URL: https://svnweb.freebsd.org/changeset/base/366471 Log: backlight: accept '%' in the brightness input value Improve friendlyness of the command line by accepting the percent brightness in both format: with or without a trailing '%' Reviewed by: manu Differential Revision: https://reviews.freebsd.org/D26692 Modified: head/usr.bin/backlight/backlight.8 head/usr.bin/backlight/backlight.c Modified: head/usr.bin/backlight/backlight.8 ============================================================================== --- head/usr.bin/backlight/backlight.8 Tue Oct 6 06:45:52 2020 (r366470) +++ head/usr.bin/backlight/backlight.8 Tue Oct 6 08:05:19 2020 (r366471) @@ -22,7 +22,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 02, 2020 +.Dd October 06, 2020 .Dt BACKLIGHT 8 .Os .Sh NAME @@ -63,6 +63,7 @@ When querying the brightness level only print the valu Query information about the backlight (name, type). .It Ar value Set the brightness level to this value, must be between 0 and 100. +A trailing '%' is valid. .It Ar incr | + .Op Ar value Decrement the backlight level. Modified: head/usr.bin/backlight/backlight.c ============================================================================== --- head/usr.bin/backlight/backlight.c Tue Oct 6 06:45:52 2020 (r366470) +++ head/usr.bin/backlight/backlight.c Tue Oct 6 08:05:19 2020 (r366471) @@ -144,6 +144,9 @@ main(int argc, char *argv[]) action = BACKLIGHT_SET_BRIGHTNESS; if (argc == 1) { + /* ignore a trailing % for user friendlyness */ + if (argv[0][strlen(argv[0]) - 1] == '%') + argv[0][strlen(argv[0]) - 1] = '\0'; percent = strtonum(argv[0], 0, 100, &percent_error); if (percent_error) errx(1, "Cannot parse brightness level %s: %s", From owner-svn-src-all@freebsd.org Tue Oct 6 08:06:57 2020 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 1626042C039; Tue, 6 Oct 2020 08:06:57 +0000 (UTC) (envelope-from hps@selasky.org) Received: from mail.turbocat.net (turbocat.net [IPv6:2a01:4f8:c17:6c4b::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4C596S574Bz46wj; Tue, 6 Oct 2020 08:06:56 +0000 (UTC) (envelope-from hps@selasky.org) Received: from hps2020.home.selasky.org (120.89-11-192.nextgentel.com [89.11.192.120]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mail.turbocat.net (Postfix) with ESMTPSA id 7AD082602B9; Tue, 6 Oct 2020 10:06:48 +0200 (CEST) Subject: Re: svn commit: r366471 - head/usr.bin/backlight To: Baptiste Daroussin , src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org References: <202010060805.09685J6l009787@repo.freebsd.org> From: Hans Petter Selasky Message-ID: Date: Tue, 6 Oct 2020 10:06:13 +0200 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <202010060805.09685J6l009787@repo.freebsd.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 4C596S574Bz46wj X-Spamd-Bar: ---- Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:24940, ipnet:2a01:4f8::/29, country:DE] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Tue, 06 Oct 2020 08:06:57 -0000 On 2020-10-06 10:05, Baptiste Daroussin wrote: > Author: bapt > Date: Tue Oct 6 08:05:19 2020 > New Revision: 366471 > URL: https://svnweb.freebsd.org/changeset/base/366471 > > Log: > backlight: accept '%' in the brightness input value > > Improve friendlyness of the command line by accepting the percent brightness > in both format: with or without a trailing '%' > > Reviewed by: manu > Differential Revision: https://reviews.freebsd.org/D26692 > > Modified: > head/usr.bin/backlight/backlight.8 > head/usr.bin/backlight/backlight.c > > Modified: head/usr.bin/backlight/backlight.8 > ============================================================================== > --- head/usr.bin/backlight/backlight.8 Tue Oct 6 06:45:52 2020 (r366470) > +++ head/usr.bin/backlight/backlight.8 Tue Oct 6 08:05:19 2020 (r366471) > @@ -22,7 +22,7 @@ > .\" > .\" $FreeBSD$ > .\" > -.Dd October 02, 2020 > +.Dd October 06, 2020 > .Dt BACKLIGHT 8 > .Os > .Sh NAME > @@ -63,6 +63,7 @@ When querying the brightness level only print the valu > Query information about the backlight (name, type). > .It Ar value > Set the brightness level to this value, must be between 0 and 100. > +A trailing '%' is valid. > .It Ar incr | + > .Op Ar value > Decrement the backlight level. > > Modified: head/usr.bin/backlight/backlight.c > ============================================================================== > --- head/usr.bin/backlight/backlight.c Tue Oct 6 06:45:52 2020 (r366470) > +++ head/usr.bin/backlight/backlight.c Tue Oct 6 08:05:19 2020 (r366471) > @@ -144,6 +144,9 @@ main(int argc, char *argv[]) > action = BACKLIGHT_SET_BRIGHTNESS; > > if (argc == 1) { > + /* ignore a trailing % for user friendlyness */ > + if (argv[0][strlen(argv[0]) - 1] == '%') > + argv[0][strlen(argv[0]) - 1] = '\0'; > percent = strtonum(argv[0], 0, 100, &percent_error); > if (percent_error) > errx(1, "Cannot parse brightness level %s: %s", > Should there be a check here that strlen(xxx) > 0 ? --HPS From owner-svn-src-all@freebsd.org Tue Oct 6 08:18:10 2020 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 8F4B942C588; Tue, 6 Oct 2020 08:18:10 +0000 (UTC) (envelope-from bapt@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C59MQ372Gz47fr; Tue, 6 Oct 2020 08:18:10 +0000 (UTC) (envelope-from bapt@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 49C8C238D6; Tue, 6 Oct 2020 08:18:10 +0000 (UTC) (envelope-from bapt@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0968IANS016329; Tue, 6 Oct 2020 08:18:10 GMT (envelope-from bapt@FreeBSD.org) Received: (from bapt@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0968IABV016328; Tue, 6 Oct 2020 08:18:10 GMT (envelope-from bapt@FreeBSD.org) Message-Id: <202010060818.0968IABV016328@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bapt set sender to bapt@FreeBSD.org using -f From: Baptiste Daroussin Date: Tue, 6 Oct 2020 08:18:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366472 - head/usr.bin/backlight X-SVN-Group: head X-SVN-Commit-Author: bapt X-SVN-Commit-Paths: head/usr.bin/backlight X-SVN-Commit-Revision: 366472 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.33 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: Tue, 06 Oct 2020 08:18:10 -0000 Author: bapt Date: Tue Oct 6 08:18:09 2020 New Revision: 366472 URL: https://svnweb.freebsd.org/changeset/base/366472 Log: backlight: check the lenght if the input before trimming '%' Reported by: hps Reviewed by: manu Differential Revision: https://reviews.freebsd.org/D26693 Modified: head/usr.bin/backlight/backlight.c Modified: head/usr.bin/backlight/backlight.c ============================================================================== --- head/usr.bin/backlight/backlight.c Tue Oct 6 08:05:19 2020 (r366471) +++ head/usr.bin/backlight/backlight.c Tue Oct 6 08:18:09 2020 (r366472) @@ -145,7 +145,8 @@ main(int argc, char *argv[]) if (argc == 1) { /* ignore a trailing % for user friendlyness */ - if (argv[0][strlen(argv[0]) - 1] == '%') + if (strlen(argv[0]) > 0 && + argv[0][strlen(argv[0]) - 1] == '%') argv[0][strlen(argv[0]) - 1] = '\0'; percent = strtonum(argv[0], 0, 100, &percent_error); if (percent_error) From owner-svn-src-all@freebsd.org Tue Oct 6 09:28:25 2020 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 E2BB642D8FF; Tue, 6 Oct 2020 09:28:25 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5BwT4l2gz4DVL; Tue, 6 Oct 2020 09:28:25 +0000 (UTC) (envelope-from kib@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 6BBB6247BF; Tue, 6 Oct 2020 09:28:25 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0969SPDm059191; Tue, 6 Oct 2020 09:28:25 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0969SP1c059189; Tue, 6 Oct 2020 09:28:25 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010060928.0969SP1c059189@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Tue, 6 Oct 2020 09:28:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366473 - in stable/12/sys: amd64/include x86/include X-SVN-Group: stable-12 X-SVN-Commit-Author: kib X-SVN-Commit-Paths: in stable/12/sys: amd64/include x86/include X-SVN-Commit-Revision: 366473 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.33 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: Tue, 06 Oct 2020 09:28:26 -0000 Author: kib Date: Tue Oct 6 09:28:24 2020 New Revision: 366473 URL: https://svnweb.freebsd.org/changeset/base/366473 Log: MFC r366415: Move ctx_switch_xsave declaration to amd64 md_var.h. Modified: stable/12/sys/amd64/include/md_var.h stable/12/sys/x86/include/x86_var.h Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/amd64/include/md_var.h ============================================================================== --- stable/12/sys/amd64/include/md_var.h Tue Oct 6 08:18:09 2020 (r366472) +++ stable/12/sys/amd64/include/md_var.h Tue Oct 6 09:28:24 2020 (r366473) @@ -37,6 +37,7 @@ #include extern uint64_t *vm_page_dump; +extern char ctx_switch_xsave[]; extern int hw_lower_amd64_sharedpage; extern int hw_ibrs_disable; extern int hw_ssb_disable; Modified: stable/12/sys/x86/include/x86_var.h ============================================================================== --- stable/12/sys/x86/include/x86_var.h Tue Oct 6 08:18:09 2020 (r366472) +++ stable/12/sys/x86/include/x86_var.h Tue Oct 6 09:28:24 2020 (r366473) @@ -67,7 +67,6 @@ extern u_int cpu_mon_mwait_flags; extern u_int cpu_mon_min_size; extern u_int cpu_mon_max_size; extern u_int cpu_maxphyaddr; -extern char ctx_switch_xsave[]; extern u_int hv_high; extern char hv_vendor[]; extern char kstack[]; From owner-svn-src-all@freebsd.org Tue Oct 6 09:51:41 2020 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 8A7C142E650; Tue, 6 Oct 2020 09:51:41 +0000 (UTC) (envelope-from tuexen@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5CRK3Fghz4FtJ; Tue, 6 Oct 2020 09:51:41 +0000 (UTC) (envelope-from tuexen@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 5446424D1B; Tue, 6 Oct 2020 09:51:41 +0000 (UTC) (envelope-from tuexen@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0969pftT072354; Tue, 6 Oct 2020 09:51:41 GMT (envelope-from tuexen@FreeBSD.org) Received: (from tuexen@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0969pfpN072353; Tue, 6 Oct 2020 09:51:41 GMT (envelope-from tuexen@FreeBSD.org) Message-Id: <202010060951.0969pfpN072353@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tuexen set sender to tuexen@FreeBSD.org using -f From: Michael Tuexen Date: Tue, 6 Oct 2020 09:51:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366474 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: tuexen X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366474 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.33 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: Tue, 06 Oct 2020 09:51:41 -0000 Author: tuexen Date: Tue Oct 6 09:51:40 2020 New Revision: 366474 URL: https://svnweb.freebsd.org/changeset/base/366474 Log: Whitespace changes. MFC after: 3 days Modified: head/sys/netinet/sctp_input.c Modified: head/sys/netinet/sctp_input.c ============================================================================== --- head/sys/netinet/sctp_input.c Tue Oct 6 09:28:24 2020 (r366473) +++ head/sys/netinet/sctp_input.c Tue Oct 6 09:51:40 2020 (r366474) @@ -1510,7 +1510,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphle * ----INIT-ACK(tag=t)--> * ----INIT(tag=t)------> *1 * <---INIT-ACK(tag=a)--- - * <----CE(tag=t)------------- *2 + * <----CE(tag=t)------------- *2 * * At point *1 we should be generating a different * tag t'. Which means we would throw away the CE and send @@ -1741,8 +1741,7 @@ sctp_process_cookie_existing(struct mbuf *m, int iphle if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) && (!SCTP_IS_LISTENING(inp))) { - stcb->sctp_ep->sctp_flags |= - SCTP_PCB_FLAGS_CONNECTED; + stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; soisconnected(stcb->sctp_socket); } if (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED) From owner-svn-src-all@freebsd.org Tue Oct 6 10:35:04 2020 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 3F99442EEE6; Tue, 6 Oct 2020 10:35:04 +0000 (UTC) (envelope-from manu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5DPN0nYzz4JXw; Tue, 6 Oct 2020 10:35:04 +0000 (UTC) (envelope-from manu@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 EE37025614; Tue, 6 Oct 2020 10:35:03 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096AZ3fK002278; Tue, 6 Oct 2020 10:35:03 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096AZ37t002277; Tue, 6 Oct 2020 10:35:03 GMT (envelope-from manu@FreeBSD.org) Message-Id: <202010061035.096AZ37t002277@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Tue, 6 Oct 2020 10:35:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366475 - head/sys/compat/linuxkpi/common/include/linux X-SVN-Group: head X-SVN-Commit-Author: manu X-SVN-Commit-Paths: head/sys/compat/linuxkpi/common/include/linux X-SVN-Commit-Revision: 366475 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.33 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: Tue, 06 Oct 2020 10:35:04 -0000 Author: manu Date: Tue Oct 6 10:35:03 2020 New Revision: 366475 URL: https://svnweb.freebsd.org/changeset/base/366475 Log: linuxkpi: Add gcd function This compute the common greater divider Taken from OpenBSD Reviewed by: bz, imp Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26674 Added: head/sys/compat/linuxkpi/common/include/linux/gcd.h (contents, props changed) Added: head/sys/compat/linuxkpi/common/include/linux/gcd.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/include/linux/gcd.h Tue Oct 6 10:35:03 2020 (r366475) @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_GCD_H_ +#define _LINUX_GCD_H_ + +static inline unsigned long +gcd(unsigned long a, unsigned long b) +{ + unsigned long c; + + c = a % b; + while (c != 0) { + a = b; + b = c; + c = a % b; + } + + return (b); +} + +#endif From owner-svn-src-all@freebsd.org Tue Oct 6 10:36:17 2020 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 0F48942EEFA; Tue, 6 Oct 2020 10:36:17 +0000 (UTC) (envelope-from manu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5DQm67t3z4Jhk; Tue, 6 Oct 2020 10:36:16 +0000 (UTC) (envelope-from manu@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 B626425615; Tue, 6 Oct 2020 10:36:16 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096AaGal002376; Tue, 6 Oct 2020 10:36:16 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096AaGMq002375; Tue, 6 Oct 2020 10:36:16 GMT (envelope-from manu@FreeBSD.org) Message-Id: <202010061036.096AaGMq002375@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Tue, 6 Oct 2020 10:36:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366476 - head/sys/compat/linuxkpi/common/include/linux X-SVN-Group: head X-SVN-Commit-Author: manu X-SVN-Commit-Paths: head/sys/compat/linuxkpi/common/include/linux X-SVN-Commit-Revision: 366476 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.33 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: Tue, 06 Oct 2020 10:36:17 -0000 Author: manu Date: Tue Oct 6 10:36:16 2020 New Revision: 366476 URL: https://svnweb.freebsd.org/changeset/base/366476 Log: linuxkpi: Add numa.h Only contain NUMA_NO_NODE needed by drm Reviewed by: bz Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26676 Added: head/sys/compat/linuxkpi/common/include/linux/numa.h (contents, props changed) Added: head/sys/compat/linuxkpi/common/include/linux/numa.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/include/linux/numa.h Tue Oct 6 10:36:16 2020 (r366476) @@ -0,0 +1,36 @@ +/*- + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Emmanuel Vadot under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_NUMA_H_ +#define _LINUX_NUMA_H_ + +#define NUMA_NO_NODE -1 + +#endif /* _LINUX_NUMA_H_ */ From owner-svn-src-all@freebsd.org Tue Oct 6 10:37:22 2020 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 2982542F1D5; Tue, 6 Oct 2020 10:37:22 +0000 (UTC) (envelope-from manu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5DS15rW0z4JdY; Tue, 6 Oct 2020 10:37:21 +0000 (UTC) (envelope-from manu@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 ABC3B2553C; Tue, 6 Oct 2020 10:37:21 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096AbLl0002478; Tue, 6 Oct 2020 10:37:21 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096AbLlu002477; Tue, 6 Oct 2020 10:37:21 GMT (envelope-from manu@FreeBSD.org) Message-Id: <202010061037.096AbLlu002477@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Tue, 6 Oct 2020 10:37:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366477 - head/sys/compat/linuxkpi/common/include/linux X-SVN-Group: head X-SVN-Commit-Author: manu X-SVN-Commit-Paths: head/sys/compat/linuxkpi/common/include/linux X-SVN-Commit-Revision: 366477 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.33 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: Tue, 06 Oct 2020 10:37:22 -0000 Author: manu Date: Tue Oct 6 10:37:21 2020 New Revision: 366477 URL: https://svnweb.freebsd.org/changeset/base/366477 Log: linuxkpi: Add prefetch.h Only add prefetchw as it is the only function used by drm. Simply use the __builtin_prefetch which is available in all compiler for a long time. Reviewed by: bz Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26677 Added: head/sys/compat/linuxkpi/common/include/linux/prefetch.h (contents, props changed) Added: head/sys/compat/linuxkpi/common/include/linux/prefetch.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/include/linux/prefetch.h Tue Oct 6 10:37:21 2020 (r366477) @@ -0,0 +1,36 @@ +/*- + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Emmanuel Vadot under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_PREFETCH_H_ +#define _LINUX_PREFETCH_H_ + +#define prefetchw(x) __builtin_prefetch(x,1) + +#endif /* _LINUX_PREFETCH_H_ */ From owner-svn-src-all@freebsd.org Tue Oct 6 10:39:41 2020 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 5315542F4B3; Tue, 6 Oct 2020 10:39:41 +0000 (UTC) (envelope-from manu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5DVj1ZNPz4Jq1; Tue, 6 Oct 2020 10:39:41 +0000 (UTC) (envelope-from manu@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 19185253E1; Tue, 6 Oct 2020 10:39:41 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096AdegB002628; Tue, 6 Oct 2020 10:39:40 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096AdeLG002627; Tue, 6 Oct 2020 10:39:40 GMT (envelope-from manu@FreeBSD.org) Message-Id: <202010061039.096AdeLG002627@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Tue, 6 Oct 2020 10:39:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366478 - head/sys/compat/linuxkpi/common/include/linux X-SVN-Group: head X-SVN-Commit-Author: manu X-SVN-Commit-Paths: head/sys/compat/linuxkpi/common/include/linux X-SVN-Commit-Revision: 366478 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.33 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: Tue, 06 Oct 2020 10:39:41 -0000 Author: manu Date: Tue Oct 6 10:39:40 2020 New Revision: 366478 URL: https://svnweb.freebsd.org/changeset/base/366478 Log: linuxkpi: Add power_supply.h Add power_supply_is_system_supplied which is needed by drm. Reviewed by: bz Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26679 Added: head/sys/compat/linuxkpi/common/include/linux/power_supply.h (contents, props changed) Added: head/sys/compat/linuxkpi/common/include/linux/power_supply.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/include/linux/power_supply.h Tue Oct 6 10:39:40 2020 (r366478) @@ -0,0 +1,44 @@ +/*- + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Emmanuel Vadot under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_POWER_SUPPLY_H_ +#define _LINUX_POWER_SUPPLY_H_ + +#include +#include + +static inline int +power_supply_is_system_supplied(void) +{ + + return (power_profile_get_state() == POWER_PROFILE_PERFORMANCE); +} + +#endif From owner-svn-src-all@freebsd.org Tue Oct 6 10:41:01 2020 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 6D61242F53F; Tue, 6 Oct 2020 10:41:01 +0000 (UTC) (envelope-from manu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5DXF2JtFz4JwD; Tue, 6 Oct 2020 10:41:01 +0000 (UTC) (envelope-from manu@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 32A60255B0; Tue, 6 Oct 2020 10:41:01 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096Af1Se003517; Tue, 6 Oct 2020 10:41:01 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096Af16f003516; Tue, 6 Oct 2020 10:41:01 GMT (envelope-from manu@FreeBSD.org) Message-Id: <202010061041.096Af16f003516@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Tue, 6 Oct 2020 10:41:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366479 - head/sys/compat/linuxkpi/common/include/linux X-SVN-Group: head X-SVN-Commit-Author: manu X-SVN-Commit-Paths: head/sys/compat/linuxkpi/common/include/linux X-SVN-Commit-Revision: 366479 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.33 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: Tue, 06 Oct 2020 10:41:01 -0000 Author: manu Date: Tue Oct 6 10:41:00 2020 New Revision: 366479 URL: https://svnweb.freebsd.org/changeset/base/366479 Log: linuxkpi: Add pagemap.h Add release_pages needed by drm which simply calls put_page for all the pages provided Reviewed by: bz Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26680 Added: head/sys/compat/linuxkpi/common/include/linux/pagemap.h (contents, props changed) Added: head/sys/compat/linuxkpi/common/include/linux/pagemap.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/include/linux/pagemap.h Tue Oct 6 10:41:00 2020 (r366479) @@ -0,0 +1,45 @@ +/*- + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Emmanuel Vadot under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_PAGEMAP_H_ +#define _LINUX_PAGEMAP_H_ + +#include + +static inline void +release_pages(struct page **pages, int nr) +{ + int i; + + for (i = 0; i < nr; i++) + put_page(pages[i]); +} + +#endif From owner-svn-src-all@freebsd.org Tue Oct 6 10:41:06 2020 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 2160B42F440; Tue, 6 Oct 2020 10:41:05 +0000 (UTC) (envelope-from tuexen@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5DXK3hxXz4KJM; Tue, 6 Oct 2020 10:41:05 +0000 (UTC) (envelope-from tuexen@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 5DB1D2561A; Tue, 6 Oct 2020 10:41:05 +0000 (UTC) (envelope-from tuexen@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096Af5C1003567; Tue, 6 Oct 2020 10:41:05 GMT (envelope-from tuexen@FreeBSD.org) Received: (from tuexen@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096Af51g003566; Tue, 6 Oct 2020 10:41:05 GMT (envelope-from tuexen@FreeBSD.org) Message-Id: <202010061041.096Af51g003566@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tuexen set sender to tuexen@FreeBSD.org using -f From: Michael Tuexen Date: Tue, 6 Oct 2020 10:41:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366480 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: tuexen X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366480 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.33 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: Tue, 06 Oct 2020 10:41:06 -0000 Author: tuexen Date: Tue Oct 6 10:41:04 2020 New Revision: 366480 URL: https://svnweb.freebsd.org/changeset/base/366480 Log: Cleanup, no functional change intended. MFC after: 3 days Modified: head/sys/netinet/sctp_usrreq.c Modified: head/sys/netinet/sctp_usrreq.c ============================================================================== --- head/sys/netinet/sctp_usrreq.c Tue Oct 6 10:41:00 2020 (r366479) +++ head/sys/netinet/sctp_usrreq.c Tue Oct 6 10:41:04 2020 (r366480) @@ -3077,43 +3077,27 @@ flags_out: break; } case SCTP_RECVRCVINFO: - { - int onoff; - - if (*optsize < sizeof(int)) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); - error = EINVAL; - } else { - SCTP_INP_RLOCK(inp); - onoff = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVRCVINFO); - SCTP_INP_RUNLOCK(inp); - } - if (error == 0) { - /* return the option value */ - *(int *)optval = onoff; - *optsize = sizeof(int); - } - break; + if (*optsize < sizeof(int)) { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + error = EINVAL; + } else { + SCTP_INP_RLOCK(inp); + *(int *)optval = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVRCVINFO); + SCTP_INP_RUNLOCK(inp); + *optsize = sizeof(int); } + break; case SCTP_RECVNXTINFO: - { - int onoff; - - if (*optsize < sizeof(int)) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); - error = EINVAL; - } else { - SCTP_INP_RLOCK(inp); - onoff = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO); - SCTP_INP_RUNLOCK(inp); - } - if (error == 0) { - /* return the option value */ - *(int *)optval = onoff; - *optsize = sizeof(int); - } - break; + if (*optsize < sizeof(int)) { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + error = EINVAL; + } else { + SCTP_INP_RLOCK(inp); + *(int *)optval = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO); + SCTP_INP_RUNLOCK(inp); + *optsize = sizeof(int); } + break; case SCTP_DEFAULT_SNDINFO: { struct sctp_sndinfo *info; From owner-svn-src-all@freebsd.org Tue Oct 6 10:51:47 2020 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 CFB8D42F895; Tue, 6 Oct 2020 10:51:47 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Dmg55M9z4Khs; Tue, 6 Oct 2020 10:51:47 +0000 (UTC) (envelope-from gbe@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 92296257AF; Tue, 6 Oct 2020 10:51:47 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096Aplcw011401; Tue, 6 Oct 2020 10:51:47 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096AplSk011400; Tue, 6 Oct 2020 10:51:47 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010061051.096AplSk011400@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Tue, 6 Oct 2020 10:51:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366481 - head/share/man/man3 X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/share/man/man3 X-SVN-Commit-Revision: 366481 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.33 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: Tue, 06 Oct 2020 10:51:47 -0000 Author: gbe (doc committer) Date: Tue Oct 6 10:51:47 2020 New Revision: 366481 URL: https://svnweb.freebsd.org/changeset/base/366481 Log: intro(3): Update the list of included libraries - Extend the list of main libraries of section 3 - Extend the library functions that are included in the libc MFC after: 2 weeks Submitted by: Naga Chaitanya Vellanki Approved by: gbe Differential Revision: https://reviews.freebsd.org/D26476 Modified: head/share/man/man3/intro.3 Modified: head/share/man/man3/intro.3 ============================================================================== --- head/share/man/man3/intro.3 Tue Oct 6 10:41:04 2020 (r366480) +++ head/share/man/man3/intro.3 Tue Oct 6 10:51:47 2020 (r366481) @@ -28,12 +28,17 @@ .\" @(#)intro.3 8.1 (Berkeley) 6/5/93 .\" $FreeBSD$ .\" -.Dd March 22, 2017 +.Dd October 6, 2020 .Dt INTRO 3 .Os .Sh NAME .Nm intro .Nd introduction to the C libraries +.Sh SYNOPSIS +.Nm cc +.Op Ar flags +.Ar +.Op Fl llibrary .Sh DESCRIPTION This section provides an overview of the C library functions, their error returns and other @@ -47,7 +52,11 @@ must be indicated at compile time with the option of the compiler. .Pp The various libraries (followed by the loader flag): -.Bl -tag -width "libc (-lc)" +.Bl -tag -width "libbluetooth (-lbluetooth)" +.It Em libbluetooth Pq Fl l Ns Ar bluetooth +The bluetooth library. +See +.Xr bluetooth 3 . .It Em libc Pq Fl l Ns Ar c Standard C library functions. When using the C compiler @@ -57,21 +66,58 @@ to supply the loader flag .Fl l Ns Ar c for these functions. There are several `libraries' or groups of functions included inside of -.Em libc -: the standard -.Tn I/O -routines, -database routines, -bit operators, -string operators, -character tests and character operators, -des encryption routines, -storage allocation, time functions, signal handling and more. +.Em libc : +.Bl -tag -width "XXXXXX" +.It standard I/O routines +see +.Xr stdio 3 +.It database routines +see +.Xr db 3 +.It bit operators +see +.Xr bitstring 3 +.It string operators +see +.Xr string 3 +.It character tests and character operators +.It storage allocation +see +.Xr mpool 3 +.It regular-expressions +see +.Xr regex 3 +.It remote procedure calls (RPC) +see +.Xr rpc 3 +.It time functions +see +.Xr time 3 +.It signal handling +see +.Xr signal 3 +.El +.It Em libcalendar Pq Fl l Ns Ar calendar +The calendar arithmetic library. +See +.Xr calendar 3 . +.It Em libcam Pq Fl l Ns Ar cam +The common access method user library. +See +.Xr cam 3 . +.It Em libcrypt Pq Fl l Ns Ar crypt +The crypt library. +See +.Xr crypt 3 . .It Em libcurses Pq Fl l Ns Ar curses Fl l Ns Ar termcap Terminal independent screen management routines for two dimensional non-bitmap display terminals. -(See -.Xr ncurses 3 . ) +See +.Xr ncurses 3 . +.It Em libcuse Pq Fl l Ns Ar cuse +The userland character device library. +See +.Xr cuse 3 . .It Em libcompat Pq Fl l Ns Ar compat Functions which are obsolete but are available for compatibility with .Bx 4.3 . @@ -82,32 +128,106 @@ have been included for source code compatibility. Use of these routines should, for the most part, be avoided. The manual page entry for each compatibility routine indicates the proper interface to use. +.It Em libdevinfo Pq Fl l Ns Ar devinfo +The Device and Resource Information Utility library. +See +.Xr devinfo 3 . +.It Em libdevstat Pq Fl l Ns Ar devstat +The Device Statistics library. +See +.Xr devstat 3 . +.It Em libdwarf Pq Fl l Ns Ar dwarf +The DWARF access library. +See +.Xr dwarf 3 . +.It Em libelf Pq Fl l Ns Ar elf +The ELF access library. +See +.Xr elf 3 . +.It Em libfetch Pq Fl l Ns Ar fetch +The file transfer library. +See +.Xr fetch 3 . +.It Em libfigpar Pq Fl l Ns Ar figpar +The configuration file parsing library. +See +.Xr figpar 3 . +.It Em libgpio Pq Fl l Ns Ar gpio +The general-purpose input output library (GPIO). +See +.Xr gpio 3 . +.It Em libgssapi Pq Fl l Ns Ar gssapi +The generic security service application programming +interface. +See +.Xr gssapi 3 . +.It Em libjail Pq Fl l Ns Ar jail +The jail library. +See +.Xr jail 3 . .It Em libkvm Pq Fl l Ns Ar kvm Functions used to access kernel memory are in this library. They can be used against both a running system and a crash dump. -(See -.Xr kvm 3 . ) +See +.Xr kvm 3 . .It Em libl Pq Fl l Ns Ar l The library for .Xr lex 1 . .It Em libm Pq Fl l Ns Ar m -The math library, -.Em libm . -The math library is loaded as needed by the Pascal compiler, -but not by the C compiler which requires the -.Fl l Ns Ar m -flag. -(See -.Xr math 3 . ) +The math library. +See +.Xr math 3 . +.It Em libmd Pq Fl l Ns Ar md +The message digest library. +See +.Xr md4 3 , +.Xr md5 3 , +.Xr sha 3 , +.Xr sha256 3 , +.Xr sha512 3 , +.Xr ripemd 3 , +.Xr skein 3 . .It Em libmp Pq Fl l Ns Ar mp +.It Em libpam Pq Fl l Ns Ar pam +The pluggable authentication module library. +See +.Xr pam 3 . +.It Em libpcap Pq Fl l Ns Ar pcap +The packet capture library. +See +.Xr pcap 3 . +.It Em libpmc Pq Fl l Ns Ar pmc +The performance counters library. +See +.Xr pmc 3 . +.It Em libpthread Pq Fl l Ns Ar pthread +The POSIX threads library. +See +.Xr pthread 3 . +.It Em libsysdecode Pq Fl l Ns Ar sysdecode +The system argument decoding library. +See +.Xr sysdecode 3 . .It Em libtermcap Pq Fl l Ns Ar termcap The terminal independent operation library package. -(See -.Xr termcap 3 . ) +See +.Xr termcap 3 . +.It Em libusb Pq Fl l Ns Ar usb +The USB access library. +See +.Xr usb 3 . +.It Em libvgl Pq Fl l Ns Ar vgl +The video graphics library. +See +.Xr vgl 3 . .It Em liby Pq Fl l Ns Ar y The library for .Xr yacc 1 . +.It Em libz Pq Fl l Ns Ar z +The general-purpose data compression library. +See +.Xr zlib 3 . .El .Sh FILES .Bl -tag -width /usr/lib/libm_p.a -compact From owner-svn-src-all@freebsd.org Tue Oct 6 11:08:54 2020 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 1284342FD77; Tue, 6 Oct 2020 11:08:54 +0000 (UTC) (envelope-from tuexen@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5F8P6frrz4Lvt; Tue, 6 Oct 2020 11:08:53 +0000 (UTC) (envelope-from tuexen@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 C380625D8A; Tue, 6 Oct 2020 11:08:53 +0000 (UTC) (envelope-from tuexen@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096B8rKd020953; Tue, 6 Oct 2020 11:08:53 GMT (envelope-from tuexen@FreeBSD.org) Received: (from tuexen@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096B8rbo020950; Tue, 6 Oct 2020 11:08:53 GMT (envelope-from tuexen@FreeBSD.org) Message-Id: <202010061108.096B8rbo020950@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tuexen set sender to tuexen@FreeBSD.org using -f From: Michael Tuexen Date: Tue, 6 Oct 2020 11:08:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366482 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: tuexen X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366482 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.33 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: Tue, 06 Oct 2020 11:08:54 -0000 Author: tuexen Date: Tue Oct 6 11:08:52 2020 New Revision: 366482 URL: https://svnweb.freebsd.org/changeset/base/366482 Log: Remove dead stores reported by clang static code analysis MFC after: 3 days Modified: head/sys/netinet/sctp_input.c head/sys/netinet/sctp_output.c head/sys/netinet/sctp_pcb.c head/sys/netinet/sctputil.c Modified: head/sys/netinet/sctp_input.c ============================================================================== --- head/sys/netinet/sctp_input.c Tue Oct 6 10:51:47 2020 (r366481) +++ head/sys/netinet/sctp_input.c Tue Oct 6 11:08:52 2020 (r366482) @@ -4116,7 +4116,6 @@ sctp_handle_packet_dropped(struct sctp_pktdrop_chunk * struct sctp_idata_chunk *idata_chunk; uint32_t bottle_bw, on_queue; uint32_t offset, chk_len; - uint16_t trunc_len; uint16_t pktdrp_len; uint8_t pktdrp_flags; @@ -4126,13 +4125,10 @@ sctp_handle_packet_dropped(struct sctp_pktdrop_chunk * pktdrp_len = ntohs(cp->ch.chunk_length); KASSERT(limit <= pktdrp_len, ("Inconsistent limit")); if (pktdrp_flags & SCTP_PACKET_TRUNCATED) { - trunc_len = ntohs(cp->trunc_len); - if (trunc_len <= pktdrp_len - sizeof(struct sctp_pktdrop_chunk)) { + if (ntohs(cp->trunc_len) <= pktdrp_len - sizeof(struct sctp_pktdrop_chunk)) { /* The peer plays games with us. */ return; } - } else { - trunc_len = 0; } limit -= sizeof(struct sctp_pktdrop_chunk); offset = 0; Modified: head/sys/netinet/sctp_output.c ============================================================================== --- head/sys/netinet/sctp_output.c Tue Oct 6 10:51:47 2020 (r366481) +++ head/sys/netinet/sctp_output.c Tue Oct 6 11:08:52 2020 (r366482) @@ -8793,7 +8793,7 @@ no_data_fill: * the top of the for, but just to make sure * I will reset these again here. */ - ctl_cnt = bundle_at = 0; + ctl_cnt = 0; continue; /* This takes us back to the * for() for the nets. */ } else { @@ -9392,7 +9392,7 @@ sctp_chunk_retransmission(struct sctp_inpcb *inp, uint32_t dmtu = 0; SCTP_TCB_LOCK_ASSERT(stcb); - tmr_started = ctl_cnt = bundle_at = error = 0; + tmr_started = ctl_cnt = 0; no_fragmentflg = 1; fwd_tsn = 0; *cnt_out = 0; Modified: head/sys/netinet/sctp_pcb.c ============================================================================== --- head/sys/netinet/sctp_pcb.c Tue Oct 6 10:51:47 2020 (r366481) +++ head/sys/netinet/sctp_pcb.c Tue Oct 6 11:08:52 2020 (r366482) @@ -4345,7 +4345,7 @@ sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockadd LIST_INSERT_HEAD(head, stcb, sctp_asocs); SCTP_INP_INFO_WUNLOCK(); - if ((err = sctp_add_remote_addr(stcb, firstaddr, NULL, port, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC))) { + if (sctp_add_remote_addr(stcb, firstaddr, NULL, port, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC)) { /* failure.. memory error? */ if (asoc->strmout) { SCTP_FREE(asoc->strmout, SCTP_M_STRMO); Modified: head/sys/netinet/sctputil.c ============================================================================== --- head/sys/netinet/sctputil.c Tue Oct 6 10:51:47 2020 (r366481) +++ head/sys/netinet/sctputil.c Tue Oct 6 11:08:52 2020 (r366482) @@ -1725,7 +1725,6 @@ sctp_timeout_handler(void *t) net = (struct sctp_nets *)tmr->net; CURVNET_SET((struct vnet *)tmr->vnet); NET_EPOCH_ENTER(et); - did_output = 1; released_asoc_reference = false; #ifdef SCTP_AUDITING_ENABLED @@ -1994,7 +1993,6 @@ sctp_timeout_handler(void *t) op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), "Shutdown guard timer expired"); sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); - did_output = true; /* no need to unlock on tcb its gone */ goto out_decr; case SCTP_TIMER_TYPE_AUTOCLOSE: @@ -2071,7 +2069,6 @@ sctp_timeout_handler(void *t) #ifdef INVARIANTS panic("Unknown timer type %d", type); #else - did_output = false; goto out; #endif } @@ -2155,7 +2152,6 @@ sctp_timer_start(int t_type, struct sctp_inpcb *inp, s ("sctp_timer_start of type %d: inp = %p, stcb->sctp_ep %p", t_type, stcb, stcb->sctp_ep)); tmr = NULL; - to_ticks = 0; if (stcb != NULL) { SCTP_TCB_LOCK_ASSERT(stcb); } else if (inp != NULL) { From owner-svn-src-all@freebsd.org Tue Oct 6 11:29:09 2020 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 CE52B430565; Tue, 6 Oct 2020 11:29:09 +0000 (UTC) (envelope-from tuexen@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Fbn5B6Mz4Mxj; Tue, 6 Oct 2020 11:29:09 +0000 (UTC) (envelope-from tuexen@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 951EE25FE2; Tue, 6 Oct 2020 11:29:09 +0000 (UTC) (envelope-from tuexen@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096BT971033487; Tue, 6 Oct 2020 11:29:09 GMT (envelope-from tuexen@FreeBSD.org) Received: (from tuexen@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096BT9cf033485; Tue, 6 Oct 2020 11:29:09 GMT (envelope-from tuexen@FreeBSD.org) Message-Id: <202010061129.096BT9cf033485@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tuexen set sender to tuexen@FreeBSD.org using -f From: Michael Tuexen Date: Tue, 6 Oct 2020 11:29:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366483 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: tuexen X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366483 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.33 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: Tue, 06 Oct 2020 11:29:09 -0000 Author: tuexen Date: Tue Oct 6 11:29:08 2020 New Revision: 366483 URL: https://svnweb.freebsd.org/changeset/base/366483 Log: Ensure variables are initialized before used. MFC after: 3 days Modified: head/sys/netinet/sctp_input.c head/sys/netinet/sctp_pcb.c Modified: head/sys/netinet/sctp_input.c ============================================================================== --- head/sys/netinet/sctp_input.c Tue Oct 6 11:08:52 2020 (r366482) +++ head/sys/netinet/sctp_input.c Tue Oct 6 11:29:08 2020 (r366483) @@ -5553,7 +5553,9 @@ sctp_common_input_processing(struct mbuf **mm, int iph stcb = NULL; goto out; } - data_processed = 1; + if (retval == 0) { + data_processed = 1; + } /* * Anything important needs to have been m_copy'ed in * process_data Modified: head/sys/netinet/sctp_pcb.c ============================================================================== --- head/sys/netinet/sctp_pcb.c Tue Oct 6 11:08:52 2020 (r366482) +++ head/sys/netinet/sctp_pcb.c Tue Oct 6 11:29:08 2020 (r366483) @@ -6047,6 +6047,7 @@ sctp_load_addresses_from_init(struct sctp_tcb *stcb, s peer_supports_prsctp = 0; peer_supports_auth = 0; peer_supports_asconf = 0; + peer_supports_asconf_ack = 0; peer_supports_reconfig = 0; peer_supports_nrsack = 0; peer_supports_pktdrop = 0; From owner-svn-src-all@freebsd.org Tue Oct 6 12:56:30 2020 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 ACB72432837; Tue, 6 Oct 2020 12:56:30 +0000 (UTC) (envelope-from jrtc27@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5HXZ43qqz4S9M; Tue, 6 Oct 2020 12:56:30 +0000 (UTC) (envelope-from jrtc27@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 6AA1A27105; Tue, 6 Oct 2020 12:56:30 +0000 (UTC) (envelope-from jrtc27@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096CuUG4088179; Tue, 6 Oct 2020 12:56:30 GMT (envelope-from jrtc27@FreeBSD.org) Received: (from jrtc27@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096CuU2d088178; Tue, 6 Oct 2020 12:56:30 GMT (envelope-from jrtc27@FreeBSD.org) Message-Id: <202010061256.096CuU2d088178@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jrtc27 set sender to jrtc27@FreeBSD.org using -f From: Jessica Clarke Date: Tue, 6 Oct 2020 12:56:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366484 - head/sys/riscv/riscv X-SVN-Group: head X-SVN-Commit-Author: jrtc27 X-SVN-Commit-Paths: head/sys/riscv/riscv X-SVN-Commit-Revision: 366484 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.33 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: Tue, 06 Oct 2020 12:56:30 -0000 Author: jrtc27 Date: Tue Oct 6 12:56:29 2020 New Revision: 366484 URL: https://svnweb.freebsd.org/changeset/base/366484 Log: riscv: De-Arm a few names These names were inherited from the arm64 port and should be changed to the RISC-V terminology. Reviewed by: jhb (mentor), kp, markj Approved by: jhb (mentor), kp, markj Differential Revision: https://reviews.freebsd.org/D26671 Modified: head/sys/riscv/riscv/exception.S head/sys/riscv/riscv/trap.c Modified: head/sys/riscv/riscv/exception.S ============================================================================== --- head/sys/riscv/riscv/exception.S Tue Oct 6 11:29:08 2020 (r366483) +++ head/sys/riscv/riscv/exception.S Tue Oct 6 12:56:29 2020 (r366484) @@ -40,12 +40,12 @@ __FBSDID("$FreeBSD$"); #include #include -.macro save_registers el +.macro save_registers mode addi sp, sp, -(TF_SIZE) sd ra, (TF_RA)(sp) -.if \el == 0 /* We came from userspace. */ +.if \mode == 0 /* We came from userspace. */ sd gp, (TF_GP)(sp) .option push .option norelax @@ -88,7 +88,7 @@ __FBSDID("$FreeBSD$"); sd a6, (TF_A + 6 * 8)(sp) sd a7, (TF_A + 7 * 8)(sp) -.if \el == 1 +.if \mode == 1 /* Store kernel sp */ li t1, TF_SIZE add t0, sp, t1 @@ -110,9 +110,9 @@ __FBSDID("$FreeBSD$"); sd t0, (TF_SCAUSE)(sp) .endm -.macro load_registers el +.macro load_registers mode ld t0, (TF_SSTATUS)(sp) -.if \el == 0 +.if \mode == 0 /* Ensure user interrupts will be enabled on eret */ li t1, SSTATUS_SPIE or t0, t0, t1 @@ -130,7 +130,7 @@ __FBSDID("$FreeBSD$"); ld t0, (TF_SEPC)(sp) csrw sepc, t0 -.if \el == 0 +.if \mode == 0 /* We go to userspace. Load user sp */ ld t0, (TF_SP)(sp) csrw sscratch, t0 Modified: head/sys/riscv/riscv/trap.c ============================================================================== --- head/sys/riscv/riscv/trap.c Tue Oct 6 11:29:08 2020 (r366483) +++ head/sys/riscv/riscv/trap.c Tue Oct 6 12:56:29 2020 (r366484) @@ -158,7 +158,7 @@ dump_regs(struct trapframe *frame) } static void -svc_handler(struct trapframe *frame) +ecall_handler(struct trapframe *frame) { struct thread *td; @@ -172,7 +172,7 @@ svc_handler(struct trapframe *frame) } static void -data_abort(struct trapframe *frame, int usermode) +page_fault_handler(struct trapframe *frame, int usermode) { struct vm_map *map; uint64_t stval; @@ -290,7 +290,7 @@ do_trap_supervisor(struct trapframe *frame) break; case EXCP_STORE_PAGE_FAULT: case EXCP_LOAD_PAGE_FAULT: - data_abort(frame, 0); + page_fault_handler(frame, 0); break; case EXCP_BREAKPOINT: #ifdef KDTRACE_HOOKS @@ -353,11 +353,11 @@ do_trap_user(struct trapframe *frame) case EXCP_STORE_PAGE_FAULT: case EXCP_LOAD_PAGE_FAULT: case EXCP_INST_PAGE_FAULT: - data_abort(frame, 1); + page_fault_handler(frame, 1); break; case EXCP_USER_ECALL: frame->tf_sepc += 4; /* Next instruction */ - svc_handler(frame); + ecall_handler(frame); break; case EXCP_ILLEGAL_INSTRUCTION: #ifdef FPE From owner-svn-src-all@freebsd.org Tue Oct 6 12:57:55 2020 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 088E04328C3; Tue, 6 Oct 2020 12:57:55 +0000 (UTC) (envelope-from lwhsu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5HZB6QQ1z4SKl; Tue, 6 Oct 2020 12:57:54 +0000 (UTC) (envelope-from lwhsu@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 C0AA526EDD; Tue, 6 Oct 2020 12:57:54 +0000 (UTC) (envelope-from lwhsu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096CvsfD088291; Tue, 6 Oct 2020 12:57:54 GMT (envelope-from lwhsu@FreeBSD.org) Received: (from lwhsu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096CvsAU088290; Tue, 6 Oct 2020 12:57:54 GMT (envelope-from lwhsu@FreeBSD.org) Message-Id: <202010061257.096CvsAU088290@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: lwhsu set sender to lwhsu@FreeBSD.org using -f From: Li-Wen Hsu Date: Tue, 6 Oct 2020 12:57:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366485 - head/tests/sys/capsicum X-SVN-Group: head X-SVN-Commit-Author: lwhsu X-SVN-Commit-Paths: head/tests/sys/capsicum X-SVN-Commit-Revision: 366485 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.33 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: Tue, 06 Oct 2020 12:57:55 -0000 Author: lwhsu Date: Tue Oct 6 12:57:54 2020 New Revision: 366485 URL: https://svnweb.freebsd.org/changeset/base/366485 Log: Temporarily skip failing test cases in CI: sys.capsicum.functional.ForkedOpenatTest_WithFlagInCapabilityMode___ sys.capsicum.functional.OpenatTest__WithFlag PR: 249960 Sponsored by: The FreeBSD Foundation Modified: head/tests/sys/capsicum/functional.sh Modified: head/tests/sys/capsicum/functional.sh ============================================================================== --- head/tests/sys/capsicum/functional.sh Tue Oct 6 12:56:29 2020 (r366484) +++ head/tests/sys/capsicum/functional.sh Tue Oct 6 12:57:54 2020 (r366485) @@ -40,6 +40,13 @@ check() ${SRCDIR}/${CAPSICUM_TEST_BIN} --gtest_filter=${tc} } +skip() +{ + local reason=${1} + + atf_skip "${reason}" +} + add_testcase() { local tc=${1} @@ -48,7 +55,20 @@ add_testcase() tc_escaped=$(echo ${tc} | sed -e 's/\./__/') atf_test_case ${tc_escaped} - eval "${tc_escaped}_body() { check ${tc}; }" + + if [ "$(atf_config_get ci false)" = "true" ]; then + case "${tc_escaped}" in + ForkedOpenatTest_WithFlagInCapabilityMode___|OpenatTest__WithFlag) + eval "${tc_escaped}_body() { skip \"http://bugs.freebsd.org/249960\"; }" + ;; + *) + eval "${tc_escaped}_body() { check ${tc}; }" + ;; + esac + else + eval "${tc_escaped}_body() { check ${tc}; }" + fi + atf_add_test_case ${tc_escaped} } From owner-svn-src-all@freebsd.org Tue Oct 6 13:02:20 2020 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 CC225432B97; Tue, 6 Oct 2020 13:02:20 +0000 (UTC) (envelope-from jrtc27@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5HgJ56ssz4Sjr; Tue, 6 Oct 2020 13:02:20 +0000 (UTC) (envelope-from jrtc27@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 946D82738C; Tue, 6 Oct 2020 13:02:20 +0000 (UTC) (envelope-from jrtc27@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096D2KI0093533; Tue, 6 Oct 2020 13:02:20 GMT (envelope-from jrtc27@FreeBSD.org) Received: (from jrtc27@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096D2KJE093532; Tue, 6 Oct 2020 13:02:20 GMT (envelope-from jrtc27@FreeBSD.org) Message-Id: <202010061302.096D2KJE093532@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jrtc27 set sender to jrtc27@FreeBSD.org using -f From: Jessica Clarke Date: Tue, 6 Oct 2020 13:02:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366486 - head/sys/riscv/riscv X-SVN-Group: head X-SVN-Commit-Author: jrtc27 X-SVN-Commit-Paths: head/sys/riscv/riscv X-SVN-Commit-Revision: 366486 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.33 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: Tue, 06 Oct 2020 13:02:20 -0000 Author: jrtc27 Date: Tue Oct 6 13:02:20 2020 New Revision: 366486 URL: https://svnweb.freebsd.org/changeset/base/366486 Log: riscv: Handle supervisor instruction page faults We should never take instruction page faults when in the kernel, but by using the standard page fault code we should get a more-informative message about faulting on a NOFAULT page rather than branching to the default case here and printing an "Unknown kernel exception ..." message. Reviewed by: jhb (mentor), markj Approved by: jhb (mentor), markj Differential Revision: https://reviews.freebsd.org/D26685 Modified: head/sys/riscv/riscv/trap.c Modified: head/sys/riscv/riscv/trap.c ============================================================================== --- head/sys/riscv/riscv/trap.c Tue Oct 6 12:57:54 2020 (r366485) +++ head/sys/riscv/riscv/trap.c Tue Oct 6 13:02:20 2020 (r366486) @@ -290,6 +290,7 @@ do_trap_supervisor(struct trapframe *frame) break; case EXCP_STORE_PAGE_FAULT: case EXCP_LOAD_PAGE_FAULT: + case EXCP_INST_PAGE_FAULT: page_fault_handler(frame, 0); break; case EXCP_BREAKPOINT: From owner-svn-src-all@freebsd.org Tue Oct 6 13:03:31 2020 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 C31FA432E15; Tue, 6 Oct 2020 13:03:31 +0000 (UTC) (envelope-from jrtc27@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Hhg4QQ7z4Shh; Tue, 6 Oct 2020 13:03:31 +0000 (UTC) (envelope-from jrtc27@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 7BB2C27199; Tue, 6 Oct 2020 13:03:31 +0000 (UTC) (envelope-from jrtc27@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096D3VBR094298; Tue, 6 Oct 2020 13:03:31 GMT (envelope-from jrtc27@FreeBSD.org) Received: (from jrtc27@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096D3VG6094297; Tue, 6 Oct 2020 13:03:31 GMT (envelope-from jrtc27@FreeBSD.org) Message-Id: <202010061303.096D3VG6094297@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jrtc27 set sender to jrtc27@FreeBSD.org using -f From: Jessica Clarke Date: Tue, 6 Oct 2020 13:03:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366487 - head/sys/riscv/riscv X-SVN-Group: head X-SVN-Commit-Author: jrtc27 X-SVN-Commit-Paths: head/sys/riscv/riscv X-SVN-Commit-Revision: 366487 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.33 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: Tue, 06 Oct 2020 13:03:31 -0000 Author: jrtc27 Date: Tue Oct 6 13:03:31 2020 New Revision: 366487 URL: https://svnweb.freebsd.org/changeset/base/366487 Log: riscv: Remove outdated condition in page_fault_handler Since r366355 and r366284 we panic on access faults rather than treating them like page faults so this condition is never true. Reviewed by: jhb (mentor), markj, mhorne Approved by: jhb (mentor), markj, mhorne Differential Revision: https://reviews.freebsd.org/D26686 Modified: head/sys/riscv/riscv/trap.c Modified: head/sys/riscv/riscv/trap.c ============================================================================== --- head/sys/riscv/riscv/trap.c Tue Oct 6 13:02:20 2020 (r366486) +++ head/sys/riscv/riscv/trap.c Tue Oct 6 13:03:31 2020 (r366487) @@ -220,8 +220,7 @@ page_fault_handler(struct trapframe *frame, int usermo va = trunc_page(stval); - if ((frame->tf_scause == EXCP_FAULT_STORE) || - (frame->tf_scause == EXCP_STORE_PAGE_FAULT)) { + if (frame->tf_scause == EXCP_STORE_PAGE_FAULT) { ftype = VM_PROT_WRITE; } else if (frame->tf_scause == EXCP_INST_PAGE_FAULT) { ftype = VM_PROT_EXECUTE; From owner-svn-src-all@freebsd.org Tue Oct 6 14:04:00 2020 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 1AD4B433FA5; Tue, 6 Oct 2020 14:04:00 +0000 (UTC) (envelope-from markj@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5K2R6lWbz4X0j; Tue, 6 Oct 2020 14:03:59 +0000 (UTC) (envelope-from markj@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 CBEAD27D9B; Tue, 6 Oct 2020 14:03:59 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096E3xwO031523; Tue, 6 Oct 2020 14:03:59 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096E3x7R031521; Tue, 6 Oct 2020 14:03:59 GMT (envelope-from markj@FreeBSD.org) Message-Id: <202010061403.096E3x7R031521@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Tue, 6 Oct 2020 14:03:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366488 - in stable/12/sys: kern sys X-SVN-Group: stable-12 X-SVN-Commit-Author: markj X-SVN-Commit-Paths: in stable/12/sys: kern sys X-SVN-Commit-Revision: 366488 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.33 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: Tue, 06 Oct 2020 14:04:00 -0000 Author: markj Date: Tue Oct 6 14:03:59 2020 New Revision: 366488 URL: https://svnweb.freebsd.org/changeset/base/366488 Log: MFC r365759-r365765, r365788: Simplify unix domain socket locking. Modified: stable/12/sys/kern/uipc_usrreq.c stable/12/sys/sys/unpcb.h Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/kern/uipc_usrreq.c ============================================================================== --- stable/12/sys/kern/uipc_usrreq.c Tue Oct 6 13:03:31 2020 (r366487) +++ stable/12/sys/kern/uipc_usrreq.c Tue Oct 6 14:03:59 2020 (r366488) @@ -65,13 +65,13 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include -#include /* XXX must be before */ #include +#include #include #include #include #include +#include #include #include #include @@ -106,9 +106,7 @@ __FBSDID("$FreeBSD$"); MALLOC_DECLARE(M_FILECAPS); /* - * Locking key: - * (l) Locked using list lock - * (g) Locked using linkage lock + * See unpcb.h for the locking key. */ static uma_zone_t unp_zone; @@ -191,41 +189,32 @@ SYSCTL_INT(_net_local, OID_AUTO, deferred, CTLFLAG_RD, /* * Locking and synchronization: * - * Three types of locks exist in the local domain socket implementation: a - * a global linkage rwlock, the mtxpool lock, and per-unpcb mutexes. - * The linkage lock protects the socket count, global generation number, - * and stream/datagram global lists. + * Several types of locks exist in the local domain socket implementation: + * - a global linkage lock + * - a global connection list lock + * - the mtxpool lock + * - per-unpcb mutexes * - * The mtxpool lock protects the vnode from being modified while referenced. - * Lock ordering requires that it be acquired before any unpcb locks. + * The linkage lock protects the global socket lists, the generation number + * counter and garbage collector state. * - * The unpcb lock (unp_mtx) protects all fields in the unpcb. Of particular - * note is that this includes the unp_conn field. So long as the unpcb lock - * is held the reference to the unpcb pointed to by unp_conn is valid. If we - * require that the unpcb pointed to by unp_conn remain live in cases where - * we need to drop the unp_mtx as when we need to acquire the lock for a - * second unpcb the caller must first acquire an additional reference on the - * second unpcb and then revalidate any state (typically check that unp_conn - * is non-NULL) upon requiring the initial unpcb lock. The lock ordering - * between unpcbs is the conventional ascending address order. Two helper - * routines exist for this: + * The connection list lock protects the list of referring sockets in a datagram + * socket PCB. This lock is also overloaded to protect a global list of + * sockets whose buffers contain socket references in the form of SCM_RIGHTS + * messages. To avoid recursion, such references are released by a dedicated + * thread. * - * - unp_pcb_lock2(unp, unp2) - which just acquires the two locks in the - * safe ordering. + * The mtxpool lock protects the vnode from being modified while referenced. + * Lock ordering rules require that it be acquired before any PCB locks. * - * - unp_pcb_owned_lock2(unp, unp2, freed) - the lock for unp is held - * when called. If unp is unlocked and unp2 is subsequently freed - * freed will be set to 1. + * The unpcb lock (unp_mtx) protects the most commonly referenced fields in the + * unpcb. This includes the unp_conn field, which either links two connected + * PCBs together (for connected socket types) or points at the destination + * socket (for connectionless socket types). The operations of creating or + * destroying a connection therefore involve locking multiple PCBs. To avoid + * lock order reversals, in some cases this involves dropping a PCB lock and + * using a reference counter to maintain liveness. * - * The helper routines for references are: - * - * - unp_pcb_hold(unp): Can be called any time we currently hold a valid - * reference to unp. - * - * - unp_pcb_rele(unp): The caller must hold the unp lock. If we are - * releasing the last reference, detach must have been called thus - * unp->unp_socket be NULL. - * * UNIX domain sockets each have an unpcb hung off of their so_pcb pointer, * allocated in pru_attach() and freed in pru_detach(). The validity of that * pointer is an invariant, so no lock is required to dereference the so_pcb @@ -285,6 +274,7 @@ static struct mtx unp_defers_lock; "unp", "unp", \ MTX_DUPOK|MTX_DEF) #define UNP_PCB_LOCK_DESTROY(unp) mtx_destroy(&(unp)->unp_mtx) +#define UNP_PCB_LOCKPTR(unp) (&(unp)->unp_mtx) #define UNP_PCB_LOCK(unp) mtx_lock(&(unp)->unp_mtx) #define UNP_PCB_TRYLOCK(unp) mtx_trylock(&(unp)->unp_mtx) #define UNP_PCB_UNLOCK(unp) mtx_unlock(&(unp)->unp_mtx) @@ -320,35 +310,43 @@ static void unp_process_defers(void * __unused, int); static void unp_pcb_hold(struct unpcb *unp) { - MPASS(unp->unp_refcount); refcount_acquire(&unp->unp_refcount); } -static int +static __result_use_check bool unp_pcb_rele(struct unpcb *unp) { - int freed; + bool ret; UNP_PCB_LOCK_ASSERT(unp); - MPASS(unp->unp_refcount); - if ((freed = refcount_release(&unp->unp_refcount))) { - /* we got here with having detached? */ - MPASS(unp->unp_socket == NULL); + + if ((ret = refcount_release(&unp->unp_refcount))) { UNP_PCB_UNLOCK(unp); UNP_PCB_LOCK_DESTROY(unp); uma_zfree(unp_zone, unp); } - return (freed); + return (ret); } static void -unp_pcb_lock2(struct unpcb *unp, struct unpcb *unp2) +unp_pcb_rele_notlast(struct unpcb *unp) { - MPASS(unp != unp2); + bool ret __unused; + + ret = refcount_release(&unp->unp_refcount); + KASSERT(!ret, ("%s: unpcb %p has no references", __func__, unp)); +} + +static void +unp_pcb_lock_pair(struct unpcb *unp, struct unpcb *unp2) +{ UNP_PCB_UNLOCK_ASSERT(unp); UNP_PCB_UNLOCK_ASSERT(unp2); - if ((uintptr_t)unp2 > (uintptr_t)unp) { + + if (unp == unp2) { UNP_PCB_LOCK(unp); + } else if ((uintptr_t)unp2 > (uintptr_t)unp) { + UNP_PCB_LOCK(unp); UNP_PCB_LOCK(unp2); } else { UNP_PCB_LOCK(unp2); @@ -356,36 +354,64 @@ unp_pcb_lock2(struct unpcb *unp, struct unpcb *unp2) } } -static __noinline void -unp_pcb_owned_lock2_slowpath(struct unpcb *unp, struct unpcb **unp2p, - int *freed) +static void +unp_pcb_unlock_pair(struct unpcb *unp, struct unpcb *unp2) { + UNP_PCB_UNLOCK(unp); + if (unp != unp2) + UNP_PCB_UNLOCK(unp2); +} + +/* + * Try to lock the connected peer of an already locked socket. In some cases + * this requires that we unlock the current socket. The pairbusy counter is + * used to block concurrent connection attempts while the lock is dropped. The + * caller must be careful to revalidate PCB state. + */ +static struct unpcb * +unp_pcb_lock_peer(struct unpcb *unp) +{ struct unpcb *unp2; - unp2 = *unp2p; + UNP_PCB_LOCK_ASSERT(unp); + unp2 = unp->unp_conn; + if (__predict_false(unp2 == NULL)) + return (NULL); + if (__predict_false(unp == unp2)) + return (unp); + + UNP_PCB_UNLOCK_ASSERT(unp2); + + if (__predict_true(UNP_PCB_TRYLOCK(unp2))) + return (unp2); + if ((uintptr_t)unp2 > (uintptr_t)unp) { + UNP_PCB_LOCK(unp2); + return (unp2); + } + unp->unp_pairbusy++; unp_pcb_hold(unp2); UNP_PCB_UNLOCK(unp); + UNP_PCB_LOCK(unp2); UNP_PCB_LOCK(unp); - *freed = unp_pcb_rele(unp2); - if (*freed) - *unp2p = NULL; + KASSERT(unp->unp_conn == unp2 || unp->unp_conn == NULL, + ("%s: socket %p was reconnected", __func__, unp)); + if (--unp->unp_pairbusy == 0 && (unp->unp_flags & UNP_WAITING) != 0) { + unp->unp_flags &= ~UNP_WAITING; + wakeup(unp); + } + if (unp_pcb_rele(unp2)) { + /* unp2 is unlocked. */ + return (NULL); + } + if (unp->unp_conn == NULL) { + UNP_PCB_UNLOCK(unp2); + return (NULL); + } + return (unp2); } -#define unp_pcb_owned_lock2(unp, unp2, freed) do { \ - freed = 0; \ - UNP_PCB_LOCK_ASSERT(unp); \ - UNP_PCB_UNLOCK_ASSERT(unp2); \ - MPASS((unp) != (unp2)); \ - if (__predict_true(UNP_PCB_TRYLOCK(unp2))) \ - break; \ - else if ((uintptr_t)(unp2) > (uintptr_t)(unp)) \ - UNP_PCB_LOCK(unp2); \ - else \ - unp_pcb_owned_lock2_slowpath((unp), &(unp2), &freed); \ -} while (0) - /* * Definitions of protocols supported in the LOCAL domain. */ @@ -467,18 +493,17 @@ uipc_accept(struct socket *so, struct sockaddr **nam) KASSERT(unp != NULL, ("uipc_accept: unp == NULL")); *nam = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK); - UNP_LINK_RLOCK(); - unp2 = unp->unp_conn; - if (unp2 != NULL && unp2->unp_addr != NULL) { - UNP_PCB_LOCK(unp2); - sa = (struct sockaddr *) unp2->unp_addr; - bcopy(sa, *nam, sa->sa_len); - UNP_PCB_UNLOCK(unp2); - } else { + UNP_PCB_LOCK(unp); + unp2 = unp_pcb_lock_peer(unp); + if (unp2 != NULL && unp2->unp_addr != NULL) + sa = (struct sockaddr *)unp2->unp_addr; + else sa = &sun_noname; - bcopy(sa, *nam, sa->sa_len); - } - UNP_LINK_RUNLOCK(); + bcopy(sa, *nam, sa->sa_len); + if (unp2 != NULL) + unp_pcb_unlock_pair(unp, unp2); + else + UNP_PCB_UNLOCK(unp); return (0); } @@ -522,7 +547,7 @@ uipc_attach(struct socket *so, int proto, struct threa UNP_PCB_LOCK_INIT(unp); unp->unp_socket = so; so->so_pcb = unp; - unp->unp_refcount = 1; + refcount_init(&unp->unp_refcount, 1); if ((locked = UNP_LINK_WOWNED()) == false) UNP_LINK_WLOCK(); @@ -699,7 +724,7 @@ uipc_close(struct socket *so) struct unpcb *unp, *unp2; struct vnode *vp = NULL; struct mtx *vplock; - int freed; + unp = sotounpcb(so); KASSERT(unp != NULL, ("uipc_close: unp == NULL")); @@ -718,18 +743,9 @@ uipc_close(struct socket *so) VOP_UNP_DETACH(vp); unp->unp_vnode = NULL; } - unp2 = unp->unp_conn; - unp_pcb_hold(unp); - if (__predict_false(unp == unp2)) { + if ((unp2 = unp_pcb_lock_peer(unp)) != NULL) unp_disconnect(unp, unp2); - } else if (unp2 != NULL) { - unp_pcb_hold(unp2); - unp_pcb_owned_lock2(unp, unp2, freed); - unp_disconnect(unp, unp2); - if (unp_pcb_rele(unp2) == 0) - UNP_PCB_UNLOCK(unp2); - } - if (unp_pcb_rele(unp) == 0) + else UNP_PCB_UNLOCK(unp); if (vp) { mtx_unlock(vplock); @@ -747,14 +763,9 @@ uipc_connect2(struct socket *so1, struct socket *so2) KASSERT(unp != NULL, ("uipc_connect2: unp == NULL")); unp2 = so2->so_pcb; KASSERT(unp2 != NULL, ("uipc_connect2: unp2 == NULL")); - if (unp != unp2) - unp_pcb_lock2(unp, unp2); - else - UNP_PCB_LOCK(unp); + unp_pcb_lock_pair(unp, unp2); error = unp_connect2(so1, so2, PRU_CONNECT2); - if (unp != unp2) - UNP_PCB_UNLOCK(unp2); - UNP_PCB_UNLOCK(unp); + unp_pcb_unlock_pair(unp, unp2); return (error); } @@ -764,14 +775,13 @@ uipc_detach(struct socket *so) struct unpcb *unp, *unp2; struct mtx *vplock; struct vnode *vp; - int freeunp, local_unp_rights; + int local_unp_rights; unp = sotounpcb(so); KASSERT(unp != NULL, ("uipc_detach: unp == NULL")); vp = NULL; vplock = NULL; - local_unp_rights = 0; SOCK_LOCK(so); if (!SOLISTENING(so)) { @@ -808,24 +818,11 @@ uipc_detach(struct socket *so) VOP_UNP_DETACH(vp); unp->unp_vnode = NULL; } - if (__predict_false(unp == unp->unp_conn)) { - unp_disconnect(unp, unp); - unp2 = NULL; - } else { - if ((unp2 = unp->unp_conn) != NULL) { - unp_pcb_owned_lock2(unp, unp2, freeunp); - if (freeunp) - unp2 = NULL; - } - unp_pcb_hold(unp); - if (unp2 != NULL) { - unp_pcb_hold(unp2); - unp_disconnect(unp, unp2); - if (unp_pcb_rele(unp2) == 0) - UNP_PCB_UNLOCK(unp2); - } - } - UNP_PCB_UNLOCK(unp); + if ((unp2 = unp_pcb_lock_peer(unp)) != NULL) + unp_disconnect(unp, unp2); + else + UNP_PCB_UNLOCK(unp); + UNP_REF_LIST_LOCK(); while (!LIST_EMPTY(&unp->unp_refs)) { struct unpcb *ref = LIST_FIRST(&unp->unp_refs); @@ -838,11 +835,9 @@ uipc_detach(struct socket *so) unp_drop(ref); UNP_REF_LIST_LOCK(); } - UNP_REF_LIST_UNLOCK(); + UNP_PCB_LOCK(unp); - freeunp = unp_pcb_rele(unp); - MPASS(freeunp == 0); local_unp_rights = unp_rights; unp->unp_socket->so_pcb = NULL; unp->unp_socket = NULL; @@ -862,30 +857,15 @@ static int uipc_disconnect(struct socket *so) { struct unpcb *unp, *unp2; - int freed; unp = sotounpcb(so); KASSERT(unp != NULL, ("uipc_disconnect: unp == NULL")); UNP_PCB_LOCK(unp); - if ((unp2 = unp->unp_conn) == NULL) { + if ((unp2 = unp_pcb_lock_peer(unp)) != NULL) + unp_disconnect(unp, unp2); + else UNP_PCB_UNLOCK(unp); - return (0); - } - if (__predict_true(unp != unp2)) { - unp_pcb_owned_lock2(unp, unp2, freed); - if (__predict_false(freed)) { - UNP_PCB_UNLOCK(unp); - return (0); - } - unp_pcb_hold(unp2); - } - unp_pcb_hold(unp); - unp_disconnect(unp, unp2); - if (unp_pcb_rele(unp) == 0) - UNP_PCB_UNLOCK(unp); - if ((unp != unp2) && unp_pcb_rele(unp2) == 0) - UNP_PCB_UNLOCK(unp2); return (0); } @@ -1004,28 +984,6 @@ uipc_rcvd(struct socket *so, int flags) } static int -connect_internal(struct socket *so, struct sockaddr *nam, struct thread *td) -{ - int error; - struct unpcb *unp; - - unp = so->so_pcb; - if (unp->unp_conn != NULL) - return (EISCONN); - error = unp_connect(so, nam, td); - if (error) - return (error); - UNP_PCB_LOCK(unp); - if (unp->unp_conn == NULL) { - UNP_PCB_UNLOCK(unp); - if (error == 0) - error = ENOTCONN; - } - return (error); -} - - -static int uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, struct mbuf *control, struct thread *td) { @@ -1055,57 +1013,26 @@ uipc_send(struct socket *so, int flags, struct mbuf *m const struct sockaddr *from; if (nam != NULL) { - /* - * We return with UNP_PCB_LOCK_HELD so we know that - * the reference is live if the pointer is valid. - */ - if ((error = connect_internal(so, nam, td))) + error = unp_connect(so, nam, td); + if (error != 0) break; - MPASS(unp->unp_conn != NULL); - unp2 = unp->unp_conn; - } else { - UNP_PCB_LOCK(unp); - - /* - * Because connect() and send() are non-atomic in a sendto() - * with a target address, it's possible that the socket will - * have disconnected before the send() can run. In that case - * return the slightly counter-intuitive but otherwise - * correct error that the socket is not connected. - */ - if ((unp2 = unp->unp_conn) == NULL) { - UNP_PCB_UNLOCK(unp); - error = ENOTCONN; - break; - } } - if (__predict_false(unp == unp2)) { - if (unp->unp_socket == NULL) { - error = ENOTCONN; - break; - } - goto connect_self; - } - unp_pcb_owned_lock2(unp, unp2, freed); - if (__predict_false(freed)) { - UNP_PCB_UNLOCK(unp); - error = ENOTCONN; - break; - } + UNP_PCB_LOCK(unp); + /* - * The socket referencing unp2 may have been closed - * or unp may have been disconnected if the unp lock - * was dropped to acquire unp2. + * Because connect() and send() are non-atomic in a sendto() + * with a target address, it's possible that the socket will + * have disconnected before the send() can run. In that case + * return the slightly counter-intuitive but otherwise + * correct error that the socket is not connected. */ - if (__predict_false(unp->unp_conn == NULL) || - unp2->unp_socket == NULL) { + unp2 = unp_pcb_lock_peer(unp); + if (unp2 == NULL) { UNP_PCB_UNLOCK(unp); - if (unp_pcb_rele(unp2) == 0) - UNP_PCB_UNLOCK(unp2); error = ENOTCONN; break; } - connect_self: + if (unp2->unp_flags & UNP_WANTCRED) control = unp_addsockcred(td, control); if (unp->unp_addr != NULL) @@ -1125,9 +1052,8 @@ uipc_send(struct socket *so, int flags, struct mbuf *m } if (nam != NULL) unp_disconnect(unp, unp2); - if (__predict_true(unp != unp2)) - UNP_PCB_UNLOCK(unp2); - UNP_PCB_UNLOCK(unp); + else + unp_pcb_unlock_pair(unp, unp2); break; } @@ -1135,36 +1061,26 @@ uipc_send(struct socket *so, int flags, struct mbuf *m case SOCK_STREAM: if ((so->so_state & SS_ISCONNECTED) == 0) { if (nam != NULL) { - error = connect_internal(so, nam, td); + error = unp_connect(so, nam, td); if (error != 0) break; } else { error = ENOTCONN; break; } - } else { - UNP_PCB_LOCK(unp); } - if ((unp2 = unp->unp_conn) == NULL) { + UNP_PCB_LOCK(unp); + if ((unp2 = unp_pcb_lock_peer(unp)) == NULL) { UNP_PCB_UNLOCK(unp); error = ENOTCONN; break; } else if (so->so_snd.sb_state & SBS_CANTSENDMORE) { - UNP_PCB_UNLOCK(unp); + unp_pcb_unlock_pair(unp, unp2); error = EPIPE; break; - } else if ((unp2 = unp->unp_conn) == NULL) { - UNP_PCB_UNLOCK(unp); - error = ENOTCONN; - break; } - unp_pcb_owned_lock2(unp, unp2, freed); UNP_PCB_UNLOCK(unp); - if (__predict_false(freed)) { - error = ENOTCONN; - break; - } if ((so2 = unp2->unp_socket) == NULL) { UNP_PCB_UNLOCK(unp2); error = ENOTCONN; @@ -1299,30 +1215,19 @@ uipc_ready(struct socket *so, struct mbuf *m, int coun ("%s: unexpected socket type for %p", __func__, so)); UNP_PCB_LOCK(unp); - if ((unp2 = unp->unp_conn) == NULL) { + if ((unp2 = unp_pcb_lock_peer(unp)) != NULL) { UNP_PCB_UNLOCK(unp); - goto search; + so2 = unp2->unp_socket; + SOCKBUF_LOCK(&so2->so_rcv); + if ((error = sbready(&so2->so_rcv, m, count)) == 0) + sorwakeup_locked(so2); + else + SOCKBUF_UNLOCK(&so2->so_rcv); + UNP_PCB_UNLOCK(unp2); + return (error); } - if (unp != unp2) { - if (UNP_PCB_TRYLOCK(unp2) == 0) { - unp_pcb_hold(unp2); - UNP_PCB_UNLOCK(unp); - UNP_PCB_LOCK(unp2); - if (unp_pcb_rele(unp2)) - goto search; - } else - UNP_PCB_UNLOCK(unp); - } - so2 = unp2->unp_socket; - SOCKBUF_LOCK(&so2->so_rcv); - if ((error = sbready(&so2->so_rcv, m, count)) == 0) - sorwakeup_locked(so2); - else - SOCKBUF_UNLOCK(&so2->so_rcv); - UNP_PCB_UNLOCK(unp2); - return (error); + UNP_PCB_UNLOCK(unp); -search: /* * The receiving socket has been disconnected, but may still be valid. * In this case, the now-ready mbufs are still present in its socket @@ -1565,7 +1470,8 @@ static int unp_connectat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) { - struct sockaddr_un *soun = (struct sockaddr_un *)nam; + struct mtx *vplock; + struct sockaddr_un *soun; struct vnode *vp; struct socket *so2; struct unpcb *unp, *unp2, *unp3; @@ -1573,8 +1479,8 @@ unp_connectat(int fd, struct socket *so, struct sockad char buf[SOCK_MAXADDRLEN]; struct sockaddr *sa; cap_rights_t rights; - int error, len, freed; - struct mtx *vplock; + int error, len; + bool connreq; if (nam->sa_family != AF_UNIX) return (EAFNOSUPPORT); @@ -1583,19 +1489,48 @@ unp_connectat(int fd, struct socket *so, struct sockad len = nam->sa_len - offsetof(struct sockaddr_un, sun_path); if (len <= 0) return (EINVAL); + soun = (struct sockaddr_un *)nam; bcopy(soun->sun_path, buf, len); buf[len] = 0; unp = sotounpcb(so); UNP_PCB_LOCK(unp); - if (unp->unp_flags & UNP_CONNECTING) { - UNP_PCB_UNLOCK(unp); - return (EALREADY); + for (;;) { + /* + * Wait for connection state to stabilize. If a connection + * already exists, give up. For datagram sockets, which permit + * multiple consecutive connect(2) calls, upper layers are + * responsible for disconnecting in advance of a subsequent + * connect(2), but this is not synchronized with PCB connection + * state. + * + * Also make sure that no threads are currently attempting to + * lock the peer socket, to ensure that unp_conn cannot + * transition between two valid sockets while locks are dropped. + */ + if (unp->unp_conn != NULL) { + UNP_PCB_UNLOCK(unp); + return (EISCONN); + } + if ((unp->unp_flags & UNP_CONNECTING) != 0) { + UNP_PCB_UNLOCK(unp); + return (EALREADY); + } + if (unp->unp_pairbusy > 0) { + unp->unp_flags |= UNP_WAITING; + mtx_sleep(unp, UNP_PCB_LOCKPTR(unp), 0, "unpeer", 0); + continue; + } + break; } unp->unp_flags |= UNP_CONNECTING; UNP_PCB_UNLOCK(unp); - sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK); + connreq = (so->so_proto->pr_flags & PR_CONNREQUIRED) != 0; + if (connreq) + sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK); + else + sa = NULL; NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, UIO_SYSSPACE, buf, fd, cap_rights_init(&rights, CAP_CONNECTAT), td); error = namei(&nd); @@ -1636,7 +1571,7 @@ unp_connectat(int fd, struct socket *so, struct sockad error = EPROTOTYPE; goto bad2; } - if (so->so_proto->pr_flags & PR_CONNREQUIRED) { + if (connreq) { if (so2->so_options & SO_ACCEPTCONN) { CURVNET_SET(so2->so_vnet); so2 = sonewconn(so2, 0); @@ -1648,7 +1583,7 @@ unp_connectat(int fd, struct socket *so, struct sockad goto bad2; } unp3 = sotounpcb(so2); - unp_pcb_lock2(unp2, unp3); + unp_pcb_lock_pair(unp2, unp3); if (unp2->unp_addr != NULL) { bcopy(unp2->unp_addr, sa, unp2->unp_addr->sun_len); unp3->unp_addr = (struct sockaddr_un *) sa; @@ -1659,29 +1594,24 @@ unp_connectat(int fd, struct socket *so, struct sockad UNP_PCB_UNLOCK(unp2); unp2 = unp3; - unp_pcb_owned_lock2(unp2, unp, freed); - if (__predict_false(freed)) { - UNP_PCB_UNLOCK(unp2); - error = ECONNREFUSED; - goto bad2; - } + + /* + * It is safe to block on the PCB lock here since unp2 is + * nascent and cannot be connected to any other sockets. + */ + UNP_PCB_LOCK(unp); #ifdef MAC mac_socketpeer_set_from_socket(so, so2); mac_socketpeer_set_from_socket(so2, so); #endif } else { - if (unp == unp2) - UNP_PCB_LOCK(unp); - else - unp_pcb_lock2(unp, unp2); + unp_pcb_lock_pair(unp, unp2); } KASSERT(unp2 != NULL && so2 != NULL && unp2->unp_socket == so2 && sotounpcb(so2) == unp2, ("%s: unp2 %p so2 %p", __func__, unp2, so2)); error = unp_connect2(so, so2, PRU_CONNECT); - if (unp != unp2) - UNP_PCB_UNLOCK(unp2); - UNP_PCB_UNLOCK(unp); + unp_pcb_unlock_pair(unp, unp2); bad2: mtx_unlock(vplock); bad: @@ -1690,6 +1620,8 @@ bad: } free(sa, M_SONAME); UNP_PCB_LOCK(unp); + KASSERT((unp->unp_flags & UNP_CONNECTING) != 0, + ("%s: unp %p has UNP_CONNECTING clear", __func__, unp)); unp->unp_flags &= ~UNP_CONNECTING; UNP_PCB_UNLOCK(unp); return (error); @@ -1729,6 +1661,8 @@ unp_connect2(struct socket *so, struct socket *so2, in UNP_PCB_LOCK_ASSERT(unp); UNP_PCB_LOCK_ASSERT(unp2); + KASSERT(unp->unp_conn == NULL, + ("%s: socket %p is already connected", __func__, unp)); if (so2->so_type != so->so_type) return (EPROTOTYPE); @@ -1745,6 +1679,8 @@ unp_connect2(struct socket *so, struct socket *so2, in case SOCK_STREAM: case SOCK_SEQPACKET: + KASSERT(unp2->unp_conn == NULL, + ("%s: socket %p is already connected", __func__, unp2)); unp2->unp_conn = unp; if (req == PRU_CONNECT && ((unp->unp_flags | unp2->unp_flags) & UNP_CONNWAIT)) @@ -1764,23 +1700,29 @@ static void unp_disconnect(struct unpcb *unp, struct unpcb *unp2) { struct socket *so, *so2; - int freed __unused; +#ifdef INVARIANTS + struct unpcb *unptmp; +#endif - KASSERT(unp2 != NULL, ("unp_disconnect: unp2 == NULL")); - UNP_PCB_LOCK_ASSERT(unp); UNP_PCB_LOCK_ASSERT(unp2); + KASSERT(unp->unp_conn == unp2, + ("%s: unpcb %p is not connected to %p", __func__, unp, unp2)); - if (unp->unp_conn == NULL && unp2->unp_conn == NULL) - return; - - MPASS(unp->unp_conn == unp2); unp->unp_conn = NULL; so = unp->unp_socket; so2 = unp2->unp_socket; switch (unp->unp_socket->so_type) { case SOCK_DGRAM: UNP_REF_LIST_LOCK(); +#ifdef INVARIANTS + LIST_FOREACH(unptmp, &unp2->unp_refs, unp_reflink) { + if (unptmp == unp) + break; + } + KASSERT(unptmp != NULL, + ("%s: %p not found in reflist of %p", __func__, unp, unp2)); +#endif LIST_REMOVE(unp, unp_reflink); UNP_REF_LIST_UNLOCK(); if (so) { @@ -1800,10 +1742,17 @@ unp_disconnect(struct unpcb *unp, struct unpcb *unp2) soisdisconnected(so2); break; } - freed = unp_pcb_rele(unp); - MPASS(freed == 0); - freed = unp_pcb_rele(unp2); - MPASS(freed == 0); + + if (unp == unp2) { + unp_pcb_rele_notlast(unp); + if (!unp_pcb_rele(unp)) + UNP_PCB_UNLOCK(unp); + } else { + if (!unp_pcb_rele(unp)) + UNP_PCB_UNLOCK(unp); + if (!unp_pcb_rele(unp2)) + UNP_PCB_UNLOCK(unp2); + } } /* @@ -1822,7 +1771,7 @@ unp_pcblist(SYSCTL_HANDLER_ARGS) struct unp_head *head; struct xunpcb *xu; u_int i; - int error, freeunp, n; + int error, n; switch ((intptr_t)arg1) { case SOCK_STREAM: @@ -1899,9 +1848,10 @@ unp_pcblist(SYSCTL_HANDLER_ARGS) for (i = 0; i < n; i++) { unp = unp_list[i]; UNP_PCB_LOCK(unp); - freeunp = unp_pcb_rele(unp); + if (unp_pcb_rele(unp)) + continue; - if (freeunp == 0 && unp->unp_gencnt <= gencnt) { + if (unp->unp_gencnt <= gencnt) { xu->xu_len = sizeof *xu; xu->xu_unpp = (uintptr_t)unp; /* @@ -1928,8 +1878,9 @@ unp_pcblist(SYSCTL_HANDLER_ARGS) sotoxsocket(unp->unp_socket, &xu->xu_socket); UNP_PCB_UNLOCK(unp); error = SYSCTL_OUT(req, xu, sizeof *xu); - } else if (freeunp == 0) + } else { UNP_PCB_UNLOCK(unp); + } } free(xu, M_TEMP); if (!error) { @@ -1982,30 +1933,23 @@ unp_drop(struct unpcb *unp) { struct socket *so = unp->unp_socket; struct unpcb *unp2; - int freed; /* * Regardless of whether the socket's peer dropped the connection * with this socket by aborting or disconnecting, POSIX requires * that ECONNRESET is returned. */ - /* acquire a reference so that unp isn't freed from underneath us */ UNP_PCB_LOCK(unp); if (so) so->so_error = ECONNRESET; - unp2 = unp->unp_conn; - if (unp2 == unp) { + if ((unp2 = unp_pcb_lock_peer(unp)) != NULL) { + /* Last reference dropped in unp_disconnect(). */ + unp_pcb_rele_notlast(unp); unp_disconnect(unp, unp2); - } else if (unp2 != NULL) { - unp_pcb_hold(unp2); - unp_pcb_owned_lock2(unp, unp2, freed); - unp_disconnect(unp, unp2); - if (unp_pcb_rele(unp2) == 0) - UNP_PCB_UNLOCK(unp2); - } - if (unp_pcb_rele(unp) == 0) + } else if (!unp_pcb_rele(unp)) { UNP_PCB_UNLOCK(unp); + } } static void @@ -2143,18 +2087,44 @@ unp_zone_change(void *tag) uma_zone_set_max(unp_zone, maxsockets); } +#ifdef INVARIANTS static void +unp_zdtor(void *mem, int size __unused, void *arg __unused) +{ + struct unpcb *unp; + + unp = mem; + + KASSERT(LIST_EMPTY(&unp->unp_refs), + ("%s: unpcb %p has lingering refs", __func__, unp)); + KASSERT(unp->unp_socket == NULL, + ("%s: unpcb %p has socket backpointer", __func__, unp)); + KASSERT(unp->unp_vnode == NULL, + ("%s: unpcb %p has vnode references", __func__, unp)); + KASSERT(unp->unp_conn == NULL, + ("%s: unpcb %p is still connected", __func__, unp)); + KASSERT(unp->unp_addr == NULL, + ("%s: unpcb %p has leaked addr", __func__, unp)); +} +#endif + +static void unp_init(void) { + uma_dtor dtor; #ifdef VIMAGE if (!IS_DEFAULT_VNET(curvnet)) return; #endif - unp_zone = uma_zcreate("unpcb", sizeof(struct unpcb), NULL, NULL, + +#ifdef INVARIANTS + dtor = unp_zdtor; +#else + dtor = NULL; +#endif + unp_zone = uma_zcreate("unpcb", sizeof(struct unpcb), NULL, dtor, NULL, NULL, UMA_ALIGN_CACHE, 0); - if (unp_zone == NULL) - panic("unp_init"); uma_zone_set_max(unp_zone, maxsockets); uma_zone_set_warning(unp_zone, "kern.ipc.maxsockets limit reached"); EVENTHANDLER_REGISTER(maxsockets_change, unp_zone_change, Modified: stable/12/sys/sys/unpcb.h ============================================================================== --- stable/12/sys/sys/unpcb.h Tue Oct 6 13:03:31 2020 (r366487) +++ stable/12/sys/sys/unpcb.h Tue Oct 6 14:03:59 2020 (r366488) @@ -65,28 +65,37 @@ typedef uint64_t unp_gen_t; * Stream sockets keep copies of receive sockbuf sb_cc and sb_mbcnt * so that changes in the sockbuf may be computed to modify * back pressure on the sender accordingly. + * + * Locking key: + * (a) Atomic + * (c) Constant + * (g) Locked using linkage lock + * (l) Locked using list lock + * (p) Locked using pcb lock */ LIST_HEAD(unp_head, unpcb); struct unpcb { /* Cache line 1 */ - struct mtx unp_mtx; /* mutex */ - struct unpcb *unp_conn; /* control block of connected socket */ - volatile u_int unp_refcount; - short unp_flags; /* flags */ - short unp_gcflag; /* Garbage collector flags. */ - struct sockaddr_un *unp_addr; /* bound address of socket */ - struct socket *unp_socket; /* pointer back to socket */ + struct mtx unp_mtx; /* PCB mutex */ + struct unpcb *unp_conn; /* (p) connected socket */ + volatile u_int unp_refcount; /* (a, p) atomic refcount */ + short unp_flags; /* (p) PCB flags */ + short unp_gcflag; /* (g) Garbage collector flags */ + struct sockaddr_un *unp_addr; /* (p) bound address of socket */ + struct socket *unp_socket; /* (c) pointer back to socket */ /* Cache line 2 */ - struct vnode *unp_vnode; /* if associated with file */ - struct xucred unp_peercred; /* peer credentials, if applicable */ - LIST_ENTRY(unpcb) unp_reflink; /* link in unp_refs list */ - LIST_ENTRY(unpcb) unp_link; /* glue on list of all PCBs */ - struct unp_head unp_refs; /* referencing socket linked list */ - unp_gen_t unp_gencnt; /* generation count of this instance */ - struct file *unp_file; /* back-pointer to file for gc. */ - u_int unp_msgcount; /* references from message queue */ - ino_t unp_ino; /* fake inode number */ + u_int unp_pairbusy; /* (p) threads acquiring peer locks */ + struct vnode *unp_vnode; /* (p) associated file if applicable */ + struct xucred unp_peercred; /* (p) peer credentials if applicable */ + LIST_ENTRY(unpcb) unp_reflink; /* (l) link in unp_refs list */ + LIST_ENTRY(unpcb) unp_link; /* (g) glue on list of all PCBs */ + struct unp_head unp_refs; /* (l) referencing socket linked list */ + unp_gen_t unp_gencnt; /* (g) generation count of this item */ + struct file *unp_file; /* (g) back-pointer to file for gc */ + u_int unp_msgcount; /* (g) references from message queue */ + ino_t unp_ino; /* (g) fake inode number */ + LIST_ENTRY(unpcb) unp_dead; /* (g) link in dead list */ } __aligned(CACHE_LINE_SIZE); /* *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-all@freebsd.org Tue Oct 6 14:26:06 2020 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 698604346A8; Tue, 6 Oct 2020 14:26:06 +0000 (UTC) (envelope-from tuexen@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5KWy2B3hz4Y0G; Tue, 6 Oct 2020 14:26:06 +0000 (UTC) (envelope-from tuexen@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 2E2F227B73; Tue, 6 Oct 2020 14:26:06 +0000 (UTC) (envelope-from tuexen@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096EQ66L043844; Tue, 6 Oct 2020 14:26:06 GMT (envelope-from tuexen@FreeBSD.org) Received: (from tuexen@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096EQ60D043843; Tue, 6 Oct 2020 14:26:06 GMT (envelope-from tuexen@FreeBSD.org) Message-Id: <202010061426.096EQ60D043843@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tuexen set sender to tuexen@FreeBSD.org using -f From: Michael Tuexen Date: Tue, 6 Oct 2020 14:26:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366489 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: tuexen X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366489 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.33 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: Tue, 06 Oct 2020 14:26:06 -0000 Author: tuexen Date: Tue Oct 6 14:26:05 2020 New Revision: 366489 URL: https://svnweb.freebsd.org/changeset/base/366489 Log: Reset delayed SACK state when restarting an SCTP association. MFC after: 3 days Modified: head/sys/netinet/sctp_input.c Modified: head/sys/netinet/sctp_input.c ============================================================================== --- head/sys/netinet/sctp_input.c Tue Oct 6 14:03:59 2020 (r366488) +++ head/sys/netinet/sctp_input.c Tue Oct 6 14:26:05 2020 (r366489) @@ -1830,17 +1830,14 @@ sctp_process_cookie_existing(struct mbuf *m, int iphle /* move to OPEN state, if not in SHUTDOWN_SENT */ SCTP_SET_STATE(stcb, SCTP_STATE_OPEN); } - asoc->pre_open_streams = - ntohs(initack_cp->init.num_outbound_streams); + asoc->pre_open_streams = ntohs(initack_cp->init.num_outbound_streams); asoc->init_seq_number = ntohl(initack_cp->init.initial_tsn); asoc->sending_seq = asoc->asconf_seq_out = asoc->str_reset_seq_out = asoc->init_seq_number; asoc->asconf_seq_out_acked = asoc->asconf_seq_out - 1; - asoc->asconf_seq_in = asoc->last_acked_seq = asoc->init_seq_number - 1; - asoc->str_reset_seq_in = asoc->init_seq_number; - asoc->advanced_peer_ack_point = asoc->last_acked_seq; + asoc->send_sack = 1; if (asoc->mapping_array) { memset(asoc->mapping_array, 0, asoc->mapping_array_size); From owner-svn-src-all@freebsd.org Tue Oct 6 15:17:42 2020 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 4D13A4356C4; Tue, 6 Oct 2020 15:17:42 +0000 (UTC) (envelope-from gjb@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5LgV1J7zz4bBs; Tue, 6 Oct 2020 15:17:42 +0000 (UTC) (envelope-from gjb@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 1082F8C58; Tue, 6 Oct 2020 15:17:42 +0000 (UTC) (envelope-from gjb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096FHfgv074774; Tue, 6 Oct 2020 15:17:41 GMT (envelope-from gjb@FreeBSD.org) Received: (from gjb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096FHf3T074773; Tue, 6 Oct 2020 15:17:41 GMT (envelope-from gjb@FreeBSD.org) Message-Id: <202010061517.096FHf3T074773@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gjb set sender to gjb@FreeBSD.org using -f From: Glen Barber Date: Tue, 6 Oct 2020 15:17:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-releng@freebsd.org Subject: svn commit: r366490 - releng/12.2/cddl/contrib/opensolaris/lib/libzfs/common X-SVN-Group: releng X-SVN-Commit-Author: gjb X-SVN-Commit-Paths: releng/12.2/cddl/contrib/opensolaris/lib/libzfs/common X-SVN-Commit-Revision: 366490 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.33 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: Tue, 06 Oct 2020 15:17:42 -0000 Author: gjb Date: Tue Oct 6 15:17:41 2020 New Revision: 366490 URL: https://svnweb.freebsd.org/changeset/base/366490 Log: MFS12 r366180, r366341: r366180 (asomers): Fix resuming receive stream to dataset with mounted clone r366341 (asomers): Fix "zfs receive" of interrupted stream without "-F" Approved by: re (kib) Sponsored by: Rubicon Communications, LLC (netgate.com) Modified: releng/12.2/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c Directory Properties: releng/12.2/ (props changed) Modified: releng/12.2/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c ============================================================================== --- releng/12.2/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c Tue Oct 6 14:26:05 2020 (r366489) +++ releng/12.2/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c Tue Oct 6 15:17:41 2020 (r366490) @@ -3138,7 +3138,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char prop_errbuf[1024]; const char *chopprefix; boolean_t newfs = B_FALSE; - boolean_t stream_wantsnewfs; + boolean_t stream_wantsnewfs, stream_resumingnewfs; uint64_t parent_snapguid = 0; prop_changelist_t *clp = NULL; nvlist_t *snapprops_nvlist = NULL; @@ -3302,6 +3302,8 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const DMU_BACKUP_FEATURE_RESUMING; stream_wantsnewfs = (drrb->drr_fromguid == 0 || (drrb->drr_flags & DRR_FLAG_CLONE) || originsnap) && !resuming; + stream_resumingnewfs = (drrb->drr_fromguid == 0 || + (drrb->drr_flags & DRR_FLAG_CLONE) || originsnap) && resuming; if (stream_wantsnewfs) { /* @@ -3433,7 +3435,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const } if (!flags->dryrun && zhp->zfs_type == ZFS_TYPE_FILESYSTEM && - (stream_wantsnewfs || resuming)) { + (stream_wantsnewfs || stream_resumingnewfs)) { /* We can't do online recv in this case */ clp = changelist_gather(zhp, ZFS_PROP_NAME, 0, 0); if (clp == NULL) { From owner-svn-src-all@freebsd.org Tue Oct 6 17:59:00 2020 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 74178438396; Tue, 6 Oct 2020 17:59:00 +0000 (UTC) (envelope-from jhb@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5QFc2ZQhz3VQH; Tue, 6 Oct 2020 17:59:00 +0000 (UTC) (envelope-from jhb@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 3B507AB86; Tue, 6 Oct 2020 17:59:00 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096Hx0hi072682; Tue, 6 Oct 2020 17:59:00 GMT (envelope-from jhb@FreeBSD.org) Received: (from jhb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096HwuYR072660; Tue, 6 Oct 2020 17:58:56 GMT (envelope-from jhb@FreeBSD.org) Message-Id: <202010061758.096HwuYR072660@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jhb set sender to jhb@FreeBSD.org using -f From: John Baldwin Date: Tue, 6 Oct 2020 17:58:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366491 - in head/sys: dev/cxgbe dev/cxgbe/crypto dev/mlx5/mlx5_en kern net sys X-SVN-Group: head X-SVN-Commit-Author: jhb X-SVN-Commit-Paths: in head/sys: dev/cxgbe dev/cxgbe/crypto dev/mlx5/mlx5_en kern net sys X-SVN-Commit-Revision: 366491 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.33 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: Tue, 06 Oct 2020 17:59:00 -0000 Author: jhb Date: Tue Oct 6 17:58:56 2020 New Revision: 366491 URL: https://svnweb.freebsd.org/changeset/base/366491 Log: Store the send tag type in the common send tag header. Both cxgbe(4) and mlx5(4) wrapped the existing send tag header with their own identical headers that stored the type that the type-specific tag structures inherited from, so in practice it seems drivers need this in the tag anyway. This permits removing these extra header indirections (struct cxgbe_snd_tag and struct mlx5e_snd_tag). In addition, this permits driver-independent code to query the type of a tag, e.g. to know what type of tag is being queried via if_snd_query. Reviewed by: gallatin, hselasky, np, kib Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D26689 Modified: head/sys/dev/cxgbe/adapter.h head/sys/dev/cxgbe/crypto/t4_kern_tls.c head/sys/dev/cxgbe/offload.h head/sys/dev/cxgbe/t4_main.c head/sys/dev/cxgbe/t4_sched.c head/sys/dev/cxgbe/t4_sge.c head/sys/dev/mlx5/mlx5_en/en.h head/sys/dev/mlx5/mlx5_en/en_hw_tls.h head/sys/dev/mlx5/mlx5_en/en_rl.h head/sys/dev/mlx5/mlx5_en/mlx5_en_hw_tls.c head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c head/sys/dev/mlx5/mlx5_en/mlx5_en_rl.c head/sys/dev/mlx5/mlx5_en/mlx5_en_tx.c head/sys/kern/kern_mbuf.c head/sys/net/if_lagg.c head/sys/net/if_vlan.c head/sys/sys/mbuf.h Modified: head/sys/dev/cxgbe/adapter.h ============================================================================== --- head/sys/dev/cxgbe/adapter.h Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/cxgbe/adapter.h Tue Oct 6 17:58:56 2020 (r366491) @@ -1202,7 +1202,6 @@ int update_mac_settings(struct ifnet *, int); int adapter_full_init(struct adapter *); int adapter_full_uninit(struct adapter *); uint64_t cxgbe_get_counter(struct ifnet *, ift_counter); -void cxgbe_snd_tag_init(struct cxgbe_snd_tag *, struct ifnet *, int); int vi_full_init(struct vi_info *); int vi_full_uninit(struct vi_info *); void vi_sysctls(struct vi_info *); Modified: head/sys/dev/cxgbe/crypto/t4_kern_tls.c ============================================================================== --- head/sys/dev/cxgbe/crypto/t4_kern_tls.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/cxgbe/crypto/t4_kern_tls.c Tue Oct 6 17:58:56 2020 (r366491) @@ -156,7 +156,7 @@ struct tls_keyctx { #define KEY_DELETE_TX 0x8 struct tlspcb { - struct cxgbe_snd_tag com; + struct m_snd_tag com; struct vi_info *vi; /* virtual interface */ struct adapter *sc; struct l2t_entry *l2te; /* L2 table entry used by this connection */ @@ -205,7 +205,7 @@ static int ktls_setup_keys(struct tlspcb *tlsp, static inline struct tlspcb * mst_to_tls(struct m_snd_tag *t) { - return ((struct tlspcb *)mst_to_cst(t)); + return (__containerof(t, struct tlspcb, com)); } /* XXX: There are similar versions of these two in tom/t4_tls.c. */ @@ -240,7 +240,7 @@ alloc_tlspcb(struct ifnet *ifp, struct vi_info *vi, in if (tlsp == NULL) return (NULL); - cxgbe_snd_tag_init(&tlsp->com, ifp, IF_SND_TAG_TYPE_TLS); + m_snd_tag_init(&tlsp->com, ifp, IF_SND_TAG_TYPE_TLS); tlsp->vi = vi; tlsp->sc = sc; tlsp->ctrlq = &sc->sge.ctrlq[pi->port_id]; @@ -484,7 +484,7 @@ ktls_set_tcb_fields(struct tlspcb *tlsp, struct tcpcb tlsp->tid); return (ENOMEM); } - m->m_pkthdr.snd_tag = m_snd_tag_ref(&tlsp->com.com); + m->m_pkthdr.snd_tag = m_snd_tag_ref(&tlsp->com); m->m_pkthdr.csum_flags |= CSUM_SND_TAG; /* FW_ULPTX_WR */ @@ -727,13 +727,13 @@ cxgbe_tls_tag_alloc(struct ifnet *ifp, union if_snd_ta else txq->kern_tls_cbc++; TXQ_UNLOCK(txq); - *pt = &tlsp->com.com; + *pt = &tlsp->com; return (0); failed: if (atid >= 0) free_atid(sc, atid); - m_snd_tag_rele(&tlsp->com.com); + m_snd_tag_rele(&tlsp->com); return (error); } @@ -836,7 +836,7 @@ ktls_setup_keys(struct tlspcb *tlsp, const struct ktls tlsp->tid); return (ENOMEM); } - m->m_pkthdr.snd_tag = m_snd_tag_ref(&tlsp->com.com); + m->m_pkthdr.snd_tag = m_snd_tag_ref(&tlsp->com); m->m_pkthdr.csum_flags |= CSUM_SND_TAG; kwr = mtod(m, void *); memset(kwr, 0, len); Modified: head/sys/dev/cxgbe/offload.h ============================================================================== --- head/sys/dev/cxgbe/offload.h Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/cxgbe/offload.h Tue Oct 6 17:58:56 2020 (r366491) @@ -87,13 +87,8 @@ enum { EO_FLUSH_RPL_PENDING = (1 << 3), /* credit flush rpl due back */ }; -struct cxgbe_snd_tag { - struct m_snd_tag com; - int type; -}; - struct cxgbe_rate_tag { - struct cxgbe_snd_tag com; + struct m_snd_tag com; struct adapter *adapter; u_int flags; struct mtx lock; @@ -112,17 +107,10 @@ struct cxgbe_rate_tag { uint8_t ncompl; /* # of completions outstanding. */ }; -static inline struct cxgbe_snd_tag * -mst_to_cst(struct m_snd_tag *t) -{ - - return (__containerof(t, struct cxgbe_snd_tag, com)); -} - static inline struct cxgbe_rate_tag * mst_to_crt(struct m_snd_tag *t) { - return ((struct cxgbe_rate_tag *)mst_to_cst(t)); + return (__containerof(t, struct cxgbe_rate_tag, com)); } union etid_entry { Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/cxgbe/t4_main.c Tue Oct 6 17:58:56 2020 (r366491) @@ -2186,9 +2186,6 @@ cxgbe_transmit(struct ifnet *ifp, struct mbuf *m) struct port_info *pi = vi->pi; struct adapter *sc; struct sge_txq *txq; -#ifdef RATELIMIT - struct cxgbe_snd_tag *cst; -#endif void *items[1]; int rc; @@ -2212,8 +2209,7 @@ cxgbe_transmit(struct ifnet *ifp, struct mbuf *m) } #ifdef RATELIMIT if (m->m_pkthdr.csum_flags & CSUM_SND_TAG) { - cst = mst_to_cst(m->m_pkthdr.snd_tag); - if (cst->type == IF_SND_TAG_TYPE_RATE_LIMIT) + if (m->m_pkthdr.snd_tag->type == IF_SND_TAG_TYPE_RATE_LIMIT) return (ethofld_transmit(ifp, m)); } #endif @@ -2374,14 +2370,6 @@ cxgbe_get_counter(struct ifnet *ifp, ift_counter c) } #if defined(KERN_TLS) || defined(RATELIMIT) -void -cxgbe_snd_tag_init(struct cxgbe_snd_tag *cst, struct ifnet *ifp, int type) -{ - - m_snd_tag_init(&cst->com, ifp); - cst->type = type; -} - static int cxgbe_snd_tag_alloc(struct ifnet *ifp, union if_snd_tag_alloc_params *params, struct m_snd_tag **pt) @@ -2402,8 +2390,6 @@ cxgbe_snd_tag_alloc(struct ifnet *ifp, union if_snd_ta default: error = EOPNOTSUPP; } - if (error == 0) - MPASS(mst_to_cst(*pt)->type == params->hdr.type); return (error); } @@ -2411,10 +2397,8 @@ static int cxgbe_snd_tag_modify(struct m_snd_tag *mst, union if_snd_tag_modify_params *params) { - struct cxgbe_snd_tag *cst; - cst = mst_to_cst(mst); - switch (cst->type) { + switch (mst->type) { #ifdef RATELIMIT case IF_SND_TAG_TYPE_RATE_LIMIT: return (cxgbe_rate_tag_modify(mst, params)); @@ -2428,10 +2412,8 @@ static int cxgbe_snd_tag_query(struct m_snd_tag *mst, union if_snd_tag_query_params *params) { - struct cxgbe_snd_tag *cst; - cst = mst_to_cst(mst); - switch (cst->type) { + switch (mst->type) { #ifdef RATELIMIT case IF_SND_TAG_TYPE_RATE_LIMIT: return (cxgbe_rate_tag_query(mst, params)); @@ -2444,10 +2426,8 @@ cxgbe_snd_tag_query(struct m_snd_tag *mst, static void cxgbe_snd_tag_free(struct m_snd_tag *mst) { - struct cxgbe_snd_tag *cst; - cst = mst_to_cst(mst); - switch (cst->type) { + switch (mst->type) { #ifdef RATELIMIT case IF_SND_TAG_TYPE_RATE_LIMIT: cxgbe_rate_tag_free(mst); Modified: head/sys/dev/cxgbe/t4_sched.c ============================================================================== --- head/sys/dev/cxgbe/t4_sched.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/cxgbe/t4_sched.c Tue Oct 6 17:58:56 2020 (r366491) @@ -788,7 +788,7 @@ failed: mtx_init(&cst->lock, "cst_lock", NULL, MTX_DEF); mbufq_init(&cst->pending_tx, INT_MAX); mbufq_init(&cst->pending_fwack, INT_MAX); - cxgbe_snd_tag_init(&cst->com, ifp, IF_SND_TAG_TYPE_RATE_LIMIT); + m_snd_tag_init(&cst->com, ifp, IF_SND_TAG_TYPE_RATE_LIMIT); cst->flags |= EO_FLOWC_PENDING | EO_SND_TAG_REF; cst->adapter = sc; cst->port_id = pi->port_id; @@ -805,7 +805,7 @@ failed: * Queues will be selected later when the connection flowid is available. */ - *pt = &cst->com.com; + *pt = &cst->com; return (0); } Modified: head/sys/dev/cxgbe/t4_sge.c ============================================================================== --- head/sys/dev/cxgbe/t4_sge.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/cxgbe/t4_sge.c Tue Oct 6 17:58:56 2020 (r366491) @@ -2404,10 +2404,10 @@ set_mbuf_eo_tsclk_tsoff(struct mbuf *m, uint8_t tsclk_ } static inline int -needs_eo(struct cxgbe_snd_tag *cst) +needs_eo(struct m_snd_tag *mst) { - return (cst != NULL && cst->type == IF_SND_TAG_TYPE_RATE_LIMIT); + return (mst != NULL && mst->type == IF_SND_TAG_TYPE_RATE_LIMIT); } #endif @@ -2716,7 +2716,7 @@ parse_pkt(struct mbuf **mp, bool vm_wr) struct tcphdr *tcp; #endif #if defined(KERN_TLS) || defined(RATELIMIT) - struct cxgbe_snd_tag *cst; + struct m_snd_tag *mst; #endif uint16_t eh_type; uint8_t cflags; @@ -2740,12 +2740,12 @@ restart: nsegs = count_mbuf_nsegs(m0, 0, &cflags); #if defined(KERN_TLS) || defined(RATELIMIT) if (m0->m_pkthdr.csum_flags & CSUM_SND_TAG) - cst = mst_to_cst(m0->m_pkthdr.snd_tag); + mst = m0->m_pkthdr.snd_tag; else - cst = NULL; + mst = NULL; #endif #ifdef KERN_TLS - if (cst != NULL && cst->type == IF_SND_TAG_TYPE_TLS) { + if (mst != NULL && mst->type == IF_SND_TAG_TYPE_TLS) { int len16; cflags |= MC_TLS; @@ -2794,17 +2794,17 @@ restart: * checksumming is enabled. needs_outer_l4_csum happens to check for * all the right things. */ - if (__predict_false(needs_eo(cst) && !needs_outer_l4_csum(m0))) { + if (__predict_false(needs_eo(mst) && !needs_outer_l4_csum(m0))) { m_snd_tag_rele(m0->m_pkthdr.snd_tag); m0->m_pkthdr.snd_tag = NULL; m0->m_pkthdr.csum_flags &= ~CSUM_SND_TAG; - cst = NULL; + mst = NULL; } #endif if (!needs_hwcsum(m0) #ifdef RATELIMIT - && !needs_eo(cst) + && !needs_eo(mst) #endif ) return (0); @@ -2923,7 +2923,7 @@ restart: #endif } #ifdef RATELIMIT - if (needs_eo(cst)) { + if (needs_eo(mst)) { u_int immhdrs; /* EO WRs have the headers in the WR and not the GL. */ @@ -6484,7 +6484,7 @@ ethofld_tx(struct cxgbe_rate_tag *cst) cst->tx_credits -= next_credits; cst->tx_nocompl += next_credits; compl = cst->ncompl == 0 || cst->tx_nocompl >= cst->tx_total / 2; - ETHER_BPF_MTAP(cst->com.com.ifp, m); + ETHER_BPF_MTAP(cst->com.ifp, m); write_ethofld_wr(cst, wr, m, compl); commit_wrq_wr(cst->eo_txq, wr, &cookie); if (compl) { @@ -6505,7 +6505,7 @@ ethofld_tx(struct cxgbe_rate_tag *cst) */ m->m_pkthdr.snd_tag = NULL; m->m_pkthdr.csum_flags &= ~CSUM_SND_TAG; - m_snd_tag_rele(&cst->com.com); + m_snd_tag_rele(&cst->com); mbufq_enqueue(&cst->pending_fwack, m); } @@ -6559,10 +6559,10 @@ ethofld_transmit(struct ifnet *ifp, struct mbuf *m0) * ethofld_tx() in case we are sending the final mbuf after * the inp was freed. */ - m_snd_tag_ref(&cst->com.com); + m_snd_tag_ref(&cst->com); ethofld_tx(cst); mtx_unlock(&cst->lock); - m_snd_tag_rele(&cst->com.com); + m_snd_tag_rele(&cst->com); return (0); done: @@ -6633,12 +6633,12 @@ ethofld_fw4_ack(struct sge_iq *iq, const struct rss_he * As with ethofld_transmit(), hold an extra reference * so that the tag is stable across ethold_tx(). */ - m_snd_tag_ref(&cst->com.com); + m_snd_tag_ref(&cst->com); m = mbufq_first(&cst->pending_tx); if (m != NULL && cst->tx_credits >= mbuf_eo_len16(m)) ethofld_tx(cst); mtx_unlock(&cst->lock); - m_snd_tag_rele(&cst->com.com); + m_snd_tag_rele(&cst->com); } else { /* * There shouldn't be any pending packets if the tag Modified: head/sys/dev/mlx5/mlx5_en/en.h ============================================================================== --- head/sys/dev/mlx5/mlx5_en/en.h Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/mlx5/mlx5_en/en.h Tue Oct 6 17:58:56 2020 (r366491) @@ -791,11 +791,6 @@ enum { MLX5E_SQ_FULL }; -struct mlx5e_snd_tag { - struct m_snd_tag m_snd_tag; /* send tag */ - u32 type; /* tag type */ -}; - struct mlx5e_sq { /* persistant fields */ struct mtx lock; @@ -876,7 +871,7 @@ mlx5e_sq_queue_level(struct mlx5e_sq *sq) struct mlx5e_channel { struct mlx5e_rq rq; - struct mlx5e_snd_tag tag; + struct m_snd_tag tag; struct mlx5e_sq sq[MLX5E_MAX_TX_NUM_TC]; struct mlx5e_priv *priv; struct completion completion; Modified: head/sys/dev/mlx5/mlx5_en/en_hw_tls.h ============================================================================== --- head/sys/dev/mlx5/mlx5_en/en_hw_tls.h Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/mlx5/mlx5_en/en_hw_tls.h Tue Oct 6 17:58:56 2020 (r366491) @@ -44,7 +44,7 @@ enum { }; struct mlx5e_tls_tag { - struct mlx5e_snd_tag tag; + struct m_snd_tag tag; STAILQ_ENTRY(mlx5e_tls_tag) entry; volatile s32 refs; /* number of pending mbufs */ uint32_t tisn; /* HW TIS context number */ Modified: head/sys/dev/mlx5/mlx5_en/en_rl.h ============================================================================== --- head/sys/dev/mlx5/mlx5_en/en_rl.h Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/mlx5/mlx5_en/en_rl.h Tue Oct 6 17:58:56 2020 (r366491) @@ -129,7 +129,7 @@ struct mlx5e_rl_channel_param { }; struct mlx5e_rl_channel { - struct mlx5e_snd_tag tag; + struct m_snd_tag tag; STAILQ_ENTRY(mlx5e_rl_channel) entry; struct mlx5e_sq * volatile sq; struct mlx5e_rl_worker *worker; Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_hw_tls.c ============================================================================== --- head/sys/dev/mlx5/mlx5_en/mlx5_en_hw_tls.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/mlx5/mlx5_en/mlx5_en_hw_tls.c Tue Oct 6 17:58:56 2020 (r366491) @@ -303,7 +303,6 @@ mlx5e_tls_snd_tag_alloc(struct ifnet *ifp, /* setup TLS tag */ ptag->tls = &priv->tls; - ptag->tag.type = params->hdr.type; /* check if there is no TIS context */ if (ptag->tisn == 0) { @@ -378,7 +377,7 @@ mlx5e_tls_snd_tag_alloc(struct ifnet *ifp, goto failure; } - switch (ptag->tag.type) { + switch (params->hdr.type) { #if defined(RATELIMIT) && defined(IF_SND_TAG_TYPE_TLS_RATE_LIMIT) case IF_SND_TAG_TYPE_TLS_RATE_LIMIT: memset(&rl_params, 0, sizeof(rl_params)); @@ -410,9 +409,9 @@ mlx5e_tls_snd_tag_alloc(struct ifnet *ifp, } /* store pointer to mbuf tag */ - MPASS(ptag->tag.m_snd_tag.refcount == 0); - m_snd_tag_init(&ptag->tag.m_snd_tag, ifp); - *ppmt = &ptag->tag.m_snd_tag; + MPASS(ptag->tag.refcount == 0); + m_snd_tag_init(&ptag->tag, ifp, params->hdr.type); + *ppmt = &ptag->tag; queue_work(priv->tls.wq, &ptag->work); flush_work(&ptag->work); @@ -429,12 +428,12 @@ mlx5e_tls_snd_tag_modify(struct m_snd_tag *pmt, union { #if defined(RATELIMIT) && defined(IF_SND_TAG_TYPE_TLS_RATE_LIMIT) struct if_snd_tag_rate_limit_params rl_params; + struct mlx5e_tls_tag *ptag = + container_of(pmt, struct mlx5e_tls_tag, tag); int error; #endif - struct mlx5e_tls_tag *ptag = - container_of(pmt, struct mlx5e_tls_tag, tag.m_snd_tag); - switch (ptag->tag.type) { + switch (pmt->type) { #if defined(RATELIMIT) && defined(IF_SND_TAG_TYPE_TLS_RATE_LIMIT) case IF_SND_TAG_TYPE_TLS_RATE_LIMIT: memset(&rl_params, 0, sizeof(rl_params)); @@ -452,10 +451,10 @@ int mlx5e_tls_snd_tag_query(struct m_snd_tag *pmt, union if_snd_tag_query_params *params) { struct mlx5e_tls_tag *ptag = - container_of(pmt, struct mlx5e_tls_tag, tag.m_snd_tag); + container_of(pmt, struct mlx5e_tls_tag, tag); int error; - switch (ptag->tag.type) { + switch (pmt->type) { #if defined(RATELIMIT) && defined(IF_SND_TAG_TYPE_TLS_RATE_LIMIT) case IF_SND_TAG_TYPE_TLS_RATE_LIMIT: error = mlx5e_rl_snd_tag_query(ptag->rl_tag, params); @@ -475,10 +474,10 @@ void mlx5e_tls_snd_tag_free(struct m_snd_tag *pmt) { struct mlx5e_tls_tag *ptag = - container_of(pmt, struct mlx5e_tls_tag, tag.m_snd_tag); + container_of(pmt, struct mlx5e_tls_tag, tag); struct mlx5e_priv *priv; - switch (ptag->tag.type) { + switch (pmt->type) { #if defined(RATELIMIT) && defined(IF_SND_TAG_TYPE_TLS_RATE_LIMIT) case IF_SND_TAG_TYPE_TLS_RATE_LIMIT: mlx5e_rl_snd_tag_free(ptag->rl_tag); @@ -495,7 +494,7 @@ mlx5e_tls_snd_tag_free(struct m_snd_tag *pmt) ptag->state = MLX5E_TLS_ST_FREED; MLX5E_TLS_TAG_UNLOCK(ptag); - priv = ptag->tag.m_snd_tag.ifp->if_softc; + priv = ptag->tag.ifp->if_softc; queue_work(priv->tls.wq, &ptag->work); } @@ -699,7 +698,7 @@ int mlx5e_sq_tls_xmit(struct mlx5e_sq *sq, struct mlx5e_xmit_args *parg, struct mbuf **ppmb) { struct mlx5e_tls_tag *ptls_tag; - struct mlx5e_snd_tag *ptag; + struct m_snd_tag *ptag; const struct tcphdr *th; struct mbuf *mb = *ppmb; u64 rcd_sn; @@ -709,8 +708,7 @@ mlx5e_sq_tls_xmit(struct mlx5e_sq *sq, struct mlx5e_xm if ((mb->m_pkthdr.csum_flags & CSUM_SND_TAG) == 0) return (MLX5E_TLS_CONTINUE); - ptag = container_of(mb->m_pkthdr.snd_tag, - struct mlx5e_snd_tag, m_snd_tag); + ptag = mb->m_pkthdr.snd_tag; if ( #if defined(RATELIMIT) && defined(IF_SND_TAG_TYPE_TLS_RATE_LIMIT) Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c ============================================================================== --- head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c Tue Oct 6 17:58:56 2020 (r366491) @@ -2141,8 +2141,7 @@ mlx5e_chan_static_init(struct mlx5e_priv *priv, struct c->ix = ix; /* setup send tag */ - c->tag.type = IF_SND_TAG_TYPE_UNLIMITED; - m_snd_tag_init(&c->tag.m_snd_tag, c->priv->ifp); + m_snd_tag_init(&c->tag, c->priv->ifp, IF_SND_TAG_TYPE_UNLIMITED); init_completion(&c->completion); @@ -2166,7 +2165,7 @@ static void mlx5e_chan_wait_for_completion(struct mlx5e_channel *c) { - m_snd_tag_rele(&c->tag.m_snd_tag); + m_snd_tag_rele(&c->tag); wait_for_completion(&c->completion); } @@ -4087,8 +4086,8 @@ mlx5e_ul_snd_tag_alloc(struct ifnet *ifp, /* check if send queue is not running */ if (unlikely(pch->sq[0].running == 0)) return (ENXIO); - m_snd_tag_ref(&pch->tag.m_snd_tag); - *ppmt = &pch->tag.m_snd_tag; + m_snd_tag_ref(&pch->tag); + *ppmt = &pch->tag; return (0); } } @@ -4097,7 +4096,7 @@ int mlx5e_ul_snd_tag_query(struct m_snd_tag *pmt, union if_snd_tag_query_params *params) { struct mlx5e_channel *pch = - container_of(pmt, struct mlx5e_channel, tag.m_snd_tag); + container_of(pmt, struct mlx5e_channel, tag); params->unlimited.max_rate = -1ULL; params->unlimited.queue_level = mlx5e_sq_queue_level(&pch->sq[0]); @@ -4108,7 +4107,7 @@ void mlx5e_ul_snd_tag_free(struct m_snd_tag *pmt) { struct mlx5e_channel *pch = - container_of(pmt, struct mlx5e_channel, tag.m_snd_tag); + container_of(pmt, struct mlx5e_channel, tag); complete(&pch->completion); } @@ -4142,10 +4141,8 @@ mlx5e_snd_tag_alloc(struct ifnet *ifp, static int mlx5e_snd_tag_modify(struct m_snd_tag *pmt, union if_snd_tag_modify_params *params) { - struct mlx5e_snd_tag *tag = - container_of(pmt, struct mlx5e_snd_tag, m_snd_tag); - switch (tag->type) { + switch (pmt->type) { #ifdef RATELIMIT case IF_SND_TAG_TYPE_RATE_LIMIT: return (mlx5e_rl_snd_tag_modify(pmt, params)); @@ -4166,10 +4163,8 @@ mlx5e_snd_tag_modify(struct m_snd_tag *pmt, union if_s static int mlx5e_snd_tag_query(struct m_snd_tag *pmt, union if_snd_tag_query_params *params) { - struct mlx5e_snd_tag *tag = - container_of(pmt, struct mlx5e_snd_tag, m_snd_tag); - switch (tag->type) { + switch (pmt->type) { #ifdef RATELIMIT case IF_SND_TAG_TYPE_RATE_LIMIT: return (mlx5e_rl_snd_tag_query(pmt, params)); @@ -4236,10 +4231,8 @@ mlx5e_ratelimit_query(struct ifnet *ifp __unused, stru static void mlx5e_snd_tag_free(struct m_snd_tag *pmt) { - struct mlx5e_snd_tag *tag = - container_of(pmt, struct mlx5e_snd_tag, m_snd_tag); - switch (tag->type) { + switch (pmt->type) { #ifdef RATELIMIT case IF_SND_TAG_TYPE_RATE_LIMIT: mlx5e_rl_snd_tag_free(pmt); Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_rl.c ============================================================================== --- head/sys/dev/mlx5/mlx5_en/mlx5_en_rl.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/mlx5/mlx5_en/mlx5_en_rl.c Tue Oct 6 17:58:56 2020 (r366491) @@ -1128,9 +1128,9 @@ mlx5e_rl_snd_tag_alloc(struct ifnet *ifp, } /* store pointer to mbuf tag */ - MPASS(channel->tag.m_snd_tag.refcount == 0); - m_snd_tag_init(&channel->tag.m_snd_tag, ifp); - *ppmt = &channel->tag.m_snd_tag; + MPASS(channel->tag.refcount == 0); + m_snd_tag_init(&channel->tag, ifp, IF_SND_TAG_TYPE_RATE_LIMIT); + *ppmt = &channel->tag; done: return (error); } @@ -1140,7 +1140,7 @@ int mlx5e_rl_snd_tag_modify(struct m_snd_tag *pmt, union if_snd_tag_modify_params *params) { struct mlx5e_rl_channel *channel = - container_of(pmt, struct mlx5e_rl_channel, tag.m_snd_tag); + container_of(pmt, struct mlx5e_rl_channel, tag); return (mlx5e_rl_modify(channel->worker, channel, params->rate_limit.max_rate)); } @@ -1149,7 +1149,7 @@ int mlx5e_rl_snd_tag_query(struct m_snd_tag *pmt, union if_snd_tag_query_params *params) { struct mlx5e_rl_channel *channel = - container_of(pmt, struct mlx5e_rl_channel, tag.m_snd_tag); + container_of(pmt, struct mlx5e_rl_channel, tag); return (mlx5e_rl_query(channel->worker, channel, params)); } @@ -1158,7 +1158,7 @@ void mlx5e_rl_snd_tag_free(struct m_snd_tag *pmt) { struct mlx5e_rl_channel *channel = - container_of(pmt, struct mlx5e_rl_channel, tag.m_snd_tag); + container_of(pmt, struct mlx5e_rl_channel, tag); mlx5e_rl_free(channel->worker, channel); } Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_tx.c ============================================================================== --- head/sys/dev/mlx5/mlx5_en/mlx5_en_tx.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/dev/mlx5/mlx5_en/mlx5_en_tx.c Tue Oct 6 17:58:56 2020 (r366491) @@ -90,7 +90,6 @@ static struct mlx5e_sq * mlx5e_select_queue_by_send_tag(struct ifnet *ifp, struct mbuf *mb) { struct m_snd_tag *mb_tag; - struct mlx5e_snd_tag *ptag; struct mlx5e_sq *sq; mb_tag = mb->m_pkthdr.snd_tag; @@ -99,29 +98,27 @@ mlx5e_select_queue_by_send_tag(struct ifnet *ifp, stru top: #endif /* get pointer to sendqueue */ - ptag = container_of(mb_tag, struct mlx5e_snd_tag, m_snd_tag); - - switch (ptag->type) { + switch (mb_tag->type) { #ifdef RATELIMIT case IF_SND_TAG_TYPE_RATE_LIMIT: - sq = container_of(ptag, + sq = container_of(mb_tag, struct mlx5e_rl_channel, tag)->sq; break; #if defined(KERN_TLS) && defined(IF_SND_TAG_TYPE_TLS_RATE_LIMIT) case IF_SND_TAG_TYPE_TLS_RATE_LIMIT: - mb_tag = container_of(ptag, struct mlx5e_tls_tag, tag)->rl_tag; + mb_tag = container_of(mb_tag, struct mlx5e_tls_tag, tag)->rl_tag; goto top; #endif #endif case IF_SND_TAG_TYPE_UNLIMITED: - sq = &container_of(ptag, + sq = &container_of(mb_tag, struct mlx5e_channel, tag)->sq[0]; - KASSERT((ptag->m_snd_tag.refcount > 0), + KASSERT((mb_tag->refcount > 0), ("mlx5e_select_queue: Channel refs are zero for unlimited tag")); break; #ifdef KERN_TLS case IF_SND_TAG_TYPE_TLS: - mb_tag = container_of(ptag, struct mlx5e_tls_tag, tag)->rl_tag; + mb_tag = container_of(mb_tag, struct mlx5e_tls_tag, tag)->rl_tag; goto top; #endif default: Modified: head/sys/kern/kern_mbuf.c ============================================================================== --- head/sys/kern/kern_mbuf.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/kern/kern_mbuf.c Tue Oct 6 17:58:56 2020 (r366491) @@ -1526,12 +1526,13 @@ m_freem(struct mbuf *mb) } void -m_snd_tag_init(struct m_snd_tag *mst, struct ifnet *ifp) +m_snd_tag_init(struct m_snd_tag *mst, struct ifnet *ifp, u_int type) { if_ref(ifp); mst->ifp = ifp; refcount_init(&mst->refcount, 1); + mst->type = type; counter_u64_add(snd_tag_count, 1); } Modified: head/sys/net/if_lagg.c ============================================================================== --- head/sys/net/if_lagg.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/net/if_lagg.c Tue Oct 6 17:58:56 2020 (r366491) @@ -1686,7 +1686,7 @@ lagg_snd_tag_alloc(struct ifnet *ifp, return (error); } - m_snd_tag_init(&lst->com, ifp); + m_snd_tag_init(&lst->com, ifp, lst->tag->type); *ppmt = &lst->com; return (0); Modified: head/sys/net/if_vlan.c ============================================================================== --- head/sys/net/if_vlan.c Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/net/if_vlan.c Tue Oct 6 17:58:56 2020 (r366491) @@ -2066,7 +2066,7 @@ vlan_snd_tag_alloc(struct ifnet *ifp, return (error); } - m_snd_tag_init(&vst->com, ifp); + m_snd_tag_init(&vst->com, ifp, vst->tag->type); *ppmt = &vst->com; return (0); Modified: head/sys/sys/mbuf.h ============================================================================== --- head/sys/sys/mbuf.h Tue Oct 6 15:17:41 2020 (r366490) +++ head/sys/sys/mbuf.h Tue Oct 6 17:58:56 2020 (r366491) @@ -141,6 +141,7 @@ struct m_tag { struct m_snd_tag { struct ifnet *ifp; /* network interface tag belongs to */ volatile u_int refcount; + u_int type; /* One of IF_SND_TAG_TYPE_*. */ }; /* @@ -833,7 +834,7 @@ int m_sanity(struct mbuf *, int); struct mbuf *m_split(struct mbuf *, int, int); struct mbuf *m_uiotombuf(struct uio *, int, int, int, int); struct mbuf *m_unshare(struct mbuf *, int); -void m_snd_tag_init(struct m_snd_tag *, struct ifnet *); +void m_snd_tag_init(struct m_snd_tag *, struct ifnet *, u_int); void m_snd_tag_destroy(struct m_snd_tag *); static __inline int From owner-svn-src-all@freebsd.org Tue Oct 6 18:02:33 2020 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 DFA964383B0; Tue, 6 Oct 2020 18:02:33 +0000 (UTC) (envelope-from jhb@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5QKj5b2Pz3Vfh; Tue, 6 Oct 2020 18:02:33 +0000 (UTC) (envelope-from jhb@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 A30C8ABB0; Tue, 6 Oct 2020 18:02:33 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096I2Xmq078538; Tue, 6 Oct 2020 18:02:33 GMT (envelope-from jhb@FreeBSD.org) Received: (from jhb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096I2XiW078537; Tue, 6 Oct 2020 18:02:33 GMT (envelope-from jhb@FreeBSD.org) Message-Id: <202010061802.096I2XiW078537@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jhb set sender to jhb@FreeBSD.org using -f From: John Baldwin Date: Tue, 6 Oct 2020 18:02:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366492 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: jhb X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366492 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.33 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: Tue, 06 Oct 2020 18:02:33 -0000 Author: jhb Date: Tue Oct 6 18:02:33 2020 New Revision: 366492 URL: https://svnweb.freebsd.org/changeset/base/366492 Log: Check if_capenable, not if_capabilities when enabling rate limiting. if_capabilities is a read-only mask of supported capabilities. if_capenable is a mask under administrative control via ifconfig(8). Reviewed by: gallatin Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D26690 Modified: head/sys/netinet/tcp_ratelimit.c Modified: head/sys/netinet/tcp_ratelimit.c ============================================================================== --- head/sys/netinet/tcp_ratelimit.c Tue Oct 6 17:58:56 2020 (r366491) +++ head/sys/netinet/tcp_ratelimit.c Tue Oct 6 18:02:33 2020 (r366492) @@ -1137,7 +1137,7 @@ tcp_rl_ifnet_link(void *arg __unused, struct ifnet *if int error; struct tcp_rate_set *rs; - if (((ifp->if_capabilities & IFCAP_TXRTLMT) == 0) || + if (((ifp->if_capenable & IFCAP_TXRTLMT) == 0) || (link_state != LINK_STATE_UP)) { /* * We only care on an interface going up that is rate-limit @@ -1224,7 +1224,7 @@ tcp_set_pacing_rate(struct tcpcb *tp, struct ifnet *if /* * We are setting up a rate for the first time. */ - if ((ifp->if_capabilities & IFCAP_TXRTLMT) == 0) { + if ((ifp->if_capenable & IFCAP_TXRTLMT) == 0) { /* Not supported by the egress */ if (error) *error = ENODEV; From owner-svn-src-all@freebsd.org Tue Oct 6 18:07:53 2020 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 6A48B43846A; Tue, 6 Oct 2020 18:07:53 +0000 (UTC) (envelope-from jhb@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5QRs27kZz3Vr1; Tue, 6 Oct 2020 18:07:53 +0000 (UTC) (envelope-from jhb@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 2821EA973; Tue, 6 Oct 2020 18:07:53 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096I7r1W078929; Tue, 6 Oct 2020 18:07:53 GMT (envelope-from jhb@FreeBSD.org) Received: (from jhb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096I7riR078928; Tue, 6 Oct 2020 18:07:53 GMT (envelope-from jhb@FreeBSD.org) Message-Id: <202010061807.096I7riR078928@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jhb set sender to jhb@FreeBSD.org using -f From: John Baldwin Date: Tue, 6 Oct 2020 18:07:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366493 - head/sys/opencrypto X-SVN-Group: head X-SVN-Commit-Author: jhb X-SVN-Commit-Paths: head/sys/opencrypto X-SVN-Commit-Revision: 366493 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.33 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: Tue, 06 Oct 2020 18:07:53 -0000 Author: jhb Date: Tue Oct 6 18:07:52 2020 New Revision: 366493 URL: https://svnweb.freebsd.org/changeset/base/366493 Log: Simplify swcr_authcompute() after removal of deprecated algorithms. - Just use sw->octx != NULL to handle the HMAC case when finalizing the MAC. - Explicitly zero the on-stack auth context. Reviewed by: markj Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D26688 Modified: head/sys/opencrypto/cryptosoft.c Modified: head/sys/opencrypto/cryptosoft.c ============================================================================== --- head/sys/opencrypto/cryptosoft.c Tue Oct 6 18:02:33 2020 (r366492) +++ head/sys/opencrypto/cryptosoft.c Tue Oct 6 18:07:52 2020 (r366493) @@ -341,7 +341,7 @@ swcr_authcompute(struct swcr_session *ses, struct cryp err = crypto_apply(crp, crp->crp_aad_start, crp->crp_aad_length, axf->Update, &ctx); if (err) - return err; + goto out; if (CRYPTO_HAS_OUTPUT_BUFFER(crp) && CRYPTO_OP_IS_ENCRYPT(crp->crp_op)) @@ -352,38 +352,13 @@ swcr_authcompute(struct swcr_session *ses, struct cryp err = crypto_apply(crp, crp->crp_payload_start, crp->crp_payload_length, axf->Update, &ctx); if (err) - return err; + goto out; - switch (axf->type) { - case CRYPTO_SHA1: - case CRYPTO_SHA2_224: - case CRYPTO_SHA2_256: - case CRYPTO_SHA2_384: - case CRYPTO_SHA2_512: - axf->Final(aalg, &ctx); - break; - - case CRYPTO_SHA1_HMAC: - case CRYPTO_SHA2_224_HMAC: - case CRYPTO_SHA2_256_HMAC: - case CRYPTO_SHA2_384_HMAC: - case CRYPTO_SHA2_512_HMAC: - case CRYPTO_RIPEMD160_HMAC: - if (sw->sw_octx == NULL) - return EINVAL; - - axf->Final(aalg, &ctx); + axf->Final(aalg, &ctx); + if (sw->sw_octx != NULL) { bcopy(sw->sw_octx, &ctx, axf->ctxsize); axf->Update(&ctx, aalg, axf->hashsize); axf->Final(aalg, &ctx); - break; - - case CRYPTO_BLAKE2B: - case CRYPTO_BLAKE2S: - case CRYPTO_NULL_HMAC: - case CRYPTO_POLY1305: - axf->Final(aalg, &ctx); - break; } if (crp->crp_op & CRYPTO_OP_VERIFY_DIGEST) { @@ -398,6 +373,8 @@ swcr_authcompute(struct swcr_session *ses, struct cryp crypto_copyback(crp, crp->crp_digest_start, sw->sw_mlen, aalg); } explicit_bzero(aalg, sizeof(aalg)); +out: + explicit_bzero(&ctx, sizeof(ctx)); return (err); } From owner-svn-src-all@freebsd.org Tue Oct 6 18:13:16 2020 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 3DFF4438893; Tue, 6 Oct 2020 18:13:16 +0000 (UTC) (envelope-from jhb@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5QZ40tqNz3WXm; Tue, 6 Oct 2020 18:13:16 +0000 (UTC) (envelope-from jhb@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 02359ACFE; Tue, 6 Oct 2020 18:13:16 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096IDFB4085167; Tue, 6 Oct 2020 18:13:15 GMT (envelope-from jhb@FreeBSD.org) Received: (from jhb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096IDFVT085166; Tue, 6 Oct 2020 18:13:15 GMT (envelope-from jhb@FreeBSD.org) Message-Id: <202010061813.096IDFVT085166@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jhb set sender to jhb@FreeBSD.org using -f From: John Baldwin Date: Tue, 6 Oct 2020 18:13:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366494 - head/sys/dev/drm2 X-SVN-Group: head X-SVN-Commit-Author: jhb X-SVN-Commit-Paths: head/sys/dev/drm2 X-SVN-Commit-Revision: 366494 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.33 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: Tue, 06 Oct 2020 18:13:16 -0000 Author: jhb Date: Tue Oct 6 18:13:15 2020 New Revision: 366494 URL: https://svnweb.freebsd.org/changeset/base/366494 Log: Don't permit DRM buffer mappings to be upgraded to executable. Reviewed by: kib MFC after: 1 month Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D26697 Modified: head/sys/dev/drm2/drm_bufs.c Modified: head/sys/dev/drm2/drm_bufs.c ============================================================================== --- head/sys/dev/drm2/drm_bufs.c Tue Oct 6 18:07:52 2020 (r366493) +++ head/sys/dev/drm2/drm_bufs.c Tue Oct 6 18:13:15 2020 (r366494) @@ -1635,14 +1635,12 @@ int drm_mapbufs(struct drm_device *dev, void *data, goto done; } retcode = vm_mmap(&vms->vm_map, &virtual, map->size, - VM_PROT_READ | VM_PROT_WRITE, VM_PROT_ALL, - MAP_SHARED | MAP_NOSYNC, OBJT_DEVICE, - file_priv->minor->device, token); + VM_PROT_RW, VM_PROT_RW, MAP_SHARED | MAP_NOSYNC, + OBJT_DEVICE, file_priv->minor->device, token); } else { retcode = vm_mmap(&vms->vm_map, &virtual, dma->byte_count, - VM_PROT_READ | VM_PROT_WRITE, VM_PROT_ALL, - MAP_SHARED | MAP_NOSYNC, OBJT_DEVICE, - file_priv->minor->device, 0); + VM_PROT_RW, VM_PROT_RW, MAP_SHARED | MAP_NOSYNC, + OBJT_DEVICE, file_priv->minor->device, 0); } if (retcode) { /* Real error */ From owner-svn-src-all@freebsd.org Tue Oct 6 19:10:33 2020 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 D068E4397E7; Tue, 6 Oct 2020 19:10:33 +0000 (UTC) (envelope-from vmaffione@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Rr95DhWz3YkQ; Tue, 6 Oct 2020 19:10:33 +0000 (UTC) (envelope-from vmaffione@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 9780CB674; Tue, 6 Oct 2020 19:10:33 +0000 (UTC) (envelope-from vmaffione@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096JAXrY015995; Tue, 6 Oct 2020 19:10:33 GMT (envelope-from vmaffione@FreeBSD.org) Received: (from vmaffione@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096JAXBl015993; Tue, 6 Oct 2020 19:10:33 GMT (envelope-from vmaffione@FreeBSD.org) Message-Id: <202010061910.096JAXBl015993@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: vmaffione set sender to vmaffione@FreeBSD.org using -f From: Vincenzo Maffione Date: Tue, 6 Oct 2020 19:10:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366495 - stable/12/tools/tools/netmap X-SVN-Group: stable-12 X-SVN-Commit-Author: vmaffione X-SVN-Commit-Paths: stable/12/tools/tools/netmap X-SVN-Commit-Revision: 366495 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.33 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: Tue, 06 Oct 2020 19:10:33 -0000 Author: vmaffione Date: Tue Oct 6 19:10:32 2020 New Revision: 366495 URL: https://svnweb.freebsd.org/changeset/base/366495 Log: MFC r366387 netmap: pkt-gen: minor corrections to documentation Submitted by: Brian Poole Modified: stable/12/tools/tools/netmap/pkt-gen.8 stable/12/tools/tools/netmap/pkt-gen.c Directory Properties: stable/12/ (props changed) Modified: stable/12/tools/tools/netmap/pkt-gen.8 ============================================================================== --- stable/12/tools/tools/netmap/pkt-gen.8 Tue Oct 6 18:13:15 2020 (r366494) +++ stable/12/tools/tools/netmap/pkt-gen.8 Tue Oct 6 19:10:32 2020 (r366495) @@ -95,7 +95,7 @@ for server-side ping-pong operation. .It Fl n Ar count Number of iterations of the .Nm -function, with 0 meaning infinite). +function (with 0 meaning infinite). In case of .Cm tx or @@ -147,10 +147,10 @@ is larger than one, each thread handles a single TX ri .Cm tx mode), a single RX ring (in .Cm rx -mode), or a TX/RX ring couple. +mode), or a TX/RX ring pair. The number of .Ar threads -must be less or equal than the number of TX (or RX) ring available +must be less than or equal to the number of TX (or RX) ring available in the device specified by .Ar interface . .It Fl T Ar report_ms @@ -158,7 +158,7 @@ Number of milliseconds between reports. .It Fl w Ar wait_for_link_time Number of seconds to wait before starting the .Nm -function, useuful to make sure that the network link is up. +function, useful to make sure that the network link is up. A network device driver may take some time to enter netmap mode, or to create a new transmit/receive ring pair when .Xr netmap 4 @@ -168,7 +168,7 @@ Packet transmission rate. Not setting the packet transmission rate tells .Nm to transmit packets as quickly as possible. -On servers from 2010 on-wards +On servers from 2010 onward .Xr netmap 4 is able to completely use all of the bandwidth of a 10 or 40Gbps link, so this option should be used unless your intention is to saturate the link. @@ -231,7 +231,7 @@ This adds 4 bytes of CRC and 20 bytes of framing to ea .It Fl C Ar tx_slots Ns Oo Cm \&, Ns Ar rx_slots Ns Oo Cm \&, Ns Ar tx_rings Ns Oo Cm \&, Ns Ar rx_rings Oc Oc Oc Configuration in terms of number of rings and slots to be used when opening the netmap port. -Such configuration has effect on software ports +Such configuration has an effect on software ports created on the fly, such as VALE ports and netmap pipes. The configuration may consist of 1 to 4 numbers separated by commas: .Dq tx_slots,rx_slots,tx_rings,rx_rings . Modified: stable/12/tools/tools/netmap/pkt-gen.c ============================================================================== --- stable/12/tools/tools/netmap/pkt-gen.c Tue Oct 6 18:13:15 2020 (r366494) +++ stable/12/tools/tools/netmap/pkt-gen.c Tue Oct 6 19:10:32 2020 (r366495) @@ -275,7 +275,7 @@ struct glob_arg { #define OPT_TS 16 /* add a timestamp */ #define OPT_INDIRECT 32 /* use indirect buffers, tx only */ #define OPT_DUMP 64 /* dump rx/tx traffic */ -#define OPT_RUBBISH 256 /* send wathever the buffers contain */ +#define OPT_RUBBISH 256 /* send whatever the buffers contain */ #define OPT_RANDOM_SRC 512 #define OPT_RANDOM_DST 1024 #define OPT_PPS_STATS 2048 @@ -2360,7 +2360,7 @@ usage(int errcode) " for client-side ping-pong operation, and pong for server-side ping-pong operation.\n" "\n" " -n count\n" -" Number of iterations of the pkt-gen function, with 0 meaning infinite). In case of tx or rx,\n" +" Number of iterations of the pkt-gen function (with 0 meaning infinite). In case of tx or rx,\n" " count is the number of packets to receive or transmit. In case of ping or pong, count is the\n" " number of ping-pong transactions.\n" "\n" @@ -2397,20 +2397,20 @@ usage(int errcode) " -p threads\n" " Number of threads to use. By default, only a single thread is used to handle all the netmap\n" " rings. If threads is larger than one, each thread handles a single TX ring (in tx mode), a\n" -" single RX ring (in rx mode), or a TX/RX ring couple. The number of threads must be less or\n" -" equal than the number of TX (or RX) ring available in the device specified by interface.\n" +" single RX ring (in rx mode), or a TX/RX ring pair. The number of threads must be less than or\n" +" equal to the number of TX (or RX) rings available in the device specified by interface.\n" "\n" " -T report_ms\n" " Number of milliseconds between reports.\n" "\n" " -w wait_for_link_time\n" -" Number of seconds to wait before starting the pkt-gen function, useuful to make sure that the\n" +" Number of seconds to wait before starting the pkt-gen function, useful to make sure that the\n" " network link is up. A network device driver may take some time to enter netmap mode, or to\n" " create a new transmit/receive ring pair when netmap(4) requests one.\n" "\n" " -R rate\n" " Packet transmission rate. Not setting the packet transmission rate tells pkt-gen to transmit\n" -" packets as quickly as possible. On servers from 2010 on-wards netmap(4) is able to com-\n" +" packets as quickly as possible. On servers from 2010 onward netmap(4) is able to com-\n" " pletely use all of the bandwidth of a 10 or 40Gbps link, so this option should be used unless\n" " your intention is to saturate the link.\n" "\n" @@ -2456,7 +2456,7 @@ usage(int errcode) "\n" " -C tx_slots[,rx_slots[,tx_rings[,rx_rings]]]\n" " Configuration in terms of number of rings and slots to be used when opening the netmap port.\n" -" Such configuration has effect on software ports created on the fly, such as VALE ports and\n" +" Such configuration has an effect on software ports created on the fly, such as VALE ports and\n" " netmap pipes. The configuration may consist of 1 to 4 numbers separated by commas: tx_slots,\n" " rx_slots, tx_rings, rx_rings. Missing numbers or zeroes stand for default values. As an\n" " additional convenience, if exactly one number is specified, then this is assigned to both\n" @@ -2472,7 +2472,7 @@ usage(int errcode) " OPT_INDIRECT 32 (use indirect buffers)\n" " OPT_DUMP 64 (dump rx/tx traffic)\n" " OPT_RUBBISH 256\n" -" (send wathever the buffers contain)\n" +" (send whatever the buffers contain)\n" " OPT_RANDOM_SRC 512\n" " OPT_RANDOM_DST 1024\n" " OPT_PPS_STATS 2048\n" From owner-svn-src-all@freebsd.org Tue Oct 6 19:11:56 2020 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 41285439C87; Tue, 6 Oct 2020 19:11:56 +0000 (UTC) (envelope-from vmaffione@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Rsm0wYLz3Ytd; Tue, 6 Oct 2020 19:11:56 +0000 (UTC) (envelope-from vmaffione@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 030C7B7B1; Tue, 6 Oct 2020 19:11:56 +0000 (UTC) (envelope-from vmaffione@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096JBtiK021721; Tue, 6 Oct 2020 19:11:55 GMT (envelope-from vmaffione@FreeBSD.org) Received: (from vmaffione@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096JBt6Z021720; Tue, 6 Oct 2020 19:11:55 GMT (envelope-from vmaffione@FreeBSD.org) Message-Id: <202010061911.096JBt6Z021720@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: vmaffione set sender to vmaffione@FreeBSD.org using -f From: Vincenzo Maffione Date: Tue, 6 Oct 2020 19:11:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366496 - stable/12/sys/net X-SVN-Group: stable-12 X-SVN-Commit-Author: vmaffione X-SVN-Commit-Paths: stable/12/sys/net X-SVN-Commit-Revision: 366496 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.33 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: Tue, 06 Oct 2020 19:11:56 -0000 Author: vmaffione Date: Tue Oct 6 19:11:55 2020 New Revision: 366496 URL: https://svnweb.freebsd.org/changeset/base/366496 Log: MFC r366388 netmap: fix constness warnings generated by "-Wcast-qual" Submitted by: milosz.kaniewski@gmail.com Modified: stable/12/sys/net/netmap_user.h Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/net/netmap_user.h ============================================================================== --- stable/12/sys/net/netmap_user.h Tue Oct 6 19:10:32 2020 (r366495) +++ stable/12/sys/net/netmap_user.h Tue Oct 6 19:11:55 2020 (r366496) @@ -292,7 +292,7 @@ struct nm_desc { * when the descriptor is open correctly, d->self == d * Eventually we should also use some magic number. */ -#define P2NMD(p) ((struct nm_desc *)(p)) +#define P2NMD(p) ((const struct nm_desc *)(p)) #define IS_NETMAP_DESC(d) ((d) && P2NMD(d)->self == P2NMD(d)) #define NETMAP_FD(d) (P2NMD(d)->fd) @@ -623,7 +623,7 @@ nm_parse(const char *ifname, struct nm_desc *d, char * const char *vpname = NULL; u_int namelen; uint32_t nr_ringid = 0, nr_flags; - char errmsg[MAXERRMSG] = ""; + char errmsg[MAXERRMSG] = "", *tmp; long num; uint16_t nr_arg2 = 0; enum { P_START, P_RNGSFXOK, P_GETNUM, P_FLAGS, P_FLAGSOK, P_MEMID } p_state; @@ -720,12 +720,13 @@ nm_parse(const char *ifname, struct nm_desc *d, char * port++; break; case P_GETNUM: - num = strtol(port, (char **)&port, 10); + num = strtol(port, &tmp, 10); if (num < 0 || num >= NETMAP_RING_MASK) { snprintf(errmsg, MAXERRMSG, "'%ld' out of range [0, %d)", num, NETMAP_RING_MASK); goto fail; } + port = tmp; nr_ringid = num & NETMAP_RING_MASK; p_state = P_RNGSFXOK; break; @@ -767,11 +768,12 @@ nm_parse(const char *ifname, struct nm_desc *d, char * snprintf(errmsg, MAXERRMSG, "double setting of memid"); goto fail; } - num = strtol(port, (char **)&port, 10); + num = strtol(port, &tmp, 10); if (num <= 0) { snprintf(errmsg, MAXERRMSG, "invalid memid %ld, must be >0", num); goto fail; } + port = tmp; nr_arg2 = num; p_state = P_RNGSFXOK; break; @@ -1054,7 +1056,7 @@ nm_inject(struct nm_desc *d, const void *buf, size_t s ring->slot[i].flags = NS_MOREFRAG; nm_pkt_copy(buf, NETMAP_BUF(ring, idx), ring->nr_buf_size); i = nm_ring_next(ring, i); - buf = (char *)buf + ring->nr_buf_size; + buf = (const char *)buf + ring->nr_buf_size; } idx = ring->slot[i].buf_idx; ring->slot[i].len = rem; From owner-svn-src-all@freebsd.org Tue Oct 6 19:12:44 2020 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 07425439C95; Tue, 6 Oct 2020 19:12:44 +0000 (UTC) (envelope-from vmaffione@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Rtg6SfGz3Z36; Tue, 6 Oct 2020 19:12:43 +0000 (UTC) (envelope-from vmaffione@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 C137CB74F; Tue, 6 Oct 2020 19:12:43 +0000 (UTC) (envelope-from vmaffione@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096JChKp021814; Tue, 6 Oct 2020 19:12:43 GMT (envelope-from vmaffione@FreeBSD.org) Received: (from vmaffione@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096JCh77021812; Tue, 6 Oct 2020 19:12:43 GMT (envelope-from vmaffione@FreeBSD.org) Message-Id: <202010061912.096JCh77021812@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: vmaffione set sender to vmaffione@FreeBSD.org using -f From: Vincenzo Maffione Date: Tue, 6 Oct 2020 19:12:43 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366497 - in stable/12: share/man/man4 tools/tools/netmap X-SVN-Group: stable-12 X-SVN-Commit-Author: vmaffione X-SVN-Commit-Paths: in stable/12: share/man/man4 tools/tools/netmap X-SVN-Commit-Revision: 366497 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.33 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: Tue, 06 Oct 2020 19:12:44 -0000 Author: vmaffione Date: Tue Oct 6 19:12:43 2020 New Revision: 366497 URL: https://svnweb.freebsd.org/changeset/base/366497 Log: MFC r366389 netmap: minor documentation fix Also update date of pkt-gen.8 (not done in r366387). Submitted by: milosz.kaniewski@gmail.com Modified: stable/12/share/man/man4/netmap.4 stable/12/tools/tools/netmap/pkt-gen.8 Directory Properties: stable/12/ (props changed) Modified: stable/12/share/man/man4/netmap.4 ============================================================================== --- stable/12/share/man/man4/netmap.4 Tue Oct 6 19:11:55 2020 (r366496) +++ stable/12/share/man/man4/netmap.4 Tue Oct 6 19:12:43 2020 (r366497) @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd February 6, 2020 +.Dd October 3, 2020 .Dt NETMAP 4 .Os .Sh NAME @@ -1051,7 +1051,7 @@ void receiver(void) for (;;) { poll(&fds, 1, -1); while ( (buf = nm_nextpkt(d, &h)) ) - consume_pkt(buf, h->len); + consume_pkt(buf, h.len); } nm_close(d); } Modified: stable/12/tools/tools/netmap/pkt-gen.8 ============================================================================== --- stable/12/tools/tools/netmap/pkt-gen.8 Tue Oct 6 19:11:55 2020 (r366496) +++ stable/12/tools/tools/netmap/pkt-gen.8 Tue Oct 6 19:12:43 2020 (r366497) @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 31, 2018 +.Dd October 3, 2020 .Dt PKT-GEN 8 .Os .Sh NAME From owner-svn-src-all@freebsd.org Tue Oct 6 19:14:05 2020 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 1B45E439A53; Tue, 6 Oct 2020 19:14:05 +0000 (UTC) (envelope-from vmaffione@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5RwF0Dt9z3Z5w; Tue, 6 Oct 2020 19:14:05 +0000 (UTC) (envelope-from vmaffione@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 C67E0BB93; Tue, 6 Oct 2020 19:14:04 +0000 (UTC) (envelope-from vmaffione@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096JE41p021932; Tue, 6 Oct 2020 19:14:04 GMT (envelope-from vmaffione@FreeBSD.org) Received: (from vmaffione@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096JE3e6021926; Tue, 6 Oct 2020 19:14:03 GMT (envelope-from vmaffione@FreeBSD.org) Message-Id: <202010061914.096JE3e6021926@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: vmaffione set sender to vmaffione@FreeBSD.org using -f From: Vincenzo Maffione Date: Tue, 6 Oct 2020 19:14:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366498 - stable/12/tools/tools/netmap X-SVN-Group: stable-12 X-SVN-Commit-Author: vmaffione X-SVN-Commit-Paths: stable/12/tools/tools/netmap X-SVN-Commit-Revision: 366498 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.33 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: Tue, 06 Oct 2020 19:14:05 -0000 Author: vmaffione Date: Tue Oct 6 19:14:03 2020 New Revision: 366498 URL: https://svnweb.freebsd.org/changeset/base/366498 Log: MFC r366393 netmap: tools: fix several compiler warnings MFC after: 1 week Modified: stable/12/tools/tools/netmap/Makefile stable/12/tools/tools/netmap/bridge.c stable/12/tools/tools/netmap/ctrs.h stable/12/tools/tools/netmap/lb.c stable/12/tools/tools/netmap/nmreplay.c stable/12/tools/tools/netmap/pkt-gen.c stable/12/tools/tools/netmap/pkt_hash.c Directory Properties: stable/12/ (props changed) Modified: stable/12/tools/tools/netmap/Makefile ============================================================================== --- stable/12/tools/tools/netmap/Makefile Tue Oct 6 19:12:43 2020 (r366497) +++ stable/12/tools/tools/netmap/Makefile Tue Oct 6 19:14:03 2020 (r366498) @@ -21,6 +21,8 @@ LDFLAGS += -lm # used by nmreplay .include .include +CFLAGS += -Wno-cast-align + all: $(PROGS) pkt-gen: pkt-gen.o Modified: stable/12/tools/tools/netmap/bridge.c ============================================================================== --- stable/12/tools/tools/netmap/bridge.c Tue Oct 6 19:12:43 2020 (r366497) +++ stable/12/tools/tools/netmap/bridge.c Tue Oct 6 19:14:03 2020 (r366498) @@ -14,7 +14,7 @@ #include #include -int verbose = 0; +static int verbose = 0; static int do_abort = 0; static int zerocopy = 1; /* enable zerocopy if possible */ @@ -31,7 +31,7 @@ sigint_h(int sig) /* * how many packets on this set of queues ? */ -int +static int pkt_queued(struct nm_desc *d, int tx) { u_int i, tot = 0; Modified: stable/12/tools/tools/netmap/ctrs.h ============================================================================== --- stable/12/tools/tools/netmap/ctrs.h Tue Oct 6 19:12:43 2020 (r366497) +++ stable/12/tools/tools/netmap/ctrs.h Tue Oct 6 19:14:03 2020 (r366498) @@ -18,12 +18,12 @@ struct my_ctrs { * Caller has to make sure that the buffer is large enough. */ static const char * -norm2(char *buf, double val, char *fmt, int normalize) +norm2(char *buf, double val, const char *fmt, int normalize) { - char *units[] = { "", "K", "M", "G", "T" }; + const char *units[] = { "", "K", "M", "G", "T" }; u_int i; if (normalize) - for (i = 0; val >=1000 && i < sizeof(units)/sizeof(char *) - 1; i++) + for (i = 0; val >=1000 && i < sizeof(units)/sizeof(const char *) - 1; i++) val /= 1000; else i=0; Modified: stable/12/tools/tools/netmap/lb.c ============================================================================== --- stable/12/tools/tools/netmap/lb.c Tue Oct 6 19:12:43 2020 (r366497) +++ stable/12/tools/tools/netmap/lb.c Tue Oct 6 19:14:03 2020 (r366498) @@ -89,7 +89,7 @@ struct compact_ipv6_hdr { #define BUF_REVOKE 100 #define STAT_MSG_MAXSIZE 1024 -struct { +static struct { char ifname[MAX_IFNAMELEN]; char base_name[MAX_IFNAMELEN]; int netmap_fd; @@ -115,7 +115,7 @@ struct overflow_queue { uint32_t size; }; -struct overflow_queue *freeq; +static struct overflow_queue *freeq; static inline int oq_full(struct overflow_queue *q) @@ -160,12 +160,12 @@ oq_deq(struct overflow_queue *q) static volatile int do_abort = 0; -uint64_t dropped = 0; -uint64_t forwarded = 0; -uint64_t received_bytes = 0; -uint64_t received_pkts = 0; -uint64_t non_ip = 0; -uint32_t freeq_n = 0; +static uint64_t dropped = 0; +static uint64_t forwarded = 0; +static uint64_t received_bytes = 0; +static uint64_t received_pkts = 0; +static uint64_t non_ip = 0; +static uint32_t freeq_n = 0; struct port_des { char interface[MAX_PORTNAMELEN]; @@ -178,7 +178,7 @@ struct port_des { struct group_des *group; }; -struct port_des *ports; +static struct port_des *ports; /* each group of pipes receives all the packets */ struct group_des { @@ -190,7 +190,7 @@ struct group_des { int custom_port; }; -struct group_des *groups; +static struct group_des *groups; /* statistcs */ struct counters { @@ -205,7 +205,7 @@ struct counters { #define COUNTERS_FULL 1 }; -struct counters counters_buf; +static struct counters counters_buf; static void * print_stats(void *arg) @@ -387,7 +387,7 @@ static void sigint_h(int sig) signal(SIGINT, SIG_DFL); } -void usage() +static void usage() { printf("usage: lb [options]\n"); printf("where options are:\n"); @@ -404,9 +404,9 @@ void usage() } static int -parse_pipes(char *spec) +parse_pipes(const char *spec) { - char *end = index(spec, ':'); + const char *end = index(spec, ':'); static int max_groups = 0; struct group_des *g; @@ -458,7 +458,8 @@ parse_pipes(char *spec) } /* complete the initialization of the groups data structure */ -void init_groups(void) +static void +init_groups(void) { int i, j, t = 0; struct group_des *g = NULL; @@ -484,7 +485,8 @@ void init_groups(void) * chain headed by g. * Return a free buffer. */ -uint32_t forward_packet(struct group_des *g, struct netmap_slot *rs) +static uint32_t +forward_packet(struct group_des *g, struct netmap_slot *rs) { uint32_t hash = rs->ptr; uint32_t output_port = hash % g->nports; @@ -886,7 +888,6 @@ run: */ for (i = glob_arg.num_groups - 1U; i > 0; i--) { struct group_des *g = &groups[i - 1]; - int j; for (j = 0; j < g->nports; j++) { struct port_des *p = &g->ports[j]; @@ -917,7 +918,7 @@ run: for (i = 0; i < npipes; i++) { struct port_des *p = &ports[i]; struct overflow_queue *q = p->oq; - uint32_t j, lim; + uint32_t k, lim; struct netmap_ring *ring; struct netmap_slot *slot; @@ -929,7 +930,7 @@ run: continue; if (q->n < lim) lim = q->n; - for (j = 0; j < lim; j++) { + for (k = 0; k < lim; k++) { struct netmap_slot s = oq_deq(q), tmp; tmp.ptr = 0; slot = &ring->slot[ring->head]; Modified: stable/12/tools/tools/netmap/nmreplay.c ============================================================================== --- stable/12/tools/tools/netmap/nmreplay.c Tue Oct 6 19:12:43 2020 (r366497) +++ stable/12/tools/tools/netmap/nmreplay.c Tue Oct 6 19:14:03 2020 (r366498) @@ -431,7 +431,7 @@ readpcap(const char *fn) enum my_pcap_mode { PM_NONE, PM_FAST, PM_FIXED, PM_REAL }; -int verbose = 0; +static int verbose = 0; static int do_abort = 0; @@ -988,7 +988,8 @@ usage(void) static char ** split_arg(const char *src, int *_ac) { - char *my = NULL, **av = NULL, *seps = " \t\r\n,"; + char *my = NULL, **av = NULL; + const char *seps = " \t\r\n,"; int l, i, ac; /* number of entries */ if (!src) @@ -1127,15 +1128,15 @@ main(int argc, char **argv) /* set default values */ for (i = 0; i < N_OPTS; i++) { - struct _qs *q = &bp[i].q; + struct _qs *qs = &bp[i].q; - q->burst = 128; - q->c_delay.optarg = "0"; - q->c_delay.run = null_run_fn; - q->c_loss.optarg = "0"; - q->c_loss.run = null_run_fn; - q->c_bw.optarg = "0"; - q->c_bw.run = null_run_fn; + qs->burst = 128; + qs->c_delay.optarg = "0"; + qs->c_delay.run = null_run_fn; + qs->c_loss.optarg = "0"; + qs->c_loss.run = null_run_fn; + qs->c_bw.optarg = "0"; + qs->c_bw.run = null_run_fn; } // Options: @@ -1250,10 +1251,10 @@ main(int argc, char **argv) /* apply commands */ for (i = 0; i < N_OPTS; i++) { /* once per queue */ - struct _qs *q = &bp[i].q; - err += cmd_apply(delay_cfg, d[i], q, &q->c_delay); - err += cmd_apply(bw_cfg, b[i], q, &q->c_bw); - err += cmd_apply(loss_cfg, l[i], q, &q->c_loss); + struct _qs *qs = &bp[i].q; + err += cmd_apply(delay_cfg, d[i], qs, &qs->c_delay); + err += cmd_apply(bw_cfg, b[i], qs, &qs->c_bw); + err += cmd_apply(loss_cfg, l[i], qs, &qs->c_loss); } pthread_create(&bp[0].cons_tid, NULL, nmreplay_main, (void*)&bp[0]); @@ -1287,7 +1288,7 @@ main(int argc, char **argv) * the final entry has s = NULL. */ struct _sm { /* string and multiplier */ - char *s; + const char *s; double m; }; Modified: stable/12/tools/tools/netmap/pkt-gen.c ============================================================================== --- stable/12/tools/tools/netmap/pkt-gen.c Tue Oct 6 19:12:43 2020 (r366497) +++ stable/12/tools/tools/netmap/pkt-gen.c Tue Oct 6 19:14:03 2020 (r366498) @@ -42,7 +42,6 @@ #define NETMAP_WITH_LIBS #include - #include // isprint() #include // sysconf() #include @@ -179,14 +178,14 @@ static inline void CPU_SET(uint32_t i, cpuset_t *p) do {struct timespec t0 = {0,0}; *(b) = t0; } while (0) #endif /* __APPLE__ */ -const char *default_payload="netmap pkt-gen DIRECT payload\n" +static const char *default_payload = "netmap pkt-gen DIRECT payload\n" "http://info.iet.unipi.it/~luigi/netmap/ "; -const char *indirect_payload="netmap pkt-gen indirect payload\n" +static const char *indirect_payload = "netmap pkt-gen indirect payload\n" "http://info.iet.unipi.it/~luigi/netmap/ "; -int verbose = 0; -int normalize = 1; +static int verbose = 0; +static int normalize = 1; #define VIRT_HDR_1 10 /* length of a base vnet-hdr */ #define VIRT_HDR_2 12 /* length of the extenede vnet-hdr */ @@ -218,7 +217,7 @@ struct pkt { ((af) == AF_INET ? (p)->ipv4.f: (p)->ipv6.f) struct ip_range { - char *name; + const char *name; union { struct { uint32_t start, end; /* same as struct in_addr */ @@ -232,7 +231,7 @@ struct ip_range { }; struct mac_range { - char *name; + const char *name; struct ether_addr start, end; }; @@ -295,7 +294,7 @@ struct glob_arg { int td_type; void *mmap_addr; char ifname[MAX_IFNAMELEN]; - char *nmr_config; + const char *nmr_config; int dummy_send; int virt_header; /* send also the virt_header */ char *packet_file; /* -P option */ @@ -620,7 +619,7 @@ system_ncpus(void) * If there is no 4th number, then the 3rd is assigned to both #tx-rings * and #rx-rings. */ -int +static int parse_nmr_config(const char* conf, struct nmreq *nmr) { char *w, *tok; @@ -727,7 +726,7 @@ checksum(const void *data, uint16_t len, uint32_t sum) /* Checksum all the pairs of bytes first... */ for (i = 0; i < (len & ~1U); i += 2) { - sum += (u_int16_t)ntohs(*((u_int16_t *)(addr + i))); + sum += (uint16_t)ntohs(*((const uint16_t *)(addr + i))); if (sum > 0xFFFF) sum -= 0xFFFF; } @@ -1241,7 +1240,7 @@ send_packets(struct netmap_ring *ring, struct pkt *pkt /* * Index of the highest bit set */ -uint32_t +static uint32_t msb64(uint64_t x) { uint64_t m = 1ULL << 63; @@ -2695,7 +2694,7 @@ main_thread(struct glob_arg *g) struct td_desc { int ty; - char *key; + const char *key; void *f; int default_burst; }; @@ -2715,7 +2714,7 @@ tap_alloc(char *dev) { struct ifreq ifr; int fd, err; - char *clonedev = TAP_CLONEDEV; + const char *clonedev = TAP_CLONEDEV; (void)err; (void)dev; Modified: stable/12/tools/tools/netmap/pkt_hash.c ============================================================================== --- stable/12/tools/tools/netmap/pkt_hash.c Tue Oct 6 19:12:43 2020 (r366497) +++ stable/12/tools/tools/netmap/pkt_hash.c Tue Oct 6 19:14:03 2020 (r366498) @@ -145,7 +145,7 @@ static uint32_t decode_gre_hash(const uint8_t *, uint8 ** Parser + hash function for the IPv4 packet **/ static uint32_t -decode_ip_n_hash(struct ip *iph, uint8_t hash_split, uint8_t seed) +decode_ip_n_hash(const struct ip *iph, uint8_t hash_split, uint8_t seed) { uint32_t rc = 0; @@ -155,19 +155,19 @@ decode_ip_n_hash(struct ip *iph, uint8_t hash_split, u ntohs(0xFFFD) + seed, ntohs(0xFFFE) + seed); } else { - struct tcphdr *tcph = NULL; - struct udphdr *udph = NULL; + const struct tcphdr *tcph = NULL; + const struct udphdr *udph = NULL; switch (iph->ip_p) { case IPPROTO_TCP: - tcph = (struct tcphdr *)((uint8_t *)iph + (iph->ip_hl<<2)); + tcph = (const struct tcphdr *)((const uint8_t *)iph + (iph->ip_hl<<2)); rc = sym_hash_fn(ntohl(iph->ip_src.s_addr), ntohl(iph->ip_dst.s_addr), ntohs(tcph->th_sport) + seed, ntohs(tcph->th_dport) + seed); break; case IPPROTO_UDP: - udph = (struct udphdr *)((uint8_t *)iph + (iph->ip_hl<<2)); + udph = (const struct udphdr *)((const uint8_t *)iph + (iph->ip_hl<<2)); rc = sym_hash_fn(ntohl(iph->ip_src.s_addr), ntohl(iph->ip_dst.s_addr), ntohs(udph->uh_sport) + seed, @@ -175,11 +175,11 @@ decode_ip_n_hash(struct ip *iph, uint8_t hash_split, u break; case IPPROTO_IPIP: /* tunneling */ - rc = decode_ip_n_hash((struct ip *)((uint8_t *)iph + (iph->ip_hl<<2)), + rc = decode_ip_n_hash((const struct ip *)((const uint8_t *)iph + (iph->ip_hl<<2)), hash_split, seed); break; case IPPROTO_GRE: - rc = decode_gre_hash((uint8_t *)iph + (iph->ip_hl<<2), + rc = decode_gre_hash((const uint8_t *)iph + (iph->ip_hl<<2), hash_split, seed); break; case IPPROTO_ICMP: @@ -205,7 +205,7 @@ decode_ip_n_hash(struct ip *iph, uint8_t hash_split, u ** Parser + hash function for the IPv6 packet **/ static uint32_t -decode_ipv6_n_hash(struct ip6_hdr *ipv6h, uint8_t hash_split, uint8_t seed) +decode_ipv6_n_hash(const struct ip6_hdr *ipv6h, uint8_t hash_split, uint8_t seed) { uint32_t saddr, daddr; uint32_t rc = 0; @@ -226,19 +226,19 @@ decode_ipv6_n_hash(struct ip6_hdr *ipv6h, uint8_t hash ntohs(0xFFFD) + seed, ntohs(0xFFFE) + seed); } else { - struct tcphdr *tcph = NULL; - struct udphdr *udph = NULL; + const struct tcphdr *tcph = NULL; + const struct udphdr *udph = NULL; switch(ntohs(ipv6h->ip6_ctlun.ip6_un1.ip6_un1_nxt)) { case IPPROTO_TCP: - tcph = (struct tcphdr *)(ipv6h + 1); + tcph = (const struct tcphdr *)(ipv6h + 1); rc = sym_hash_fn(ntohl(saddr), ntohl(daddr), ntohs(tcph->th_sport) + seed, ntohs(tcph->th_dport) + seed); break; case IPPROTO_UDP: - udph = (struct udphdr *)(ipv6h + 1); + udph = (const struct udphdr *)(ipv6h + 1); rc = sym_hash_fn(ntohl(saddr), ntohl(daddr), ntohs(udph->uh_sport) + seed, @@ -246,16 +246,16 @@ decode_ipv6_n_hash(struct ip6_hdr *ipv6h, uint8_t hash break; case IPPROTO_IPIP: /* tunneling */ - rc = decode_ip_n_hash((struct ip *)(ipv6h + 1), + rc = decode_ip_n_hash((const struct ip *)(ipv6h + 1), hash_split, seed); break; case IPPROTO_IPV6: /* tunneling */ - rc = decode_ipv6_n_hash((struct ip6_hdr *)(ipv6h + 1), + rc = decode_ipv6_n_hash((const struct ip6_hdr *)(ipv6h + 1), hash_split, seed); break; case IPPROTO_GRE: - rc = decode_gre_hash((uint8_t *)(ipv6h + 1), hash_split, seed); + rc = decode_gre_hash((const uint8_t *)(ipv6h + 1), hash_split, seed); break; case IPPROTO_ICMP: case IPPROTO_ESP: @@ -280,7 +280,7 @@ decode_ipv6_n_hash(struct ip6_hdr *ipv6h, uint8_t hash * * (See decode_vlan_n_hash & pkt_hdr_hash functions). * */ static uint32_t -decode_others_n_hash(struct ether_header *ethh, uint8_t seed) +decode_others_n_hash(const struct ether_header *ethh, uint8_t seed) { uint32_t saddr, daddr, rc; @@ -305,18 +305,18 @@ decode_others_n_hash(struct ether_header *ethh, uint8_ ** Parser + hash function for VLAN packet **/ static inline uint32_t -decode_vlan_n_hash(struct ether_header *ethh, uint8_t hash_split, uint8_t seed) +decode_vlan_n_hash(const struct ether_header *ethh, uint8_t hash_split, uint8_t seed) { uint32_t rc = 0; - struct vlanhdr *vhdr = (struct vlanhdr *)(ethh + 1); + const struct vlanhdr *vhdr = (const struct vlanhdr *)(ethh + 1); switch (ntohs(vhdr->proto)) { case ETHERTYPE_IP: - rc = decode_ip_n_hash((struct ip *)(vhdr + 1), + rc = decode_ip_n_hash((const struct ip *)(vhdr + 1), hash_split, seed); break; case ETHERTYPE_IPV6: - rc = decode_ipv6_n_hash((struct ip6_hdr *)(vhdr + 1), + rc = decode_ipv6_n_hash((const struct ip6_hdr *)(vhdr + 1), hash_split, seed); break; case ETHERTYPE_ARP: @@ -336,15 +336,15 @@ uint32_t pkt_hdr_hash(const unsigned char *buffer, uint8_t hash_split, uint8_t seed) { uint32_t rc = 0; - struct ether_header *ethh = (struct ether_header *)buffer; + const struct ether_header *ethh = (const struct ether_header *)buffer; switch (ntohs(ethh->ether_type)) { case ETHERTYPE_IP: - rc = decode_ip_n_hash((struct ip *)(ethh + 1), + rc = decode_ip_n_hash((const struct ip *)(ethh + 1), hash_split, seed); break; case ETHERTYPE_IPV6: - rc = decode_ipv6_n_hash((struct ip6_hdr *)(ethh + 1), + rc = decode_ipv6_n_hash((const struct ip6_hdr *)(ethh + 1), hash_split, seed); break; case ETHERTYPE_VLAN: @@ -372,15 +372,15 @@ decode_gre_hash(const uint8_t *grehdr, uint8_t hash_sp !!(*grehdr & 2) + /* Routing */ !!(*grehdr & 4) + /* Key */ !!(*grehdr & 8)); /* Sequence Number */ - uint16_t proto = ntohs(*(uint16_t *)(void *)(grehdr + 2)); + uint16_t proto = ntohs(*(const uint16_t *)(const void *)(grehdr + 2)); switch (proto) { case ETHERTYPE_IP: - rc = decode_ip_n_hash((struct ip *)(grehdr + len), + rc = decode_ip_n_hash((const struct ip *)(grehdr + len), hash_split, seed); break; case ETHERTYPE_IPV6: - rc = decode_ipv6_n_hash((struct ip6_hdr *)(grehdr + len), + rc = decode_ipv6_n_hash((const struct ip6_hdr *)(grehdr + len), hash_split, seed); break; case 0x6558: /* Transparent Ethernet Bridging */ From owner-svn-src-all@freebsd.org Tue Oct 6 19:15:11 2020 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 E40AE439CCF; Tue, 6 Oct 2020 19:15:11 +0000 (UTC) (envelope-from vmaffione@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5RxW5lCLz3ZWC; Tue, 6 Oct 2020 19:15:11 +0000 (UTC) (envelope-from vmaffione@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 A819DBA1D; Tue, 6 Oct 2020 19:15:11 +0000 (UTC) (envelope-from vmaffione@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096JFBJZ022051; Tue, 6 Oct 2020 19:15:11 GMT (envelope-from vmaffione@FreeBSD.org) Received: (from vmaffione@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096JFBKZ022050; Tue, 6 Oct 2020 19:15:11 GMT (envelope-from vmaffione@FreeBSD.org) Message-Id: <202010061915.096JFBKZ022050@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: vmaffione set sender to vmaffione@FreeBSD.org using -f From: Vincenzo Maffione Date: Tue, 6 Oct 2020 19:15:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366499 - stable/12/tools/tools/netmap X-SVN-Group: stable-12 X-SVN-Commit-Author: vmaffione X-SVN-Commit-Paths: stable/12/tools/tools/netmap X-SVN-Commit-Revision: 366499 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.33 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: Tue, 06 Oct 2020 19:15:12 -0000 Author: vmaffione Date: Tue Oct 6 19:15:11 2020 New Revision: 366499 URL: https://svnweb.freebsd.org/changeset/base/366499 Log: MFC r366394 netmap: tools: extend CFLAGS after including bsd.prog.mk MFC after: 1 week Modified: stable/12/tools/tools/netmap/Makefile Directory Properties: stable/12/ (props changed) Modified: stable/12/tools/tools/netmap/Makefile ============================================================================== --- stable/12/tools/tools/netmap/Makefile Tue Oct 6 19:14:03 2020 (r366498) +++ stable/12/tools/tools/netmap/Makefile Tue Oct 6 19:15:11 2020 (r366499) @@ -7,9 +7,10 @@ PROGS = pkt-gen nmreplay bridge lb CLEANFILES = $(PROGS) *.o MAN= -CFLAGS += -Werror -Wall -CFLAGS += -Wextra +.include +.include + LDFLAGS += -lpthread .ifdef WITHOUT_PCAP CFLAGS += -DNO_PCAP @@ -17,9 +18,6 @@ CFLAGS += -DNO_PCAP LDFLAGS += -lpcap .endif LDFLAGS += -lm # used by nmreplay - -.include -.include CFLAGS += -Wno-cast-align From owner-svn-src-all@freebsd.org Tue Oct 6 19:19:56 2020 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 CA596439E2A; Tue, 6 Oct 2020 19:19:56 +0000 (UTC) (envelope-from kp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5S305FZtz3Zl5; Tue, 6 Oct 2020 19:19:56 +0000 (UTC) (envelope-from kp@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 979FBB547; Tue, 6 Oct 2020 19:19:56 +0000 (UTC) (envelope-from kp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096JJu2d022294; Tue, 6 Oct 2020 19:19:56 GMT (envelope-from kp@FreeBSD.org) Received: (from kp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096JJuJ8022293; Tue, 6 Oct 2020 19:19:56 GMT (envelope-from kp@FreeBSD.org) Message-Id: <202010061919.096JJuJ8022293@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kp set sender to kp@FreeBSD.org using -f From: Kristof Provost Date: Tue, 6 Oct 2020 19:19:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366500 - head/sys/net X-SVN-Group: head X-SVN-Commit-Author: kp X-SVN-Commit-Paths: head/sys/net X-SVN-Commit-Revision: 366500 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.33 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: Tue, 06 Oct 2020 19:19:56 -0000 Author: kp Date: Tue Oct 6 19:19:56 2020 New Revision: 366500 URL: https://svnweb.freebsd.org/changeset/base/366500 Log: bridge: call member interface ioctl() without NET_EPOCH We're not allowed to hold NET_EPOCH while sleeping, so when we call ioctl() handlers for member interfaces we cannot be in NET_EPOCH. We still need some protection of our CK_LISTs, so hold BRIDGE_LOCK instead. That requires changing BRIDGE_LOCK into a sleepable lock, and separating the BRIDGE_RT_LOCK, to protect bridge_rtnode lists. That lock is taken in the data path (while in NET_EPOCH), so it cannot be a sleepable lock. While here document the locking strategy. MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D26418 Modified: head/sys/net/if_bridge.c Modified: head/sys/net/if_bridge.c ============================================================================== --- head/sys/net/if_bridge.c Tue Oct 6 19:15:11 2020 (r366499) +++ head/sys/net/if_bridge.c Tue Oct 6 19:19:56 2020 (r366500) @@ -186,17 +186,41 @@ extern void nd6_setmtu(struct ifnet *); /* * Bridge locking + * + * The bridge relies heavily on the epoch(9) system to protect its data + * structures. This means we can safely use CK_LISTs while in NET_EPOCH, but we + * must ensure there is only one writer at a time. + * + * That is: for read accesses we only need to be in NET_EPOCH, but for write + * accesses we must hold: + * + * - BRIDGE_RT_LOCK, for any change to bridge_rtnodes + * - BRIDGE_LOCK, for any other change + * + * The BRIDGE_LOCK is a sleepable lock, because it is held accross ioctl() + * calls to bridge member interfaces and these ioctl()s can sleep. + * The BRIDGE_RT_LOCK is a non-sleepable mutex, because it is sometimes + * required while we're in NET_EPOCH and then we're not allowed to sleep. */ #define BRIDGE_LOCK_INIT(_sc) do { \ - mtx_init(&(_sc)->sc_mtx, "if_bridge", NULL, MTX_DEF); \ + sx_init(&(_sc)->sc_sx, "if_bridge"); \ + mtx_init(&(_sc)->sc_rt_mtx, "if_bridge rt", NULL, MTX_DEF); \ } while (0) #define BRIDGE_LOCK_DESTROY(_sc) do { \ - mtx_destroy(&(_sc)->sc_mtx); \ + sx_destroy(&(_sc)->sc_sx); \ + mtx_destroy(&(_sc)->sc_rt_mtx); \ } while (0) -#define BRIDGE_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) -#define BRIDGE_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) -#define BRIDGE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED) -#define BRIDGE_UNLOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_NOTOWNED) +#define BRIDGE_LOCK(_sc) sx_xlock(&(_sc)->sc_sx) +#define BRIDGE_UNLOCK(_sc) sx_xunlock(&(_sc)->sc_sx) +#define BRIDGE_LOCK_ASSERT(_sc) sx_assert(&(_sc)->sc_sx, SX_XLOCKED) +#define BRIDGE_LOCK_OR_NET_EPOCH_ASSERT(_sc) \ + MPASS(in_epoch(net_epoch_preempt) || sx_xlocked(&(_sc)->sc_sx)) +#define BRIDGE_UNLOCK_ASSERT(_sc) sx_assert(&(_sc)->sc_sx, SX_UNLOCKED) +#define BRIDGE_RT_LOCK(_sc) mtx_lock(&(_sc)->sc_rt_mtx) +#define BRIDGE_RT_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_rt_mtx) +#define BRIDGE_RT_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_rt_mtx, MA_OWNED) +#define BRIDGE_RT_LOCK_OR_NET_EPOCH_ASSERT(_sc) \ + MPASS(in_epoch(net_epoch_preempt) || mtx_owned(&(_sc)->sc_rt_mtx)) /* * Bridge interface list entry. @@ -235,7 +259,8 @@ struct bridge_rtnode { struct bridge_softc { struct ifnet *sc_ifp; /* make this an interface */ LIST_ENTRY(bridge_softc) sc_list; - struct mtx sc_mtx; + struct sx sc_sx; + struct mtx sc_rt_mtx; uint32_t sc_brtmax; /* max # of addresses */ uint32_t sc_brtcnt; /* cur. # of addresses */ uint32_t sc_brttimeout; /* rt timeout in seconds */ @@ -252,8 +277,8 @@ struct bridge_softc { struct epoch_context sc_epoch_ctx; }; -VNET_DEFINE_STATIC(struct mtx, bridge_list_mtx); -#define V_bridge_list_mtx VNET(bridge_list_mtx) +VNET_DEFINE_STATIC(struct sx, bridge_list_sx); +#define V_bridge_list_sx VNET(bridge_list_sx) static eventhandler_tag bridge_detach_cookie; int bridge_rtable_prune_period = BRIDGE_RTABLE_PRUNE_PERIOD; @@ -536,11 +561,11 @@ const int bridge_control_table_size = nitems(bridge_co VNET_DEFINE_STATIC(LIST_HEAD(, bridge_softc), bridge_list); #define V_bridge_list VNET(bridge_list) -#define BRIDGE_LIST_LOCK_INIT(x) mtx_init(&V_bridge_list_mtx, \ - "if_bridge list", NULL, MTX_DEF) -#define BRIDGE_LIST_LOCK_DESTROY(x) mtx_destroy(&V_bridge_list_mtx) -#define BRIDGE_LIST_LOCK(x) mtx_lock(&V_bridge_list_mtx) -#define BRIDGE_LIST_UNLOCK(x) mtx_unlock(&V_bridge_list_mtx) +#define BRIDGE_LIST_LOCK_INIT(x) sx_init(&V_bridge_list_sx, \ + "if_bridge list") +#define BRIDGE_LIST_LOCK_DESTROY(x) sx_destroy(&V_bridge_list_sx) +#define BRIDGE_LIST_LOCK(x) sx_xlock(&V_bridge_list_sx) +#define BRIDGE_LIST_UNLOCK(x) sx_xunlock(&V_bridge_list_sx) VNET_DEFINE_STATIC(struct if_clone *, bridge_cloner); #define V_bridge_cloner VNET(bridge_cloner) @@ -670,7 +695,7 @@ bridge_clone_create(struct if_clone *ifc, int unit, ca /* Initialize our routing table. */ bridge_rtable_init(sc); - callout_init_mtx(&sc->sc_brcallout, &sc->sc_mtx, 0); + callout_init_mtx(&sc->sc_brcallout, &sc->sc_rt_mtx, 0); CK_LIST_INIT(&sc->sc_iflist); CK_LIST_INIT(&sc->sc_spanlist); @@ -722,7 +747,6 @@ bridge_clone_destroy(struct ifnet *ifp) struct bridge_iflist *bif; struct epoch_tracker et; - NET_EPOCH_ENTER(et); BRIDGE_LOCK(sc); bridge_stop(ifp, 1); @@ -740,6 +764,8 @@ bridge_clone_destroy(struct ifnet *ifp) BRIDGE_UNLOCK(sc); + NET_EPOCH_ENTER(et); + callout_drain(&sc->sc_brcallout); BRIDGE_LIST_LOCK(); @@ -778,9 +804,8 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t da struct ifdrv *ifd = (struct ifdrv *) data; const struct bridge_control *bc; int error = 0, oldmtu; - struct epoch_tracker et; - NET_EPOCH_ENTER(et); + BRIDGE_LOCK(sc); switch (cmd) { case SIOCADDMULTI: @@ -826,9 +851,7 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t da } oldmtu = ifp->if_mtu; - BRIDGE_LOCK(sc); error = (*bc->bc_func)(sc, &args); - BRIDGE_UNLOCK(sc); if (error) break; @@ -855,16 +878,16 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t da * If interface is marked down and it is running, * then stop and disable it. */ - BRIDGE_LOCK(sc); bridge_stop(ifp, 1); - BRIDGE_UNLOCK(sc); } else if ((ifp->if_flags & IFF_UP) && !(ifp->if_drv_flags & IFF_DRV_RUNNING)) { /* * If interface is marked up and it is stopped, then * start it. */ + BRIDGE_UNLOCK(sc); (*ifp->if_init)(sc); + BRIDGE_LOCK(sc); } break; @@ -877,7 +900,6 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t da sc->sc_ifp->if_mtu = ifr->ifr_mtu; break; } - BRIDGE_LOCK(sc); CK_LIST_FOREACH(bif, &sc->sc_iflist, bif_next) { if (bif->bif_ifp->if_mtu != ifr->ifr_mtu) { log(LOG_NOTICE, "%s: invalid MTU: %u(%s)" @@ -890,18 +912,19 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t da } if (!error) sc->sc_ifp->if_mtu = ifr->ifr_mtu; - BRIDGE_UNLOCK(sc); break; default: /* * drop the lock as ether_ioctl() will call bridge_start() and * cause the lock to be recursed. */ + BRIDGE_UNLOCK(sc); error = ether_ioctl(ifp, cmd, data); + BRIDGE_LOCK(sc); break; } - NET_EPOCH_EXIT(et); + BRIDGE_UNLOCK(sc); return (error); } @@ -933,9 +956,7 @@ bridge_mutecaps(struct bridge_softc *sc) /* strip off mask bits and enable them again if allowed */ enabled &= ~BRIDGE_IFCAPS_MASK; enabled |= mask; - BRIDGE_UNLOCK(sc); bridge_set_ifcap(sc, bif, enabled); - BRIDGE_LOCK(sc); } } @@ -946,8 +967,6 @@ bridge_set_ifcap(struct bridge_softc *sc, struct bridg struct ifreq ifr; int error, mask, stuck; - BRIDGE_UNLOCK_ASSERT(sc); - bzero(&ifr, sizeof(ifr)); ifr.ifr_reqcap = set; @@ -977,7 +996,7 @@ bridge_lookup_member(struct bridge_softc *sc, const ch struct bridge_iflist *bif; struct ifnet *ifp; - NET_EPOCH_ASSERT(); + BRIDGE_LOCK_OR_NET_EPOCH_ASSERT(sc); CK_LIST_FOREACH(bif, &sc->sc_iflist, bif_next) { ifp = bif->bif_ifp; @@ -998,7 +1017,7 @@ bridge_lookup_member_if(struct bridge_softc *sc, struc { struct bridge_iflist *bif; - NET_EPOCH_ASSERT(); + BRIDGE_LOCK_OR_NET_EPOCH_ASSERT(sc); CK_LIST_FOREACH(bif, &sc->sc_iflist, bif_next) { if (bif->bif_ifp == member_ifp) @@ -1061,14 +1080,15 @@ bridge_delete_member(struct bridge_softc *sc, struct b bridge_linkcheck(sc); bridge_mutecaps(sc); /* recalcuate now this interface is removed */ + BRIDGE_RT_LOCK(sc); bridge_rtdelete(sc, ifs, IFBF_FLUSHALL); + BRIDGE_RT_UNLOCK(sc); KASSERT(bif->bif_addrcnt == 0, ("%s: %d bridge routes referenced", __func__, bif->bif_addrcnt)); ifs->if_bridge_output = NULL; ifs->if_bridge_input = NULL; ifs->if_bridge_linkstate = NULL; - BRIDGE_UNLOCK(sc); if (!gone) { switch (ifs->if_type) { case IFT_ETHER: @@ -1095,7 +1115,6 @@ bridge_delete_member(struct bridge_softc *sc, struct b bridge_set_ifcap(sc, bif, bif->bif_savedcaps); } bstp_destroy(&bif->bif_stp); /* prepare to free */ - BRIDGE_LOCK(sc); NET_EPOCH_CALL(bridge_delete_member_cb, &bif->bif_epoch_ctx); } @@ -1173,9 +1192,7 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) */ CK_LIST_FOREACH(bif, &sc->sc_iflist, bif_next) { if (in6ifa_llaonifp(bif->bif_ifp)) { - BRIDGE_UNLOCK(sc); in6_ifdetach(bif->bif_ifp); - BRIDGE_LOCK(sc); if_printf(sc->sc_ifp, "IPv6 addresses on %s have been removed " "before adding it as a member to prevent " @@ -1184,9 +1201,7 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) } } if (in6ifa_llaonifp(ifs)) { - BRIDGE_UNLOCK(sc); in6_ifdetach(ifs); - BRIDGE_LOCK(sc); if_printf(sc->sc_ifp, "IPv6 addresses on %s have been removed " "before adding it as a member to prevent " @@ -1244,9 +1259,7 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) switch (ifs->if_type) { case IFT_ETHER: case IFT_L2VLAN: - BRIDGE_UNLOCK(sc); error = ifpromisc(ifs, 1); - BRIDGE_LOCK(sc); break; } @@ -1428,10 +1441,8 @@ bridge_ioctl_gifs(struct bridge_softc *sc, void *arg) len -= sizeof(breq); } - BRIDGE_UNLOCK(sc); bifc->ifbic_len = sizeof(breq) * count; error = copyout(outbuf, bifc->ifbic_req, bifc->ifbic_len); - BRIDGE_LOCK(sc); free(outbuf, M_TEMP); return (error); } @@ -1481,10 +1492,8 @@ bridge_ioctl_rts(struct bridge_softc *sc, void *arg) len -= sizeof(bareq); } out: - BRIDGE_UNLOCK(sc); bac->ifbac_len = sizeof(bareq) * count; error = copyout(outbuf, bac->ifbac_req, bac->ifbac_len); - BRIDGE_LOCK(sc); free(outbuf, M_TEMP); return (error); } @@ -1494,19 +1503,20 @@ bridge_ioctl_saddr(struct bridge_softc *sc, void *arg) { struct ifbareq *req = arg; struct bridge_iflist *bif; + struct epoch_tracker et; int error; - NET_EPOCH_ASSERT(); - + NET_EPOCH_ENTER(et); bif = bridge_lookup_member(sc, req->ifba_ifsname); - if (bif == NULL) + if (bif == NULL) { + NET_EPOCH_EXIT(et); return (ENOENT); + } /* bridge_rtupdate() may acquire the lock. */ - BRIDGE_UNLOCK(sc); error = bridge_rtupdate(sc, req->ifba_dst, req->ifba_vlan, bif, 1, req->ifba_flags); - BRIDGE_LOCK(sc); + NET_EPOCH_EXIT(et); return (error); } @@ -1542,7 +1552,10 @@ bridge_ioctl_flush(struct bridge_softc *sc, void *arg) { struct ifbreq *req = arg; + BRIDGE_RT_LOCK(sc); bridge_rtflush(sc, req->ifbr_ifsflags); + BRIDGE_RT_UNLOCK(sc); + return (0); } @@ -1810,10 +1823,8 @@ bridge_ioctl_gifsstp(struct bridge_softc *sc, void *ar len -= sizeof(bpreq); } - BRIDGE_UNLOCK(sc); bifstp->ifbpstp_len = sizeof(bpreq) * count; error = copyout(outbuf, bifstp->ifbpstp_req, bifstp->ifbpstp_len); - BRIDGE_LOCK(sc); free(outbuf, M_TEMP); return (error); } @@ -1845,7 +1856,6 @@ bridge_ifdetach(void *arg __unused, struct ifnet *ifp) { struct bridge_softc *sc = ifp->if_bridge; struct bridge_iflist *bif; - struct epoch_tracker et; if (ifp->if_flags & IFF_RENAMING) return; @@ -1856,7 +1866,6 @@ bridge_ifdetach(void *arg __unused, struct ifnet *ifp) */ return; } - NET_EPOCH_ENTER(et); /* Check if the interface is a bridge member */ if (sc != NULL) { BRIDGE_LOCK(sc); @@ -1866,7 +1875,6 @@ bridge_ifdetach(void *arg __unused, struct ifnet *ifp) bridge_delete_member(sc, bif, 1); BRIDGE_UNLOCK(sc); - NET_EPOCH_EXIT(et); return; } @@ -1883,7 +1891,6 @@ bridge_ifdetach(void *arg __unused, struct ifnet *ifp) BRIDGE_UNLOCK(sc); } BRIDGE_LIST_UNLOCK(); - NET_EPOCH_EXIT(et); } /* @@ -1920,16 +1927,18 @@ bridge_stop(struct ifnet *ifp, int disable) { struct bridge_softc *sc = ifp->if_softc; - NET_EPOCH_ASSERT(); BRIDGE_LOCK_ASSERT(sc); if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) return; + BRIDGE_RT_LOCK(sc); callout_stop(&sc->sc_brcallout); + bstp_stop(&sc->sc_stp); bridge_rtflush(sc, IFBF_FLUSHDYN); + BRIDGE_RT_UNLOCK(sc); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; } @@ -2659,8 +2668,7 @@ bridge_rtupdate(struct bridge_softc *sc, const uint8_t struct bridge_rtnode *brt; int error; - NET_EPOCH_ASSERT(); - BRIDGE_UNLOCK_ASSERT(sc); + BRIDGE_LOCK_OR_NET_EPOCH_ASSERT(sc); /* Check the source address is valid and not multicast. */ if (ETHER_IS_MULTICAST(dst) || @@ -2677,24 +2685,24 @@ bridge_rtupdate(struct bridge_softc *sc, const uint8_t * update it, otherwise create a new one. */ if ((brt = bridge_rtnode_lookup(sc, dst, vlan)) == NULL) { - BRIDGE_LOCK(sc); + BRIDGE_RT_LOCK(sc); /* Check again, now that we have the lock. There could have * been a race and we only want to insert this once. */ if ((brt = bridge_rtnode_lookup(sc, dst, vlan)) != NULL) { - BRIDGE_UNLOCK(sc); + BRIDGE_RT_UNLOCK(sc); return (0); } if (sc->sc_brtcnt >= sc->sc_brtmax) { sc->sc_brtexceeded++; - BRIDGE_UNLOCK(sc); + BRIDGE_RT_UNLOCK(sc); return (ENOSPC); } /* Check per interface address limits (if enabled) */ if (bif->bif_addrmax && bif->bif_addrcnt >= bif->bif_addrmax) { bif->bif_addrexceeded++; - BRIDGE_UNLOCK(sc); + BRIDGE_RT_UNLOCK(sc); return (ENOSPC); } @@ -2705,7 +2713,7 @@ bridge_rtupdate(struct bridge_softc *sc, const uint8_t */ brt = uma_zalloc(V_bridge_rtnode_zone, M_NOWAIT | M_ZERO); if (brt == NULL) { - BRIDGE_UNLOCK(sc); + BRIDGE_RT_UNLOCK(sc); return (ENOMEM); } brt->brt_vnet = curvnet; @@ -2720,22 +2728,22 @@ bridge_rtupdate(struct bridge_softc *sc, const uint8_t if ((error = bridge_rtnode_insert(sc, brt)) != 0) { uma_zfree(V_bridge_rtnode_zone, brt); - BRIDGE_UNLOCK(sc); + BRIDGE_RT_UNLOCK(sc); return (error); } brt->brt_dst = bif; bif->bif_addrcnt++; - BRIDGE_UNLOCK(sc); + BRIDGE_RT_UNLOCK(sc); } if ((brt->brt_flags & IFBAF_TYPEMASK) == IFBAF_DYNAMIC && brt->brt_dst != bif) { - BRIDGE_LOCK(sc); + BRIDGE_RT_LOCK(sc); brt->brt_dst->bif_addrcnt--; brt->brt_dst = bif; brt->brt_dst->bif_addrcnt++; - BRIDGE_UNLOCK(sc); + BRIDGE_RT_UNLOCK(sc); } if ((flags & IFBAF_TYPEMASK) == IFBAF_DYNAMIC) @@ -2777,7 +2785,7 @@ bridge_rttrim(struct bridge_softc *sc) struct bridge_rtnode *brt, *nbrt; NET_EPOCH_ASSERT(); - BRIDGE_LOCK_ASSERT(sc); + BRIDGE_RT_LOCK_ASSERT(sc); /* Make sure we actually need to do this. */ if (sc->sc_brtcnt <= sc->sc_brtmax) @@ -2806,10 +2814,8 @@ static void bridge_timer(void *arg) { struct bridge_softc *sc = arg; - struct epoch_tracker et; - NET_EPOCH_ENTER(et); - BRIDGE_LOCK_ASSERT(sc); + BRIDGE_RT_LOCK_ASSERT(sc); /* Destruction of rtnodes requires a proper vnet context */ CURVNET_SET(sc->sc_ifp->if_vnet); @@ -2819,7 +2825,6 @@ bridge_timer(void *arg) callout_reset(&sc->sc_brcallout, bridge_rtable_prune_period * hz, bridge_timer, sc); CURVNET_RESTORE(); - NET_EPOCH_EXIT(et); } /* @@ -2832,8 +2837,7 @@ bridge_rtage(struct bridge_softc *sc) { struct bridge_rtnode *brt, *nbrt; - NET_EPOCH_ASSERT(); - BRIDGE_LOCK_ASSERT(sc); + BRIDGE_RT_LOCK_ASSERT(sc); CK_LIST_FOREACH_SAFE(brt, &sc->sc_rtlist, brt_list, nbrt) { if ((brt->brt_flags & IFBAF_TYPEMASK) == IFBAF_DYNAMIC) { @@ -2853,8 +2857,7 @@ bridge_rtflush(struct bridge_softc *sc, int full) { struct bridge_rtnode *brt, *nbrt; - NET_EPOCH_ASSERT(); - BRIDGE_LOCK_ASSERT(sc); + BRIDGE_RT_LOCK_ASSERT(sc); CK_LIST_FOREACH_SAFE(brt, &sc->sc_rtlist, brt_list, nbrt) { if (full || (brt->brt_flags & IFBAF_TYPEMASK) == IFBAF_DYNAMIC) @@ -2873,8 +2876,7 @@ bridge_rtdaddr(struct bridge_softc *sc, const uint8_t struct bridge_rtnode *brt; int found = 0; - NET_EPOCH_ASSERT(); - BRIDGE_LOCK_ASSERT(sc); + BRIDGE_RT_LOCK(sc); /* * If vlan is zero then we want to delete for all vlans so the lookup @@ -2885,6 +2887,8 @@ bridge_rtdaddr(struct bridge_softc *sc, const uint8_t found = 1; } + BRIDGE_RT_UNLOCK(sc); + return (found ? 0 : ENOENT); } @@ -2898,8 +2902,7 @@ bridge_rtdelete(struct bridge_softc *sc, struct ifnet { struct bridge_rtnode *brt, *nbrt; - NET_EPOCH_ASSERT(); - BRIDGE_LOCK_ASSERT(sc); + BRIDGE_RT_LOCK_ASSERT(sc); CK_LIST_FOREACH_SAFE(brt, &sc->sc_rtlist, brt_list, nbrt) { if (brt->brt_ifp == ifp && (full || @@ -3003,7 +3006,7 @@ bridge_rtnode_lookup(struct bridge_softc *sc, const ui uint32_t hash; int dir; - NET_EPOCH_ASSERT(); + BRIDGE_RT_LOCK_OR_NET_EPOCH_ASSERT(sc); hash = bridge_rthash(sc, addr); CK_LIST_FOREACH(brt, &sc->sc_rthash[hash], brt_hash) { @@ -3030,7 +3033,7 @@ bridge_rtnode_insert(struct bridge_softc *sc, struct b uint32_t hash; int dir; - BRIDGE_LOCK_ASSERT(sc); + BRIDGE_RT_LOCK_ASSERT(sc); hash = bridge_rthash(sc, brt->brt_addr); @@ -3086,8 +3089,7 @@ bridge_rtnode_destroy_cb(struct epoch_context *ctx) static void bridge_rtnode_destroy(struct bridge_softc *sc, struct bridge_rtnode *brt) { - NET_EPOCH_ASSERT(); - BRIDGE_LOCK_ASSERT(sc); + BRIDGE_RT_LOCK_ASSERT(sc); CK_LIST_REMOVE(brt, brt_hash); @@ -3108,11 +3110,9 @@ bridge_rtable_expire(struct ifnet *ifp, int age) { struct bridge_softc *sc = ifp->if_bridge; struct bridge_rtnode *brt; - struct epoch_tracker et; - NET_EPOCH_ENTER(et); CURVNET_SET(ifp->if_vnet); - BRIDGE_LOCK(sc); + BRIDGE_RT_LOCK(sc); /* * If the age is zero then flush, otherwise set all the expiry times to @@ -3129,9 +3129,8 @@ bridge_rtable_expire(struct ifnet *ifp, int age) brt->brt_expire = time_uptime + age; } } - BRIDGE_UNLOCK(sc); + BRIDGE_RT_UNLOCK(sc); CURVNET_RESTORE(); - NET_EPOCH_EXIT(et); } /* @@ -3659,7 +3658,7 @@ bridge_linkcheck(struct bridge_softc *sc) struct bridge_iflist *bif; int new_link, hasls; - NET_EPOCH_ASSERT(); + BRIDGE_LOCK_OR_NET_EPOCH_ASSERT(sc); new_link = LINK_STATE_DOWN; hasls = 0; From owner-svn-src-all@freebsd.org Tue Oct 6 21:31:05 2020 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 A753543C0DB; Tue, 6 Oct 2020 21:31:05 +0000 (UTC) (envelope-from pfg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5VyK3pTtz3y19; Tue, 6 Oct 2020 21:31:05 +0000 (UTC) (envelope-from pfg@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 66BA0D0BC; Tue, 6 Oct 2020 21:31:05 +0000 (UTC) (envelope-from pfg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096LV5gx002513; Tue, 6 Oct 2020 21:31:05 GMT (envelope-from pfg@FreeBSD.org) Received: (from pfg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096LV56E002512; Tue, 6 Oct 2020 21:31:05 GMT (envelope-from pfg@FreeBSD.org) Message-Id: <202010062131.096LV56E002512@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: pfg set sender to pfg@FreeBSD.org using -f From: "Pedro F. Giffuni" Date: Tue, 6 Oct 2020 21:31:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366501 - head/sys/fs/ext2fs X-SVN-Group: head X-SVN-Commit-Author: pfg X-SVN-Commit-Paths: head/sys/fs/ext2fs X-SVN-Commit-Revision: 366501 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.33 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: Tue, 06 Oct 2020 21:31:05 -0000 Author: pfg Date: Tue Oct 6 21:31:04 2020 New Revision: 366501 URL: https://svnweb.freebsd.org/changeset/base/366501 Log: ext2fs: minor typo. Obtained from: Dragonfly MFC after: 3 days Modified: head/sys/fs/ext2fs/ext2_alloc.c Modified: head/sys/fs/ext2fs/ext2_alloc.c ============================================================================== --- head/sys/fs/ext2fs/ext2_alloc.c Tue Oct 6 19:19:56 2020 (r366500) +++ head/sys/fs/ext2fs/ext2_alloc.c Tue Oct 6 21:31:04 2020 (r366501) @@ -193,7 +193,7 @@ static SYSCTL_NODE(_vfs, OID_AUTO, ext2fs, CTLFLAG_RW static int doasyncfree = 1; SYSCTL_INT(_vfs_ext2fs, OID_AUTO, doasyncfree, CTLFLAG_RW, &doasyncfree, 0, - "Use asychronous writes to update block pointers when freeing blocks"); + "Use asynchronous writes to update block pointers when freeing blocks"); static int doreallocblks = 0; From owner-svn-src-all@freebsd.org Tue Oct 6 22:53:12 2020 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 5432143D8B0; Tue, 6 Oct 2020 22:53:12 +0000 (UTC) (envelope-from jmg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Xn41Rc1z43cX; Tue, 6 Oct 2020 22:53:12 +0000 (UTC) (envelope-from jmg@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 14DADDF4D; Tue, 6 Oct 2020 22:53:12 +0000 (UTC) (envelope-from jmg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096MrBxp057759; Tue, 6 Oct 2020 22:53:11 GMT (envelope-from jmg@FreeBSD.org) Received: (from jmg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096MrBUO057758; Tue, 6 Oct 2020 22:53:11 GMT (envelope-from jmg@FreeBSD.org) Message-Id: <202010062253.096MrBUO057758@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jmg set sender to jmg@FreeBSD.org using -f From: John-Mark Gurney Date: Tue, 6 Oct 2020 22:53:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366502 - head/share/man/man8 X-SVN-Group: head X-SVN-Commit-Author: jmg X-SVN-Commit-Paths: head/share/man/man8 X-SVN-Commit-Revision: 366502 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.33 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: Tue, 06 Oct 2020 22:53:12 -0000 Author: jmg Date: Tue Oct 6 22:53:11 2020 New Revision: 366502 URL: https://svnweb.freebsd.org/changeset/base/366502 Log: add the FILESYSTEMS placeholder and note that it's the default early_late_divider Modified: head/share/man/man8/rc.8 Modified: head/share/man/man8/rc.8 ============================================================================== --- head/share/man/man8/rc.8 Tue Oct 6 21:31:04 2020 (r366501) +++ head/share/man/man8/rc.8 Tue Oct 6 22:53:11 2020 (r366502) @@ -31,7 +31,7 @@ .\" @(#)rc.8 8.2 (Berkeley) 12/11/93 .\" $FreeBSD$ .\" -.Dd September 6, 2019 +.Dd October 6, 2020 .Dt RC 8 .Os .Sh NAME @@ -242,7 +242,11 @@ Scripts that are .Dq placeholders to ensure that certain operations are performed before others. In order of startup, these are: -.Bl -tag -width ".Pa NETWORKING" +.Bl -tag -width ".Pa FILESYSTEMS" +.It Pa FILESYSTEMS +Ensure that root and other critical file systems are mounted. +This is the default +.Va $early_late_divider . .It Pa NETWORKING Ensure basic network services are running, including general network configuration. From owner-svn-src-all@freebsd.org Tue Oct 6 23:16:58 2020 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 0B0C843DF97; Tue, 6 Oct 2020 23:16:58 +0000 (UTC) (envelope-from mhorne@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5YJT6Wcpz44fG; Tue, 6 Oct 2020 23:16:57 +0000 (UTC) (envelope-from mhorne@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 C2D14E64A; Tue, 6 Oct 2020 23:16:57 +0000 (UTC) (envelope-from mhorne@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096NGveF070654; Tue, 6 Oct 2020 23:16:57 GMT (envelope-from mhorne@FreeBSD.org) Received: (from mhorne@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096NGvnW070651; Tue, 6 Oct 2020 23:16:57 GMT (envelope-from mhorne@FreeBSD.org) Message-Id: <202010062316.096NGvnW070651@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mhorne set sender to mhorne@FreeBSD.org using -f From: Mitchell Horne Date: Tue, 6 Oct 2020 23:16:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366503 - in head/sys: kern sys x86/x86 X-SVN-Group: head X-SVN-Commit-Author: mhorne X-SVN-Commit-Paths: in head/sys: kern sys x86/x86 X-SVN-Commit-Revision: 366503 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.33 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: Tue, 06 Oct 2020 23:16:58 -0000 Author: mhorne Date: Tue Oct 6 23:16:56 2020 New Revision: 366503 URL: https://svnweb.freebsd.org/changeset/base/366503 Log: Remove unused function cpu_boot() The prototype was added with the creation of kern_shutdown.c in r17658, but it appears to have never been implemented. Remove it now. Reviewed by: cem, kib Differential Revision: https://reviews.freebsd.org/D26702 Modified: head/sys/kern/kern_shutdown.c head/sys/sys/systm.h head/sys/x86/x86/cpu_machdep.c Modified: head/sys/kern/kern_shutdown.c ============================================================================== --- head/sys/kern/kern_shutdown.c Tue Oct 6 22:53:11 2020 (r366502) +++ head/sys/kern/kern_shutdown.c Tue Oct 6 23:16:56 2020 (r366503) @@ -668,7 +668,6 @@ shutdown_reset(void *junk, int howto) spinlock_enter(); #endif - /* cpu_boot(howto); */ /* doesn't do anything at the moment */ cpu_reset(); /* NOTREACHED */ /* assuming reset worked */ } Modified: head/sys/sys/systm.h ============================================================================== --- head/sys/sys/systm.h Tue Oct 6 22:53:11 2020 (r366502) +++ head/sys/sys/systm.h Tue Oct 6 23:16:56 2020 (r366503) @@ -268,7 +268,6 @@ void *phashinit_flags(int count, struct malloc_type *t int flags); void g_waitidle(void); -void cpu_boot(int); void cpu_flush_dcache(void *, size_t); void cpu_rootconf(void); void critical_enter_KBI(void); Modified: head/sys/x86/x86/cpu_machdep.c ============================================================================== --- head/sys/x86/x86/cpu_machdep.c Tue Oct 6 22:53:11 2020 (r366502) +++ head/sys/x86/x86/cpu_machdep.c Tue Oct 6 23:16:56 2020 (r366503) @@ -194,17 +194,6 @@ SYSCTL_BOOL(_machdep, OID_AUTO, mwait_cpustop_broken, "Can not reliably wake MONITOR/MWAIT cpus without interrupts"); /* - * Machine dependent boot() routine - * - * I haven't seen anything to put here yet - * Possibly some stuff might be grafted back here from boot() - */ -void -cpu_boot(int howto) -{ -} - -/* * Flush the D-cache for non-DMA I/O so that the I-cache can * be made coherent later. */ From owner-svn-src-all@freebsd.org Tue Oct 6 23:33:57 2020 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 067C243E043; Tue, 6 Oct 2020 23:33:57 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Yh46P4Zz45Cs; Tue, 6 Oct 2020 23:33:56 +0000 (UTC) (envelope-from imp@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 BED25EA21; Tue, 6 Oct 2020 23:33:56 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096NXuaq082758; Tue, 6 Oct 2020 23:33:56 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096NXuVp082757; Tue, 6 Oct 2020 23:33:56 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010062333.096NXuVp082757@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Tue, 6 Oct 2020 23:33:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366504 - head/sys/cam X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/sys/cam X-SVN-Commit-Revision: 366504 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.33 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: Tue, 06 Oct 2020 23:33:57 -0000 Author: imp Date: Tue Oct 6 23:33:56 2020 New Revision: 366504 URL: https://svnweb.freebsd.org/changeset/base/366504 Log: cam: Assert we have a reference when freeing sim Before we decrement refcount to sleep on the sim, assert that the refcount >= 1. If it were 0 here, we'd never wake up. Modified: head/sys/cam/cam_sim.c Modified: head/sys/cam/cam_sim.c ============================================================================== --- head/sys/cam/cam_sim.c Tue Oct 6 23:16:56 2020 (r366503) +++ head/sys/cam/cam_sim.c Tue Oct 6 23:33:56 2020 (r366504) @@ -134,6 +134,7 @@ cam_sim_free(struct cam_sim *sim, int free_devq) mtx = sim->mtx; mtx_assert(mtx, MA_OWNED); } + KASSERT(sim->refcount >= 1, ("sim->refcount >= 1")); sim->refcount--; if (sim->refcount > 0) { error = msleep(sim, mtx, PRIBIO, "simfree", 0); From owner-svn-src-all@freebsd.org Tue Oct 6 23:35:26 2020 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 BBB1F43DE7F; Tue, 6 Oct 2020 23:35:26 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5Yjp4bKxz45Vq; Tue, 6 Oct 2020 23:35:26 +0000 (UTC) (envelope-from imp@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 81016E4C5; Tue, 6 Oct 2020 23:35:26 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 096NZQaQ082893; Tue, 6 Oct 2020 23:35:26 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 096NZQmE082892; Tue, 6 Oct 2020 23:35:26 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010062335.096NZQmE082892@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Tue, 6 Oct 2020 23:35:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366505 - head/sys/cam/nvme X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/sys/cam/nvme X-SVN-Commit-Revision: 366505 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.33 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: Tue, 06 Oct 2020 23:35:26 -0000 Author: imp Date: Tue Oct 6 23:35:26 2020 New Revision: 366505 URL: https://svnweb.freebsd.org/changeset/base/366505 Log: nvme: Note where the CCB was released for passthrough command Modified: head/sys/cam/nvme/nvme_da.c Modified: head/sys/cam/nvme/nvme_da.c ============================================================================== --- head/sys/cam/nvme/nvme_da.c Tue Oct 6 23:33:56 2020 (r366504) +++ head/sys/cam/nvme/nvme_da.c Tue Oct 6 23:35:26 2020 (r366505) @@ -1257,6 +1257,7 @@ ndadone(struct cam_periph *periph, union ccb *done_ccb /* No-op. We're polling */ return; case NDA_CCB_PASS: + /* NVME_PASSTHROUGH_CMD runs this CCB and releases it */ return; default: break; From owner-svn-src-all@freebsd.org Wed Oct 7 05:36:06 2020 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 447FF3FC121; Wed, 7 Oct 2020 05:36:06 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5jjy159Yz4M83; Wed, 7 Oct 2020 05:36:06 +0000 (UTC) (envelope-from imp@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 09DAC12C2C; Wed, 7 Oct 2020 05:36:06 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0975a5kP003737; Wed, 7 Oct 2020 05:36:05 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0975a5Hg003736; Wed, 7 Oct 2020 05:36:05 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010070536.0975a5Hg003736@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Wed, 7 Oct 2020 05:36:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366506 - head/sbin/nvmecontrol/modules/wdc X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/sbin/nvmecontrol/modules/wdc X-SVN-Commit-Revision: 366506 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.33 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: Wed, 07 Oct 2020 05:36:06 -0000 Author: imp Date: Wed Oct 7 05:36:05 2020 New Revision: 366506 URL: https://svnweb.freebsd.org/changeset/base/366506 Log: nvmecontrol: Update wdc module for newer WDC NVMe products Update the to log fetch operation for latest WDC NVMe products. Tested on HGST SN100 (a few years old) and WDC SN720 (more recent). Submitted by: Akhilesh Rn (minor style tweak by me) Github PR: 435 Modified: head/sbin/nvmecontrol/modules/wdc/wdc.c Modified: head/sbin/nvmecontrol/modules/wdc/wdc.c ============================================================================== --- head/sbin/nvmecontrol/modules/wdc/wdc.c Tue Oct 6 23:35:26 2020 (r366505) +++ head/sbin/nvmecontrol/modules/wdc/wdc.c Wed Oct 7 05:36:05 2020 (r366506) @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include "nvmecontrol.h" @@ -61,14 +62,18 @@ static struct options { const char *template; const char *dev; + uint8_t data_area; } opt = { .template = NULL, .dev = NULL, + .data_area = 0, }; static const struct opts opts[] = { OPT("template", 'o', arg_string, opt, template, "Template for paths to use for different logs"), + OPT("data-area", 'd', arg_uint8, opt, data_area, + "Data-area to retrieve up to"), OPT_END }; @@ -88,11 +93,27 @@ static struct cmd cap_diag_cmd = { CMD_SUBCOMMAND(wdc_cmd, cap_diag_cmd); -#define WDC_NVME_TOC_SIZE 8 +#define WDC_NVME_VID 0x1c58 +#define WDC_NVME_VID_2 0x1b96 +#define WDC_NVME_VID_3 0x15b7 -#define WDC_NVME_CAP_DIAG_OPCODE 0xe6 -#define WDC_NVME_CAP_DIAG_CMD 0x0000 +#define WDC_NVME_TOC_SIZE 0x8 +#define WDC_NVME_LOG_SIZE_HDR_LEN 0x8 +#define WDC_NVME_CAP_DIAG_OPCODE_E6 0xe6 +#define WDC_NVME_CAP_DIAG_CMD 0x0000 +#define WDC_NVME_CAP_DIAG_OPCODE_FA 0xfa +#define WDC_NVME_DUI_MAX_SECTIONS_V0 0x3c +#define WDC_NVME_DUI_MAX_SECTIONS_V1 0x3a +#define WDC_NVME_DUI_MAX_SECTIONS_V2 0x26 +#define WDC_NVME_DUI_MAX_SECTIONS_V3 0x23 +typedef enum wdc_dui_header { + WDC_DUI_HEADER_VER_0 = 0, + WDC_DUI_HEADER_VER_1, + WDC_DUI_HEADER_VER_2, + WDC_DUI_HEADER_VER_3, +} wdc_dui_header; + static void wdc_append_serial_name(int fd, char *buf, size_t len, const char *suffix) { @@ -108,25 +129,26 @@ wdc_append_serial_name(int fd, char *buf, size_t len, while (walker > sn && *walker == ' ') walker--; *++walker = '\0'; - snprintf(buf, len, "%s%s.bin", sn, suffix); + snprintf(buf, len, "_%s_%s.bin", sn, suffix); } static void wdc_get_data(int fd, uint32_t opcode, uint32_t len, uint32_t off, uint32_t cmd, - uint8_t *buffer, size_t buflen) + uint8_t *buffer, size_t buflen, bool e6lg_flag) { struct nvme_pt_command pt; memset(&pt, 0, sizeof(pt)); pt.cmd.opc = opcode; - pt.cmd.cdw10 = htole32(len / sizeof(uint32_t)); /* - 1 like all the others ??? */ - pt.cmd.cdw11 = htole32(off / sizeof(uint32_t)); + pt.cmd.cdw10 = htole32(len / sizeof(uint32_t)); pt.cmd.cdw12 = htole32(cmd); + if (e6lg_flag) + pt.cmd.cdw11 = htole32(off / sizeof(uint32_t)); + else + pt.cmd.cdw13 = htole32(off / sizeof(uint32_t)); pt.buf = buffer; pt.len = buflen; pt.is_read = 1; -// printf("opcode %#x cdw10(len) %#x cdw11(offset?) %#x cdw12(cmd/sub) %#x buflen %zd\n", -// (int)opcode, (int)cdw10, (int)cdw11, (int)cdw12, buflen); if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) err(1, "wdc_get_data request failed"); @@ -135,17 +157,29 @@ wdc_get_data(int fd, uint32_t opcode, uint32_t len, ui } static void -wdc_do_dump(int fd, char *tmpl, const char *suffix, uint32_t opcode, +wdc_do_dump_e6(int fd, char *tmpl, const char *suffix, uint32_t opcode, uint32_t cmd, int len_off) { int first; int fd2; - uint8_t *buf; + uint8_t *buf, *hdr; uint32_t len, offset; size_t resid; + bool e6lg_flag = false; wdc_append_serial_name(fd, tmpl, MAXPATHLEN, suffix); + /* Read Log Dump header */ + len = WDC_NVME_LOG_SIZE_HDR_LEN; + offset = 0; + hdr = malloc(len); + if (hdr == NULL) + errx(1, "Can't get buffer to read dump"); + wdc_get_data(fd, opcode, len, offset, cmd, hdr, len, false); + if (memcmp("E6LG", hdr, 4) == 0) { + e6lg_flag = true; + } + /* XXX overwrite protection? */ fd2 = open(tmpl, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd2 < 0) @@ -159,15 +193,13 @@ wdc_do_dump(int fd, char *tmpl, const char *suffix, ui do { resid = len > NVME_MAX_XFER_SIZE ? NVME_MAX_XFER_SIZE : len; - wdc_get_data(fd, opcode, resid, offset, cmd, buf, resid); + wdc_get_data(fd, opcode, resid, offset, cmd, buf, resid, e6lg_flag); if (first) { len = be32dec(buf + len_off); if (len == 0) errx(1, "No data for %s", suffix); - if (memcmp("E6LG", buf, 4) != 0) - printf("Expected header of E6LG, found '%4.4s' instead\n", - buf); + printf("Dumping %d bytes of version %d.%d log to %s\n", len, buf[8], buf[9], tmpl); /* @@ -184,15 +216,153 @@ wdc_do_dump(int fd, char *tmpl, const char *suffix, ui offset += resid; len -= resid; } while (len > 0); + free(hdr); free(buf); close(fd2); } static void +wdc_get_data_dui(int fd, uint32_t opcode, uint32_t len, uint64_t off, + uint8_t *buffer, size_t buflen) +{ + struct nvme_pt_command pt; + + memset(&pt, 0, sizeof(pt)); + pt.cmd.opc = opcode; + pt.cmd.nsid = NONE; + pt.cmd.cdw10 = htole32((len / sizeof(uint32_t)) - 1) ; + pt.cmd.cdw12 = htole32(off & 0xFFFFFFFFu); + pt.cmd.cdw13 = htole32(off >> 32); + pt.buf = buffer; + pt.len = buflen; + pt.is_read = 1; + + if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) + err(1, "wdc_get_data_dui request failed"); + if (nvme_completion_is_error(&pt.cpl)) + errx(1, "wdc_get_data_dui request returned error"); +} + +static uint8_t +wdc_get_dui_max_sections(uint16_t header_ver) +{ + switch (header_ver) { + case WDC_DUI_HEADER_VER_0: + return WDC_NVME_DUI_MAX_SECTIONS_V0; + case WDC_DUI_HEADER_VER_1: + return WDC_NVME_DUI_MAX_SECTIONS_V1; + case WDC_DUI_HEADER_VER_2: + return WDC_NVME_DUI_MAX_SECTIONS_V2; + case WDC_DUI_HEADER_VER_3: + return WDC_NVME_DUI_MAX_SECTIONS_V3; + } + return 0; +} + +static void +wdc_get_dui_log_size(int fd, uint32_t opcode, uint8_t data_area, + uint64_t *log_size, int len_off) +{ + uint8_t *hdr; + uint8_t max_sections; + int i, j; + uint16_t hdr_ver; + uint16_t len; + uint64_t dui_size; + + dui_size = 0; + len = 1024; + hdr = (uint8_t*)malloc(len); + if (hdr == NULL) + errx(1, "Can't get buffer to read header"); + wdc_get_data_dui(fd, opcode, len, 0, hdr, len); + + hdr += len_off; + hdr_ver = ((*hdr & 0xF) != 0)? *hdr : le16dec(hdr); + max_sections = wdc_get_dui_max_sections(hdr_ver); + + if (hdr_ver == 0 || hdr_ver == 1) { + dui_size = (uint64_t)le32dec(hdr + 4); + if (dui_size == 0) { + hdr += 8; + for (i = 0, j = 0; i < (int)max_sections; i++, j+=8) + dui_size += (uint64_t)le32dec(hdr + j + 4); + } + } else if (hdr_ver == 2 || hdr_ver == 3) { + if (data_area == 0) { + dui_size = le64dec(hdr + 4); + if (dui_size == 0) { + hdr += 12; + for (i = 0, j = 0 ; i < (int)max_sections; i++, j+=12) + dui_size += le64dec(hdr + j + 4); + } + } else { + hdr += 12; + for (i = 0, j = 0; i < (int)max_sections; i++, j+=12) { + if (le16dec(hdr + j + 2) <= data_area) + dui_size += le64dec(hdr + j + 4); + else + break; + } + } + } + else + errx(1, "ERROR : No valid header "); + + *log_size = dui_size; + free(hdr); +} + +static void +wdc_do_dump_dui(int fd, char *tmpl, uint8_t data_area, + const char *suffix, uint32_t opcode, int len_off) +{ + int fd2, first; + uint8_t *buf; + uint16_t hdr_ver; + uint64_t log_len, offset; + size_t resid; + + wdc_append_serial_name(fd, tmpl, MAXPATHLEN, suffix); + wdc_get_dui_log_size(fd, opcode, data_area, &log_len, len_off); + if (log_len == 0) + errx(1, "No data for %s", suffix); + fd2 = open(tmpl, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd2 < 0) + err(1, "open %s", tmpl); + buf = aligned_alloc(PAGE_SIZE, NVME_MAX_XFER_SIZE); + if (buf == NULL) + errx(1, "Can't get buffer to read dump"); + offset = 0; + first = 1; + + while (log_len > 0) { + resid = log_len > NVME_MAX_XFER_SIZE ? NVME_MAX_XFER_SIZE : log_len; + wdc_get_data_dui(fd, opcode, resid, offset, buf, resid); + if (first) { + hdr_ver = ((buf[len_off] & 0xF) != 0) ? + (buf[len_off]) : (le16dec(buf + len_off)); + printf("Dumping %ld bytes of version %d log to %s\n", log_len, + hdr_ver, tmpl); + first = 0; + } + if (write(fd2, buf, resid) != (ssize_t)resid) + err(1, "write"); + offset += resid; + log_len -= resid; + } + + free(buf); + close(fd2); +} + +static void wdc_cap_diag(const struct cmd *f, int argc, char *argv[]) { char tmpl[MAXPATHLEN]; int fd; + struct nvme_controller_data cdata; + uint32_t vid; if (arg_parse(argc, argv, f)) return; @@ -200,11 +370,28 @@ wdc_cap_diag(const struct cmd *f, int argc, char *argv fprintf(stderr, "Missing template arg.\n"); arg_help(argc, argv, f); } + if (opt.data_area > 4) { + fprintf(stderr, "Data area range 1-4, supplied %d.\n", opt.data_area); + arg_help(argc, argv, f); + } strlcpy(tmpl, opt.template, sizeof(tmpl)); open_dev(opt.dev, &fd, 1, 1); - wdc_do_dump(fd, tmpl, "cap_diag", WDC_NVME_CAP_DIAG_OPCODE, - WDC_NVME_CAP_DIAG_CMD, 4); + read_controller_data(fd, &cdata); + vid = cdata.vid; + switch (vid) { + case WDC_NVME_VID : + case WDC_NVME_VID_2 : + wdc_do_dump_e6(fd, tmpl, "cap_diag", WDC_NVME_CAP_DIAG_OPCODE_E6, + WDC_NVME_CAP_DIAG_CMD, 4); + break; + case WDC_NVME_VID_3 : + wdc_do_dump_dui(fd, tmpl, opt.data_area, "cap_diag", + WDC_NVME_CAP_DIAG_OPCODE_FA, 512); + break; + default: + errx(1, "ERROR : WDC: unsupported device (%#x) for this command", vid); + } close(fd); exit(1); From owner-svn-src-all@freebsd.org Wed Oct 7 05:44:36 2020 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 944373FC0F3; Wed, 7 Oct 2020 05:44:36 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5jvm3Qttz4Mmn; Wed, 7 Oct 2020 05:44:36 +0000 (UTC) (envelope-from imp@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 591B512AEC; Wed, 7 Oct 2020 05:44:36 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0975iaG3010032; Wed, 7 Oct 2020 05:44:36 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0975iaDE010031; Wed, 7 Oct 2020 05:44:36 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010070544.0975iaDE010031@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Wed, 7 Oct 2020 05:44:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366507 - head/sys/cam/scsi X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/sys/cam/scsi X-SVN-Commit-Revision: 366507 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.33 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: Wed, 07 Oct 2020 05:44:36 -0000 Author: imp Date: Wed Oct 7 05:44:35 2020 New Revision: 366507 URL: https://svnweb.freebsd.org/changeset/base/366507 Log: cam: Add quirk for Samsung MZ7* behind a SATA-to-SAS interposer Sometimes, this drive will be present in the system such that the the firmware identification string doesn't start with ATA, such as when it's behind a SATA-to-SAS interposer. Add another quirk for that. Submitted by: github user mr44er Github PR: 423 Modified: head/sys/cam/scsi/scsi_da.c Modified: head/sys/cam/scsi/scsi_da.c ============================================================================== --- head/sys/cam/scsi/scsi_da.c Wed Oct 7 05:36:05 2020 (r366506) +++ head/sys/cam/scsi/scsi_da.c Wed Oct 7 05:44:35 2020 (r366507) @@ -1417,6 +1417,15 @@ static struct da_quirk_entry da_quirk_table[] = }, { /* + * Same as above but enable the quirks for SSD SAMSUNG MZ7* + * connected via SATA-to-SAS interposer and because of this + * starting without "ATA" + */ + { T_DIRECT, SIP_MEDIA_FIXED, "SAMSUNG", "MZ7*", "*" }, + /*quirks*/DA_Q_4K + }, + { + /* * SuperTalent TeraDrive CT SSDs * 4k optimised & trim only works in 4k requests + 4k aligned */ From owner-svn-src-all@freebsd.org Wed Oct 7 06:16:39 2020 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 CA6033FC7D8; Wed, 7 Oct 2020 06:16:39 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5kcl52NBz4PLS; Wed, 7 Oct 2020 06:16:39 +0000 (UTC) (envelope-from imp@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 75E4512F6D; Wed, 7 Oct 2020 06:16:39 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0976GdiW028369; Wed, 7 Oct 2020 06:16:39 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0976Gclk028363; Wed, 7 Oct 2020 06:16:38 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010070616.0976Gclk028363@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Wed, 7 Oct 2020 06:16:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366508 - in head/sys: dev/rt geom/eli kern sys X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head/sys: dev/rt geom/eli kern sys X-SVN-Commit-Revision: 366508 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.33 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: Wed, 07 Oct 2020 06:16:39 -0000 Author: imp Date: Wed Oct 7 06:16:37 2020 New Revision: 366508 URL: https://svnweb.freebsd.org/changeset/base/366508 Log: Move kernel env global variables, etc to sys/kenv.h The kernel globals for kenv are confined to 2 files that need them and a few that likely shouldn't (but as written the code does). Move them from sys/systm.h to sys/kenv.h. This removed a XXX from systm.h and cleans it up a little bit... Modified: head/sys/dev/rt/if_rt.c head/sys/geom/eli/g_eli.c head/sys/kern/kern_environment.c head/sys/kern/subr_hints.c head/sys/sys/kenv.h head/sys/sys/systm.h Modified: head/sys/dev/rt/if_rt.c ============================================================================== --- head/sys/dev/rt/if_rt.c Wed Oct 7 05:44:35 2020 (r366507) +++ head/sys/dev/rt/if_rt.c Wed Oct 7 06:16:37 2020 (r366508) @@ -38,6 +38,8 @@ __FBSDID("$FreeBSD$"); #include "if_rtvar.h" #include "if_rtreg.h" +#include + #include #include #include Modified: head/sys/geom/eli/g_eli.c ============================================================================== --- head/sys/geom/eli/g_eli.c Wed Oct 7 05:44:35 2020 (r366507) +++ head/sys/geom/eli/g_eli.c Wed Oct 7 06:16:37 2020 (r366508) @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include Modified: head/sys/kern/kern_environment.c ============================================================================== --- head/sys/kern/kern_environment.c Wed Oct 7 05:44:35 2020 (r366507) +++ head/sys/kern/kern_environment.c Wed Oct 7 06:16:37 2020 (r366508) @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include Modified: head/sys/kern/subr_hints.c ============================================================================== --- head/sys/kern/subr_hints.c Wed Oct 7 05:44:35 2020 (r366507) +++ head/sys/kern/subr_hints.c Wed Oct 7 06:16:37 2020 (r366508) @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include Modified: head/sys/sys/kenv.h ============================================================================== --- head/sys/sys/kenv.h Wed Oct 7 05:44:35 2020 (r366507) +++ head/sys/sys/kenv.h Wed Oct 7 06:16:37 2020 (r366508) @@ -42,4 +42,18 @@ #define KENV_MNAMELEN 128 /* Maximum name length (for the syscall) */ #define KENV_MVALLEN 128 /* Maximum value length (for the syscall) */ +#ifdef _KERNEL +/* + * Most of these variables should be const. + */ +extern bool dynamic_kenv; +extern struct mtx kenv_lock; +extern char *kern_envp; +extern char *md_envp; +extern char static_env[]; +extern char static_hints[]; /* by config for now */ + +extern char **kenvp; +#endif /* _KERNEL */ + #endif /* !_SYS_KENV_H_ */ Modified: head/sys/sys/systm.h ============================================================================== --- head/sys/sys/systm.h Wed Oct 7 05:44:35 2020 (r366507) +++ head/sys/sys/systm.h Wed Oct 7 06:16:37 2020 (r366508) @@ -204,21 +204,7 @@ void kassert_panic(const char *fmt, ...) __printflike }) #define SCHEDULER_STOPPED() SCHEDULER_STOPPED_TD(curthread) -/* - * XXX the hints declarations are even more misplaced than most declarations - * in this file, since they are needed in one file (per arch) and only used - * in two files. - * XXX most of these variables should be const. - */ extern int osreldate; -extern bool dynamic_kenv; -extern struct mtx kenv_lock; -extern char *kern_envp; -extern char *md_envp; -extern char static_env[]; -extern char static_hints[]; /* by config for now */ - -extern char **kenvp; extern const void *zero_region; /* address space maps to a zeroed page */ From owner-svn-src-all@freebsd.org Wed Oct 7 07:23:30 2020 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 332053FE1E3; Wed, 7 Oct 2020 07:23:30 +0000 (UTC) (envelope-from lwhsu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5m5t0Z9lz4SFh; Wed, 7 Oct 2020 07:23:30 +0000 (UTC) (envelope-from lwhsu@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 EAC1B13DED; Wed, 7 Oct 2020 07:23:29 +0000 (UTC) (envelope-from lwhsu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0977NT6E071319; Wed, 7 Oct 2020 07:23:29 GMT (envelope-from lwhsu@FreeBSD.org) Received: (from lwhsu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0977NTYS071318; Wed, 7 Oct 2020 07:23:29 GMT (envelope-from lwhsu@FreeBSD.org) Message-Id: <202010070723.0977NTYS071318@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: lwhsu set sender to lwhsu@FreeBSD.org using -f From: Li-Wen Hsu Date: Wed, 7 Oct 2020 07:23:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366509 - head/tests/sys/capsicum X-SVN-Group: head X-SVN-Commit-Author: lwhsu X-SVN-Commit-Paths: head/tests/sys/capsicum X-SVN-Commit-Revision: 366509 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.33 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: Wed, 07 Oct 2020 07:23:30 -0000 Author: lwhsu Date: Wed Oct 7 07:23:29 2020 New Revision: 366509 URL: https://svnweb.freebsd.org/changeset/base/366509 Log: Skip test written in Googltest in the wrapper script This leaves the main test body untouched and only skip running in the CI env, makes doing local test easier while developing. PR: 244165 Sponsored by: The FreeBSD Foundation Modified: head/tests/sys/capsicum/functional.sh Modified: head/tests/sys/capsicum/functional.sh ============================================================================== --- head/tests/sys/capsicum/functional.sh Wed Oct 7 06:16:37 2020 (r366508) +++ head/tests/sys/capsicum/functional.sh Wed Oct 7 07:23:29 2020 (r366509) @@ -59,7 +59,10 @@ add_testcase() if [ "$(atf_config_get ci false)" = "true" ]; then case "${tc_escaped}" in ForkedOpenatTest_WithFlagInCapabilityMode___|OpenatTest__WithFlag) - eval "${tc_escaped}_body() { skip \"http://bugs.freebsd.org/249960\"; }" + eval "${tc_escaped}_body() { skip \"https://bugs.freebsd.org/249960\"; }" + ;; + PipePdfork__WildcardWait) + eval "${tc_escaped}_body() { skip \"https://bugs.freebsd.org/244165\"; }" ;; *) eval "${tc_escaped}_body() { check ${tc}; }" From owner-svn-src-all@freebsd.org Wed Oct 7 07:55:55 2020 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 DDBC53FF63B; Wed, 7 Oct 2020 07:55:55 +0000 (UTC) (envelope-from lwhsu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5mqH5d3Bz4Vhf; Wed, 7 Oct 2020 07:55:55 +0000 (UTC) (envelope-from lwhsu@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 A033814631; Wed, 7 Oct 2020 07:55:55 +0000 (UTC) (envelope-from lwhsu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0977ttpL089740; Wed, 7 Oct 2020 07:55:55 GMT (envelope-from lwhsu@FreeBSD.org) Received: (from lwhsu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0977tt4X089739; Wed, 7 Oct 2020 07:55:55 GMT (envelope-from lwhsu@FreeBSD.org) Message-Id: <202010070755.0977tt4X089739@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: lwhsu set sender to lwhsu@FreeBSD.org using -f From: Li-Wen Hsu Date: Wed, 7 Oct 2020 07:55:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366510 - head/contrib/capsicum-test X-SVN-Group: head X-SVN-Commit-Author: lwhsu X-SVN-Commit-Paths: head/contrib/capsicum-test X-SVN-Commit-Revision: 366510 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.33 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: Wed, 07 Oct 2020 07:55:55 -0000 Author: lwhsu Date: Wed Oct 7 07:55:55 2020 New Revision: 366510 URL: https://svnweb.freebsd.org/changeset/base/366510 Log: Revert r358001 in favor of r366509 Sponsored by: The FreeBSD Foundation Modified: head/contrib/capsicum-test/procdesc.cc Modified: head/contrib/capsicum-test/procdesc.cc ============================================================================== --- head/contrib/capsicum-test/procdesc.cc Wed Oct 7 07:23:29 2020 (r366509) +++ head/contrib/capsicum-test/procdesc.cc Wed Oct 7 07:55:55 2020 (r366510) @@ -763,7 +763,6 @@ TEST_F(PipePdfork, ModeBits) { #endif TEST_F(PipePdfork, WildcardWait) { - TEST_SKIPPED("https://bugs.freebsd.org/244165"); // TODO(FreeBSD): make wildcard wait ignore pdfork()ed children // https://bugs.freebsd.org/201054 TerminateChild(); From owner-svn-src-all@freebsd.org Wed Oct 7 07:55:56 2020 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 0C42C3FF468; Wed, 7 Oct 2020 07:55:56 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5mqH6b8fz4VfM; Wed, 7 Oct 2020 07:55:55 +0000 (UTC) (envelope-from imp@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 C237514632; Wed, 7 Oct 2020 07:55:55 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0977ttbQ089742; Wed, 7 Oct 2020 07:55:55 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0977ttxU089741; Wed, 7 Oct 2020 07:55:55 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010070755.0977ttxU089741@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Wed, 7 Oct 2020 07:55:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366511 - head/sbin/nvmecontrol/modules/wdc X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/sbin/nvmecontrol/modules/wdc X-SVN-Commit-Revision: 366511 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.33 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: Wed, 07 Oct 2020 07:55:56 -0000 Author: imp Date: Wed Oct 7 07:55:55 2020 New Revision: 366511 URL: https://svnweb.freebsd.org/changeset/base/366511 Log: Use intmax_t to print uint64_t values. This fixes the 32-bit build where the types are different. Modified: head/sbin/nvmecontrol/modules/wdc/wdc.c Modified: head/sbin/nvmecontrol/modules/wdc/wdc.c ============================================================================== --- head/sbin/nvmecontrol/modules/wdc/wdc.c Wed Oct 7 07:55:55 2020 (r366510) +++ head/sbin/nvmecontrol/modules/wdc/wdc.c Wed Oct 7 07:55:55 2020 (r366511) @@ -342,8 +342,8 @@ wdc_do_dump_dui(int fd, char *tmpl, uint8_t data_area, if (first) { hdr_ver = ((buf[len_off] & 0xF) != 0) ? (buf[len_off]) : (le16dec(buf + len_off)); - printf("Dumping %ld bytes of version %d log to %s\n", log_len, - hdr_ver, tmpl); + printf("Dumping %jd bytes of version %d log to %s\n", + (uintmax_t)log_len, hdr_ver, tmpl); first = 0; } if (write(fd2, buf, resid) != (ssize_t)resid) From owner-svn-src-all@freebsd.org Wed Oct 7 09:53:25 2020 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 B60FE42AB27; Wed, 7 Oct 2020 09:53:25 +0000 (UTC) (envelope-from lwhsu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5qQs4VPRz4clK; Wed, 7 Oct 2020 09:53:25 +0000 (UTC) (envelope-from lwhsu@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 7F157154FA; Wed, 7 Oct 2020 09:53:25 +0000 (UTC) (envelope-from lwhsu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0979rPa0063359; Wed, 7 Oct 2020 09:53:25 GMT (envelope-from lwhsu@FreeBSD.org) Received: (from lwhsu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0979rPPl063358; Wed, 7 Oct 2020 09:53:25 GMT (envelope-from lwhsu@FreeBSD.org) Message-Id: <202010070953.0979rPPl063358@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: lwhsu set sender to lwhsu@FreeBSD.org using -f From: Li-Wen Hsu Date: Wed, 7 Oct 2020 09:53:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366512 - head/tests/sys/capsicum X-SVN-Group: head X-SVN-Commit-Author: lwhsu X-SVN-Commit-Paths: head/tests/sys/capsicum X-SVN-Commit-Revision: 366512 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.33 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: Wed, 07 Oct 2020 09:53:25 -0000 Author: lwhsu Date: Wed Oct 7 09:53:24 2020 New Revision: 366512 URL: https://svnweb.freebsd.org/changeset/base/366512 Log: Temporarily skip failing test cases in CI: sys.capsicum.functional.Capability__NoBypassDAC sys.capsicum.functional.Pdfork__OtherUserForked PR: 250178, 250179 Sponsored by: The FreeBSD Foundation Modified: head/tests/sys/capsicum/functional.sh Modified: head/tests/sys/capsicum/functional.sh ============================================================================== --- head/tests/sys/capsicum/functional.sh Wed Oct 7 07:55:55 2020 (r366511) +++ head/tests/sys/capsicum/functional.sh Wed Oct 7 09:53:24 2020 (r366512) @@ -64,6 +64,12 @@ add_testcase() PipePdfork__WildcardWait) eval "${tc_escaped}_body() { skip \"https://bugs.freebsd.org/244165\"; }" ;; + Capability__NoBypassDAC) + eval "${tc_escaped}_body() { skip \"https://bugs.freebsd.org/250178\"; }" + ;; + Pdfork__OtherUserForked) + eval "${tc_escaped}_body() { skip \"https://bugs.freebsd.org/250179\"; }" + ;; *) eval "${tc_escaped}_body() { check ${tc}; }" ;; From owner-svn-src-all@freebsd.org Wed Oct 7 10:43:29 2020 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 C9D6B42B7D2; Wed, 7 Oct 2020 10:43:29 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5rXd52PXz4fpG; Wed, 7 Oct 2020 10:43:29 +0000 (UTC) (envelope-from kib@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 900EF164C8; Wed, 7 Oct 2020 10:43:29 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097AhTUv094439; Wed, 7 Oct 2020 10:43:29 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097AhTdg094438; Wed, 7 Oct 2020 10:43:29 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010071043.097AhTdg094438@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Wed, 7 Oct 2020 10:43:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366513 - stable/12/usr.sbin/pciconf X-SVN-Group: stable-12 X-SVN-Commit-Author: kib X-SVN-Commit-Paths: stable/12/usr.sbin/pciconf X-SVN-Commit-Revision: 366513 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.33 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: Wed, 07 Oct 2020 10:43:29 -0000 Author: kib Date: Wed Oct 7 10:43:29 2020 New Revision: 366513 URL: https://svnweb.freebsd.org/changeset/base/366513 Log: MFC r366300: pciconf: print PCIe CTL max read request. Modified: stable/12/usr.sbin/pciconf/cap.c Directory Properties: stable/12/ (props changed) Modified: stable/12/usr.sbin/pciconf/cap.c ============================================================================== --- stable/12/usr.sbin/pciconf/cap.c Wed Oct 7 09:53:24 2020 (r366512) +++ stable/12/usr.sbin/pciconf/cap.c Wed Oct 7 10:43:29 2020 (r366513) @@ -397,6 +397,28 @@ link_speed_string(uint8_t speed) } static const char * +max_read_string(u_int max_read) +{ + + switch (max_read) { + case 0x0: + return ("128"); + case 0x1: + return ("256"); + case 0x2: + return ("512"); + case 0x3: + return ("1024"); + case 0x4: + return ("2048"); + case 0x5: + return ("4096"); + default: + return ("undef"); + } +} + +static const char * aspm_string(uint8_t aspm) { @@ -498,6 +520,8 @@ cap_express(int fd, struct pci_conf *p, uint8_t ptr) (ctl & PCIEM_CTL2_ARI) ? "enabled" : "disabled"); } } + printf("\n max read %s", max_read_string((ctl & + PCIEM_CTL_MAX_READ_REQUEST) >> 12)); cap = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_CAP, 4); sta = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_STA, 2); if (cap == 0 && sta == 0) From owner-svn-src-all@freebsd.org Wed Oct 7 10:58:56 2020 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 B959D42BA64; Wed, 7 Oct 2020 10:58:56 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5rtS4Yd8z4gb9; Wed, 7 Oct 2020 10:58:56 +0000 (UTC) (envelope-from kib@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 7FFC31664E; Wed, 7 Oct 2020 10:58:56 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097AwuI0001036; Wed, 7 Oct 2020 10:58:56 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097AwuwC001035; Wed, 7 Oct 2020 10:58:56 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010071058.097AwuwC001035@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Wed, 7 Oct 2020 10:58:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366514 - head/sys/net X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: head/sys/net X-SVN-Commit-Revision: 366514 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.33 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: Wed, 07 Oct 2020 10:58:56 -0000 Author: kib Date: Wed Oct 7 10:58:56 2020 New Revision: 366514 URL: https://svnweb.freebsd.org/changeset/base/366514 Log: Fix typo. Sponsored by: Mellanox Technologies/NVIDIA Networking MFC after: 3 days Modified: head/sys/net/if.h Modified: head/sys/net/if.h ============================================================================== --- head/sys/net/if.h Wed Oct 7 10:43:29 2020 (r366513) +++ head/sys/net/if.h Wed Oct 7 10:58:56 2020 (r366514) @@ -209,7 +209,7 @@ struct if_data { * contains the enabled optional feature & capabilites that can be used * individually per packet and are specified in the mbuf pkthdr.csum_flags * field. IFCAP_* and CSUM_* do not match one to one and CSUM_* may be - * more detailed or differenciated than IFCAP_*. + * more detailed or differentiated than IFCAP_*. * Hwassist features are defined CSUM_* in sys/mbuf.h * * Capabilities that cannot be arbitrarily changed with ifconfig/ioctl From owner-svn-src-all@freebsd.org Wed Oct 7 12:11:11 2020 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 B966342DD4E; Wed, 7 Oct 2020 12:11:11 +0000 (UTC) (envelope-from trasz@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5tTq4XBBz4lRt; Wed, 7 Oct 2020 12:11:11 +0000 (UTC) (envelope-from trasz@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 7F512176E7; Wed, 7 Oct 2020 12:11:11 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097CBB3G044906; Wed, 7 Oct 2020 12:11:11 GMT (envelope-from trasz@FreeBSD.org) Received: (from trasz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097CBBr4044905; Wed, 7 Oct 2020 12:11:11 GMT (envelope-from trasz@FreeBSD.org) Message-Id: <202010071211.097CBBr4044905@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: trasz set sender to trasz@FreeBSD.org using -f From: Edward Tomasz Napierala Date: Wed, 7 Oct 2020 12:11:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366515 - head/sys/riscv/riscv X-SVN-Group: head X-SVN-Commit-Author: trasz X-SVN-Commit-Paths: head/sys/riscv/riscv X-SVN-Commit-Revision: 366515 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.33 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: Wed, 07 Oct 2020 12:11:11 -0000 Author: trasz Date: Wed Oct 7 12:11:11 2020 New Revision: 366515 URL: https://svnweb.freebsd.org/changeset/base/366515 Log: Don't use critical section when calling intr_irq_handler() - that function enters critical section by itself anyway. Reviewed by: kp Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D26694 Modified: head/sys/riscv/riscv/intr_machdep.c Modified: head/sys/riscv/riscv/intr_machdep.c ============================================================================== --- head/sys/riscv/riscv/intr_machdep.c Wed Oct 7 10:58:56 2020 (r366514) +++ head/sys/riscv/riscv/intr_machdep.c Wed Oct 7 12:11:11 2020 (r366515) @@ -158,8 +158,6 @@ riscv_cpu_intr(struct trapframe *frame) struct intr_irqsrc *isrc; int active_irq; - critical_enter(); - KASSERT(frame->tf_scause & EXCP_INTR, ("riscv_cpu_intr: wrong frame passed")); @@ -169,18 +167,16 @@ riscv_cpu_intr(struct trapframe *frame) case IRQ_SOFTWARE_USER: case IRQ_SOFTWARE_SUPERVISOR: case IRQ_TIMER_SUPERVISOR: + critical_enter(); isrc = &isrcs[active_irq].isrc; if (intr_isrc_dispatch(isrc, frame) != 0) printf("stray interrupt %d\n", active_irq); + critical_exit(); break; case IRQ_EXTERNAL_SUPERVISOR: intr_irq_handler(frame); break; - default: - break; } - - critical_exit(); } #ifdef SMP From owner-svn-src-all@freebsd.org Wed Oct 7 12:38:04 2020 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 DDB6642E892; Wed, 7 Oct 2020 12:38:04 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C5v4r5WQdz4mRv; Wed, 7 Oct 2020 12:38:04 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: from mail-qv1-f53.google.com (mail-qv1-f53.google.com [209.85.219.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) (Authenticated sender: kevans) by smtp.freebsd.org (Postfix) with ESMTPSA id 9C0BA154A2; Wed, 7 Oct 2020 12:38:04 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: by mail-qv1-f53.google.com with SMTP id db4so1017566qvb.4; Wed, 07 Oct 2020 05:38:04 -0700 (PDT) X-Gm-Message-State: AOAM533PFXEBrQAIlsnGrVKtJ0j03c3Q1C879kloOIa0duDy9tYHPvpo uUWbzs9/tSC/4/6Sc4abcsxPDDgXgVw3aclBbag= X-Google-Smtp-Source: ABdhPJx4uF1wOLWiDkyD7OvPjEDDPNPaxHAV02jU1UzeBtBGresckIE+Z8kIlH3Y5CAGB3O9B974Ug4nt+5c77Ussv4= X-Received: by 2002:a0c:f0d1:: with SMTP id d17mr2992370qvl.34.1602074284072; Wed, 07 Oct 2020 05:38:04 -0700 (PDT) MIME-Version: 1.0 References: <202010070616.0976Gclk028363@repo.freebsd.org> In-Reply-To: <202010070616.0976Gclk028363@repo.freebsd.org> From: Kyle Evans Date: Wed, 7 Oct 2020 07:37:51 -0500 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: svn commit: r366508 - in head/sys: dev/rt geom/eli kern sys To: Warner Losh Cc: src-committers , svn-src-all , svn-src-head Content-Type: text/plain; charset="UTF-8" X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Wed, 07 Oct 2020 12:38:04 -0000 On Wed, Oct 7, 2020 at 1:16 AM Warner Losh wrote: > > Author: imp > Date: Wed Oct 7 06:16:37 2020 > New Revision: 366508 > URL: https://svnweb.freebsd.org/changeset/base/366508 > > Log: > Move kernel env global variables, etc to sys/kenv.h > > The kernel globals for kenv are confined to 2 files that need them and > a few that likely shouldn't (but as written the code does). Move them > from sys/systm.h to sys/kenv.h. This removed a XXX from systm.h and > cleans it up a little bit... > https://reviews.freebsd.org/D26562 can be closed now From owner-svn-src-all@freebsd.org Wed Oct 7 14:43:16 2020 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 BEA82431582; Wed, 7 Oct 2020 14:43:16 +0000 (UTC) (envelope-from fernape@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5xsJ4d0Nz4vMl; Wed, 7 Oct 2020 14:43:16 +0000 (UTC) (envelope-from fernape@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 8219A18FFA; Wed, 7 Oct 2020 14:43:16 +0000 (UTC) (envelope-from fernape@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097EhGiI043581; Wed, 7 Oct 2020 14:43:16 GMT (envelope-from fernape@FreeBSD.org) Received: (from fernape@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097EhGiA043580; Wed, 7 Oct 2020 14:43:16 GMT (envelope-from fernape@FreeBSD.org) Message-Id: <202010071443.097EhGiA043580@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: fernape set sender to fernape@FreeBSD.org using -f From: =?UTF-8?Q?Fernando_Apestegu=c3=ada?= Date: Wed, 7 Oct 2020 14:43:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366516 - head/usr.bin/ul X-SVN-Group: head X-SVN-Commit-Author: fernape X-SVN-Commit-Paths: head/usr.bin/ul X-SVN-Commit-Revision: 366516 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.33 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: Wed, 07 Oct 2020 14:43:16 -0000 Author: fernape (ports committer) Date: Wed Oct 7 14:43:16 2020 New Revision: 366516 URL: https://svnweb.freebsd.org/changeset/base/366516 Log: ul(1): Remove references to colcrt(1) and nroff(1) colcrt(1) and nroff(1) where removed in r319664. Remove references to these commands in ul(1) man page. PR: 244127 Reported by: freebsd@tim.thechases.com Approved by: manpages (gbe@) Differential Revision: https://reviews.freebsd.org/D2614 Modified: head/usr.bin/ul/ul.1 Modified: head/usr.bin/ul/ul.1 ============================================================================== --- head/usr.bin/ul/ul.1 Wed Oct 7 12:11:11 2020 (r366515) +++ head/usr.bin/ul/ul.1 Wed Oct 7 14:43:16 2020 (r366516) @@ -28,7 +28,7 @@ .\" @(#)ul.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd August 4, 2004 +.Dd October 7, 2020 .Dt UL 1 .Os .Sh NAME @@ -64,11 +64,7 @@ The following options are available: .It Fl i Underlining is indicated by a separate line containing appropriate dashes -.Ql \- ; -this is useful when you want to look at the underlining -which is present in an -.Xr nroff 1 -output stream on a CRT-terminal. +.Ql \- . .It Fl t Ar terminal Overrides the terminal type specified in the environment with .Ar terminal . @@ -85,18 +81,10 @@ as described in .Sh EXIT STATUS .Ex -std .Sh SEE ALSO -.Xr colcrt 1 , .Xr man 1 , -.Xr nroff 1 +.Xr mandoc 1 .Sh HISTORY The .Nm command appeared in .Bx 3.0 . -.Sh BUGS -The -.Xr nroff 1 -command usually outputs a series of backspaces and underlines intermixed -with the text to indicate underlining. -No attempt is made to optimize -the backward motion. From owner-svn-src-all@freebsd.org Wed Oct 7 15:22:49 2020 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 89882431E25; Wed, 7 Oct 2020 15:22:49 +0000 (UTC) (envelope-from tuexen@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C5ykx2mL8z3SSx; Wed, 7 Oct 2020 15:22:49 +0000 (UTC) (envelope-from tuexen@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 424AD195FF; Wed, 7 Oct 2020 15:22:49 +0000 (UTC) (envelope-from tuexen@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097FMnMw067859; Wed, 7 Oct 2020 15:22:49 GMT (envelope-from tuexen@FreeBSD.org) Received: (from tuexen@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097FMmY8067857; Wed, 7 Oct 2020 15:22:48 GMT (envelope-from tuexen@FreeBSD.org) Message-Id: <202010071522.097FMmY8067857@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: tuexen set sender to tuexen@FreeBSD.org using -f From: Michael Tuexen Date: Wed, 7 Oct 2020 15:22:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366517 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: tuexen X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366517 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.33 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: Wed, 07 Oct 2020 15:22:49 -0000 Author: tuexen Date: Wed Oct 7 15:22:48 2020 New Revision: 366517 URL: https://svnweb.freebsd.org/changeset/base/366517 Log: Minor cleanups. MFC after: 3 days Modified: head/sys/netinet/sctp_cc_functions.c head/sys/netinet/sctp_output.c Modified: head/sys/netinet/sctp_cc_functions.c ============================================================================== --- head/sys/netinet/sctp_cc_functions.c Wed Oct 7 14:43:16 2020 (r366516) +++ head/sys/netinet/sctp_cc_functions.c Wed Oct 7 15:22:48 2020 (r366517) @@ -1993,12 +1993,12 @@ htcp_alpha_update(struct htcp *ca) scale = min(max(scale, 1U << 2), 10U << 3); /* clamping ratio to * interval [0.5,10]<<3 */ factor = (factor << 3) / scale; - if (!factor) + if (factor != 0) factor = 1; } ca->alpha = 2 * factor * ((1 << 7) - ca->beta); - if (!ca->alpha) + if (ca->alpha != 0) ca->alpha = ALPHA_BASE; } Modified: head/sys/netinet/sctp_output.c ============================================================================== --- head/sys/netinet/sctp_output.c Wed Oct 7 14:43:16 2020 (r366516) +++ head/sys/netinet/sctp_output.c Wed Oct 7 15:22:48 2020 (r366517) @@ -2774,8 +2774,7 @@ sctp_select_nth_preferred_addr_from_ifn_boundall(struc uint8_t dest_is_priv, int addr_wanted, sa_family_t fam, - sctp_route_t *ro -) + sctp_route_t *ro) { struct sctp_ifa *ifa, *sifa; int num_eligible_addr = 0; From owner-svn-src-all@freebsd.org Wed Oct 7 17:46:50 2020 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 19765434A91; Wed, 7 Oct 2020 17:46:50 +0000 (UTC) (envelope-from hselasky@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C61x56wmFz3Zj5; Wed, 7 Oct 2020 17:46:49 +0000 (UTC) (envelope-from hselasky@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 D10621B514; Wed, 7 Oct 2020 17:46:49 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097HknnL054241; Wed, 7 Oct 2020 17:46:49 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097Hkneh054240; Wed, 7 Oct 2020 17:46:49 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <202010071746.097Hkneh054240@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Wed, 7 Oct 2020 17:46:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366518 - head/sys/dev/mlx5/mlx5_core X-SVN-Group: head X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: head/sys/dev/mlx5/mlx5_core X-SVN-Commit-Revision: 366518 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.33 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: Wed, 07 Oct 2020 17:46:50 -0000 Author: hselasky Date: Wed Oct 7 17:46:49 2020 New Revision: 366518 URL: https://svnweb.freebsd.org/changeset/base/366518 Log: Properly cleanup driver during remove_one() in mlx5core. Cleanup all host resources, SYSCTLs, MSIX vectors and memory used by the host and only leave the device allocated memory behind, if any, because it may still be in use, when the PCI remove function is called. Else future probe calls may fail due to SYSCTLs already existing. MFC after: 1 week Sponsored by: Mellanox Technologies // NVIDIA Networking Modified: head/sys/dev/mlx5/mlx5_core/mlx5_main.c Modified: head/sys/dev/mlx5/mlx5_core/mlx5_main.c ============================================================================== --- head/sys/dev/mlx5/mlx5_core/mlx5_main.c Wed Oct 7 15:22:48 2020 (r366517) +++ head/sys/dev/mlx5/mlx5_core/mlx5_main.c Wed Oct 7 17:46:49 2020 (r366518) @@ -1665,9 +1665,8 @@ static void remove_one(struct pci_dev *pdev) struct mlx5_priv *priv = &dev->priv; if (mlx5_unload_one(dev, priv, true)) { - mlx5_core_err(dev, "mlx5_unload_one failed\n"); - mlx5_health_cleanup(dev); - return; + mlx5_core_err(dev, "mlx5_unload_one() failed, leaked %lld bytes\n", + (long long)(dev->priv.fw_pages * MLX5_ADAPTER_PAGE_SIZE)); } mlx5_pagealloc_cleanup(dev); From owner-svn-src-all@freebsd.org Wed Oct 7 18:48:12 2020 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 51D6A435C6B; Wed, 7 Oct 2020 18:48:12 +0000 (UTC) (envelope-from mhorne@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C63Hw1SjXz3dqB; Wed, 7 Oct 2020 18:48:12 +0000 (UTC) (envelope-from mhorne@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 157261C020; Wed, 7 Oct 2020 18:48:12 +0000 (UTC) (envelope-from mhorne@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097ImBXB091106; Wed, 7 Oct 2020 18:48:11 GMT (envelope-from mhorne@FreeBSD.org) Received: (from mhorne@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097ImAxg091098; Wed, 7 Oct 2020 18:48:10 GMT (envelope-from mhorne@FreeBSD.org) Message-Id: <202010071848.097ImAxg091098@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mhorne set sender to mhorne@FreeBSD.org using -f From: Mitchell Horne Date: Wed, 7 Oct 2020 18:48:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366519 - in head/sys: amd64/amd64 arm/arm arm64/arm64 i386/i386 mips/mips powerpc/powerpc riscv/riscv X-SVN-Group: head X-SVN-Commit-Author: mhorne X-SVN-Commit-Paths: in head/sys: amd64/amd64 arm/arm arm64/arm64 i386/i386 mips/mips powerpc/powerpc riscv/riscv X-SVN-Commit-Revision: 366519 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.33 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: Wed, 07 Oct 2020 18:48:12 -0000 Author: mhorne Date: Wed Oct 7 18:48:10 2020 New Revision: 366519 URL: https://svnweb.freebsd.org/changeset/base/366519 Log: Print symbol index for unsupported relocation types It is unlikely, but possible, that an unrecognized or unsupported relocation type is encountered while trying to load a kernel module. If this occurs we should offer the symbol index as a hint to the user. While here, fix some small style issues. Reviewed by: markj, kib (amd64 part, in D26701) Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Modified: head/sys/amd64/amd64/elf_machdep.c head/sys/arm/arm/elf_machdep.c head/sys/arm64/arm64/elf_machdep.c head/sys/i386/i386/elf_machdep.c head/sys/mips/mips/elf_machdep.c head/sys/powerpc/powerpc/elf32_machdep.c head/sys/powerpc/powerpc/elf64_machdep.c head/sys/riscv/riscv/elf_machdep.c Modified: head/sys/amd64/amd64/elf_machdep.c ============================================================================== --- head/sys/amd64/amd64/elf_machdep.c Wed Oct 7 17:46:49 2020 (r366518) +++ head/sys/amd64/amd64/elf_machdep.c Wed Oct 7 18:48:10 2020 (r366519) @@ -309,11 +309,11 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas case R_X86_64_NONE: /* none */ break; - case R_X86_64_64: /* S + A */ + case R_X86_64_64: /* S + A */ error = lookup(lf, symidx, 1, &addr); val = addr + addend; if (error != 0) - return -1; + return (-1); if (*where != val) *where = val; break; @@ -325,7 +325,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas where32 = (Elf32_Addr *)where; val32 = (Elf32_Addr)(addr + addend - (Elf_Addr)where); if (error != 0) - return -1; + return (-1); if (*where32 != val32) *where32 = val32; break; @@ -335,7 +335,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas val32 = (Elf32_Addr)(addr + addend); where32 = (Elf32_Addr *)where; if (error != 0) - return -1; + return (-1); if (*where32 != val32) *where32 = val32; break; @@ -345,14 +345,15 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas * There shouldn't be copy relocations in kernel * objects. */ - printf("kldload: unexpected R_COPY relocation\n"); + printf("kldload: unexpected R_COPY relocation, " + "symbol index %ld\n", symidx); return (-1); case R_X86_64_GLOB_DAT: /* S */ case R_X86_64_JMP_SLOT: /* XXX need addend + offset */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); if (*where != addr) *where = addr; break; @@ -372,8 +373,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas break; default: - printf("kldload: unexpected relocation type %ld\n", - rtype); + printf("kldload: unexpected relocation type %ld, " + "symbol index %ld\n", rtype, symidx); return (-1); } return (0); Modified: head/sys/arm/arm/elf_machdep.c ============================================================================== --- head/sys/arm/arm/elf_machdep.c Wed Oct 7 17:46:49 2020 (r366518) +++ head/sys/arm/arm/elf_machdep.c Wed Oct 7 18:48:10 2020 (r366519) @@ -236,7 +236,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas case R_ARM_ABS32: error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); store_ptr(where, addr + load_ptr(where)); break; @@ -245,8 +245,9 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas * There shouldn't be copy relocations in kernel * objects. */ - printf("kldload: unexpected R_COPY relocation\n"); - return -1; + printf("kldload: unexpected R_COPY relocation, " + "symbol index %d\n", symidx); + return (-1); break; case R_ARM_JUMP_SLOT: @@ -260,9 +261,9 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas break; default: - printf("kldload: unexpected relocation type %d\n", - rtype); - return -1; + printf("kldload: unexpected relocation type %d, " + "symbol index %d\n", rtype, symidx); + return (-1); } return(0); } Modified: head/sys/arm64/arm64/elf_machdep.c ============================================================================== --- head/sys/arm64/arm64/elf_machdep.c Wed Oct 7 17:46:49 2020 (r366518) +++ head/sys/arm64/arm64/elf_machdep.c Wed Oct 7 18:48:10 2020 (r366519) @@ -227,7 +227,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas *where = val; break; default: - printf("kldload: unexpected relocation type %d\n", rtype); + printf("kldload: unexpected relocation type %d, " + "symbol index %d\n", rtype, symidx); return (-1); } return (error); Modified: head/sys/i386/i386/elf_machdep.c ============================================================================== --- head/sys/i386/i386/elf_machdep.c Wed Oct 7 17:46:49 2020 (r366518) +++ head/sys/i386/i386/elf_machdep.c Wed Oct 7 18:48:10 2020 (r366519) @@ -213,7 +213,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas case R_386_32: /* S + A */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); addr += addend; if (*where != addr) *where = addr; @@ -222,7 +222,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas case R_386_PC32: /* S + A - P */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); addr += addend - (Elf_Addr)where; if (*where != addr) *where = addr; @@ -233,14 +233,15 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas * There shouldn't be copy relocations in kernel * objects. */ - printf("kldload: unexpected R_COPY relocation\n"); - return -1; + printf("kldload: unexpected R_COPY relocation, " + "symbol index %d\n", symidx); + return (-1); break; case R_386_GLOB_DAT: /* S */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); if (*where != addr) *where = addr; break; @@ -255,9 +256,9 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas *where = addr; break; default: - printf("kldload: unexpected relocation type %d\n", - rtype); - return -1; + printf("kldload: unexpected relocation type %d, " + "symbol index %d\n", rtype, symidx); + return (-1); } return(0); } Modified: head/sys/mips/mips/elf_machdep.c ============================================================================== --- head/sys/mips/mips/elf_machdep.c Wed Oct 7 17:46:49 2020 (r366518) +++ head/sys/mips/mips/elf_machdep.c Wed Oct 7 18:48:10 2020 (r366519) @@ -454,12 +454,12 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas break; default: - printf("kldload: unexpected relocation type %d\n", - rtype); + printf("kldload: unexpected relocation type %d, " + "symbol index %d\n", rtype, symidx); return (-1); } - return(0); + return (0); } int Modified: head/sys/powerpc/powerpc/elf32_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/elf32_machdep.c Wed Oct 7 17:46:49 2020 (r366518) +++ head/sys/powerpc/powerpc/elf32_machdep.c Wed Oct 7 18:48:10 2020 (r366519) @@ -262,14 +262,14 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas case R_PPC_ADDR32: /* word32 S + A */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); *where = elf_relocaddr(lf, addr + addend); break; case R_PPC_ADDR16_LO: /* #lo(S) */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); /* * addend values are sometimes relative to sections * (i.e. .rodata) in rela, where in reality they @@ -284,7 +284,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas case R_PPC_ADDR16_HA: /* #ha(S) */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); /* * addend values are sometimes relative to sections * (i.e. .rodata) in rela, where in reality they @@ -311,7 +311,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); *where = elf_relocaddr(lf, addr + addend); break; @@ -323,11 +323,11 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas break; default: - printf("kldload: unexpected relocation type %d\n", - (int) rtype); - return -1; + printf("kldload: unexpected relocation type %d, " + "symbol index %d\n", (int)rtype, symidx); + return (-1); } - return(0); + return (0); } void Modified: head/sys/powerpc/powerpc/elf64_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/elf64_machdep.c Wed Oct 7 17:46:49 2020 (r366518) +++ head/sys/powerpc/powerpc/elf64_machdep.c Wed Oct 7 18:48:10 2020 (r366519) @@ -342,7 +342,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas case R_PPC64_ADDR64: /* doubleword64 S + A */ error = lookup(lf, symidx, 1, &addr); if (error != 0) - return -1; + return (-1); addr += addend; *where = addr; break; @@ -369,11 +369,11 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas break; default: - printf("kldload: unexpected relocation type %d\n", - (int) rtype); - return -1; + printf("kldload: unexpected relocation type %d, " + "symbol index %d\n", (int)rtype, symidx); + return (-1); } - return(0); + return (0); } void Modified: head/sys/riscv/riscv/elf_machdep.c ============================================================================== --- head/sys/riscv/riscv/elf_machdep.c Wed Oct 7 17:46:49 2020 (r366518) +++ head/sys/riscv/riscv/elf_machdep.c Wed Oct 7 18:48:10 2020 (r366519) @@ -479,7 +479,8 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas break; default: - printf("kldload: unexpected relocation type %ld\n", rtype); + printf("kldload: unexpected relocation type %ld, " + "symbol index %ld\n", rtype, symidx); return (-1); } From owner-svn-src-all@freebsd.org Wed Oct 7 20:09:27 2020 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 46BD6436DDB; Wed, 7 Oct 2020 20:09:27 +0000 (UTC) (envelope-from mhorne@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C655g1BwMz40Bt; Wed, 7 Oct 2020 20:09:27 +0000 (UTC) (envelope-from mhorne@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 0C8CA1CAEF; Wed, 7 Oct 2020 20:09:27 +0000 (UTC) (envelope-from mhorne@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097K9Que040091; Wed, 7 Oct 2020 20:09:26 GMT (envelope-from mhorne@FreeBSD.org) Received: (from mhorne@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097K9QVi040090; Wed, 7 Oct 2020 20:09:26 GMT (envelope-from mhorne@FreeBSD.org) Message-Id: <202010072009.097K9QVi040090@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mhorne set sender to mhorne@FreeBSD.org using -f From: Mitchell Horne Date: Wed, 7 Oct 2020 20:09:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-releng@freebsd.org Subject: svn commit: r366520 - releng/12.2/sys/arm64/arm64 X-SVN-Group: releng X-SVN-Commit-Author: mhorne X-SVN-Commit-Paths: releng/12.2/sys/arm64/arm64 X-SVN-Commit-Revision: 366520 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.33 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: Wed, 07 Oct 2020 20:09:27 -0000 Author: mhorne Date: Wed Oct 7 20:09:26 2020 New Revision: 366520 URL: https://svnweb.freebsd.org/changeset/base/366520 Log: MFS r366360,r366361: MFC r366271: arm64: set the correct HWCAP Approved by: re (gjb) Modified: releng/12.2/sys/arm64/arm64/identcpu.c Directory Properties: releng/12.2/ (props changed) Modified: releng/12.2/sys/arm64/arm64/identcpu.c ============================================================================== --- releng/12.2/sys/arm64/arm64/identcpu.c Wed Oct 7 18:48:10 2020 (r366519) +++ releng/12.2/sys/arm64/arm64/identcpu.c Wed Oct 7 20:09:26 2020 (r366520) @@ -500,7 +500,7 @@ parse_cpu_features_hwcap(u_int cpu) hwcap |= HWCAP_ASIMD; break; case ID_AA64PFR0_AdvSIMD_HP: - hwcap |= HWCAP_ASIMD | HWCAP_ASIMDDP; + hwcap |= HWCAP_ASIMD | HWCAP_ASIMDHP; break; default: break; From owner-svn-src-all@freebsd.org Wed Oct 7 20:31:14 2020 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 66A1D43842B; Wed, 7 Oct 2020 20:31:14 +0000 (UTC) (envelope-from cem@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C65Zp28KLz41ND; Wed, 7 Oct 2020 20:31:14 +0000 (UTC) (envelope-from cem@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 2CCAC1D696; Wed, 7 Oct 2020 20:31:14 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097KVElg053355; Wed, 7 Oct 2020 20:31:14 GMT (envelope-from cem@FreeBSD.org) Received: (from cem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097KVExc053354; Wed, 7 Oct 2020 20:31:14 GMT (envelope-from cem@FreeBSD.org) Message-Id: <202010072031.097KVExc053354@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cem set sender to cem@FreeBSD.org using -f From: Conrad Meyer Date: Wed, 7 Oct 2020 20:31:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366521 - head/usr.sbin/bhyveload X-SVN-Group: head X-SVN-Commit-Author: cem X-SVN-Commit-Paths: head/usr.sbin/bhyveload X-SVN-Commit-Revision: 366521 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.33 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: Wed, 07 Oct 2020 20:31:14 -0000 Author: cem Date: Wed Oct 7 20:31:13 2020 New Revision: 366521 URL: https://svnweb.freebsd.org/changeset/base/366521 Log: bhyveload(8): Implement loader_callbacks::diskwrite The method was optional prior to r365938, which made it mandatory but did add any test that an implementation provides the method nor implement it for bhyveload. The code path might not be hit unless the user's loader was configured to write to a file on disk, such as with nextboot(8). Reviewed by: grehan, tsoome Approved by: bhyve X-MFC-With: r365938 Differential Revision: https://reviews.freebsd.org/D26710 Modified: head/usr.sbin/bhyveload/bhyveload.c Modified: head/usr.sbin/bhyveload/bhyveload.c ============================================================================== --- head/usr.sbin/bhyveload/bhyveload.c Wed Oct 7 20:09:26 2020 (r366520) +++ head/usr.sbin/bhyveload/bhyveload.c Wed Oct 7 20:31:13 2020 (r366521) @@ -300,11 +300,11 @@ cb_stat(void *arg, void *h, struct stat *sbp) static int cb_diskread(void *arg, int unit, uint64_t from, void *to, size_t size, - size_t *resid) + size_t *resid) { ssize_t n; - if (unit < 0 || unit >= ndisks ) + if (unit < 0 || unit >= ndisks) return (EIO); n = pread(disk_fd[unit], to, size, from); if (n < 0) @@ -314,6 +314,21 @@ cb_diskread(void *arg, int unit, uint64_t from, void * } static int +cb_diskwrite(void *arg, int unit, uint64_t offset, void *src, size_t size, + size_t *resid) +{ + ssize_t n; + + if (unit < 0 || unit >= ndisks) + return (EIO); + n = pwrite(disk_fd[unit], src, size, offset); + if (n < 0) + return (errno); + *resid = size - n; + return (0); +} + +static int cb_diskioctl(void *arg, int unit, u_long cmd, void *data) { struct stat sb; @@ -611,6 +626,7 @@ static struct loader_callbacks cb = { .stat = cb_stat, .diskread = cb_diskread, + .diskwrite = cb_diskwrite, .diskioctl = cb_diskioctl, .copyin = cb_copyin, From owner-svn-src-all@freebsd.org Wed Oct 7 21:56:59 2020 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 9D417439B89; Wed, 7 Oct 2020 21:56:59 +0000 (UTC) (envelope-from bz@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C67Tl3g3rz45Rn; Wed, 7 Oct 2020 21:56:59 +0000 (UTC) (envelope-from bz@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 610C01E601; Wed, 7 Oct 2020 21:56:59 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097LuxDd007964; Wed, 7 Oct 2020 21:56:59 GMT (envelope-from bz@FreeBSD.org) Received: (from bz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097Luwbe007960; Wed, 7 Oct 2020 21:56:58 GMT (envelope-from bz@FreeBSD.org) Message-Id: <202010072156.097Luwbe007960@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bz set sender to bz@FreeBSD.org using -f From: "Bjoern A. Zeeb" Date: Wed, 7 Oct 2020 21:56:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366522 - in head: lib/lib80211 sbin/ifconfig sys/net80211 X-SVN-Group: head X-SVN-Commit-Author: bz X-SVN-Commit-Paths: in head: lib/lib80211 sbin/ifconfig sys/net80211 X-SVN-Commit-Revision: 366522 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.33 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: Wed, 07 Oct 2020 21:56:59 -0000 Author: bz Date: Wed Oct 7 21:56:58 2020 New Revision: 366522 URL: https://svnweb.freebsd.org/changeset/base/366522 Log: 80211: non-functional changes Sort a few VHT160 and 80+80 lines, update some comments, and remove a superfluous ','. No functional changes intended. MFC after: 1 week Sponsored by: The FreeBSD Foundation Modified: head/lib/lib80211/lib80211_regdomain.c head/sbin/ifconfig/ifieee80211.c head/sys/net80211/ieee80211.c head/sys/net80211/ieee80211_node.h Modified: head/lib/lib80211/lib80211_regdomain.c ============================================================================== --- head/lib/lib80211/lib80211_regdomain.c Wed Oct 7 20:31:13 2020 (r366521) +++ head/lib/lib80211/lib80211_regdomain.c Wed Oct 7 21:56:58 2020 (r366522) @@ -191,11 +191,11 @@ decode_flag(struct mystate *mt, const char *p, int len FLAG(IEEE80211_CHAN_VHT20), FLAG(IEEE80211_CHAN_VHT40), FLAG(IEEE80211_CHAN_VHT80), + FLAG(IEEE80211_CHAN_VHT160), /* * XXX VHT80P80? This likely should be done by * 80MHz chan logic in net80211 / ifconfig. */ - FLAG(IEEE80211_CHAN_VHT160), FLAG(IEEE80211_CHAN_ST), FLAG(IEEE80211_CHAN_TURBO), FLAG(IEEE80211_CHAN_PASSIVE), Modified: head/sbin/ifconfig/ifieee80211.c ============================================================================== --- head/sbin/ifconfig/ifieee80211.c Wed Oct 7 20:31:13 2020 (r366521) +++ head/sbin/ifconfig/ifieee80211.c Wed Oct 7 21:56:58 2020 (r366522) @@ -2385,8 +2385,7 @@ regdomain_makechannels( &dc->dc_chaninfo); } - /* VHT80 */ - /* XXX dc_vhtcap? */ + /* VHT80 is mandatory (and so should be VHT40 above). */ if (1) { regdomain_addchans(ci, &rd->bands_11ac, reg, IEEE80211_CHAN_A | IEEE80211_CHAN_HT40U | Modified: head/sys/net80211/ieee80211.c ============================================================================== --- head/sys/net80211/ieee80211.c Wed Oct 7 20:31:13 2020 (r366521) +++ head/sys/net80211/ieee80211.c Wed Oct 7 21:56:58 2020 (r366522) @@ -158,7 +158,7 @@ ieee80211_chan_init(struct ieee80211com *ic) /* * Setup the HT40/VHT40 upper/lower bits. - * The VHT80 math is done elsewhere. + * The VHT80/... math is done elsewhere. */ if (IEEE80211_IS_CHAN_HT40(c) && c->ic_extieee == 0) c->ic_extieee = ieee80211_mhz2ieee(c->ic_freq + @@ -167,8 +167,8 @@ ieee80211_chan_init(struct ieee80211com *ic) /* Update VHT math */ /* - * XXX VHT again, note that this assumes VHT80 channels - * are legit already + * XXX VHT again, note that this assumes VHT80/... channels + * are legit already. */ set_vht_extchan(c); @@ -712,8 +712,8 @@ ieee80211_vap_attach(struct ieee80211vap *vap, ifm_cha ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_VHT); ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT40); ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80); - ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80P80); ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT160); + ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80P80); IEEE80211_UNLOCK(ic); return 1; @@ -767,8 +767,8 @@ ieee80211_vap_detach(struct ieee80211vap *vap) ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_VHT); ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT40); ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80); - ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80P80); ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT160); + ieee80211_syncflag_vht_locked(ic, IEEE80211_FVHT_USEVHT80P80); /* NB: this handles the bpfdetach done below */ ieee80211_syncflag_ext_locked(ic, IEEE80211_FEXT_BPF); @@ -1160,7 +1160,7 @@ struct vht_chan_range vht80_chan_ranges[] = { { 5570, 5650 }, { 5650, 5730 }, { 5735, 5815 }, - { 0, 0, } + { 0, 0 } }; static int Modified: head/sys/net80211/ieee80211_node.h ============================================================================== --- head/sys/net80211/ieee80211_node.h Wed Oct 7 20:31:13 2020 (r366521) +++ head/sys/net80211/ieee80211_node.h Wed Oct 7 21:56:58 2020 (r366522) @@ -70,7 +70,7 @@ struct ieee80211vap; struct ieee80211_scanparams; /* - * Information element ``blob''. We use this structure + * Information element (IE) ``blob''. We use this structure * to capture management frame payloads that need to be * retained. Information elements within the payload that * we need to consult have references recorded. From owner-svn-src-all@freebsd.org Wed Oct 7 22:07:27 2020 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 3E133439C95; Wed, 7 Oct 2020 22:07:27 +0000 (UTC) (envelope-from bz@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C67jq0wD4z45rV; Wed, 7 Oct 2020 22:07:27 +0000 (UTC) (envelope-from bz@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 F25B31E540; Wed, 7 Oct 2020 22:07:26 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097M7QKf014015; Wed, 7 Oct 2020 22:07:26 GMT (envelope-from bz@FreeBSD.org) Received: (from bz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097M7QU0014014; Wed, 7 Oct 2020 22:07:26 GMT (envelope-from bz@FreeBSD.org) Message-Id: <202010072207.097M7QU0014014@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bz set sender to bz@FreeBSD.org using -f From: "Bjoern A. Zeeb" Date: Wed, 7 Oct 2020 22:07:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366523 - head/sys/compat/linuxkpi/common/include/linux X-SVN-Group: head X-SVN-Commit-Author: bz X-SVN-Commit-Paths: head/sys/compat/linuxkpi/common/include/linux X-SVN-Commit-Revision: 366523 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.33 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: Wed, 07 Oct 2020 22:07:27 -0000 Author: bz Date: Wed Oct 7 22:07:26 2020 New Revision: 366523 URL: https://svnweb.freebsd.org/changeset/base/366523 Log: LinuxKPI: add a bitfield.h implementation. This code was iteratively implemented during the work on various WiFi drivers -- from individual functions to a macro-created implementations for the various bit sized needed (and then extended to more for comepleteness). Some of the bit combinations do not seem to make sense so are left out. The __bf_shf(x) was obtained from D26681 [1]. Requested by: manu [1] Reviewed by: hselasky, manu MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26708 Added: head/sys/compat/linuxkpi/common/include/linux/bitfield.h (contents, props changed) Added: head/sys/compat/linuxkpi/common/include/linux/bitfield.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/include/linux/bitfield.h Wed Oct 7 22:07:26 2020 (r366523) @@ -0,0 +1,105 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Björn Zeeb under sponsorship from + * the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_BITFIELD_H +#define _LINUX_BITFIELD_H + +#include +#include + +/* Use largest possible type. */ +static inline uint64_t ___lsb(uint64_t f) { return (f & -f); } +static inline uint64_t ___bitmask(uint64_t f) { return (f / ___lsb(f)); } + +#define _uX_get_bits(_n) \ + static __inline uint ## _n ## _t \ + u ## _n ## _get_bits(uint ## _n ## _t v, uint ## _n ## _t f) \ + { \ + return ((v & f) / ___lsb(f)); \ + } + +_uX_get_bits(64) +_uX_get_bits(32) +_uX_get_bits(16) +_uX_get_bits(8) + +#define _leX_get_bits(_n) \ + static __inline uint ## _n ## _t \ + le ## _n ## _get_bits(__le ## _n v, uint ## _n ## _t f) \ + { \ + return ((le ## _n ## _to_cpu(v) & f) / ___lsb(f)); \ + } + +_leX_get_bits(64) +_leX_get_bits(32) +_leX_get_bits(16) + +#define _uX_encode_bits(_n) \ + static __inline uint ## _n ## _t \ + u ## _n ## _encode_bits(uint ## _n ## _t v, uint ## _n ## _t f) \ + { \ + return ((v & ___bitmask(f)) * ___lsb(f)); \ + } + +_uX_encode_bits(64) +_uX_encode_bits(32) +_uX_encode_bits(16) +_uX_encode_bits(8) + +#define _leX_encode_bits(_n) \ + static __inline uint ## _n ## _t \ + le ## _n ## _encode_bits(__le ## _n v, uint ## _n ## _t f)\ + { \ + return (cpu_to_le ## _n((v & ___bitmask(f)) * ___lsb(f))); \ + } + +_leX_encode_bits(64) +_leX_encode_bits(32) +_leX_encode_bits(16) + +static __inline void +le32p_replace_bits(uint32_t *p, uint32_t v, uint32_t f) +{ + + *p = (*p & ~(cpu_to_le32(v))) | le32_encode_bits(v, f); + return; +} + +#define __bf_shf(x) (__builtin_ffsll(x) - 1) + +#define FIELD_PREP(_mask, _value) \ + (((typeof(_mask))(_value) << __bf_shf(_mask)) & (_mask)) + +#define FIELD_GET(_mask, _value) \ + ((typeof(_mask))(((_value) & (_mask)) >> __bf_shf(_mask))) + +#endif /* _LINUX_BITFIELD_H */ From owner-svn-src-all@freebsd.org Wed Oct 7 22:29:27 2020 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 8B19E43A3D0; Wed, 7 Oct 2020 22:29:27 +0000 (UTC) (envelope-from bz@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C68CC28SHz47CY; Wed, 7 Oct 2020 22:29:27 +0000 (UTC) (envelope-from bz@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 2DCE11EBDF; Wed, 7 Oct 2020 22:29:27 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097MTR3T026474; Wed, 7 Oct 2020 22:29:27 GMT (envelope-from bz@FreeBSD.org) Received: (from bz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097MTRol026473; Wed, 7 Oct 2020 22:29:27 GMT (envelope-from bz@FreeBSD.org) Message-Id: <202010072229.097MTRol026473@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bz set sender to bz@FreeBSD.org using -f From: "Bjoern A. Zeeb" Date: Wed, 7 Oct 2020 22:29:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366524 - head/sbin/ifconfig X-SVN-Group: head X-SVN-Commit-Author: bz X-SVN-Commit-Paths: head/sbin/ifconfig X-SVN-Commit-Revision: 366524 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.33 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: Wed, 07 Oct 2020 22:29:27 -0000 Author: bz Date: Wed Oct 7 22:29:26 2020 New Revision: 366524 URL: https://svnweb.freebsd.org/changeset/base/366524 Log: 80211: ifconfig replace MS() with _IEEE80211_MASKSHIFT() As we did in the kernel in r366112 replace the MS() macro with the version(s) added to the kernel: _IEEE80211_MASKSHIFT(). Also provide its counter part. This will later allow use to use other macros defined in net80211 headers here in ifconfig. MFC after: 1 week Sponsored by: The FreeBSD Foundation Modified: head/sbin/ifconfig/ifieee80211.c Modified: head/sbin/ifconfig/ifieee80211.c ============================================================================== --- head/sbin/ifconfig/ifieee80211.c Wed Oct 7 22:07:26 2020 (r366523) +++ head/sbin/ifconfig/ifieee80211.c Wed Oct 7 22:29:26 2020 (r366524) @@ -138,6 +138,14 @@ #define IEEE80211_FVHT_USEVHT80P80 0x000000010 /* CONF: Use VHT 80+80 */ #endif +/* Helper macros unified. */ +#ifndef _IEEE80211_MASKSHIFT +#define _IEEE80211_MASKSHIFT(_v, _f) (((_v) & _f) >> _f##_S) +#endif +#ifndef _IEEE80211_SHIFTMASK +#define _IEEE80211_SHIFTMASK(_v, _f) (((_v) << _f##_S) & _f) +#endif + #define MAXCHAN 1536 /* max 1.5K channels */ #define MAXCOL 78 @@ -2706,7 +2714,6 @@ printie(const char* tag, const uint8_t *ie, size_t iel static void printwmeparam(const char *tag, const u_int8_t *ie, size_t ielen, int maxlen) { -#define MS(_v, _f) (((_v) & _f) >> _f##_S) static const char *acnames[] = { "BE", "BK", "VO", "VI" }; const struct ieee80211_wme_param *wme = (const struct ieee80211_wme_param *) ie; @@ -2721,17 +2728,17 @@ printwmeparam(const char *tag, const u_int8_t *ie, siz const struct ieee80211_wme_acparams *ac = &wme->params_acParams[i]; - printf(" %s[%saifsn %u cwmin %u cwmax %u txop %u]" - , acnames[i] - , MS(ac->acp_aci_aifsn, WME_PARAM_ACM) ? "acm " : "" - , MS(ac->acp_aci_aifsn, WME_PARAM_AIFSN) - , MS(ac->acp_logcwminmax, WME_PARAM_LOGCWMIN) - , MS(ac->acp_logcwminmax, WME_PARAM_LOGCWMAX) - , LE_READ_2(&ac->acp_txop) - ); + printf(" %s[%saifsn %u cwmin %u cwmax %u txop %u]", acnames[i], + _IEEE80211_MASKSHIFT(ac->acp_aci_aifsn, WME_PARAM_ACM) ? + "acm " : "", + _IEEE80211_MASKSHIFT(ac->acp_aci_aifsn, WME_PARAM_AIFSN), + _IEEE80211_MASKSHIFT(ac->acp_logcwminmax, + WME_PARAM_LOGCWMIN), + _IEEE80211_MASKSHIFT(ac->acp_logcwminmax, + WME_PARAM_LOGCWMAX), + LE_READ_2(&ac->acp_txop)); } printf(">"); -#undef MS } static void From owner-svn-src-all@freebsd.org Wed Oct 7 22:52:24 2020 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 B93B743AA22; Wed, 7 Oct 2020 22:52:24 +0000 (UTC) (envelope-from bz@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C68jh4ZVfz49Kf; Wed, 7 Oct 2020 22:52:24 +0000 (UTC) (envelope-from bz@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 814BF1EFF5; Wed, 7 Oct 2020 22:52:24 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097MqO87044463; Wed, 7 Oct 2020 22:52:24 GMT (envelope-from bz@FreeBSD.org) Received: (from bz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097MqOUP044462; Wed, 7 Oct 2020 22:52:24 GMT (envelope-from bz@FreeBSD.org) Message-Id: <202010072252.097MqOUP044462@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bz set sender to bz@FreeBSD.org using -f From: "Bjoern A. Zeeb" Date: Wed, 7 Oct 2020 22:52:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366525 - head/sys/net80211 X-SVN-Group: head X-SVN-Commit-Author: bz X-SVN-Commit-Paths: head/sys/net80211 X-SVN-Commit-Revision: 366525 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.33 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: Wed, 07 Oct 2020 22:52:24 -0000 Author: bz Date: Wed Oct 7 22:52:24 2020 New Revision: 366525 URL: https://svnweb.freebsd.org/changeset/base/366525 Log: net80211: whitespace Fix indentation for the multi-line copies of ieee80211_add_channel_list_5ghz() for the 3 bands. MFC after: 1 week Sponsored by: The FreeBSD Foundation Modified: head/sys/net80211/ieee80211_regdomain.c Modified: head/sys/net80211/ieee80211_regdomain.c ============================================================================== --- head/sys/net80211/ieee80211_regdomain.c Wed Oct 7 22:29:26 2020 (r366524) +++ head/sys/net80211/ieee80211_regdomain.c Wed Oct 7 22:52:24 2020 (r366525) @@ -158,14 +158,14 @@ ieee80211_init_channels(struct ieee80211com *ic, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) == 2) cbw_flags |= NET80211_CBW_FLAG_VHT80P80; ieee80211_add_channel_list_5ghz(chans, IEEE80211_CHAN_MAX, - nchans, def_chan_5ghz_band1, nitems(def_chan_5ghz_band1), - bands, cbw_flags); + nchans, def_chan_5ghz_band1, nitems(def_chan_5ghz_band1), + bands, cbw_flags); ieee80211_add_channel_list_5ghz(chans, IEEE80211_CHAN_MAX, nchans, def_chan_5ghz_band2, nitems(def_chan_5ghz_band2), - bands, cbw_flags); + bands, cbw_flags); ieee80211_add_channel_list_5ghz(chans, IEEE80211_CHAN_MAX, nchans, def_chan_5ghz_band3, nitems(def_chan_5ghz_band3), - bands, cbw_flags); + bands, cbw_flags); } if (rd != NULL) ic->ic_regdomain = *rd; From owner-svn-src-all@freebsd.org Wed Oct 7 23:14:49 2020 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 D5ED443A769; Wed, 7 Oct 2020 23:14:49 +0000 (UTC) (envelope-from mhorne@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C69CY55Xyz4B79; Wed, 7 Oct 2020 23:14:49 +0000 (UTC) (envelope-from mhorne@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 915CD1F451; Wed, 7 Oct 2020 23:14:49 +0000 (UTC) (envelope-from mhorne@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 097NEnbT056875; Wed, 7 Oct 2020 23:14:49 GMT (envelope-from mhorne@FreeBSD.org) Received: (from mhorne@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 097NEnp0056874; Wed, 7 Oct 2020 23:14:49 GMT (envelope-from mhorne@FreeBSD.org) Message-Id: <202010072314.097NEnp0056874@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mhorne set sender to mhorne@FreeBSD.org using -f From: Mitchell Horne Date: Wed, 7 Oct 2020 23:14:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366526 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: mhorne X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366526 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.33 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: Wed, 07 Oct 2020 23:14:49 -0000 Author: mhorne Date: Wed Oct 7 23:14:49 2020 New Revision: 366526 URL: https://svnweb.freebsd.org/changeset/base/366526 Log: Handle kmod local relocation failures gracefully It is possible for elf_reloc_local() to fail in the unlikely case of an unsupported relocation type. If this occurs, do not continue to process the file. Reviewed by: kib, markj (earlier version) MFC after: 1 week Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D26701 Modified: head/sys/kern/link_elf_obj.c Modified: head/sys/kern/link_elf_obj.c ============================================================================== --- head/sys/kern/link_elf_obj.c Wed Oct 7 22:52:24 2020 (r366525) +++ head/sys/kern/link_elf_obj.c Wed Oct 7 23:14:49 2020 (r366526) @@ -1676,9 +1676,11 @@ link_elf_reloc_local(linker_file_t lf, bool ifuncs) if (ELF_ST_BIND(sym->st_info) != STB_LOCAL) continue; if ((ELF_ST_TYPE(sym->st_info) == STT_GNU_IFUNC || - elf_is_ifunc_reloc(rel->r_info)) == ifuncs) - elf_reloc_local(lf, base, rel, ELF_RELOC_REL, - elf_obj_lookup); + elf_is_ifunc_reloc(rel->r_info)) != ifuncs) + continue; + if (elf_reloc_local(lf, base, rel, ELF_RELOC_REL, + elf_obj_lookup) != 0) + return (ENOEXEC); } } @@ -1704,9 +1706,11 @@ link_elf_reloc_local(linker_file_t lf, bool ifuncs) if (ELF_ST_BIND(sym->st_info) != STB_LOCAL) continue; if ((ELF_ST_TYPE(sym->st_info) == STT_GNU_IFUNC || - elf_is_ifunc_reloc(rela->r_info)) == ifuncs) - elf_reloc_local(lf, base, rela, ELF_RELOC_RELA, - elf_obj_lookup); + elf_is_ifunc_reloc(rela->r_info)) != ifuncs) + continue; + if (elf_reloc_local(lf, base, rela, ELF_RELOC_RELA, + elf_obj_lookup) != 0) + return (ENOEXEC); } } return (0); From owner-svn-src-all@freebsd.org Thu Oct 8 00:28:05 2020 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 0069243BC4D; Thu, 8 Oct 2020 00:28:05 +0000 (UTC) (envelope-from philip@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6Br46bz8z4G5t; Thu, 8 Oct 2020 00:28:04 +0000 (UTC) (envelope-from philip@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 C1DB7201AA; Thu, 8 Oct 2020 00:28:04 +0000 (UTC) (envelope-from philip@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0980S4H5099874; Thu, 8 Oct 2020 00:28:04 GMT (envelope-from philip@FreeBSD.org) Received: (from philip@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0980S3sH099866; Thu, 8 Oct 2020 00:28:03 GMT (envelope-from philip@FreeBSD.org) Message-Id: <202010080028.0980S3sH099866@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: philip set sender to philip@FreeBSD.org using -f From: Philip Paeps Date: Thu, 8 Oct 2020 00:28:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r366527 - vendor/tzdata/dist X-SVN-Group: vendor X-SVN-Commit-Author: philip X-SVN-Commit-Paths: vendor/tzdata/dist X-SVN-Commit-Revision: 366527 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.33 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: Thu, 08 Oct 2020 00:28:05 -0000 Author: philip Date: Thu Oct 8 00:28:03 2020 New Revision: 366527 URL: https://svnweb.freebsd.org/changeset/base/366527 Log: Import tzdata 2020b Modified: vendor/tzdata/dist/Makefile vendor/tzdata/dist/NEWS vendor/tzdata/dist/README vendor/tzdata/dist/africa vendor/tzdata/dist/antarctica vendor/tzdata/dist/asia vendor/tzdata/dist/australasia vendor/tzdata/dist/backzone vendor/tzdata/dist/europe vendor/tzdata/dist/leap-seconds.list vendor/tzdata/dist/leapseconds vendor/tzdata/dist/leapseconds.awk vendor/tzdata/dist/northamerica vendor/tzdata/dist/southamerica vendor/tzdata/dist/theory.html vendor/tzdata/dist/version vendor/tzdata/dist/zishrink.awk vendor/tzdata/dist/zoneinfo2tdf.pl Modified: vendor/tzdata/dist/Makefile ============================================================================== --- vendor/tzdata/dist/Makefile Wed Oct 7 23:14:49 2020 (r366526) +++ vendor/tzdata/dist/Makefile Thu Oct 8 00:28:03 2020 (r366527) @@ -22,13 +22,13 @@ BUGEMAIL= tz@iana.org # DATAFORM= main # To wait even longer for new features, use: # DATAFORM= rearguard +# Rearguard users might also want "ZFLAGS = -b fat"; see below. DATAFORM= main # Change the line below for your timezone (after finding the one you want in # one of the $(TDATA) source files, or adding it to a source file). # Alternatively, if you discover you've got the wrong timezone, you can just -# zic -l rightzone -# to correct things. +# 'zic -l -' to remove it, or 'zic -l rightzone' to change it. # Use the command # make zonenames # to get a list of the values you can use for LOCALTIME. @@ -37,33 +37,30 @@ LOCALTIME= GMT # The POSIXRULES macro controls interpretation of nonstandard and obsolete # POSIX-like TZ settings like TZ='EET-2EEST' that lack DST transition rules. -# In the reference implementation, if you want something other than Eastern -# United States time as a template for handling these settings, you can -# change the line below (after finding the timezone you want in the -# one of the $(TDATA) source files, or adding it to a source file). -# A setting like TZ='EET-2EEST' is supposed to use the rules in the -# template file to determine "spring forward" and "fall back" days and -# times; the environment variable itself specifies UT offsets of standard and -# daylight saving time. -# Alternatively, if you discover you've got the wrong timezone, you can just -# zic -p rightzone -# to correct things. -# Use the command -# make zonenames -# to get a list of the values you can use for POSIXRULES. +# Such a setting uses the rules in a template file to determine +# "spring forward" and "fall back" days and times; the environment +# variable itself specifies UT offsets of standard and daylight saving time. # -# If POSIXRULES is empty, no template is installed; this is the intended -# future default for POSIXRULES. +# If POSIXRULES is '-', no template is installed; this is the default. # -# Nonempty POSIXRULES is obsolete and should not be relied on, because: +# Any other value for POSIXRULES is obsolete and should not be relied on, as: # * It does not work correctly in popular implementations such as GNU/Linux. # * It does not work in the tzdb implementation for timestamps after 2037. # * It is incompatible with 'zic -b slim' if POSIXRULES specifies transitions # at standard time or UT rather than at local time. # In short, software should avoid ruleless settings like TZ='EET-2EEST' # and so should not depend on the value of POSIXRULES. +# +# If, despite the above, you want a template for handling these settings, +# you can change the line below (after finding the timezone you want in the +# one of the $(TDATA) source files, or adding it to a source file). +# Alternatively, if you discover you've got the wrong timezone, you can just +# 'zic -p -' to remove it, or 'zic -p rightzone' to change it. +# Use the command +# make zonenames +# to get a list of the values you can use for POSIXRULES. -POSIXRULES= America/New_York +POSIXRULES= - # Also see TZDEFRULESTRING below, which takes effect only # if the time zone files cannot be accessed. @@ -172,9 +169,6 @@ TZDATA_TEXT= leapseconds tzdata.zi # For backward-compatibility links for old zone names, use # BACKWARD= backward -# If you also want the link US/Pacific-New, even though it is confusing -# and is planned to be removed from the database eventually, use -# BACKWARD= backward pacificnew # To omit these links, use # BACKWARD= @@ -192,10 +186,6 @@ PACKRATDATA= UTF8_LOCALE= en_US.utf8 -# Since "." may not be in PATH... - -YEARISTYPE= ./yearistype - # Non-default libraries needed to link. LDLIBS= @@ -253,13 +243,12 @@ LDLIBS= # other than simply getting garbage data # -DUSE_LTZ=0 to build zdump with the system time zone library # Also set TZDOBJS=zdump.o and CHECK_TIME_T_ALTERNATIVES= below. -# -DZIC_BLOAT_DEFAULT=\"slim\" to default zic's -b option to "slim", and -# similarly for "fat". Fat TZif files work around incompatibilities +# -DZIC_BLOAT_DEFAULT=\"fat\" to default zic's -b option to "fat", and +# similarly for "slim". Fat TZif files work around incompatibilities # and bugs in some TZif readers, notably readers that mishandle 64-bit # data in TZif files. Slim TZif files are more efficient and do not # work around these incompatibilities and bugs. If not given, the -# current default is "fat" but this is intended to change as readers -# requiring fat files often mishandle timestamps after 2037 anyway. +# default is "slim". # -DZIC_MAX_ABBR_LEN_WO_WARN=3 # (or some other number) to set the maximum time zone abbreviation length # that zic will accept without a warning (the default is 6) @@ -333,9 +322,8 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \ # add # -DSTD_INSPIRED # to the end of the "CFLAGS=" line. This arranges for the functions -# "tzsetwall", "offtime", "timelocal", "timegm", "timeoff", +# "offtime", "timelocal", "timegm", "timeoff", # "posix2time", and "time2posix" to be added to the time conversion library. -# "tzsetwall" is deprecated and is intended to be removed soon; see NEWS. # "offtime" is like "gmtime" except that it accepts a second (long) argument # that gives an offset to add to the time_t when converting it. # "timelocal" is equivalent to "mktime". @@ -395,7 +383,7 @@ ZIC= $(zic) $(ZFLAGS) # To shrink the size of installed TZif files, # append "-r @N" to omit data before N-seconds-after-the-Epoch. -# You can also append "-b slim" if that is not already the default; +# To grow the files and work around older application bugs, append "-b fat"; # see ZIC_BLOAT_DEFAULT above. # See the zic man page for more about -b and -r. ZFLAGS= @@ -424,26 +412,6 @@ CURL= curl # Name of GNU Privacy Guard , used to sign distributions. GPG= gpg -# The path where SGML DTDs are kept and the catalog file(s) to use when -# validating HTML 4.01. The default should work on both Debian and Red Hat. -SGML_TOPDIR= /usr -SGML_DTDDIR= $(SGML_TOPDIR)/share/xml/w3c-sgml-lib/schema/dtd -SGML_SEARCH_PATH= $(SGML_DTDDIR)/REC-html401-19991224 -SGML_CATALOG_FILES= \ - $(SGML_TOPDIR)/share/doc/w3-recs/html/www.w3.org/TR/1999/REC-html401-19991224/HTML4.cat:$(SGML_TOPDIR)/share/sgml/html/4.01/HTML4.cat - -# The name, arguments and environment of a program to validate HTML 4.01. -# See for a validator, and -# for a validation library. -# Set VALIDATE=':' if you do not have such a program. -VALIDATE = nsgmls -VALIDATE_FLAGS = -s -B -wall -wno-unused-param -VALIDATE_ENV = \ - SGML_CATALOG_FILES='$(SGML_CATALOG_FILES)' \ - SGML_SEARCH_PATH='$(SGML_SEARCH_PATH)' \ - SP_CHARSET_FIXED=YES \ - SP_ENCODING=UTF-8 - # This expensive test requires USE_LTZ. # To suppress it, define this macro to be empty. CHECK_TIME_T_ALTERNATIVES = check_time_t_alternatives @@ -538,8 +506,8 @@ DOCS= $(MANS) date.1 $(MANTXTS) $(WEB_PAGES) PRIMARY_YDATA= africa antarctica asia australasia \ europe northamerica southamerica YDATA= $(PRIMARY_YDATA) etcetera -NDATA= systemv factory -TDATA_TO_CHECK= $(YDATA) $(NDATA) backward pacificnew +NDATA= factory +TDATA_TO_CHECK= $(YDATA) $(NDATA) backward TDATA= $(YDATA) $(NDATA) $(BACKWARD) ZONETABLES= zone1970.tab zone.tab TABDATA= iso3166.tab $(TZDATA_TEXT) $(ZONETABLES) @@ -547,7 +515,7 @@ LEAP_DEPS= leapseconds.awk leap-seconds.list TZDATA_ZI_DEPS= ziguard.awk zishrink.awk version $(TDATA) $(PACKRATDATA) DSTDATA_ZI_DEPS= ziguard.awk $(TDATA) $(PACKRATDATA) DATA= $(TDATA_TO_CHECK) backzone iso3166.tab leap-seconds.list \ - leapseconds yearistype.sh $(ZONETABLES) + leapseconds $(ZONETABLES) AWK_SCRIPTS= checklinks.awk checktab.awk leapseconds.awk \ ziguard.awk zishrink.awk MISC= $(AWK_SCRIPTS) zoneinfo2tdf.pl @@ -573,12 +541,10 @@ VERSION_DEPS= \ etcetera europe factory iso3166.tab \ leap-seconds.list leapseconds.awk localtime.c \ newctime.3 newstrftime.3 newtzset.3 northamerica \ - pacificnew private.h \ - southamerica strftime.c systemv theory.html \ + private.h southamerica strftime.c theory.html \ time2posix.3 tz-art.html tz-how-to.html tz-link.html \ tzfile.5 tzfile.h tzselect.8 tzselect.ksh \ - workman.sh yearistype.sh \ - zdump.8 zdump.c zic.8 zic.c \ + workman.sh zdump.8 zdump.c zic.8 zic.c \ ziguard.awk zishrink.awk \ zone.tab zone1970.tab zoneinfo2tdf.pl @@ -587,7 +553,7 @@ VERSION_DEPS= \ SHELL= /bin/sh -all: tzselect yearistype zic zdump libtz.a $(TABDATA) \ +all: tzselect zic zdump libtz.a $(TABDATA) \ vanguard.zi main.zi rearguard.zi ALL: all date $(ENCHILADA) @@ -657,10 +623,6 @@ zdump: $(TZDOBJS) zic: $(TZCOBJS) $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZCOBJS) $(LDLIBS) -yearistype: yearistype.sh - cp yearistype.sh yearistype - chmod +x yearistype - leapseconds: $(LEAP_DEPS) $(AWK) -v EXPIRES_LINE=$(EXPIRES_LINE) \ -f leapseconds.awk leap-seconds.list >$@.out @@ -675,10 +637,9 @@ INSTALLARGS = \ PACKRATDATA='$(PACKRATDATA)' \ TZDEFAULT='$(TZDEFAULT)' \ TZDIR='$(TZDIR)' \ - YEARISTYPE='$(YEARISTYPE)' \ ZIC='$(ZIC)' -INSTALL_DATA_DEPS = zic leapseconds yearistype tzdata.zi +INSTALL_DATA_DEPS = zic leapseconds tzdata.zi # 'make install_data' installs one set of TZif files. install_data: $(INSTALL_DATA_DEPS) @@ -793,7 +754,7 @@ check_character_set: $(ENCHILADA) ! grep -Env $(SAFE_LINE)'|^UNUSUAL_OK_'$(OK_CHAR)'*$$' \ Makefile && \ ! grep -Env $(SAFE_SHARP_LINE) $(TDATA_TO_CHECK) backzone \ - leapseconds yearistype.sh zone.tab && \ + leapseconds zone.tab && \ ! grep -Env $(OK_LINE) $(ENCHILADA); \ } touch $@ @@ -845,15 +806,13 @@ check_tzs: $(TZS) $(TZS_NEW) check_web: $(CHECK_WEB_PAGES) check_theory.html: theory.html check_tz-art.html: tz-art.html +check_tz-how-to.html: tz-how-to.html check_tz-link.html: tz-link.html -check_theory.html check_tz-art.html check_tz-link.html: +check_theory.html check_tz-art.html check_tz-how-to.html check_tz-link.html: $(CURL) -sS --url https://validator.w3.org/nu/ -F out=gnu \ -F file=@$$(expr $@ : 'check_\(.*\)') -o $@.out && \ test ! -s $@.out || { cat $@.out; exit 1; } mv $@.out $@ -check_tz-how-to.html: tz-how-to.html - $(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) tz-how-to.html - touch $@ # Check that zishrink.awk does not alter the data, and that ziguard.awk # preserves main-format data. @@ -883,7 +842,7 @@ clean_misc: rm -fr check_*.dir rm -f *.o *.out $(TIME_T_ALTERNATIVES) \ check_* core typecheck_* \ - date tzselect version.h zdump zic yearistype libtz.a + date tzselect version.h zdump zic libtz.a clean: clean_misc rm -fr *.dir tzdb-*/ rm -f *.zi $(TZS_NEW) Modified: vendor/tzdata/dist/NEWS ============================================================================== --- vendor/tzdata/dist/NEWS Wed Oct 7 23:14:49 2020 (r366526) +++ vendor/tzdata/dist/NEWS Thu Oct 8 00:28:03 2020 (r366527) @@ -1,5 +1,76 @@ News for the tz database +Release 2020b - 2020-10-06 18:35:04 -0700 + + Briefly: + Revised predictions for Morocco's changes starting in 2023. + Canada's Yukon changes to -07 on 2020-11-01, not 2020-03-08. + Macquarie Island has stayed in sync with Tasmania since 2011. + Casey, Antarctica is at +08 in winter and +11 in summer. + zic no longer supports -y, nor the TYPE field of Rules. + + Changes to future timestamps + + Morocco's spring-forward after Ramadan is now predicted to occur + no sooner than two days after Ramadan, instead of one day. + (Thanks to Milamber.) The first altered prediction is for 2023, + now predicted to spring-forward on April 30 instead of April 23. + + Changes to past and future timestamps + + Casey Station, Antarctica has been using +08 in winter and +11 in + summer since 2018. The most recent transition from +08 to +11 was + 2020-10-04 00:01. Also, Macquarie Island has been staying in + sync with Tasmania since 2011. (Thanks to Steffen Thorsen.) + + Changes to past and future time zone abbreviations and DST flags + + Canada's Yukon, represented by America/Whitehorse and + America/Dawson, changes its time zone rules from -08/-07 to + permanent -07 on 2020-11-01, not on 2020-03-08 as 2020a had it. + This change affects only the time zone abbreviation (MST vs PDT) + and daylight saving flag for the period between the two dates. + (Thanks to Andrew G. Smith.) + + Changes to past timestamps + + Correct several transitions for Hungary for 1918/1983. + For example, the 1983-09-25 fall-back was at 01:00, not 03:00. + (Thanks to Géza Nyáry.) Also, the 1890 transition to standard + time was on 11-01, not 10-01 (thanks to Michael Deckers). + + The 1891 French transition was on March 16, not March 15. The + 1911-03-11 French transition was at midnight, not a minute later. + Monaco's transitions were on 1892-06-01 and 1911-03-29, not + 1891-03-15 and 1911-03-11. (Thanks to Michael Deckers.) + + Changes to code + + Support for zic's long-obsolete '-y YEARISTYPE' option has been + removed and, with it, so has support for the TYPE field in Rule + lines, which is now reserved for compatibility with earlier zic. + These features were previously deprecated in release 2015f. + (Thanks to Tim Parenti.) + + zic now defaults to '-b slim' instead of to '-b fat'. + + zic's new '-l -' and '-p -' options uninstall any existing + localtime and posixrules files, respectively. + + The undocumented and ineffective tzsetwall function has been + removed. + + Changes to build procedure + + The Makefile now defaults POSIXRULES to '-', so the posixrules + feature (obsolete as of 2019b) is no longer installed by default. + + Changes to documentation and commentary + + The long-obsolete files pacificnew, systemv, and yearistype.sh have + been removed from the distribution. (Thanks to Tim Parenti.) + + Release 2020a - 2020-04-23 16:03:47 -0700 Briefly: Modified: vendor/tzdata/dist/README ============================================================================== --- vendor/tzdata/dist/README Wed Oct 7 23:14:49 2020 (r366526) +++ vendor/tzdata/dist/README Thu Oct 8 00:28:03 2020 (r366527) @@ -20,6 +20,8 @@ substituting your desired installation directory for " make TOPDIR=$HOME/tzdir install $HOME/tzdir/usr/bin/zdump -v America/Los_Angeles +See the file tz-how-to.html for examples of how to read the data files. + This database of historical local time information has several goals: * Provide a compendium of data about the history of civil time that Modified: vendor/tzdata/dist/africa ============================================================================== --- vendor/tzdata/dist/africa Wed Oct 7 23:14:49 2020 (r366526) +++ vendor/tzdata/dist/africa Thu Oct 8 00:28:03 2020 (r366527) @@ -64,7 +64,7 @@ # Corrections are welcome. # Algeria -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Algeria 1916 only - Jun 14 23:00s 1:00 S Rule Algeria 1916 1919 - Oct Sun>=1 23:00s 0 - Rule Algeria 1917 only - Mar 24 23:00s 1:00 S @@ -87,10 +87,9 @@ Rule Algeria 1978 only - Mar 24 1:00 1:00 S Rule Algeria 1978 only - Sep 22 3:00 0 - Rule Algeria 1980 only - Apr 25 0:00 1:00 S Rule Algeria 1980 only - Oct 31 2:00 0 - -# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's -# more precise 0:09:21. +# See Europe/Paris for PMT-related transitions. # Zone NAME STDOFF RULES FORMAT [UNTIL] -Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 15 0:01 +Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 16 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time 0:00 Algeria WE%sT 1940 Feb 25 2:00 1:00 Algeria CE%sT 1946 Oct 7 @@ -176,7 +175,7 @@ Link Africa/Abidjan Atlantic/St_Helena # St Helena # Egypt was mean noon at the Great Pyramid, 2:04:30.5, but apparently this # did not apply to Cairo, Alexandria, or Port Said. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Egypt 1940 only - Jul 15 0:00 1:00 S Rule Egypt 1940 only - Oct 1 0:00 0 - Rule Egypt 1941 only - Apr 15 0:00 1:00 S @@ -411,7 +410,7 @@ Zone Africa/Cairo 2:05:09 - LMT 1900 Oct # now Ghana observed different DST regimes in different years. For # lack of better info, use Shanks except treat the minus sign as a # typo, and assume DST started in 1920 not 1936. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Ghana 1920 1942 - Sep 1 0:00 0:20 - Rule Ghana 1920 1942 - Dec 31 0:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] @@ -501,7 +500,7 @@ Zone Africa/Monrovia -0:43:08 - LMT 1882 # From Paul Eggert (2013-10-25): # For now, assume they're reverting to the pre-2012 rules of permanent UT +02. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Libya 1951 only - Oct 14 2:00 1:00 S Rule Libya 1952 only - Jan 1 0:00 0 - Rule Libya 1953 only - Oct 9 2:00 1:00 S @@ -624,7 +623,7 @@ Zone Africa/Tripoli 0:52:44 - LMT 1920 # "The trial ended on March 29, 2009, when the clocks moved back by one hour # at 2am (or 02:00) local time..." -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Mauritius 1982 only - Oct 10 0:00 1:00 - Rule Mauritius 1983 only - Mar 21 0:00 0 - Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 - @@ -875,17 +874,30 @@ Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis # https://maroc-diplomatique.net/maroc-le-retour-a-lheure-gmt-est-prevu-dimanche-prochain/ # http://aujourdhui.ma/actualite/gmt1-retour-a-lheure-normale-dimanche-prochain-1 # -# From Paul Eggert (2020-04-14): +# From Milamber (2020-05-31) +# In Morocco (where I live), the end of Ramadan (Arabic month) is followed by +# the Eid al-Fitr, and concretely it's 1 or 2 day offs for the people (with +# traditional visiting of family, big lunches/dinners, etc.). So for this +# year the astronomical calculations don't include the following 2 days off in +# the calc. These 2 days fall in a Sunday/Monday, so it's not acceptable by +# people to have a time shift during these 2 days off. Perhaps you can modify +# the (predicted) rules for next years: if the end of Ramadan is a (probable) +# Friday or Saturday (and so the 2 days off are on a weekend), the next time +# shift will be the next weekend. +# +# From Paul Eggert (2020-05-31): # For now, guess that in the future Morocco will fall back at 03:00 # the last Sunday before Ramadan, and spring forward at 02:00 the -# first Sunday after the day after Ramadan. To implement this, -# transition dates for 2021 through 2087 were determined by running -# the following program under GNU Emacs 26.3. -# (let ((islamic-year 1442)) +# first Sunday after two days after Ramadan. To implement this, +# transition dates and times for 2019 through 2087 were determined by +# running the following program under GNU Emacs 26.3. (This algorithm +# also produces the correct transition dates for 2016 through 2018, +# though the times differ due to Morocco's time zone change in 2018.) +# (let ((islamic-year 1440)) # (require 'cal-islam) # (while (< islamic-year 1511) # (let ((a (calendar-islamic-to-absolute (list 9 1 islamic-year))) -# (b (1+ (calendar-islamic-to-absolute (list 10 1 islamic-year)))) +# (b (+ 2 (calendar-islamic-to-absolute (list 10 1 islamic-year)))) # (sunday 0)) # (while (/= sunday (mod (setq a (1- a)) 7))) # (while (/= sunday (mod b 7)) @@ -900,7 +912,7 @@ Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis # (car (cdr (cdr b))) (calendar-month-name (car b) t) (car (cdr b))))) # (setq islamic-year (+ 1 islamic-year)))) -# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Morocco 1939 only - Sep 12 0:00 1:00 - Rule Morocco 1939 only - Nov 19 0:00 0 - Rule Morocco 1940 only - Feb 25 0:00 1:00 - @@ -951,7 +963,7 @@ Rule Morocco 2021 only - May 16 2:00 0 - Rule Morocco 2022 only - Mar 27 3:00 -1:00 - Rule Morocco 2022 only - May 8 2:00 0 - Rule Morocco 2023 only - Mar 19 3:00 -1:00 - -Rule Morocco 2023 only - Apr 23 2:00 0 - +Rule Morocco 2023 only - Apr 30 2:00 0 - Rule Morocco 2024 only - Mar 10 3:00 -1:00 - Rule Morocco 2024 only - Apr 14 2:00 0 - Rule Morocco 2025 only - Feb 23 3:00 -1:00 - @@ -967,7 +979,7 @@ Rule Morocco 2029 only - Feb 18 2:00 0 - Rule Morocco 2029 only - Dec 30 3:00 -1:00 - Rule Morocco 2030 only - Feb 10 2:00 0 - Rule Morocco 2030 only - Dec 22 3:00 -1:00 - -Rule Morocco 2031 only - Jan 26 2:00 0 - +Rule Morocco 2031 only - Feb 2 2:00 0 - Rule Morocco 2031 only - Dec 14 3:00 -1:00 - Rule Morocco 2032 only - Jan 18 2:00 0 - Rule Morocco 2032 only - Nov 28 3:00 -1:00 - @@ -983,7 +995,7 @@ Rule Morocco 2036 only - Nov 23 2:00 0 - Rule Morocco 2037 only - Oct 4 3:00 -1:00 - Rule Morocco 2037 only - Nov 15 2:00 0 - Rule Morocco 2038 only - Sep 26 3:00 -1:00 - -Rule Morocco 2038 only - Oct 31 2:00 0 - +Rule Morocco 2038 only - Nov 7 2:00 0 - Rule Morocco 2039 only - Sep 18 3:00 -1:00 - Rule Morocco 2039 only - Oct 23 2:00 0 - Rule Morocco 2040 only - Sep 2 3:00 -1:00 - @@ -999,7 +1011,7 @@ Rule Morocco 2044 only - Aug 28 2:00 0 - Rule Morocco 2045 only - Jul 9 3:00 -1:00 - Rule Morocco 2045 only - Aug 20 2:00 0 - Rule Morocco 2046 only - Jul 1 3:00 -1:00 - -Rule Morocco 2046 only - Aug 5 2:00 0 - +Rule Morocco 2046 only - Aug 12 2:00 0 - Rule Morocco 2047 only - Jun 23 3:00 -1:00 - Rule Morocco 2047 only - Jul 28 2:00 0 - Rule Morocco 2048 only - Jun 7 3:00 -1:00 - @@ -1015,7 +1027,7 @@ Rule Morocco 2052 only - Jun 2 2:00 0 - Rule Morocco 2053 only - Apr 13 3:00 -1:00 - Rule Morocco 2053 only - May 25 2:00 0 - Rule Morocco 2054 only - Apr 5 3:00 -1:00 - -Rule Morocco 2054 only - May 10 2:00 0 - +Rule Morocco 2054 only - May 17 2:00 0 - Rule Morocco 2055 only - Mar 28 3:00 -1:00 - Rule Morocco 2055 only - May 2 2:00 0 - Rule Morocco 2056 only - Mar 12 3:00 -1:00 - @@ -1031,7 +1043,7 @@ Rule Morocco 2060 only - Mar 7 2:00 0 - Rule Morocco 2061 only - Jan 16 3:00 -1:00 - Rule Morocco 2061 only - Feb 27 2:00 0 - Rule Morocco 2062 only - Jan 8 3:00 -1:00 - -Rule Morocco 2062 only - Feb 12 2:00 0 - +Rule Morocco 2062 only - Feb 19 2:00 0 - Rule Morocco 2062 only - Dec 31 3:00 -1:00 - Rule Morocco 2063 only - Feb 4 2:00 0 - Rule Morocco 2063 only - Dec 16 3:00 -1:00 - @@ -1047,7 +1059,7 @@ Rule Morocco 2067 only - Dec 11 2:00 0 - Rule Morocco 2068 only - Oct 21 3:00 -1:00 - Rule Morocco 2068 only - Dec 2 2:00 0 - Rule Morocco 2069 only - Oct 13 3:00 -1:00 - -Rule Morocco 2069 only - Nov 17 2:00 0 - +Rule Morocco 2069 only - Nov 24 2:00 0 - Rule Morocco 2070 only - Oct 5 3:00 -1:00 - Rule Morocco 2070 only - Nov 9 2:00 0 - Rule Morocco 2071 only - Sep 20 3:00 -1:00 - @@ -1063,7 +1075,7 @@ Rule Morocco 2075 only - Sep 15 2:00 0 - Rule Morocco 2076 only - Jul 26 3:00 -1:00 - Rule Morocco 2076 only - Sep 6 2:00 0 - Rule Morocco 2077 only - Jul 18 3:00 -1:00 - -Rule Morocco 2077 only - Aug 22 2:00 0 - +Rule Morocco 2077 only - Aug 29 2:00 0 - Rule Morocco 2078 only - Jul 10 3:00 -1:00 - Rule Morocco 2078 only - Aug 14 2:00 0 - Rule Morocco 2079 only - Jun 25 3:00 -1:00 - @@ -1073,13 +1085,13 @@ Rule Morocco 2080 only - Jul 21 2:00 0 - Rule Morocco 2081 only - Jun 1 3:00 -1:00 - Rule Morocco 2081 only - Jul 13 2:00 0 - Rule Morocco 2082 only - May 24 3:00 -1:00 - -Rule Morocco 2082 only - Jun 28 2:00 0 - +Rule Morocco 2082 only - Jul 5 2:00 0 - Rule Morocco 2083 only - May 16 3:00 -1:00 - Rule Morocco 2083 only - Jun 20 2:00 0 - Rule Morocco 2084 only - Apr 30 3:00 -1:00 - Rule Morocco 2084 only - Jun 11 2:00 0 - Rule Morocco 2085 only - Apr 22 3:00 -1:00 - -Rule Morocco 2085 only - May 27 2:00 0 - +Rule Morocco 2085 only - Jun 3 2:00 0 - Rule Morocco 2086 only - Apr 14 3:00 -1:00 - Rule Morocco 2086 only - May 19 2:00 0 - Rule Morocco 2087 only - Mar 30 3:00 -1:00 - @@ -1180,7 +1192,7 @@ Link Africa/Maputo Africa/Lusaka # Zambia # Use plain "WAT" and "CAT" for the time zone abbreviations, to be compatible # with Namibia's neighbors. -# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S # Vanguard section, for zic and other parsers that support negative DST. Rule Namibia 1994 only - Mar 21 0:00 -1:00 WAT Rule Namibia 1994 2017 - Sep Sun>=1 2:00 0 CAT @@ -1303,7 +1315,7 @@ Zone Indian/Mahe 3:41:48 - LMT 1906 Jun # Victoria # See Africa/Nairobi. # South Africa -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule SA 1942 1943 - Sep Sun>=15 2:00 1:00 - Rule SA 1943 1944 - Mar Sun>=15 2:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] @@ -1336,7 +1348,7 @@ Link Africa/Johannesburg Africa/Mbabane # Eswatini # Abdalla of NTC, archived at: # https://mm.icann.org/pipermail/tz/2017-October/025333.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Sudan 1970 only - May 1 0:00 1:00 S Rule Sudan 1970 1985 - Oct 15 0:00 0 - Rule Sudan 1971 only - Apr 30 0:00 1:00 S @@ -1424,7 +1436,7 @@ Zone Africa/Juba 2:06:28 - LMT 1931 # http://www.almadenahnews.com/newss/news.php?c=118&id=38036 # http://www.worldtimezone.com/dst_news/dst_news_tunis02.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Tunisia 1939 only - Apr 15 23:00s 1:00 S Rule Tunisia 1939 only - Nov 18 23:00s 0 - Rule Tunisia 1940 only - Feb 25 23:00s 1:00 S @@ -1451,9 +1463,7 @@ Rule Tunisia 2005 only - Sep 30 1:00s 0 - Rule Tunisia 2006 2008 - Mar lastSun 2:00s 1:00 S Rule Tunisia 2006 2008 - Oct lastSun 2:00s 0 - -# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's -# more precise 0:09:21. -# Shanks & Pottenger say the 1911 switch was on Mar 9; go with Howse's Mar 11. +# See Europe/Paris for PMT-related transitions. # Zone NAME STDOFF RULES FORMAT [UNTIL] Zone Africa/Tunis 0:40:44 - LMT 1881 May 12 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time Modified: vendor/tzdata/dist/antarctica ============================================================================== --- vendor/tzdata/dist/antarctica Wed Oct 7 23:14:49 2020 (r366526) +++ vendor/tzdata/dist/antarctica Thu Oct 8 00:28:03 2020 (r366527) @@ -70,15 +70,30 @@ # Australian Antarctica Division informed us that Casey changed time # zone to UTC+11 in "the morning of 22nd October 2016". +# From Steffen Thorsen (2020-10-02, as corrected): +# Based on information we have received from the Australian Antarctic +# Division, Casey station and Macquarie Island station will move to Tasmanian +# daylight savings time on Sunday 4 October. This will take effect from 0001 +# hrs on Sunday 4 October 2020 and will mean Casey and Macquarie Island will +# be on the same time zone as Hobart. Some past dates too for this 3 hour +# time change back and forth between UTC+8 and UTC+11 for Casey: +# - 2018 Oct 7 4:00 - 2019 Mar 17 3:00 - 2019 Oct 4 3:00 - 2020 Mar 8 3:00 +# and now - 2020 Oct 4 0:01 + # Zone NAME STDOFF RULES FORMAT [UNTIL] -Zone Antarctica/Casey 0 - -00 1969 - 8:00 - +08 2009 Oct 18 2:00 +Zone Antarctica/Casey 0 - -00 1969 + 8:00 - +08 2009 Oct 18 2:00 11:00 - +11 2010 Mar 5 2:00 - 8:00 - +08 2011 Oct 28 2:00 + 8:00 - +08 2011 Oct 28 2:00 11:00 - +11 2012 Feb 21 17:00u - 8:00 - +08 2016 Oct 22 + 8:00 - +08 2016 Oct 22 11:00 - +11 2018 Mar 11 4:00 - 8:00 - +08 + 8:00 - +08 2018 Oct 7 4:00 + 11:00 - +11 2019 Mar 17 3:00 + 8:00 - +08 2019 Oct 4 3:00 + 11:00 - +11 2020 Mar 8 3:00 + 8:00 - +08 2020 Oct 4 0:01 + 11:00 - +11 Zone Antarctica/Davis 0 - -00 1957 Jan 13 7:00 - +07 1964 Nov 0 - -00 1969 Feb @@ -224,7 +239,7 @@ Zone Antarctica/Syowa 0 - -00 1957 Jan 29 # suggested by Bengt-Inge Larsson comment them out for now, and approximate # with only UTC and CEST. Uncomment them when 2014b is more prevalent. # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S #Rule Troll 2005 max - Mar 1 1:00u 1:00 +01 Rule Troll 2005 max - Mar lastSun 1:00u 2:00 +02 #Rule Troll 2005 max - Oct lastSun 1:00u 1:00 +01 Modified: vendor/tzdata/dist/asia ============================================================================== --- vendor/tzdata/dist/asia Wed Oct 7 23:14:49 2020 (r366526) +++ vendor/tzdata/dist/asia Thu Oct 8 00:28:03 2020 (r366527) @@ -70,7 +70,7 @@ ############################################################################### # These rules are stolen from the 'europe' file. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S Rule EUAsia 1979 1995 - Sep lastSun 1:00u 0 - Rule EUAsia 1996 max - Oct lastSun 1:00u 0 - @@ -114,7 +114,7 @@ Zone Asia/Kabul 4:36:48 - LMT 1890 # or # (brief) # http://www.worldtimezone.com/dst_news/dst_news_armenia03.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 - Rule Armenia 2011 only - Oct lastSun 2:00s 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] @@ -140,7 +140,7 @@ Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2 # http://vestnikkavkaza.net/news/Azerbaijani-Cabinet-of-Ministers-cancels-daylight-saving-time.html # http://en.apa.az/xeber_azerbaijan_abolishes_daylight_savings_ti_240862.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 - Rule Azer 1997 2015 - Oct lastSun 5:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] @@ -227,7 +227,7 @@ Zone Asia/Baku 3:19:24 - LMT 1924 May 2 # http://www.thedailystar.net/newDesign/latest_news.php?nid=22817 # http://www.worldtimezone.com/dst_news/dst_news_bangladesh06.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Dhaka 2009 only - Jun 19 23:00 1:00 - Rule Dhaka 2009 only - Dec 31 24:00 0 - @@ -303,7 +303,7 @@ Zone Asia/Yangon 6:24:47 - LMT 1880 # or Rangoo # generally esteemed a success, it was announced early in 1920 that it would # not be repeated." # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Shang 1919 only - Apr 12 24:00 1:00 D Rule Shang 1919 only - Sep 30 24:00 0 S @@ -399,7 +399,7 @@ Rule Shang 1919 only - Sep 30 24:00 0 S # the Yangtze river delta area during that period of time although the scope # of such use will need to be investigated to determine. # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Shang 1940 only - Jun 1 0:00 1:00 D Rule Shang 1940 only - Oct 12 24:00 0 S Rule Shang 1941 only - Mar 15 0:00 1:00 D @@ -462,7 +462,7 @@ Rule Shang 1948 1949 - Sep 30 24:00 0 S #plan # to begin on 17 April. # http://data.people.com.cn/pic/101p/1988/04/1988041201.jpg -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule PRC 1986 only - May 4 2:00 1:00 D Rule PRC 1986 1991 - Sep Sun>=11 2:00 0 S Rule PRC 1987 1991 - Apr Sun>=11 2:00 1:00 D @@ -846,7 +846,7 @@ Zone Asia/Urumqi 5:50:20 - LMT 1928 # or dates for the 1942 and 1945 transitions. # The Japanese occupation of Hong Kong began 1941-12-25. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule HK 1946 only - Apr 21 0:00 1:00 S Rule HK 1946 only - Dec 1 3:30s 0 - Rule HK 1947 only - Apr 13 3:30s 1:00 S @@ -973,7 +973,7 @@ Zone Asia/Hong_Kong 7:36:42 - LMT 1904 Oct 30 0:36:42 # until 1945-09-21 at 01:00, overriding Shanks & Pottenger. # Likewise, use Yu-Cheng Chuang's data for DST in Taiwan. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Taiwan 1946 only - May 15 0:00 1:00 D Rule Taiwan 1946 only - Oct 1 0:00 0 S Rule Taiwan 1947 only - Apr 15 0:00 1:00 D @@ -1099,7 +1099,7 @@ Zone Asia/Taipei 8:06:00 - LMT 1896 Jan 1 # The 1904 decree says that Macau changed from the meridian of # Fortaleza do Monte, presumably the basis for the 7:34:10 for LMT. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Macau 1942 1943 - Apr 30 23:00 1:00 - Rule Macau 1942 only - Nov 17 23:00 0 - Rule Macau 1943 only - Sep 30 23:00 0 S @@ -1157,7 +1157,7 @@ Zone Asia/Macau 7:34:10 - LMT 1904 Oct 30 # Cyprus to remain united in time. Cyprus Mail 2017-10-17. # https://cyprus-mail.com/2017/10/17/cyprus-remain-united-time/ -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Cyprus 1975 only - Apr 13 0:00 1:00 S Rule Cyprus 1975 only - Oct 12 0:00 0 - Rule Cyprus 1976 only - May 15 0:00 1:00 S @@ -1534,7 +1534,7 @@ Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov # be changed back to its previous state on the 24 hours of the # thirtieth day of Shahrivar. # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Iran 1978 1980 - Mar 20 24:00 1:00 - Rule Iran 1978 only - Oct 20 24:00 0 - Rule Iran 1979 only - Sep 18 24:00 0 - @@ -1676,7 +1676,7 @@ Zone Asia/Tehran 3:25:44 - LMT 1916 # We have published a short article in English about the change: # https://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Iraq 1982 only - May 1 0:00 1:00 - Rule Iraq 1982 1984 - Oct 1 0:00 0 - Rule Iraq 1983 only - Mar 31 0:00 1:00 - @@ -1699,6 +1699,10 @@ Zone Asia/Baghdad 2:57:40 - LMT 1890 # Israel +# For more info about the motivation for DST in Israel, see: +# Barak Y. Israel's Daylight Saving Time controversy. Israel Affairs. +# 2020-08-11. https://doi.org/10.1080/13537121.2020.1806564 + # From Ephraim Silverberg (2001-01-11): # # I coined "IST/IDT" circa 1988. Until then there were three @@ -1720,7 +1724,7 @@ Zone Asia/Baghdad 2:57:40 - LMT 1890 # family is from India). # From Shanks & Pottenger: -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 1940 only - Jun 1 0:00 1:00 D Rule Zion 1942 1944 - Nov 1 0:00 0 S Rule Zion 1943 only - Apr 1 2:00 1:00 D @@ -1812,7 +1816,7 @@ Rule Zion 1988 only - Sep 4 0:00 0 S # (except in 2002) is three nights before Yom Kippur [Day of Atonement] # (the eve of the 7th of Tishrei in the lunar Hebrew calendar). -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 1989 only - Apr 30 0:00 1:00 D Rule Zion 1989 only - Sep 3 0:00 0 S Rule Zion 1990 only - Mar 25 0:00 1:00 D @@ -1828,7 +1832,7 @@ Rule Zion 1993 only - Sep 5 0:00 0 S # Ministry of Interior, Jerusalem, Israel. The spokeswoman can be reached by # calling the office directly at 972-2-6701447 or 972-2-6701448. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 1994 only - Apr 1 0:00 1:00 D Rule Zion 1994 only - Aug 28 0:00 0 S Rule Zion 1995 only - Mar 31 0:00 1:00 D @@ -1848,7 +1852,7 @@ Rule Zion 1995 only - Sep 3 0:00 0 S # # where YYYY is the relevant year. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 1996 only - Mar 15 0:00 1:00 D Rule Zion 1996 only - Sep 16 0:00 0 S Rule Zion 1997 only - Mar 21 0:00 1:00 D @@ -1871,7 +1875,7 @@ Rule Zion 1999 only - Sep 3 2:00 0 S # # ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2000-2004.ps.gz -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 2000 only - Apr 14 2:00 1:00 D Rule Zion 2000 only - Oct 6 1:00 0 S Rule Zion 2001 only - Apr 9 1:00 1:00 D @@ -1893,7 +1897,7 @@ Rule Zion 2004 only - Sep 22 1:00 0 S # # ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2005+beyond.ps -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 2005 2012 - Apr Fri<=1 2:00 1:00 D Rule Zion 2005 only - Oct 9 2:00 0 S Rule Zion 2006 only - Oct 1 2:00 0 S @@ -1913,7 +1917,7 @@ Rule Zion 2012 only - Sep 23 2:00 0 S # As of 2013, DST starts at 02:00 on the Friday before the last Sunday # in March. DST ends at 02:00 on the last Sunday of October. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D Rule Zion 2013 max - Oct lastSun 2:00 0 S @@ -2013,7 +2017,7 @@ Zone Asia/Jerusalem 2:20:54 - LMT 1880 # do in any POSIX or C platform. The "25:00" assumes zic from 2007 or later, # which should be safe now. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Japan 1948 only - May Sat>=1 24:00 1:00 D Rule Japan 1948 1951 - Sep Sat>=8 25:00 0 S Rule Japan 1949 only - Apr Sat>=1 24:00 1:00 D @@ -2090,7 +2094,7 @@ Zone Asia/Tokyo 9:18:59 - LMT 1887 Dec 31 15:00u # From Paul Eggert (2013-12-11): # As Steffen suggested, consider the past 21-month experiment to be DST. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Jordan 1973 only - Jun 6 0:00 1:00 S Rule Jordan 1973 1975 - Oct 1 0:00 0 - Rule Jordan 1974 1977 - May 1 0:00 1:00 S @@ -2416,7 +2420,7 @@ Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk # Our government cancels daylight saving time 6th of August 2005. # From 2005-08-12 our GMT-offset is +6, w/o any daylight saving. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Kyrgyz 1992 1996 - Apr Sun>=7 0:00s 1:00 - Rule Kyrgyz 1992 1996 - Sep lastSun 0:00 0 - Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 - @@ -2472,7 +2476,7 @@ Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2 # follow and continued to use GMT+9:00 for interoperability. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule ROK 1948 only - Jun 1 0:00 1:00 D Rule ROK 1948 only - Sep 12 24:00 0 S Rule ROK 1949 only - Apr 3 0:00 1:00 D @@ -2560,7 +2564,7 @@ Zone Asia/Pyongyang 8:23:00 - LMT 1908 Apr 1 # Lebanon -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Lebanon 1920 only - Mar 28 0:00 1:00 S Rule Lebanon 1920 only - Oct 25 0:00 0 - Rule Lebanon 1921 only - Apr 3 0:00 1:00 S @@ -2590,7 +2594,7 @@ Zone Asia/Beirut 2:22:00 - LMT 1880 2:00 Lebanon EE%sT # Malaysia -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule NBorneo 1935 1941 - Sep 14 0:00 0:20 - Rule NBorneo 1935 1941 - Dec 14 0:00 0 - # @@ -2735,7 +2739,7 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé # September daylight saving time ends. Source: # http://zasag.mn/news/view/8969 -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Mongol 1983 1984 - Apr 1 0:00 1:00 - Rule Mongol 1983 only - Oct 1 0:00 0 - # Shanks & Pottenger and IATA SSIM say 1990s switches occurred at 00:00, @@ -2923,7 +2927,7 @@ Zone Asia/Kathmandu 5:41:16 - LMT 1920 # "People laud PM's announcement to end DST" # http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=99374&Itemid=2 -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Pakistan 2002 only - Apr Sun>=2 0:00 1:00 S Rule Pakistan 2002 only - Oct Sun>=2 0:00 0 - Rule Pakistan 2008 only - Jun 1 0:00 1:00 S @@ -3225,7 +3229,7 @@ Zone Asia/Karachi 4:28:12 - LMT 1907 # From Tim Parenti (2016-10-19): # Predict fall transitions on October's last Saturday at 01:00 from now on. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule EgyptAsia 1957 only - May 10 0:00 1:00 S Rule EgyptAsia 1957 1958 - Oct 1 0:00 0 - Rule EgyptAsia 1958 only - May 1 0:00 1:00 S @@ -3325,7 +3329,7 @@ Zone Asia/Hebron 2:20:23 - LMT 1900 Oct # influence of the sources. There is no current abbreviation for DST, # so use "PDT", the usual American style. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Phil 1936 only - Nov 1 0:00 1:00 D Rule Phil 1937 only - Feb 1 0:00 0 S Rule Phil 1954 only - Apr 12 0:00 1:00 D @@ -3473,7 +3477,7 @@ Zone Asia/Colombo 5:19:24 - LMT 1880 5:30 - +0530 # Syria -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Syria 1920 1923 - Apr Sun>=15 2:00 1:00 S Rule Syria 1920 1923 - Oct Sun>=1 2:00 0 - Rule Syria 1962 only - Apr 29 2:00 1:00 S Modified: vendor/tzdata/dist/australasia ============================================================================== --- vendor/tzdata/dist/australasia Wed Oct 7 23:14:49 2020 (r366526) +++ vendor/tzdata/dist/australasia Thu Oct 8 00:28:03 2020 (r366527) @@ -13,7 +13,7 @@ # Please see the notes below for the controversy about "EST" versus "AEST" etc. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Aus 1917 only - Jan 1 0:01 1:00 D Rule Aus 1917 only - Mar 25 2:00 0 S Rule Aus 1942 only - Jan 1 2:00 1:00 D @@ -32,7 +32,7 @@ Zone Australia/Darwin 8:43:20 - LMT 1895 Feb 9:30 Aus AC%sT # Western Australia # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AW 1974 only - Oct lastSun 2:00s 1:00 D Rule AW 1975 only - Mar Sun>=1 2:00s 0 S Rule AW 1983 only - Oct lastSun 2:00s 1:00 D @@ -70,7 +70,7 @@ Zone Australia/Eucla 8:35:28 - LMT 1895 Dec # applies to all of the Whitsundays. # http://www.australia.gov.au/about-australia/australian-story/austn-islands # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AQ 1971 only - Oct lastSun 2:00s 1:00 D Rule AQ 1972 only - Feb lastSun 2:00s 0 S Rule AQ 1989 1991 - Oct lastSun 2:00s 1:00 D @@ -86,7 +86,7 @@ Zone Australia/Lindeman 9:55:56 - LMT 1895 10:00 Holiday AE%sT # South Australia -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AS 1971 1985 - Oct lastSun 2:00s 1:00 D Rule AS 1986 only - Oct 19 2:00s 1:00 D Rule AS 1987 2007 - Oct lastSun 2:00s 1:00 D @@ -114,7 +114,7 @@ Zone Australia/Adelaide 9:14:20 - LMT 1895 Feb # http://www.bom.gov.au/climate/averages/tables/dst_times.shtml # says King Island didn't observe DST from WWII until late 1971. # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AT 1967 only - Oct Sun>=1 2:00s 1:00 D Rule AT 1968 only - Mar lastSun 2:00s 0 S Rule AT 1968 1985 - Oct lastSun 2:00s 1:00 D @@ -147,7 +147,7 @@ Zone Australia/Currie 9:35:28 - LMT 1895 Sep 10:00 AT AE%sT # Victoria -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AV 1971 1985 - Oct lastSun 2:00s 1:00 D Rule AV 1972 only - Feb lastSun 2:00s 0 S Rule AV 1973 1985 - Mar Sun>=1 2:00s 0 S @@ -168,7 +168,7 @@ Zone Australia/Melbourne 9:39:52 - LMT 1895 Feb 10:00 AV AE%sT # New South Wales -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AN 1971 1985 - Oct lastSun 2:00s 1:00 D Rule AN 1972 only - Feb 27 2:00s 0 S Rule AN 1973 1981 - Mar Sun>=1 2:00s 0 S @@ -197,7 +197,7 @@ Zone Australia/Broken_Hill 9:25:48 - LMT 1895 Feb 9:30 AS AC%sT # Lord Howe Island -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule LH 1981 1984 - Oct lastSun 2:00 1:00 - Rule LH 1982 1985 - Mar Sun>=1 2:00 0 - Rule LH 1985 only - Oct lastSun 2:00 0:30 - @@ -252,8 +252,9 @@ Zone Antarctica/Macquarie 0 - -00 1899 Nov *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-all@freebsd.org Thu Oct 8 00:29:53 2020 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 9340E43BB7A; Thu, 8 Oct 2020 00:29:53 +0000 (UTC) (envelope-from philip@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6Bt93P8Qz4GJT; Thu, 8 Oct 2020 00:29:53 +0000 (UTC) (envelope-from philip@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 3FB221FF6A; Thu, 8 Oct 2020 00:29:53 +0000 (UTC) (envelope-from philip@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0980Traj099992; Thu, 8 Oct 2020 00:29:53 GMT (envelope-from philip@FreeBSD.org) Received: (from philip@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0980Tr8m099991; Thu, 8 Oct 2020 00:29:53 GMT (envelope-from philip@FreeBSD.org) Message-Id: <202010080029.0980Tr8m099991@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: philip set sender to philip@FreeBSD.org using -f From: Philip Paeps Date: Thu, 8 Oct 2020 00:29:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r366528 - vendor/tzdata/tzdata2020b X-SVN-Group: vendor X-SVN-Commit-Author: philip X-SVN-Commit-Paths: vendor/tzdata/tzdata2020b X-SVN-Commit-Revision: 366528 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.33 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: Thu, 08 Oct 2020 00:29:53 -0000 Author: philip Date: Thu Oct 8 00:29:52 2020 New Revision: 366528 URL: https://svnweb.freebsd.org/changeset/base/366528 Log: Tag import of tzdata 2020b Added: vendor/tzdata/tzdata2020b/ - copied from r366527, vendor/tzdata/dist/ From owner-svn-src-all@freebsd.org Thu Oct 8 00:35:38 2020 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 BBB3E43C305; Thu, 8 Oct 2020 00:35:38 +0000 (UTC) (envelope-from philip@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6C0p4k5qz4GQT; Thu, 8 Oct 2020 00:35:38 +0000 (UTC) (envelope-from philip@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 8626A1FE4C; Thu, 8 Oct 2020 00:35:38 +0000 (UTC) (envelope-from philip@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0980Zcs6005835; Thu, 8 Oct 2020 00:35:38 GMT (envelope-from philip@FreeBSD.org) Received: (from philip@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0980Zb6X005827; Thu, 8 Oct 2020 00:35:37 GMT (envelope-from philip@FreeBSD.org) Message-Id: <202010080035.0980Zb6X005827@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: philip set sender to philip@FreeBSD.org using -f From: Philip Paeps Date: Thu, 8 Oct 2020 00:35:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366529 - head/contrib/tzdata X-SVN-Group: head X-SVN-Commit-Author: philip X-SVN-Commit-Paths: head/contrib/tzdata X-SVN-Commit-Revision: 366529 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.33 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: Thu, 08 Oct 2020 00:35:38 -0000 Author: philip Date: Thu Oct 8 00:35:36 2020 New Revision: 366529 URL: https://svnweb.freebsd.org/changeset/base/366529 Log: Import tzdata 2020b Changes: https://github.com/eggert/tz/blob/2020b/NEWS MFC after: 3 days Modified: head/contrib/tzdata/Makefile head/contrib/tzdata/NEWS head/contrib/tzdata/README head/contrib/tzdata/africa head/contrib/tzdata/antarctica head/contrib/tzdata/asia head/contrib/tzdata/australasia head/contrib/tzdata/backzone head/contrib/tzdata/europe head/contrib/tzdata/leap-seconds.list head/contrib/tzdata/leapseconds head/contrib/tzdata/leapseconds.awk head/contrib/tzdata/northamerica head/contrib/tzdata/southamerica head/contrib/tzdata/theory.html head/contrib/tzdata/version head/contrib/tzdata/zishrink.awk head/contrib/tzdata/zoneinfo2tdf.pl Directory Properties: head/contrib/tzdata/ (props changed) Modified: head/contrib/tzdata/Makefile ============================================================================== --- head/contrib/tzdata/Makefile Thu Oct 8 00:29:52 2020 (r366528) +++ head/contrib/tzdata/Makefile Thu Oct 8 00:35:36 2020 (r366529) @@ -22,13 +22,13 @@ BUGEMAIL= tz@iana.org # DATAFORM= main # To wait even longer for new features, use: # DATAFORM= rearguard +# Rearguard users might also want "ZFLAGS = -b fat"; see below. DATAFORM= main # Change the line below for your timezone (after finding the one you want in # one of the $(TDATA) source files, or adding it to a source file). # Alternatively, if you discover you've got the wrong timezone, you can just -# zic -l rightzone -# to correct things. +# 'zic -l -' to remove it, or 'zic -l rightzone' to change it. # Use the command # make zonenames # to get a list of the values you can use for LOCALTIME. @@ -37,33 +37,30 @@ LOCALTIME= GMT # The POSIXRULES macro controls interpretation of nonstandard and obsolete # POSIX-like TZ settings like TZ='EET-2EEST' that lack DST transition rules. -# In the reference implementation, if you want something other than Eastern -# United States time as a template for handling these settings, you can -# change the line below (after finding the timezone you want in the -# one of the $(TDATA) source files, or adding it to a source file). -# A setting like TZ='EET-2EEST' is supposed to use the rules in the -# template file to determine "spring forward" and "fall back" days and -# times; the environment variable itself specifies UT offsets of standard and -# daylight saving time. -# Alternatively, if you discover you've got the wrong timezone, you can just -# zic -p rightzone -# to correct things. -# Use the command -# make zonenames -# to get a list of the values you can use for POSIXRULES. +# Such a setting uses the rules in a template file to determine +# "spring forward" and "fall back" days and times; the environment +# variable itself specifies UT offsets of standard and daylight saving time. # -# If POSIXRULES is empty, no template is installed; this is the intended -# future default for POSIXRULES. +# If POSIXRULES is '-', no template is installed; this is the default. # -# Nonempty POSIXRULES is obsolete and should not be relied on, because: +# Any other value for POSIXRULES is obsolete and should not be relied on, as: # * It does not work correctly in popular implementations such as GNU/Linux. # * It does not work in the tzdb implementation for timestamps after 2037. # * It is incompatible with 'zic -b slim' if POSIXRULES specifies transitions # at standard time or UT rather than at local time. # In short, software should avoid ruleless settings like TZ='EET-2EEST' # and so should not depend on the value of POSIXRULES. +# +# If, despite the above, you want a template for handling these settings, +# you can change the line below (after finding the timezone you want in the +# one of the $(TDATA) source files, or adding it to a source file). +# Alternatively, if you discover you've got the wrong timezone, you can just +# 'zic -p -' to remove it, or 'zic -p rightzone' to change it. +# Use the command +# make zonenames +# to get a list of the values you can use for POSIXRULES. -POSIXRULES= America/New_York +POSIXRULES= - # Also see TZDEFRULESTRING below, which takes effect only # if the time zone files cannot be accessed. @@ -172,9 +169,6 @@ TZDATA_TEXT= leapseconds tzdata.zi # For backward-compatibility links for old zone names, use # BACKWARD= backward -# If you also want the link US/Pacific-New, even though it is confusing -# and is planned to be removed from the database eventually, use -# BACKWARD= backward pacificnew # To omit these links, use # BACKWARD= @@ -192,10 +186,6 @@ PACKRATDATA= UTF8_LOCALE= en_US.utf8 -# Since "." may not be in PATH... - -YEARISTYPE= ./yearistype - # Non-default libraries needed to link. LDLIBS= @@ -253,13 +243,12 @@ LDLIBS= # other than simply getting garbage data # -DUSE_LTZ=0 to build zdump with the system time zone library # Also set TZDOBJS=zdump.o and CHECK_TIME_T_ALTERNATIVES= below. -# -DZIC_BLOAT_DEFAULT=\"slim\" to default zic's -b option to "slim", and -# similarly for "fat". Fat TZif files work around incompatibilities +# -DZIC_BLOAT_DEFAULT=\"fat\" to default zic's -b option to "fat", and +# similarly for "slim". Fat TZif files work around incompatibilities # and bugs in some TZif readers, notably readers that mishandle 64-bit # data in TZif files. Slim TZif files are more efficient and do not # work around these incompatibilities and bugs. If not given, the -# current default is "fat" but this is intended to change as readers -# requiring fat files often mishandle timestamps after 2037 anyway. +# default is "slim". # -DZIC_MAX_ABBR_LEN_WO_WARN=3 # (or some other number) to set the maximum time zone abbreviation length # that zic will accept without a warning (the default is 6) @@ -333,9 +322,8 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \ # add # -DSTD_INSPIRED # to the end of the "CFLAGS=" line. This arranges for the functions -# "tzsetwall", "offtime", "timelocal", "timegm", "timeoff", +# "offtime", "timelocal", "timegm", "timeoff", # "posix2time", and "time2posix" to be added to the time conversion library. -# "tzsetwall" is deprecated and is intended to be removed soon; see NEWS. # "offtime" is like "gmtime" except that it accepts a second (long) argument # that gives an offset to add to the time_t when converting it. # "timelocal" is equivalent to "mktime". @@ -395,7 +383,7 @@ ZIC= $(zic) $(ZFLAGS) # To shrink the size of installed TZif files, # append "-r @N" to omit data before N-seconds-after-the-Epoch. -# You can also append "-b slim" if that is not already the default; +# To grow the files and work around older application bugs, append "-b fat"; # see ZIC_BLOAT_DEFAULT above. # See the zic man page for more about -b and -r. ZFLAGS= @@ -424,26 +412,6 @@ CURL= curl # Name of GNU Privacy Guard , used to sign distributions. GPG= gpg -# The path where SGML DTDs are kept and the catalog file(s) to use when -# validating HTML 4.01. The default should work on both Debian and Red Hat. -SGML_TOPDIR= /usr -SGML_DTDDIR= $(SGML_TOPDIR)/share/xml/w3c-sgml-lib/schema/dtd -SGML_SEARCH_PATH= $(SGML_DTDDIR)/REC-html401-19991224 -SGML_CATALOG_FILES= \ - $(SGML_TOPDIR)/share/doc/w3-recs/html/www.w3.org/TR/1999/REC-html401-19991224/HTML4.cat:$(SGML_TOPDIR)/share/sgml/html/4.01/HTML4.cat - -# The name, arguments and environment of a program to validate HTML 4.01. -# See for a validator, and -# for a validation library. -# Set VALIDATE=':' if you do not have such a program. -VALIDATE = nsgmls -VALIDATE_FLAGS = -s -B -wall -wno-unused-param -VALIDATE_ENV = \ - SGML_CATALOG_FILES='$(SGML_CATALOG_FILES)' \ - SGML_SEARCH_PATH='$(SGML_SEARCH_PATH)' \ - SP_CHARSET_FIXED=YES \ - SP_ENCODING=UTF-8 - # This expensive test requires USE_LTZ. # To suppress it, define this macro to be empty. CHECK_TIME_T_ALTERNATIVES = check_time_t_alternatives @@ -538,8 +506,8 @@ DOCS= $(MANS) date.1 $(MANTXTS) $(WEB_PAGES) PRIMARY_YDATA= africa antarctica asia australasia \ europe northamerica southamerica YDATA= $(PRIMARY_YDATA) etcetera -NDATA= systemv factory -TDATA_TO_CHECK= $(YDATA) $(NDATA) backward pacificnew +NDATA= factory +TDATA_TO_CHECK= $(YDATA) $(NDATA) backward TDATA= $(YDATA) $(NDATA) $(BACKWARD) ZONETABLES= zone1970.tab zone.tab TABDATA= iso3166.tab $(TZDATA_TEXT) $(ZONETABLES) @@ -547,7 +515,7 @@ LEAP_DEPS= leapseconds.awk leap-seconds.list TZDATA_ZI_DEPS= ziguard.awk zishrink.awk version $(TDATA) $(PACKRATDATA) DSTDATA_ZI_DEPS= ziguard.awk $(TDATA) $(PACKRATDATA) DATA= $(TDATA_TO_CHECK) backzone iso3166.tab leap-seconds.list \ - leapseconds yearistype.sh $(ZONETABLES) + leapseconds $(ZONETABLES) AWK_SCRIPTS= checklinks.awk checktab.awk leapseconds.awk \ ziguard.awk zishrink.awk MISC= $(AWK_SCRIPTS) zoneinfo2tdf.pl @@ -573,12 +541,10 @@ VERSION_DEPS= \ etcetera europe factory iso3166.tab \ leap-seconds.list leapseconds.awk localtime.c \ newctime.3 newstrftime.3 newtzset.3 northamerica \ - pacificnew private.h \ - southamerica strftime.c systemv theory.html \ + private.h southamerica strftime.c theory.html \ time2posix.3 tz-art.html tz-how-to.html tz-link.html \ tzfile.5 tzfile.h tzselect.8 tzselect.ksh \ - workman.sh yearistype.sh \ - zdump.8 zdump.c zic.8 zic.c \ + workman.sh zdump.8 zdump.c zic.8 zic.c \ ziguard.awk zishrink.awk \ zone.tab zone1970.tab zoneinfo2tdf.pl @@ -587,7 +553,7 @@ VERSION_DEPS= \ SHELL= /bin/sh -all: tzselect yearistype zic zdump libtz.a $(TABDATA) \ +all: tzselect zic zdump libtz.a $(TABDATA) \ vanguard.zi main.zi rearguard.zi ALL: all date $(ENCHILADA) @@ -657,10 +623,6 @@ zdump: $(TZDOBJS) zic: $(TZCOBJS) $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(TZCOBJS) $(LDLIBS) -yearistype: yearistype.sh - cp yearistype.sh yearistype - chmod +x yearistype - leapseconds: $(LEAP_DEPS) $(AWK) -v EXPIRES_LINE=$(EXPIRES_LINE) \ -f leapseconds.awk leap-seconds.list >$@.out @@ -675,10 +637,9 @@ INSTALLARGS = \ PACKRATDATA='$(PACKRATDATA)' \ TZDEFAULT='$(TZDEFAULT)' \ TZDIR='$(TZDIR)' \ - YEARISTYPE='$(YEARISTYPE)' \ ZIC='$(ZIC)' -INSTALL_DATA_DEPS = zic leapseconds yearistype tzdata.zi +INSTALL_DATA_DEPS = zic leapseconds tzdata.zi # 'make install_data' installs one set of TZif files. install_data: $(INSTALL_DATA_DEPS) @@ -793,7 +754,7 @@ check_character_set: $(ENCHILADA) ! grep -Env $(SAFE_LINE)'|^UNUSUAL_OK_'$(OK_CHAR)'*$$' \ Makefile && \ ! grep -Env $(SAFE_SHARP_LINE) $(TDATA_TO_CHECK) backzone \ - leapseconds yearistype.sh zone.tab && \ + leapseconds zone.tab && \ ! grep -Env $(OK_LINE) $(ENCHILADA); \ } touch $@ @@ -845,15 +806,13 @@ check_tzs: $(TZS) $(TZS_NEW) check_web: $(CHECK_WEB_PAGES) check_theory.html: theory.html check_tz-art.html: tz-art.html +check_tz-how-to.html: tz-how-to.html check_tz-link.html: tz-link.html -check_theory.html check_tz-art.html check_tz-link.html: +check_theory.html check_tz-art.html check_tz-how-to.html check_tz-link.html: $(CURL) -sS --url https://validator.w3.org/nu/ -F out=gnu \ -F file=@$$(expr $@ : 'check_\(.*\)') -o $@.out && \ test ! -s $@.out || { cat $@.out; exit 1; } mv $@.out $@ -check_tz-how-to.html: tz-how-to.html - $(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) tz-how-to.html - touch $@ # Check that zishrink.awk does not alter the data, and that ziguard.awk # preserves main-format data. @@ -883,7 +842,7 @@ clean_misc: rm -fr check_*.dir rm -f *.o *.out $(TIME_T_ALTERNATIVES) \ check_* core typecheck_* \ - date tzselect version.h zdump zic yearistype libtz.a + date tzselect version.h zdump zic libtz.a clean: clean_misc rm -fr *.dir tzdb-*/ rm -f *.zi $(TZS_NEW) Modified: head/contrib/tzdata/NEWS ============================================================================== --- head/contrib/tzdata/NEWS Thu Oct 8 00:29:52 2020 (r366528) +++ head/contrib/tzdata/NEWS Thu Oct 8 00:35:36 2020 (r366529) @@ -1,5 +1,76 @@ News for the tz database +Release 2020b - 2020-10-06 18:35:04 -0700 + + Briefly: + Revised predictions for Morocco's changes starting in 2023. + Canada's Yukon changes to -07 on 2020-11-01, not 2020-03-08. + Macquarie Island has stayed in sync with Tasmania since 2011. + Casey, Antarctica is at +08 in winter and +11 in summer. + zic no longer supports -y, nor the TYPE field of Rules. + + Changes to future timestamps + + Morocco's spring-forward after Ramadan is now predicted to occur + no sooner than two days after Ramadan, instead of one day. + (Thanks to Milamber.) The first altered prediction is for 2023, + now predicted to spring-forward on April 30 instead of April 23. + + Changes to past and future timestamps + + Casey Station, Antarctica has been using +08 in winter and +11 in + summer since 2018. The most recent transition from +08 to +11 was + 2020-10-04 00:01. Also, Macquarie Island has been staying in + sync with Tasmania since 2011. (Thanks to Steffen Thorsen.) + + Changes to past and future time zone abbreviations and DST flags + + Canada's Yukon, represented by America/Whitehorse and + America/Dawson, changes its time zone rules from -08/-07 to + permanent -07 on 2020-11-01, not on 2020-03-08 as 2020a had it. + This change affects only the time zone abbreviation (MST vs PDT) + and daylight saving flag for the period between the two dates. + (Thanks to Andrew G. Smith.) + + Changes to past timestamps + + Correct several transitions for Hungary for 1918/1983. + For example, the 1983-09-25 fall-back was at 01:00, not 03:00. + (Thanks to Géza Nyáry.) Also, the 1890 transition to standard + time was on 11-01, not 10-01 (thanks to Michael Deckers). + + The 1891 French transition was on March 16, not March 15. The + 1911-03-11 French transition was at midnight, not a minute later. + Monaco's transitions were on 1892-06-01 and 1911-03-29, not + 1891-03-15 and 1911-03-11. (Thanks to Michael Deckers.) + + Changes to code + + Support for zic's long-obsolete '-y YEARISTYPE' option has been + removed and, with it, so has support for the TYPE field in Rule + lines, which is now reserved for compatibility with earlier zic. + These features were previously deprecated in release 2015f. + (Thanks to Tim Parenti.) + + zic now defaults to '-b slim' instead of to '-b fat'. + + zic's new '-l -' and '-p -' options uninstall any existing + localtime and posixrules files, respectively. + + The undocumented and ineffective tzsetwall function has been + removed. + + Changes to build procedure + + The Makefile now defaults POSIXRULES to '-', so the posixrules + feature (obsolete as of 2019b) is no longer installed by default. + + Changes to documentation and commentary + + The long-obsolete files pacificnew, systemv, and yearistype.sh have + been removed from the distribution. (Thanks to Tim Parenti.) + + Release 2020a - 2020-04-23 16:03:47 -0700 Briefly: Modified: head/contrib/tzdata/README ============================================================================== --- head/contrib/tzdata/README Thu Oct 8 00:29:52 2020 (r366528) +++ head/contrib/tzdata/README Thu Oct 8 00:35:36 2020 (r366529) @@ -20,6 +20,8 @@ substituting your desired installation directory for " make TOPDIR=$HOME/tzdir install $HOME/tzdir/usr/bin/zdump -v America/Los_Angeles +See the file tz-how-to.html for examples of how to read the data files. + This database of historical local time information has several goals: * Provide a compendium of data about the history of civil time that Modified: head/contrib/tzdata/africa ============================================================================== --- head/contrib/tzdata/africa Thu Oct 8 00:29:52 2020 (r366528) +++ head/contrib/tzdata/africa Thu Oct 8 00:35:36 2020 (r366529) @@ -64,7 +64,7 @@ # Corrections are welcome. # Algeria -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Algeria 1916 only - Jun 14 23:00s 1:00 S Rule Algeria 1916 1919 - Oct Sun>=1 23:00s 0 - Rule Algeria 1917 only - Mar 24 23:00s 1:00 S @@ -87,10 +87,9 @@ Rule Algeria 1978 only - Mar 24 1:00 1:00 S Rule Algeria 1978 only - Sep 22 3:00 0 - Rule Algeria 1980 only - Apr 25 0:00 1:00 S Rule Algeria 1980 only - Oct 31 2:00 0 - -# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's -# more precise 0:09:21. +# See Europe/Paris for PMT-related transitions. # Zone NAME STDOFF RULES FORMAT [UNTIL] -Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 15 0:01 +Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 16 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time 0:00 Algeria WE%sT 1940 Feb 25 2:00 1:00 Algeria CE%sT 1946 Oct 7 @@ -176,7 +175,7 @@ Link Africa/Abidjan Atlantic/St_Helena # St Helena # Egypt was mean noon at the Great Pyramid, 2:04:30.5, but apparently this # did not apply to Cairo, Alexandria, or Port Said. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Egypt 1940 only - Jul 15 0:00 1:00 S Rule Egypt 1940 only - Oct 1 0:00 0 - Rule Egypt 1941 only - Apr 15 0:00 1:00 S @@ -411,7 +410,7 @@ Zone Africa/Cairo 2:05:09 - LMT 1900 Oct # now Ghana observed different DST regimes in different years. For # lack of better info, use Shanks except treat the minus sign as a # typo, and assume DST started in 1920 not 1936. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Ghana 1920 1942 - Sep 1 0:00 0:20 - Rule Ghana 1920 1942 - Dec 31 0:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] @@ -501,7 +500,7 @@ Zone Africa/Monrovia -0:43:08 - LMT 1882 # From Paul Eggert (2013-10-25): # For now, assume they're reverting to the pre-2012 rules of permanent UT +02. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Libya 1951 only - Oct 14 2:00 1:00 S Rule Libya 1952 only - Jan 1 0:00 0 - Rule Libya 1953 only - Oct 9 2:00 1:00 S @@ -624,7 +623,7 @@ Zone Africa/Tripoli 0:52:44 - LMT 1920 # "The trial ended on March 29, 2009, when the clocks moved back by one hour # at 2am (or 02:00) local time..." -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Mauritius 1982 only - Oct 10 0:00 1:00 - Rule Mauritius 1983 only - Mar 21 0:00 0 - Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 - @@ -875,17 +874,30 @@ Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis # https://maroc-diplomatique.net/maroc-le-retour-a-lheure-gmt-est-prevu-dimanche-prochain/ # http://aujourdhui.ma/actualite/gmt1-retour-a-lheure-normale-dimanche-prochain-1 # -# From Paul Eggert (2020-04-14): +# From Milamber (2020-05-31) +# In Morocco (where I live), the end of Ramadan (Arabic month) is followed by +# the Eid al-Fitr, and concretely it's 1 or 2 day offs for the people (with +# traditional visiting of family, big lunches/dinners, etc.). So for this +# year the astronomical calculations don't include the following 2 days off in +# the calc. These 2 days fall in a Sunday/Monday, so it's not acceptable by +# people to have a time shift during these 2 days off. Perhaps you can modify +# the (predicted) rules for next years: if the end of Ramadan is a (probable) +# Friday or Saturday (and so the 2 days off are on a weekend), the next time +# shift will be the next weekend. +# +# From Paul Eggert (2020-05-31): # For now, guess that in the future Morocco will fall back at 03:00 # the last Sunday before Ramadan, and spring forward at 02:00 the -# first Sunday after the day after Ramadan. To implement this, -# transition dates for 2021 through 2087 were determined by running -# the following program under GNU Emacs 26.3. -# (let ((islamic-year 1442)) +# first Sunday after two days after Ramadan. To implement this, +# transition dates and times for 2019 through 2087 were determined by +# running the following program under GNU Emacs 26.3. (This algorithm +# also produces the correct transition dates for 2016 through 2018, +# though the times differ due to Morocco's time zone change in 2018.) +# (let ((islamic-year 1440)) # (require 'cal-islam) # (while (< islamic-year 1511) # (let ((a (calendar-islamic-to-absolute (list 9 1 islamic-year))) -# (b (1+ (calendar-islamic-to-absolute (list 10 1 islamic-year)))) +# (b (+ 2 (calendar-islamic-to-absolute (list 10 1 islamic-year)))) # (sunday 0)) # (while (/= sunday (mod (setq a (1- a)) 7))) # (while (/= sunday (mod b 7)) @@ -900,7 +912,7 @@ Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis # (car (cdr (cdr b))) (calendar-month-name (car b) t) (car (cdr b))))) # (setq islamic-year (+ 1 islamic-year)))) -# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Morocco 1939 only - Sep 12 0:00 1:00 - Rule Morocco 1939 only - Nov 19 0:00 0 - Rule Morocco 1940 only - Feb 25 0:00 1:00 - @@ -951,7 +963,7 @@ Rule Morocco 2021 only - May 16 2:00 0 - Rule Morocco 2022 only - Mar 27 3:00 -1:00 - Rule Morocco 2022 only - May 8 2:00 0 - Rule Morocco 2023 only - Mar 19 3:00 -1:00 - -Rule Morocco 2023 only - Apr 23 2:00 0 - +Rule Morocco 2023 only - Apr 30 2:00 0 - Rule Morocco 2024 only - Mar 10 3:00 -1:00 - Rule Morocco 2024 only - Apr 14 2:00 0 - Rule Morocco 2025 only - Feb 23 3:00 -1:00 - @@ -967,7 +979,7 @@ Rule Morocco 2029 only - Feb 18 2:00 0 - Rule Morocco 2029 only - Dec 30 3:00 -1:00 - Rule Morocco 2030 only - Feb 10 2:00 0 - Rule Morocco 2030 only - Dec 22 3:00 -1:00 - -Rule Morocco 2031 only - Jan 26 2:00 0 - +Rule Morocco 2031 only - Feb 2 2:00 0 - Rule Morocco 2031 only - Dec 14 3:00 -1:00 - Rule Morocco 2032 only - Jan 18 2:00 0 - Rule Morocco 2032 only - Nov 28 3:00 -1:00 - @@ -983,7 +995,7 @@ Rule Morocco 2036 only - Nov 23 2:00 0 - Rule Morocco 2037 only - Oct 4 3:00 -1:00 - Rule Morocco 2037 only - Nov 15 2:00 0 - Rule Morocco 2038 only - Sep 26 3:00 -1:00 - -Rule Morocco 2038 only - Oct 31 2:00 0 - +Rule Morocco 2038 only - Nov 7 2:00 0 - Rule Morocco 2039 only - Sep 18 3:00 -1:00 - Rule Morocco 2039 only - Oct 23 2:00 0 - Rule Morocco 2040 only - Sep 2 3:00 -1:00 - @@ -999,7 +1011,7 @@ Rule Morocco 2044 only - Aug 28 2:00 0 - Rule Morocco 2045 only - Jul 9 3:00 -1:00 - Rule Morocco 2045 only - Aug 20 2:00 0 - Rule Morocco 2046 only - Jul 1 3:00 -1:00 - -Rule Morocco 2046 only - Aug 5 2:00 0 - +Rule Morocco 2046 only - Aug 12 2:00 0 - Rule Morocco 2047 only - Jun 23 3:00 -1:00 - Rule Morocco 2047 only - Jul 28 2:00 0 - Rule Morocco 2048 only - Jun 7 3:00 -1:00 - @@ -1015,7 +1027,7 @@ Rule Morocco 2052 only - Jun 2 2:00 0 - Rule Morocco 2053 only - Apr 13 3:00 -1:00 - Rule Morocco 2053 only - May 25 2:00 0 - Rule Morocco 2054 only - Apr 5 3:00 -1:00 - -Rule Morocco 2054 only - May 10 2:00 0 - +Rule Morocco 2054 only - May 17 2:00 0 - Rule Morocco 2055 only - Mar 28 3:00 -1:00 - Rule Morocco 2055 only - May 2 2:00 0 - Rule Morocco 2056 only - Mar 12 3:00 -1:00 - @@ -1031,7 +1043,7 @@ Rule Morocco 2060 only - Mar 7 2:00 0 - Rule Morocco 2061 only - Jan 16 3:00 -1:00 - Rule Morocco 2061 only - Feb 27 2:00 0 - Rule Morocco 2062 only - Jan 8 3:00 -1:00 - -Rule Morocco 2062 only - Feb 12 2:00 0 - +Rule Morocco 2062 only - Feb 19 2:00 0 - Rule Morocco 2062 only - Dec 31 3:00 -1:00 - Rule Morocco 2063 only - Feb 4 2:00 0 - Rule Morocco 2063 only - Dec 16 3:00 -1:00 - @@ -1047,7 +1059,7 @@ Rule Morocco 2067 only - Dec 11 2:00 0 - Rule Morocco 2068 only - Oct 21 3:00 -1:00 - Rule Morocco 2068 only - Dec 2 2:00 0 - Rule Morocco 2069 only - Oct 13 3:00 -1:00 - -Rule Morocco 2069 only - Nov 17 2:00 0 - +Rule Morocco 2069 only - Nov 24 2:00 0 - Rule Morocco 2070 only - Oct 5 3:00 -1:00 - Rule Morocco 2070 only - Nov 9 2:00 0 - Rule Morocco 2071 only - Sep 20 3:00 -1:00 - @@ -1063,7 +1075,7 @@ Rule Morocco 2075 only - Sep 15 2:00 0 - Rule Morocco 2076 only - Jul 26 3:00 -1:00 - Rule Morocco 2076 only - Sep 6 2:00 0 - Rule Morocco 2077 only - Jul 18 3:00 -1:00 - -Rule Morocco 2077 only - Aug 22 2:00 0 - +Rule Morocco 2077 only - Aug 29 2:00 0 - Rule Morocco 2078 only - Jul 10 3:00 -1:00 - Rule Morocco 2078 only - Aug 14 2:00 0 - Rule Morocco 2079 only - Jun 25 3:00 -1:00 - @@ -1073,13 +1085,13 @@ Rule Morocco 2080 only - Jul 21 2:00 0 - Rule Morocco 2081 only - Jun 1 3:00 -1:00 - Rule Morocco 2081 only - Jul 13 2:00 0 - Rule Morocco 2082 only - May 24 3:00 -1:00 - -Rule Morocco 2082 only - Jun 28 2:00 0 - +Rule Morocco 2082 only - Jul 5 2:00 0 - Rule Morocco 2083 only - May 16 3:00 -1:00 - Rule Morocco 2083 only - Jun 20 2:00 0 - Rule Morocco 2084 only - Apr 30 3:00 -1:00 - Rule Morocco 2084 only - Jun 11 2:00 0 - Rule Morocco 2085 only - Apr 22 3:00 -1:00 - -Rule Morocco 2085 only - May 27 2:00 0 - +Rule Morocco 2085 only - Jun 3 2:00 0 - Rule Morocco 2086 only - Apr 14 3:00 -1:00 - Rule Morocco 2086 only - May 19 2:00 0 - Rule Morocco 2087 only - Mar 30 3:00 -1:00 - @@ -1180,7 +1192,7 @@ Link Africa/Maputo Africa/Lusaka # Zambia # Use plain "WAT" and "CAT" for the time zone abbreviations, to be compatible # with Namibia's neighbors. -# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S # Vanguard section, for zic and other parsers that support negative DST. Rule Namibia 1994 only - Mar 21 0:00 -1:00 WAT Rule Namibia 1994 2017 - Sep Sun>=1 2:00 0 CAT @@ -1303,7 +1315,7 @@ Zone Indian/Mahe 3:41:48 - LMT 1906 Jun # Victoria # See Africa/Nairobi. # South Africa -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule SA 1942 1943 - Sep Sun>=15 2:00 1:00 - Rule SA 1943 1944 - Mar Sun>=15 2:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] @@ -1336,7 +1348,7 @@ Link Africa/Johannesburg Africa/Mbabane # Eswatini # Abdalla of NTC, archived at: # https://mm.icann.org/pipermail/tz/2017-October/025333.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Sudan 1970 only - May 1 0:00 1:00 S Rule Sudan 1970 1985 - Oct 15 0:00 0 - Rule Sudan 1971 only - Apr 30 0:00 1:00 S @@ -1424,7 +1436,7 @@ Zone Africa/Juba 2:06:28 - LMT 1931 # http://www.almadenahnews.com/newss/news.php?c=118&id=38036 # http://www.worldtimezone.com/dst_news/dst_news_tunis02.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Tunisia 1939 only - Apr 15 23:00s 1:00 S Rule Tunisia 1939 only - Nov 18 23:00s 0 - Rule Tunisia 1940 only - Feb 25 23:00s 1:00 S @@ -1451,9 +1463,7 @@ Rule Tunisia 2005 only - Sep 30 1:00s 0 - Rule Tunisia 2006 2008 - Mar lastSun 2:00s 1:00 S Rule Tunisia 2006 2008 - Oct lastSun 2:00s 0 - -# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's -# more precise 0:09:21. -# Shanks & Pottenger say the 1911 switch was on Mar 9; go with Howse's Mar 11. +# See Europe/Paris for PMT-related transitions. # Zone NAME STDOFF RULES FORMAT [UNTIL] Zone Africa/Tunis 0:40:44 - LMT 1881 May 12 0:09:21 - PMT 1911 Mar 11 # Paris Mean Time Modified: head/contrib/tzdata/antarctica ============================================================================== --- head/contrib/tzdata/antarctica Thu Oct 8 00:29:52 2020 (r366528) +++ head/contrib/tzdata/antarctica Thu Oct 8 00:35:36 2020 (r366529) @@ -70,15 +70,30 @@ # Australian Antarctica Division informed us that Casey changed time # zone to UTC+11 in "the morning of 22nd October 2016". +# From Steffen Thorsen (2020-10-02, as corrected): +# Based on information we have received from the Australian Antarctic +# Division, Casey station and Macquarie Island station will move to Tasmanian +# daylight savings time on Sunday 4 October. This will take effect from 0001 +# hrs on Sunday 4 October 2020 and will mean Casey and Macquarie Island will +# be on the same time zone as Hobart. Some past dates too for this 3 hour +# time change back and forth between UTC+8 and UTC+11 for Casey: +# - 2018 Oct 7 4:00 - 2019 Mar 17 3:00 - 2019 Oct 4 3:00 - 2020 Mar 8 3:00 +# and now - 2020 Oct 4 0:01 + # Zone NAME STDOFF RULES FORMAT [UNTIL] -Zone Antarctica/Casey 0 - -00 1969 - 8:00 - +08 2009 Oct 18 2:00 +Zone Antarctica/Casey 0 - -00 1969 + 8:00 - +08 2009 Oct 18 2:00 11:00 - +11 2010 Mar 5 2:00 - 8:00 - +08 2011 Oct 28 2:00 + 8:00 - +08 2011 Oct 28 2:00 11:00 - +11 2012 Feb 21 17:00u - 8:00 - +08 2016 Oct 22 + 8:00 - +08 2016 Oct 22 11:00 - +11 2018 Mar 11 4:00 - 8:00 - +08 + 8:00 - +08 2018 Oct 7 4:00 + 11:00 - +11 2019 Mar 17 3:00 + 8:00 - +08 2019 Oct 4 3:00 + 11:00 - +11 2020 Mar 8 3:00 + 8:00 - +08 2020 Oct 4 0:01 + 11:00 - +11 Zone Antarctica/Davis 0 - -00 1957 Jan 13 7:00 - +07 1964 Nov 0 - -00 1969 Feb @@ -224,7 +239,7 @@ Zone Antarctica/Syowa 0 - -00 1957 Jan 29 # suggested by Bengt-Inge Larsson comment them out for now, and approximate # with only UTC and CEST. Uncomment them when 2014b is more prevalent. # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S #Rule Troll 2005 max - Mar 1 1:00u 1:00 +01 Rule Troll 2005 max - Mar lastSun 1:00u 2:00 +02 #Rule Troll 2005 max - Oct lastSun 1:00u 1:00 +01 Modified: head/contrib/tzdata/asia ============================================================================== --- head/contrib/tzdata/asia Thu Oct 8 00:29:52 2020 (r366528) +++ head/contrib/tzdata/asia Thu Oct 8 00:35:36 2020 (r366529) @@ -70,7 +70,7 @@ ############################################################################### # These rules are stolen from the 'europe' file. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S Rule EUAsia 1979 1995 - Sep lastSun 1:00u 0 - Rule EUAsia 1996 max - Oct lastSun 1:00u 0 - @@ -114,7 +114,7 @@ Zone Asia/Kabul 4:36:48 - LMT 1890 # or # (brief) # http://www.worldtimezone.com/dst_news/dst_news_armenia03.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 - Rule Armenia 2011 only - Oct lastSun 2:00s 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] @@ -140,7 +140,7 @@ Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2 # http://vestnikkavkaza.net/news/Azerbaijani-Cabinet-of-Ministers-cancels-daylight-saving-time.html # http://en.apa.az/xeber_azerbaijan_abolishes_daylight_savings_ti_240862.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 - Rule Azer 1997 2015 - Oct lastSun 5:00 0 - # Zone NAME STDOFF RULES FORMAT [UNTIL] @@ -227,7 +227,7 @@ Zone Asia/Baku 3:19:24 - LMT 1924 May 2 # http://www.thedailystar.net/newDesign/latest_news.php?nid=22817 # http://www.worldtimezone.com/dst_news/dst_news_bangladesh06.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Dhaka 2009 only - Jun 19 23:00 1:00 - Rule Dhaka 2009 only - Dec 31 24:00 0 - @@ -303,7 +303,7 @@ Zone Asia/Yangon 6:24:47 - LMT 1880 # or Rangoo # generally esteemed a success, it was announced early in 1920 that it would # not be repeated." # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Shang 1919 only - Apr 12 24:00 1:00 D Rule Shang 1919 only - Sep 30 24:00 0 S @@ -399,7 +399,7 @@ Rule Shang 1919 only - Sep 30 24:00 0 S # the Yangtze river delta area during that period of time although the scope # of such use will need to be investigated to determine. # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Shang 1940 only - Jun 1 0:00 1:00 D Rule Shang 1940 only - Oct 12 24:00 0 S Rule Shang 1941 only - Mar 15 0:00 1:00 D @@ -462,7 +462,7 @@ Rule Shang 1948 1949 - Sep 30 24:00 0 S #plan # to begin on 17 April. # http://data.people.com.cn/pic/101p/1988/04/1988041201.jpg -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule PRC 1986 only - May 4 2:00 1:00 D Rule PRC 1986 1991 - Sep Sun>=11 2:00 0 S Rule PRC 1987 1991 - Apr Sun>=11 2:00 1:00 D @@ -846,7 +846,7 @@ Zone Asia/Urumqi 5:50:20 - LMT 1928 # or dates for the 1942 and 1945 transitions. # The Japanese occupation of Hong Kong began 1941-12-25. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule HK 1946 only - Apr 21 0:00 1:00 S Rule HK 1946 only - Dec 1 3:30s 0 - Rule HK 1947 only - Apr 13 3:30s 1:00 S @@ -973,7 +973,7 @@ Zone Asia/Hong_Kong 7:36:42 - LMT 1904 Oct 30 0:36:42 # until 1945-09-21 at 01:00, overriding Shanks & Pottenger. # Likewise, use Yu-Cheng Chuang's data for DST in Taiwan. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Taiwan 1946 only - May 15 0:00 1:00 D Rule Taiwan 1946 only - Oct 1 0:00 0 S Rule Taiwan 1947 only - Apr 15 0:00 1:00 D @@ -1099,7 +1099,7 @@ Zone Asia/Taipei 8:06:00 - LMT 1896 Jan 1 # The 1904 decree says that Macau changed from the meridian of # Fortaleza do Monte, presumably the basis for the 7:34:10 for LMT. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Macau 1942 1943 - Apr 30 23:00 1:00 - Rule Macau 1942 only - Nov 17 23:00 0 - Rule Macau 1943 only - Sep 30 23:00 0 S @@ -1157,7 +1157,7 @@ Zone Asia/Macau 7:34:10 - LMT 1904 Oct 30 # Cyprus to remain united in time. Cyprus Mail 2017-10-17. # https://cyprus-mail.com/2017/10/17/cyprus-remain-united-time/ -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Cyprus 1975 only - Apr 13 0:00 1:00 S Rule Cyprus 1975 only - Oct 12 0:00 0 - Rule Cyprus 1976 only - May 15 0:00 1:00 S @@ -1534,7 +1534,7 @@ Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov # be changed back to its previous state on the 24 hours of the # thirtieth day of Shahrivar. # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Iran 1978 1980 - Mar 20 24:00 1:00 - Rule Iran 1978 only - Oct 20 24:00 0 - Rule Iran 1979 only - Sep 18 24:00 0 - @@ -1676,7 +1676,7 @@ Zone Asia/Tehran 3:25:44 - LMT 1916 # We have published a short article in English about the change: # https://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Iraq 1982 only - May 1 0:00 1:00 - Rule Iraq 1982 1984 - Oct 1 0:00 0 - Rule Iraq 1983 only - Mar 31 0:00 1:00 - @@ -1699,6 +1699,10 @@ Zone Asia/Baghdad 2:57:40 - LMT 1890 # Israel +# For more info about the motivation for DST in Israel, see: +# Barak Y. Israel's Daylight Saving Time controversy. Israel Affairs. +# 2020-08-11. https://doi.org/10.1080/13537121.2020.1806564 + # From Ephraim Silverberg (2001-01-11): # # I coined "IST/IDT" circa 1988. Until then there were three @@ -1720,7 +1724,7 @@ Zone Asia/Baghdad 2:57:40 - LMT 1890 # family is from India). # From Shanks & Pottenger: -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 1940 only - Jun 1 0:00 1:00 D Rule Zion 1942 1944 - Nov 1 0:00 0 S Rule Zion 1943 only - Apr 1 2:00 1:00 D @@ -1812,7 +1816,7 @@ Rule Zion 1988 only - Sep 4 0:00 0 S # (except in 2002) is three nights before Yom Kippur [Day of Atonement] # (the eve of the 7th of Tishrei in the lunar Hebrew calendar). -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 1989 only - Apr 30 0:00 1:00 D Rule Zion 1989 only - Sep 3 0:00 0 S Rule Zion 1990 only - Mar 25 0:00 1:00 D @@ -1828,7 +1832,7 @@ Rule Zion 1993 only - Sep 5 0:00 0 S # Ministry of Interior, Jerusalem, Israel. The spokeswoman can be reached by # calling the office directly at 972-2-6701447 or 972-2-6701448. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 1994 only - Apr 1 0:00 1:00 D Rule Zion 1994 only - Aug 28 0:00 0 S Rule Zion 1995 only - Mar 31 0:00 1:00 D @@ -1848,7 +1852,7 @@ Rule Zion 1995 only - Sep 3 0:00 0 S # # where YYYY is the relevant year. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 1996 only - Mar 15 0:00 1:00 D Rule Zion 1996 only - Sep 16 0:00 0 S Rule Zion 1997 only - Mar 21 0:00 1:00 D @@ -1871,7 +1875,7 @@ Rule Zion 1999 only - Sep 3 2:00 0 S # # ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2000-2004.ps.gz -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 2000 only - Apr 14 2:00 1:00 D Rule Zion 2000 only - Oct 6 1:00 0 S Rule Zion 2001 only - Apr 9 1:00 1:00 D @@ -1893,7 +1897,7 @@ Rule Zion 2004 only - Sep 22 1:00 0 S # # ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2005+beyond.ps -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 2005 2012 - Apr Fri<=1 2:00 1:00 D Rule Zion 2005 only - Oct 9 2:00 0 S Rule Zion 2006 only - Oct 1 2:00 0 S @@ -1913,7 +1917,7 @@ Rule Zion 2012 only - Sep 23 2:00 0 S # As of 2013, DST starts at 02:00 on the Friday before the last Sunday # in March. DST ends at 02:00 on the last Sunday of October. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D Rule Zion 2013 max - Oct lastSun 2:00 0 S @@ -2013,7 +2017,7 @@ Zone Asia/Jerusalem 2:20:54 - LMT 1880 # do in any POSIX or C platform. The "25:00" assumes zic from 2007 or later, # which should be safe now. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Japan 1948 only - May Sat>=1 24:00 1:00 D Rule Japan 1948 1951 - Sep Sat>=8 25:00 0 S Rule Japan 1949 only - Apr Sat>=1 24:00 1:00 D @@ -2090,7 +2094,7 @@ Zone Asia/Tokyo 9:18:59 - LMT 1887 Dec 31 15:00u # From Paul Eggert (2013-12-11): # As Steffen suggested, consider the past 21-month experiment to be DST. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Jordan 1973 only - Jun 6 0:00 1:00 S Rule Jordan 1973 1975 - Oct 1 0:00 0 - Rule Jordan 1974 1977 - May 1 0:00 1:00 S @@ -2416,7 +2420,7 @@ Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk # Our government cancels daylight saving time 6th of August 2005. # From 2005-08-12 our GMT-offset is +6, w/o any daylight saving. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Kyrgyz 1992 1996 - Apr Sun>=7 0:00s 1:00 - Rule Kyrgyz 1992 1996 - Sep lastSun 0:00 0 - Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 - @@ -2472,7 +2476,7 @@ Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2 # follow and continued to use GMT+9:00 for interoperability. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule ROK 1948 only - Jun 1 0:00 1:00 D Rule ROK 1948 only - Sep 12 24:00 0 S Rule ROK 1949 only - Apr 3 0:00 1:00 D @@ -2560,7 +2564,7 @@ Zone Asia/Pyongyang 8:23:00 - LMT 1908 Apr 1 # Lebanon -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Lebanon 1920 only - Mar 28 0:00 1:00 S Rule Lebanon 1920 only - Oct 25 0:00 0 - Rule Lebanon 1921 only - Apr 3 0:00 1:00 S @@ -2590,7 +2594,7 @@ Zone Asia/Beirut 2:22:00 - LMT 1880 2:00 Lebanon EE%sT # Malaysia -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule NBorneo 1935 1941 - Sep 14 0:00 0:20 - Rule NBorneo 1935 1941 - Dec 14 0:00 0 - # @@ -2735,7 +2739,7 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé # September daylight saving time ends. Source: # http://zasag.mn/news/view/8969 -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Mongol 1983 1984 - Apr 1 0:00 1:00 - Rule Mongol 1983 only - Oct 1 0:00 0 - # Shanks & Pottenger and IATA SSIM say 1990s switches occurred at 00:00, @@ -2923,7 +2927,7 @@ Zone Asia/Kathmandu 5:41:16 - LMT 1920 # "People laud PM's announcement to end DST" # http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=99374&Itemid=2 -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Pakistan 2002 only - Apr Sun>=2 0:00 1:00 S Rule Pakistan 2002 only - Oct Sun>=2 0:00 0 - Rule Pakistan 2008 only - Jun 1 0:00 1:00 S @@ -3225,7 +3229,7 @@ Zone Asia/Karachi 4:28:12 - LMT 1907 # From Tim Parenti (2016-10-19): # Predict fall transitions on October's last Saturday at 01:00 from now on. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule EgyptAsia 1957 only - May 10 0:00 1:00 S Rule EgyptAsia 1957 1958 - Oct 1 0:00 0 - Rule EgyptAsia 1958 only - May 1 0:00 1:00 S @@ -3325,7 +3329,7 @@ Zone Asia/Hebron 2:20:23 - LMT 1900 Oct # influence of the sources. There is no current abbreviation for DST, # so use "PDT", the usual American style. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Phil 1936 only - Nov 1 0:00 1:00 D Rule Phil 1937 only - Feb 1 0:00 0 S Rule Phil 1954 only - Apr 12 0:00 1:00 D @@ -3473,7 +3477,7 @@ Zone Asia/Colombo 5:19:24 - LMT 1880 5:30 - +0530 # Syria -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Syria 1920 1923 - Apr Sun>=15 2:00 1:00 S Rule Syria 1920 1923 - Oct Sun>=1 2:00 0 - Rule Syria 1962 only - Apr 29 2:00 1:00 S Modified: head/contrib/tzdata/australasia ============================================================================== --- head/contrib/tzdata/australasia Thu Oct 8 00:29:52 2020 (r366528) +++ head/contrib/tzdata/australasia Thu Oct 8 00:35:36 2020 (r366529) @@ -13,7 +13,7 @@ # Please see the notes below for the controversy about "EST" versus "AEST" etc. -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule Aus 1917 only - Jan 1 0:01 1:00 D Rule Aus 1917 only - Mar 25 2:00 0 S Rule Aus 1942 only - Jan 1 2:00 1:00 D @@ -32,7 +32,7 @@ Zone Australia/Darwin 8:43:20 - LMT 1895 Feb 9:30 Aus AC%sT # Western Australia # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AW 1974 only - Oct lastSun 2:00s 1:00 D Rule AW 1975 only - Mar Sun>=1 2:00s 0 S Rule AW 1983 only - Oct lastSun 2:00s 1:00 D @@ -70,7 +70,7 @@ Zone Australia/Eucla 8:35:28 - LMT 1895 Dec # applies to all of the Whitsundays. # http://www.australia.gov.au/about-australia/australian-story/austn-islands # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AQ 1971 only - Oct lastSun 2:00s 1:00 D Rule AQ 1972 only - Feb lastSun 2:00s 0 S Rule AQ 1989 1991 - Oct lastSun 2:00s 1:00 D @@ -86,7 +86,7 @@ Zone Australia/Lindeman 9:55:56 - LMT 1895 10:00 Holiday AE%sT # South Australia -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AS 1971 1985 - Oct lastSun 2:00s 1:00 D Rule AS 1986 only - Oct 19 2:00s 1:00 D Rule AS 1987 2007 - Oct lastSun 2:00s 1:00 D @@ -114,7 +114,7 @@ Zone Australia/Adelaide 9:14:20 - LMT 1895 Feb # http://www.bom.gov.au/climate/averages/tables/dst_times.shtml # says King Island didn't observe DST from WWII until late 1971. # -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AT 1967 only - Oct Sun>=1 2:00s 1:00 D Rule AT 1968 only - Mar lastSun 2:00s 0 S Rule AT 1968 1985 - Oct lastSun 2:00s 1:00 D @@ -147,7 +147,7 @@ Zone Australia/Currie 9:35:28 - LMT 1895 Sep 10:00 AT AE%sT # Victoria -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AV 1971 1985 - Oct lastSun 2:00s 1:00 D Rule AV 1972 only - Feb lastSun 2:00s 0 S Rule AV 1973 1985 - Mar Sun>=1 2:00s 0 S @@ -168,7 +168,7 @@ Zone Australia/Melbourne 9:39:52 - LMT 1895 Feb 10:00 AV AE%sT # New South Wales -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule AN 1971 1985 - Oct lastSun 2:00s 1:00 D Rule AN 1972 only - Feb 27 2:00s 0 S Rule AN 1973 1981 - Mar Sun>=1 2:00s 0 S @@ -197,7 +197,7 @@ Zone Australia/Broken_Hill 9:25:48 - LMT 1895 Feb 9:30 AS AC%sT # Lord Howe Island -# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +# Rule NAME FROM TO - IN ON AT SAVE LETTER/S Rule LH 1981 1984 - Oct lastSun 2:00 1:00 - Rule LH 1982 1985 - Mar Sun>=1 2:00 0 - Rule LH 1985 only - Oct lastSun 2:00 0:30 - @@ -252,8 +252,9 @@ Zone Antarctica/Macquarie 0 - -00 1899 Nov *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-all@freebsd.org Thu Oct 8 02:56:11 2020 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 C8C95441F87; Thu, 8 Oct 2020 02:56:11 +0000 (UTC) (envelope-from gjb@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6G6z4ySWz4Rj6; Thu, 8 Oct 2020 02:56:11 +0000 (UTC) (envelope-from gjb@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 8E23821DCB; Thu, 8 Oct 2020 02:56:11 +0000 (UTC) (envelope-from gjb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0982uBhQ093260; Thu, 8 Oct 2020 02:56:11 GMT (envelope-from gjb@FreeBSD.org) Received: (from gjb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0982uBXq093259; Thu, 8 Oct 2020 02:56:11 GMT (envelope-from gjb@FreeBSD.org) Message-Id: <202010080256.0982uBXq093259@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gjb set sender to gjb@FreeBSD.org using -f From: Glen Barber Date: Thu, 8 Oct 2020 02:56:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-releng@freebsd.org Subject: svn commit: r366530 - releng/12.2/release/pkg_repos X-SVN-Group: releng X-SVN-Commit-Author: gjb X-SVN-Commit-Paths: releng/12.2/release/pkg_repos X-SVN-Commit-Revision: 366530 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.33 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: Thu, 08 Oct 2020 02:56:11 -0000 Author: gjb Date: Thu Oct 8 02:56:11 2020 New Revision: 366530 URL: https://svnweb.freebsd.org/changeset/base/366530 Log: Update the 12.2 pkg_repos/release-dvd.conf file to use the release_2 set for dvd1.iso builds for reproducibility. Approved by: re (implicit) Sponsored by: Rubicon Communications, LLC (netgate.com) Modified: releng/12.2/release/pkg_repos/release-dvd.conf Modified: releng/12.2/release/pkg_repos/release-dvd.conf ============================================================================== --- releng/12.2/release/pkg_repos/release-dvd.conf Thu Oct 8 00:35:36 2020 (r366529) +++ releng/12.2/release/pkg_repos/release-dvd.conf Thu Oct 8 02:56:11 2020 (r366530) @@ -1,6 +1,6 @@ # $FreeBSD$ release: { - url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly", + url: "pkg+http://pkg.FreeBSD.org/${ABI}/release_2", mirror_type: "srv", signature_type: "fingerprints", fingerprints: "/usr/share/keys/pkg", From owner-svn-src-all@freebsd.org Thu Oct 8 04:00:31 2020 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 AD574444D88; Thu, 8 Oct 2020 04:00:31 +0000 (UTC) (envelope-from cy@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6HYC4C0Kz4Wpw; Thu, 8 Oct 2020 04:00:31 +0000 (UTC) (envelope-from cy@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 737E422C1B; Thu, 8 Oct 2020 04:00:31 +0000 (UTC) (envelope-from cy@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09840VGh032127; Thu, 8 Oct 2020 04:00:31 GMT (envelope-from cy@FreeBSD.org) Received: (from cy@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09840VFf032126; Thu, 8 Oct 2020 04:00:31 GMT (envelope-from cy@FreeBSD.org) Message-Id: <202010080400.09840VFf032126@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cy set sender to cy@FreeBSD.org using -f From: Cy Schubert Date: Thu, 8 Oct 2020 04:00:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r366531 - in stable: 11/sys/contrib/ipfilter/netinet 12/sys/contrib/ipfilter/netinet X-SVN-Group: stable-11 X-SVN-Commit-Author: cy X-SVN-Commit-Paths: in stable: 11/sys/contrib/ipfilter/netinet 12/sys/contrib/ipfilter/netinet X-SVN-Commit-Revision: 366531 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.33 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: Thu, 08 Oct 2020 04:00:31 -0000 Author: cy Date: Thu Oct 8 04:00:31 2020 New Revision: 366531 URL: https://svnweb.freebsd.org/changeset/base/366531 Log: MFC r366287: Continued ipfilter #ifdef cleanup. The r343701 log entry contains a complete description. Modified: stable/11/sys/contrib/ipfilter/netinet/ip_nat.c Directory Properties: stable/11/ (props changed) Changes in other areas also in this revision: Modified: stable/12/sys/contrib/ipfilter/netinet/ip_nat.c Directory Properties: stable/12/ (props changed) Modified: stable/11/sys/contrib/ipfilter/netinet/ip_nat.c ============================================================================== --- stable/11/sys/contrib/ipfilter/netinet/ip_nat.c Thu Oct 8 02:56:11 2020 (r366530) +++ stable/11/sys/contrib/ipfilter/netinet/ip_nat.c Thu Oct 8 04:00:31 2020 (r366531) @@ -5116,8 +5116,8 @@ ipf_nat_out(fin, nat, natadd, nflags) ipf_fix_outcksum(0, &fin->fin_ip->ip_sum, msumd, 0); } -#if !defined(_KERNEL) || defined(MENTAT) || defined(__sgi) || \ - defined(linux) || defined(BRIDGE_IPF) || defined(__FreeBSD__) +#if !defined(_KERNEL) || defined(MENTAT) || \ + defined(BRIDGE_IPF) || defined(__FreeBSD__) else { /* * Strictly speaking, this isn't necessary on BSD @@ -5631,8 +5631,7 @@ ipf_nat_in(fin, nat, natadd, nflags) } fin->fin_ip->ip_dst = nat->nat_ndstip; fin->fin_daddr = nat->nat_ndstaddr; -#if !defined(_KERNEL) || defined(MENTAT) || defined(__sgi) || \ - defined(__osf__) || defined(linux) +#if !defined(_KERNEL) || defined(MENTAT) ipf_fix_outcksum(0, &fin->fin_ip->ip_sum, ipsumd, 0); #endif break; From owner-svn-src-all@freebsd.org Thu Oct 8 04:00:32 2020 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 0A09B444C49; Thu, 8 Oct 2020 04:00:32 +0000 (UTC) (envelope-from cy@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6HYC6Xg1z4Wl7; Thu, 8 Oct 2020 04:00:31 +0000 (UTC) (envelope-from cy@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 C3AA122AC1; Thu, 8 Oct 2020 04:00:31 +0000 (UTC) (envelope-from cy@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09840VF6032133; Thu, 8 Oct 2020 04:00:31 GMT (envelope-from cy@FreeBSD.org) Received: (from cy@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09840VRT032132; Thu, 8 Oct 2020 04:00:31 GMT (envelope-from cy@FreeBSD.org) Message-Id: <202010080400.09840VRT032132@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cy set sender to cy@FreeBSD.org using -f From: Cy Schubert Date: Thu, 8 Oct 2020 04:00:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366531 - in stable: 11/sys/contrib/ipfilter/netinet 12/sys/contrib/ipfilter/netinet X-SVN-Group: stable-12 X-SVN-Commit-Author: cy X-SVN-Commit-Paths: in stable: 11/sys/contrib/ipfilter/netinet 12/sys/contrib/ipfilter/netinet X-SVN-Commit-Revision: 366531 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.33 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: Thu, 08 Oct 2020 04:00:32 -0000 Author: cy Date: Thu Oct 8 04:00:31 2020 New Revision: 366531 URL: https://svnweb.freebsd.org/changeset/base/366531 Log: MFC r366287: Continued ipfilter #ifdef cleanup. The r343701 log entry contains a complete description. Modified: stable/12/sys/contrib/ipfilter/netinet/ip_nat.c Directory Properties: stable/12/ (props changed) Changes in other areas also in this revision: Modified: stable/11/sys/contrib/ipfilter/netinet/ip_nat.c Directory Properties: stable/11/ (props changed) Modified: stable/12/sys/contrib/ipfilter/netinet/ip_nat.c ============================================================================== --- stable/12/sys/contrib/ipfilter/netinet/ip_nat.c Thu Oct 8 02:56:11 2020 (r366530) +++ stable/12/sys/contrib/ipfilter/netinet/ip_nat.c Thu Oct 8 04:00:31 2020 (r366531) @@ -5116,8 +5116,8 @@ ipf_nat_out(fin, nat, natadd, nflags) ipf_fix_outcksum(0, &fin->fin_ip->ip_sum, msumd, 0); } -#if !defined(_KERNEL) || defined(MENTAT) || defined(__sgi) || \ - defined(linux) || defined(BRIDGE_IPF) || defined(__FreeBSD__) +#if !defined(_KERNEL) || defined(MENTAT) || \ + defined(BRIDGE_IPF) || defined(__FreeBSD__) else { /* * Strictly speaking, this isn't necessary on BSD @@ -5631,8 +5631,7 @@ ipf_nat_in(fin, nat, natadd, nflags) } fin->fin_ip->ip_dst = nat->nat_ndstip; fin->fin_daddr = nat->nat_ndstaddr; -#if !defined(_KERNEL) || defined(MENTAT) || defined(__sgi) || \ - defined(__osf__) || defined(linux) +#if !defined(_KERNEL) || defined(MENTAT) ipf_fix_outcksum(0, &fin->fin_ip->ip_sum, ipsumd, 0); #endif break; From owner-svn-src-all@freebsd.org Thu Oct 8 10:00:14 2020 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 35DB73FBE85; Thu, 8 Oct 2020 10:00:14 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6RXG0hT0z3Zql; Thu, 8 Oct 2020 10:00:14 +0000 (UTC) (envelope-from np@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 EEF4C26AF8; Thu, 8 Oct 2020 10:00:13 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098A0DT0051830; Thu, 8 Oct 2020 10:00:13 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098A0Dfv051828; Thu, 8 Oct 2020 10:00:13 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010081000.098A0Dfv051828@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Thu, 8 Oct 2020 10:00:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366532 - in head: share/man/man4 sys/dev/cxgbe X-SVN-Group: head X-SVN-Commit-Author: np X-SVN-Commit-Paths: in head: share/man/man4 sys/dev/cxgbe X-SVN-Commit-Revision: 366532 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.33 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: Thu, 08 Oct 2020 10:00:14 -0000 Author: np Date: Thu Oct 8 10:00:13 2020 New Revision: 366532 URL: https://svnweb.freebsd.org/changeset/base/366532 Log: cxgbe(4): knobs to drop various kinds of undesirable frames on ingress. These kind of drops come for free in the sense that they do not use the filter TCAM or any other resource that wouldn't normally be used during rx. Frames dropped by the hardware get counted in the MAC's rx stats but are not delivered to the driver. hw.cxgbe.attack_filter Set to 1 to enable the "attack filter". Default is 0. The attack filter will drop an incoming frame if any of these conditions is true: src ip/ip6 == dst ip/ip6; tcp and src/dst ip is not unicast; src/dst ip is loopback (127.x.y.z); src ip6 is not unicast; src/dst ip6 is loopback (::1/128) or unspecified (::/128); tcp and src/dst ip6 is mcast (ff00::/8). hw.cxgbe.drop_ip_fragments Set to 1 to drop all incoming IP fragments. Default is 0. Note that this drops valid frames. hw.cxgbe.drop_pkts_with_l2_errors Set to 1 to drop incoming frames with Layer 2 length or checksum errors. Default is 1. hw.cxgbe.drop_pkts_with_l3_errors Set to 1 to drop incoming frames with IP version, length, or checksum errors. Default is 0. hw.cxgbe.drop_pkts_with_l4_errors Set to 1 to drop incoming frames with Layer 4 length, checksum, or other errors. Default is 0. MFC after: 2 weeks Sponsored by: Chelsio Communications Modified: head/share/man/man4/cxgbe.4 head/sys/dev/cxgbe/t4_main.c Modified: head/share/man/man4/cxgbe.4 ============================================================================== --- head/share/man/man4/cxgbe.4 Thu Oct 8 04:00:31 2020 (r366531) +++ head/share/man/man4/cxgbe.4 Thu Oct 8 10:00:13 2020 (r366532) @@ -31,7 +31,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 17, 2020 +.Dd October 8, 2020 .Dt CXGBE 4 .Os .Sh NAME @@ -362,6 +362,26 @@ The default value is 0 and should be changed only if P to communicate with each other. Different interfaces can be assigned different values using the dev..X.tx_vm_wr sysctl when the interface is administratively down. +.It Va hw.cxgbe.attack_filter +Set to 1 to enable the "attack filter". +Default is 0. +The attack filter will drop an incoming frame if any of these conditions is +true: src ip/ip6 == dst ip/ip6; tcp and src/dst ip is not unicast; src/dst ip is +loopback (127.x.y.z); src ip6 is not unicast; src/dst ip6 is loopback (::1/128) +or unspecified (::/128); tcp and src/dst ip6 is mcast (ff00::/8). +.It Va hw.cxgbe.drop_ip_fragments +Set to 1 to drop all incoming IP fragments. +Default is 0. +Note that this drops valid frames. +.It Va hw.cxgbe.drop_pkts_with_l2_errors +Set to 1 to drop incoming frames with Layer 2 length or checksum errors. +Default is 1. +.It Va hw.cxgbe.drop_pkts_with_l3_errors +Set to 1 to drop incoming frames with IP version, length, or checksum errors. +Default is 0. +.It Va hw.cxgbe.drop_pkts_with_l4_errors +Set to 1 to drop incoming frames with Layer 4 length, checksum, or other errors. +Default is 0. .El .Sh SUPPORT For general information and support, Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Thu Oct 8 04:00:31 2020 (r366531) +++ head/sys/dev/cxgbe/t4_main.c Thu Oct 8 10:00:13 2020 (r366532) @@ -595,6 +595,46 @@ static int t4_tx_vm_wr = 0; SYSCTL_INT(_hw_cxgbe, OID_AUTO, tx_vm_wr, CTLFLAG_RWTUN, &t4_tx_vm_wr, 0, "Use VM work requests to transmit packets."); +/* + * Set to non-zero to enable the attack filter. A packet that matches any of + * these conditions will get dropped on ingress: + * 1) IP && source address == destination address. + * 2) TCP/IP && source address is not a unicast address. + * 3) TCP/IP && destination address is not a unicast address. + * 4) IP && source address is loopback (127.x.y.z). + * 5) IP && destination address is loopback (127.x.y.z). + * 6) IPv6 && source address == destination address. + * 7) IPv6 && source address is not a unicast address. + * 8) IPv6 && source address is loopback (::1/128). + * 9) IPv6 && destination address is loopback (::1/128). + * 10) IPv6 && source address is unspecified (::/128). + * 11) IPv6 && destination address is unspecified (::/128). + * 12) TCP/IPv6 && source address is multicast (ff00::/8). + * 13) TCP/IPv6 && destination address is multicast (ff00::/8). + */ +static int t4_attack_filter = 0; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, attack_filter, CTLFLAG_RDTUN, + &t4_attack_filter, 0, "Drop suspicious traffic"); + +static int t4_drop_ip_fragments = 0; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, drop_ip_fragments, CTLFLAG_RDTUN, + &t4_drop_ip_fragments, 0, "Drop IP fragments"); + +static int t4_drop_pkts_with_l2_errors = 1; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, drop_pkts_with_l2_errors, CTLFLAG_RDTUN, + &t4_drop_pkts_with_l2_errors, 0, + "Drop all frames with Layer 2 length or checksum errors"); + +static int t4_drop_pkts_with_l3_errors = 0; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, drop_pkts_with_l3_errors, CTLFLAG_RDTUN, + &t4_drop_pkts_with_l3_errors, 0, + "Drop all frames with IP version, length, or checksum errors"); + +static int t4_drop_pkts_with_l4_errors = 0; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, drop_pkts_with_l4_errors, CTLFLAG_RDTUN, + &t4_drop_pkts_with_l4_errors, 0, + "Drop all frames with Layer 4 length, checksum, or other errors"); + #ifdef TCP_OFFLOAD /* * TOE tunables. @@ -4740,7 +4780,7 @@ t4_enable_kern_tls(struct adapter *sc) static int set_params__post_init(struct adapter *sc) { - uint32_t param, val; + uint32_t mask, param, val; #ifdef TCP_OFFLOAD int i, v, shift; #endif @@ -4760,6 +4800,33 @@ set_params__post_init(struct adapter *sc) val = 1 << (G_MASKSIZE(t4_read_reg(sc, A_TP_RSS_CONFIG_TNL)) - 1); t4_set_reg_field(sc, A_TP_RSS_CONFIG_TNL, V_MASKFILTER(M_MASKFILTER), V_MASKFILTER(val - 1)); + + mask = F_DROPERRORANY | F_DROPERRORMAC | F_DROPERRORIPVER | + F_DROPERRORFRAG | F_DROPERRORATTACK | F_DROPERRORETHHDRLEN | + F_DROPERRORIPHDRLEN | F_DROPERRORTCPHDRLEN | F_DROPERRORPKTLEN | + F_DROPERRORTCPOPT | F_DROPERRORCSUMIP | F_DROPERRORCSUM; + val = 0; + if (t4_attack_filter != 0) { + t4_set_reg_field(sc, A_TP_GLOBAL_CONFIG, F_ATTACKFILTERENABLE, + F_ATTACKFILTERENABLE); + val |= F_DROPERRORATTACK; + } + if (t4_drop_ip_fragments != 0) { + t4_set_reg_field(sc, A_TP_GLOBAL_CONFIG, F_FRAGMENTDROP, + F_FRAGMENTDROP); + val |= F_DROPERRORFRAG; + } + if (t4_drop_pkts_with_l2_errors != 0) + val |= F_DROPERRORMAC | F_DROPERRORETHHDRLEN; + if (t4_drop_pkts_with_l3_errors != 0) { + val |= F_DROPERRORIPVER | F_DROPERRORIPHDRLEN | + F_DROPERRORCSUMIP; + } + if (t4_drop_pkts_with_l4_errors != 0) { + val |= F_DROPERRORTCPHDRLEN | F_DROPERRORPKTLEN | + F_DROPERRORTCPOPT | F_DROPERRORCSUM; + } + t4_set_reg_field(sc, A_TP_ERR_CONFIG, mask, val); #ifdef TCP_OFFLOAD /* From owner-svn-src-all@freebsd.org Thu Oct 8 10:59:50 2020 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 21F863FD0C9; Thu, 8 Oct 2020 10:59:50 +0000 (UTC) (envelope-from hselasky@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6Ss16x4lz3d9d; Thu, 8 Oct 2020 10:59:49 +0000 (UTC) (envelope-from hselasky@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 CE0DE279A2; Thu, 8 Oct 2020 10:59:49 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098AxnAu088316; Thu, 8 Oct 2020 10:59:49 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098Axn9K088315; Thu, 8 Oct 2020 10:59:49 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <202010081059.098Axn9K088315@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Thu, 8 Oct 2020 10:59:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366533 - head/sys/dev/evdev X-SVN-Group: head X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: head/sys/dev/evdev X-SVN-Commit-Revision: 366533 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.33 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: Thu, 08 Oct 2020 10:59:50 -0000 Author: hselasky Date: Thu Oct 8 10:59:49 2020 New Revision: 366533 URL: https://svnweb.freebsd.org/changeset/base/366533 Log: Allow evdev's rcpt_mask and sysmouse_t_axis parameters to be specified in /boot/loader.conf . MFC after: 1 week Sponsored by: Mellanox Technologies // NVIDIA Networking Modified: head/sys/dev/evdev/evdev.c Modified: head/sys/dev/evdev/evdev.c ============================================================================== --- head/sys/dev/evdev/evdev.c Thu Oct 8 10:00:13 2020 (r366532) +++ head/sys/dev/evdev/evdev.c Thu Oct 8 10:59:49 2020 (r366533) @@ -77,10 +77,10 @@ int evdev_sysmouse_t_axis = 0; SYSCTL_NODE(_kern, OID_AUTO, evdev, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, "Evdev args"); #ifdef EVDEV_SUPPORT -SYSCTL_INT(_kern_evdev, OID_AUTO, rcpt_mask, CTLFLAG_RW, &evdev_rcpt_mask, 0, +SYSCTL_INT(_kern_evdev, OID_AUTO, rcpt_mask, CTLFLAG_RWTUN, &evdev_rcpt_mask, 0, "Who is receiving events: bit0 - sysmouse, bit1 - kbdmux, " "bit2 - mouse hardware, bit3 - keyboard hardware"); -SYSCTL_INT(_kern_evdev, OID_AUTO, sysmouse_t_axis, CTLFLAG_RW, +SYSCTL_INT(_kern_evdev, OID_AUTO, sysmouse_t_axis, CTLFLAG_RWTUN, &evdev_sysmouse_t_axis, 0, "Extract T-axis from 0-none, 1-ums, 2-psm"); #endif SYSCTL_NODE(_kern_evdev, OID_AUTO, input, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, From owner-svn-src-all@freebsd.org Thu Oct 8 11:04:33 2020 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 6DFEF3FCFD3; Thu, 8 Oct 2020 11:04:33 +0000 (UTC) (envelope-from trasz@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6SyT2L5zz3dc3; Thu, 8 Oct 2020 11:04:33 +0000 (UTC) (envelope-from trasz@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 2F3B8277E3; Thu, 8 Oct 2020 11:04:33 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098B4WEc094308; Thu, 8 Oct 2020 11:04:32 GMT (envelope-from trasz@FreeBSD.org) Received: (from trasz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098B4WkE094307; Thu, 8 Oct 2020 11:04:32 GMT (envelope-from trasz@FreeBSD.org) Message-Id: <202010081104.098B4WkE094307@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: trasz set sender to trasz@FreeBSD.org using -f From: Edward Tomasz Napierala Date: Thu, 8 Oct 2020 11:04:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366534 - head/sys/riscv/riscv X-SVN-Group: head X-SVN-Commit-Author: trasz X-SVN-Commit-Paths: head/sys/riscv/riscv X-SVN-Commit-Revision: 366534 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.33 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: Thu, 08 Oct 2020 11:04:33 -0000 Author: trasz Date: Thu Oct 8 11:04:32 2020 New Revision: 366534 URL: https://svnweb.freebsd.org/changeset/base/366534 Log: Remove yet another useless assignment, adding a KASSERT just in case. Reviewed by: kp Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D26698 Modified: head/sys/riscv/riscv/trap.c Modified: head/sys/riscv/riscv/trap.c ============================================================================== --- head/sys/riscv/riscv/trap.c Thu Oct 8 10:59:49 2020 (r366533) +++ head/sys/riscv/riscv/trap.c Thu Oct 8 11:04:32 2020 (r366534) @@ -158,15 +158,12 @@ dump_regs(struct trapframe *frame) } static void -ecall_handler(struct trapframe *frame) +ecall_handler(void) { struct thread *td; td = curthread; - KASSERT(td->td_frame == frame, - ("%s: td_frame %p != frame %p", __func__, td->td_frame, frame)); - syscallenter(td); syscallret(td); } @@ -324,9 +321,11 @@ do_trap_user(struct trapframe *frame) struct pcb *pcb; td = curthread; - td->td_frame = frame; pcb = td->td_pcb; + KASSERT(td->td_frame == frame, + ("%s: td_frame %p != frame %p", __func__, td->td_frame, frame)); + /* Ensure we came from usermode, interrupts disabled */ KASSERT((csr_read(sstatus) & (SSTATUS_SPP | SSTATUS_SIE)) == 0, ("Came from U mode with interrupts enabled")); @@ -357,7 +356,7 @@ do_trap_user(struct trapframe *frame) break; case EXCP_USER_ECALL: frame->tf_sepc += 4; /* Next instruction */ - ecall_handler(frame); + ecall_handler(); break; case EXCP_ILLEGAL_INSTRUCTION: #ifdef FPE From owner-svn-src-all@freebsd.org Thu Oct 8 11:25:19 2020 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 D66583FD9A9; Thu, 8 Oct 2020 11:25:19 +0000 (UTC) (envelope-from hselasky@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6TQR59j2z3fP4; Thu, 8 Oct 2020 11:25:19 +0000 (UTC) (envelope-from hselasky@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 90A448151; Thu, 8 Oct 2020 11:25:19 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098BPJh7006492; Thu, 8 Oct 2020 11:25:19 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098BPJjI006491; Thu, 8 Oct 2020 11:25:19 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <202010081125.098BPJjI006491@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Thu, 8 Oct 2020 11:25:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366535 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366535 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.33 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: Thu, 08 Oct 2020 11:25:19 -0000 Author: hselasky Date: Thu Oct 8 11:25:19 2020 New Revision: 366535 URL: https://svnweb.freebsd.org/changeset/base/366535 Log: The ethernet header structure is read-only. Add const keyword. (This is a diff reduction towards D26254) MFC after: 1 week Sponsored by: Mellanox Technologies // NVIDIA Networking Modified: head/sys/kern/uipc_mbufhash.c Modified: head/sys/kern/uipc_mbufhash.c ============================================================================== --- head/sys/kern/uipc_mbufhash.c Thu Oct 8 11:04:32 2020 (r366534) +++ head/sys/kern/uipc_mbufhash.c Thu Oct 8 11:25:19 2020 (r366535) @@ -78,7 +78,7 @@ m_ether_tcpip_hash(const uint32_t flags, const struct struct ether_vlan_header vlan; uint32_t port; } buf; - struct ether_header *eh; + const struct ether_header *eh; const struct ether_vlan_header *vlan; #ifdef INET const struct ip *ip; From owner-svn-src-all@freebsd.org Thu Oct 8 11:30:23 2020 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 1A8F53FD83F; Thu, 8 Oct 2020 11:30:23 +0000 (UTC) (envelope-from hselasky@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6TXG71qgz3fSk; Thu, 8 Oct 2020 11:30:22 +0000 (UTC) (envelope-from hselasky@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 D484D27971; Thu, 8 Oct 2020 11:30:22 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098BUMuj006775; Thu, 8 Oct 2020 11:30:22 GMT (envelope-from hselasky@FreeBSD.org) Received: (from hselasky@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098BUMe9006774; Thu, 8 Oct 2020 11:30:22 GMT (envelope-from hselasky@FreeBSD.org) Message-Id: <202010081130.098BUMe9006774@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hselasky set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky Date: Thu, 8 Oct 2020 11:30:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366536 - head/sys/dev/usb X-SVN-Group: head X-SVN-Commit-Author: hselasky X-SVN-Commit-Paths: head/sys/dev/usb X-SVN-Commit-Revision: 366536 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.33 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: Thu, 08 Oct 2020 11:30:23 -0000 Author: hselasky Date: Thu Oct 8 11:30:22 2020 New Revision: 366536 URL: https://svnweb.freebsd.org/changeset/base/366536 Log: Try a bit harder to get the USB device descriptor in case the initial read fails. MFC after: 1 week Sponsored by: Mellanox Technologies // NVIDIA Networking Modified: head/sys/dev/usb/usb_request.c Modified: head/sys/dev/usb/usb_request.c ============================================================================== --- head/sys/dev/usb/usb_request.c Thu Oct 8 11:25:19 2020 (r366535) +++ head/sys/dev/usb/usb_request.c Thu Oct 8 11:30:22 2020 (r366536) @@ -1973,9 +1973,23 @@ usbd_setup_device_desc(struct usb_device *udev, struct /* get partial device descriptor, some devices crash on this */ err = usbd_req_get_desc(udev, mtx, NULL, &udev->ddesc, USB_MAX_IPACKET, USB_MAX_IPACKET, 0, UDESC_DEVICE, 0, 0); - if (err != 0) - break; - + if (err != 0) { + DPRINTF("Trying fallback for getting the USB device descriptor\n"); + /* try 8 bytes bMaxPacketSize */ + udev->ddesc.bMaxPacketSize = 8; + /* get full device descriptor */ + err = usbd_req_get_device_desc(udev, mtx, &udev->ddesc); + if (err == 0) + break; + /* try 16 bytes bMaxPacketSize */ + udev->ddesc.bMaxPacketSize = 16; + /* get full device descriptor */ + err = usbd_req_get_device_desc(udev, mtx, &udev->ddesc); + if (err == 0) + break; + /* try 32/64 bytes bMaxPacketSize */ + udev->ddesc.bMaxPacketSize = 32; + } /* get the full device descriptor */ err = usbd_req_get_device_desc(udev, mtx, &udev->ddesc); break; From owner-svn-src-all@freebsd.org Thu Oct 8 11:45:11 2020 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 86C513FE087; Thu, 8 Oct 2020 11:45:11 +0000 (UTC) (envelope-from kaktus@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6TsM33Bjz3g4C; Thu, 8 Oct 2020 11:45:11 +0000 (UTC) (envelope-from kaktus@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 4BF998511; Thu, 8 Oct 2020 11:45:11 +0000 (UTC) (envelope-from kaktus@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098BjBaO018734; Thu, 8 Oct 2020 11:45:11 GMT (envelope-from kaktus@FreeBSD.org) Received: (from kaktus@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098BjBun018733; Thu, 8 Oct 2020 11:45:11 GMT (envelope-from kaktus@FreeBSD.org) Message-Id: <202010081145.098BjBun018733@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kaktus set sender to kaktus@FreeBSD.org using -f From: Pawel Biernacki Date: Thu, 8 Oct 2020 11:45:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366537 - head/libexec/rc/rc.d X-SVN-Group: head X-SVN-Commit-Author: kaktus X-SVN-Commit-Paths: head/libexec/rc/rc.d X-SVN-Commit-Revision: 366537 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.33 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: Thu, 08 Oct 2020 11:45:11 -0000 Author: kaktus Date: Thu Oct 8 11:45:10 2020 New Revision: 366537 URL: https://svnweb.freebsd.org/changeset/base/366537 Log: [pf] /etc/rc.d/pf should REQUIRE routing When a system with pf_enable="YES" in /etc/rc.conf uses hostnames in /etc/pf.conf, these hostnames cannot be resolved via external nameservers because the default route is not yet set. This results in an empty (all open) ruleset. Since r195026 already put netif back to REQUIRE, this change does not affect the issue that the firewall should rather have been setup before any network traffic can occur. PR: 211928 Submitted by: Robert Schulze Reported by: Robert Schulze Tested by: Mateusz Kwiatkowski No objections from: kp MFC after: 3 days Modified: head/libexec/rc/rc.d/pf Modified: head/libexec/rc/rc.d/pf ============================================================================== --- head/libexec/rc/rc.d/pf Thu Oct 8 11:30:22 2020 (r366536) +++ head/libexec/rc/rc.d/pf Thu Oct 8 11:45:10 2020 (r366537) @@ -4,8 +4,7 @@ # # PROVIDE: pf -# REQUIRE: FILESYSTEMS netif pflog pfsync -# BEFORE: routing +# REQUIRE: FILESYSTEMS netif pflog pfsync routing # KEYWORD: nojailvnet . /etc/rc.subr From owner-svn-src-all@freebsd.org Thu Oct 8 12:56:24 2020 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 31E3F42827F; Thu, 8 Oct 2020 12:56:24 +0000 (UTC) (envelope-from kevans@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6WRX0Ybdz41Qv; Thu, 8 Oct 2020 12:56:24 +0000 (UTC) (envelope-from kevans@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 EAADD9302; Thu, 8 Oct 2020 12:56:23 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098CuNHa062138; Thu, 8 Oct 2020 12:56:23 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098CuN9Y062137; Thu, 8 Oct 2020 12:56:23 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <202010081256.098CuN9Y062137@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Thu, 8 Oct 2020 12:56:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366538 - stable/12/usr.sbin/crunch/crunchgen X-SVN-Group: stable-12 X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: stable/12/usr.sbin/crunch/crunchgen X-SVN-Commit-Revision: 366538 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.33 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: Thu, 08 Oct 2020 12:56:24 -0000 Author: kevans Date: Thu Oct 8 12:56:23 2020 New Revision: 366538 URL: https://svnweb.freebsd.org/changeset/base/366538 Log: MFC r366466: crunchgen: fix MK_AUTO_OBJ logic after r364166 r364166 converted echo -n `/bin/pwd` to a raw pwd invocation, leaving a trailing newline at the end of path. This caused a later stat() of it to erroneously fail and the fallback to MK_AUTO_OBJ=no logic proceeded as unexpected. Harry Schmalzbauer bissected the resulting build failure he experienced (stable/12 host, -HEAD build) down to r365887. This change is mostly unrelated, except it switches the build to bootstrapped crunchgen - clue! I then bissected recent crunchgen changes going back a bit since we wouldn't observe the failure immediately with -CURRENT in most configurations, which landed me on r364166. After many intense head-scratching minutes and printf debugging, I realized that the newline was the difference. This is where our tale ends. Modified: stable/12/usr.sbin/crunch/crunchgen/crunchgen.c Directory Properties: stable/12/ (props changed) Modified: stable/12/usr.sbin/crunch/crunchgen/crunchgen.c ============================================================================== --- stable/12/usr.sbin/crunch/crunchgen/crunchgen.c Thu Oct 8 11:45:10 2020 (r366537) +++ stable/12/usr.sbin/crunch/crunchgen/crunchgen.c Thu Oct 8 12:56:23 2020 (r366538) @@ -666,6 +666,8 @@ fillin_program(prog_t *p) if (!*path) errx(1, "Can't perform pwd on: %s\n", p->srcdir); + /* Chop off trailing newline. */ + path[strlen(path) - 1] = '\0'; p->realsrcdir = strdup(path); } From owner-svn-src-all@freebsd.org Thu Oct 8 16:44:34 2020 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 B6D4B42BAF7; Thu, 8 Oct 2020 16:44:34 +0000 (UTC) (envelope-from jkim@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6cVp4j4Kz4DnQ; Thu, 8 Oct 2020 16:44:34 +0000 (UTC) (envelope-from jkim@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 6B398B96F; Thu, 8 Oct 2020 16:44:34 +0000 (UTC) (envelope-from jkim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098GiYgc003441; Thu, 8 Oct 2020 16:44:34 GMT (envelope-from jkim@FreeBSD.org) Received: (from jkim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098GiTks003413; Thu, 8 Oct 2020 16:44:29 GMT (envelope-from jkim@FreeBSD.org) Message-Id: <202010081644.098GiTks003413@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jkim set sender to jkim@FreeBSD.org using -f From: Jung-uk Kim Date: Thu, 8 Oct 2020 16:44:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r366539 - in vendor-sys/acpica/dist: . generate/release source/common source/compiler source/components/debugger source/components/disassembler source/components/events source/component... X-SVN-Group: vendor-sys X-SVN-Commit-Author: jkim X-SVN-Commit-Paths: in vendor-sys/acpica/dist: . generate/release source/common source/compiler source/components/debugger source/components/disassembler source/components/events source/components/executer source/compone... X-SVN-Commit-Revision: 366539 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.33 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: Thu, 08 Oct 2020 16:44:34 -0000 Author: jkim Date: Thu Oct 8 16:44:28 2020 New Revision: 366539 URL: https://svnweb.freebsd.org/changeset/base/366539 Log: Import ACPICA 20200925. Modified: vendor-sys/acpica/dist/changes.txt vendor-sys/acpica/dist/generate/release/build.sh vendor-sys/acpica/dist/generate/release/release.sh vendor-sys/acpica/dist/source/common/ahpredef.c vendor-sys/acpica/dist/source/common/ahuuids.c vendor-sys/acpica/dist/source/common/dmtbinfo1.c vendor-sys/acpica/dist/source/compiler/aslcompiler.l vendor-sys/acpica/dist/source/compiler/aslload.c vendor-sys/acpica/dist/source/compiler/aslmessages.c vendor-sys/acpica/dist/source/compiler/aslmessages.h vendor-sys/acpica/dist/source/compiler/aslparseop.c vendor-sys/acpica/dist/source/compiler/aslprepkg.c vendor-sys/acpica/dist/source/compiler/aslutils.c vendor-sys/acpica/dist/source/compiler/aslxref.c vendor-sys/acpica/dist/source/components/debugger/dbexec.c vendor-sys/acpica/dist/source/components/debugger/dbinput.c vendor-sys/acpica/dist/source/components/debugger/dbmethod.c vendor-sys/acpica/dist/source/components/disassembler/dmbuffer.c vendor-sys/acpica/dist/source/components/disassembler/dmcstyle.c vendor-sys/acpica/dist/source/components/events/evrgnini.c vendor-sys/acpica/dist/source/components/executer/exregion.c vendor-sys/acpica/dist/source/components/namespace/nsalloc.c vendor-sys/acpica/dist/source/components/namespace/nsarguments.c vendor-sys/acpica/dist/source/components/namespace/nsxfobj.c vendor-sys/acpica/dist/source/components/parser/psparse.c vendor-sys/acpica/dist/source/components/utilities/utpredef.c vendor-sys/acpica/dist/source/components/utilities/utstrsuppt.c vendor-sys/acpica/dist/source/include/acconfig.h vendor-sys/acpica/dist/source/include/acdebug.h vendor-sys/acpica/dist/source/include/acexcep.h vendor-sys/acpica/dist/source/include/acpixf.h vendor-sys/acpica/dist/source/include/acpredef.h vendor-sys/acpica/dist/source/include/actbl1.h vendor-sys/acpica/dist/source/include/actypes.h vendor-sys/acpica/dist/source/include/acuuid.h vendor-sys/acpica/dist/source/include/platform/aclinux.h vendor-sys/acpica/dist/source/os_specific/service_layers/oslinuxtbl.c vendor-sys/acpica/dist/source/tools/acpiexec/aemain.c Modified: vendor-sys/acpica/dist/changes.txt ============================================================================== --- vendor-sys/acpica/dist/changes.txt Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/changes.txt Thu Oct 8 16:44:28 2020 (r366539) @@ -1,6 +1,80 @@ ---------------------------------------- +25 September 2020. Summary of changes for version 20200925: + +This release is available at https://acpica.org/downloads + + +1) ACPICA kernel-resident subsystem: + +Preserve memory opregion mappings. The ACPICA's strategy with respect to +the handling of memory mappings associated with memory operation regions +is to avoid mapping the entire region at once which may be problematic at +least in principle (for example, it may lead to conflicts with +overlapping mappings having different attributes created by drivers). It +may also be wasteful, because memory opregions on some systems take up +vastchunks of address space while the fields in those regions actually +accessed by AML are sparsely distributed. + +For this reason, a one-page "window" is mapped for a given opregion on +the first memory access through it and if that "window" does not cover an +address range accessed through that opregion subsequently, it is unmapped +and a new "window" is mapped to replace it. Next, if the new "window" is +not sufficient to access memory through the opregion in question in the +future, it will be replaced with yet another "window" and so on. That +may lead to a suboptimal sequence of memory mapping and unmapping +operations, for example if two fields in one opregion separated from each +other by a sufficiently wide chunk of unused address space are accessed +in an alternating pattern. + +Added support for 64 bit risc-v compilation. Useful for acpica tools and +incorporating ACPICA into the Firmware Test Suite. Colin Ian King +. + +Added support for SMBus predefined names (from SMBus Control Method +Interface Specification, Version 1.0, December 10, 1999. New predefined +names: + _SBA + _SBI + _SBR + _SBT + _SBW + +AML Disassembler: Added a new command, "All Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); + Node->Type = TargetNode->Type; + if (Node->Type == ACPI_TYPE_METHOD) + { + /* Save the parameter count for methods */ + + Node->Value = TargetNode->Value; + } } return (AE_OK); Modified: vendor-sys/acpica/dist/source/compiler/aslmessages.c ============================================================================== --- vendor-sys/acpica/dist/source/compiler/aslmessages.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/compiler/aslmessages.c Thu Oct 8 16:44:28 2020 (r366539) @@ -381,6 +381,9 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_DUPLICATE_EXTERN_MISMATCH */ "Type mismatch between multiple external declarations detected", /* ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE */"Duplicate external declaration:", /* ASL_MSG_CONDREF_NEEDS_EXTERNAL_DECL */"CondRefOf parameter requires External() declaration", +/* ASL_MSG_EXTERNAL_FOUND_HERE */ "External declaration below ", +/* ASL_MSG_LOWER_CASE_NAMESEG */ "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case", +/* ASL_MSG_LOWER_CASE_NAMEPATH */ "At least one lower case letter found in NamePath, ASL is case insensitive - converting to upper case", }; /* Table compiler */ Modified: vendor-sys/acpica/dist/source/compiler/aslmessages.h ============================================================================== --- vendor-sys/acpica/dist/source/compiler/aslmessages.h Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/compiler/aslmessages.h Thu Oct 8 16:44:28 2020 (r366539) @@ -383,6 +383,9 @@ typedef enum ASL_MSG_DUPLICATE_EXTERN_MISMATCH, ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, ASL_MSG_CONDREF_NEEDS_EXTERNAL_DECL, + ASL_MSG_EXTERNAL_FOUND_HERE, + ASL_MSG_LOWER_CASE_NAMESEG, + ASL_MSG_LOWER_CASE_NAMEPATH, /* These messages are used by the Data Table compiler only */ Modified: vendor-sys/acpica/dist/source/compiler/aslparseop.c ============================================================================== --- vendor-sys/acpica/dist/source/compiler/aslparseop.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/compiler/aslparseop.c Thu Oct 8 16:44:28 2020 (r366539) @@ -388,6 +388,8 @@ TrCreateValuedLeafOp ( UINT64 Value) { ACPI_PARSE_OBJECT *Op; + UINT32 i; + char *StringPtr = NULL; Op = TrAllocateOp (ParseOpcode); @@ -408,11 +410,35 @@ TrCreateValuedLeafOp ( case PARSEOP_NAMESEG: + /* Check for mixed case (or all lower case). Issue a remark in this case */ + + for (i = 0; i < ACPI_NAMESEG_SIZE; i++) + { + if (islower (Op->Asl.Value.Name[i])) + { + AcpiUtStrupr (&Op->Asl.Value.Name[i]); + AslError (ASL_REMARK, ASL_MSG_LOWER_CASE_NAMESEG, Op, Op->Asl.Value.Name); + break; + } + } DbgPrint (ASL_PARSE_OUTPUT, "NAMESEG->%s", Op->Asl.Value.String); break; case PARSEOP_NAMESTRING: + /* Check for mixed case (or all lower case). Issue a remark in this case */ + + StringPtr = Op->Asl.Value.Name; + for (i = 0; *StringPtr; i++) + { + if (islower (*StringPtr)) + { + AcpiUtStrupr (&Op->Asl.Value.Name[i]); + AslError (ASL_REMARK, ASL_MSG_LOWER_CASE_NAMEPATH, Op, Op->Asl.Value.Name); + break; + } + StringPtr++; + } DbgPrint (ASL_PARSE_OUTPUT, "NAMESTRING->%s", Op->Asl.Value.String); break; Modified: vendor-sys/acpica/dist/source/compiler/aslprepkg.c ============================================================================== --- vendor-sys/acpica/dist/source/compiler/aslprepkg.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/compiler/aslprepkg.c Thu Oct 8 16:44:28 2020 (r366539) @@ -318,6 +318,17 @@ ApCheckPackage ( */ for (i = 0; i < Count; i++) { + if (!Op) + { + /* + * If we get to this point, it means that the package length + * is larger than the initializer list. Stop processing the + * package and return because we have run out of package + * elements to analyze. + */ + return; + } + ApCheckObjectType (Predefined->Info.Name, Op, Package->RetInfo.ObjectType1, i); Op = Op->Asl.Next; @@ -917,7 +928,7 @@ ApPackageTooSmall ( UINT32 ExpectedCount) { - sprintf (AslGbl_MsgBuffer, "%s: length %u, required minimum is %u", + sprintf (AslGbl_MsgBuffer, "%4.4s: length %u, required minimum is %u", PredefinedName, Count, ExpectedCount); AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer); @@ -946,7 +957,7 @@ ApZeroLengthPackage ( ACPI_PARSE_OBJECT *Op) { - sprintf (AslGbl_MsgBuffer, "%s: length is zero", PredefinedName); + sprintf (AslGbl_MsgBuffer, "%4.4s: length is zero", PredefinedName); AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer); } @@ -975,7 +986,7 @@ ApPackageTooLarge ( UINT32 ExpectedCount) { - sprintf (AslGbl_MsgBuffer, "%s: length is %u, only %u required", + sprintf (AslGbl_MsgBuffer, "%4.4s: length is %u, only %u required", PredefinedName, Count, ExpectedCount); AslError (ASL_REMARK, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer); Modified: vendor-sys/acpica/dist/source/compiler/aslutils.c ============================================================================== --- vendor-sys/acpica/dist/source/compiler/aslutils.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/compiler/aslutils.c Thu Oct 8 16:44:28 2020 (r366539) @@ -1074,14 +1074,16 @@ UtDoConstant ( { ACPI_STATUS Status; UINT64 ConvertedInteger; - char ErrBuf[64]; + char ErrBuf[128]; + const ACPI_EXCEPTION_INFO *ExceptionInfo; Status = AcpiUtStrtoul64 (String, &ConvertedInteger); if (ACPI_FAILURE (Status)) { - sprintf (ErrBuf, "While creating 64-bit constant: %s\n", - AcpiFormatException (Status)); + ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status); + sprintf (ErrBuf, " %s while converting to 64-bit integer", + ExceptionInfo->Description); AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset, Modified: vendor-sys/acpica/dist/source/compiler/aslxref.c ============================================================================== --- vendor-sys/acpica/dist/source/compiler/aslxref.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/compiler/aslxref.c Thu Oct 8 16:44:28 2020 (r366539) @@ -433,6 +433,7 @@ XfNamespaceLocateBegin ( UINT32 i; ACPI_NAMESPACE_NODE *DeclarationParentMethod; ACPI_PARSE_OBJECT *ReferenceParentMethod; + char *ExternalPath; ACPI_FUNCTION_TRACE_PTR (XfNamespaceLocateBegin, Op); @@ -1263,7 +1264,15 @@ XfNamespaceLocateBegin ( Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_CONDREFOF && !XfRefIsGuardedByIfCondRefOf (Node, Op)) { - AslError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL); + ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE); + sprintf (AslGbl_MsgBuffer, "full path of external object: %s", + ExternalPath); + AslDualParseOpError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL, + ASL_MSG_EXTERNAL_FOUND_HERE, Node->Op, AslGbl_MsgBuffer); + if (ExternalPath) + { + ACPI_FREE (ExternalPath); + } } /* 5) Check for a connection object */ Modified: vendor-sys/acpica/dist/source/components/debugger/dbexec.c ============================================================================== --- vendor-sys/acpica/dist/source/components/debugger/dbexec.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/debugger/dbexec.c Thu Oct 8 16:44:28 2020 (r366539) @@ -252,7 +252,8 @@ AcpiDbDeleteObjects ( * * RETURN: Status * - * DESCRIPTION: Execute a control method. + * DESCRIPTION: Execute a control method. Used to evaluate objects via the + * "EXECUTE" or "EVALUATE" commands. * ******************************************************************************/ @@ -504,11 +505,12 @@ AcpiDbExecutionWalk ( Status = AcpiEvaluateObject (Node, NULL, NULL, &ReturnObj); + AcpiGbl_MethodExecuting = FALSE; + AcpiOsPrintf ("Evaluation of [%4.4s] returned %s\n", AcpiUtGetNodeName (Node), AcpiFormatException (Status)); - AcpiGbl_MethodExecuting = FALSE; return (AE_OK); } @@ -525,7 +527,8 @@ AcpiDbExecutionWalk ( * RETURN: None * * DESCRIPTION: Execute a control method. Name is relative to the current - * scope. + * scope. Function used for the "EXECUTE", "EVALUATE", and + * "ALL" commands * ******************************************************************************/ @@ -569,6 +572,12 @@ AcpiDbExecute ( return; } + if ((Flags & EX_ALL) && (strlen (Name) > 4)) + { + AcpiOsPrintf ("Input name (%s) must be a 4-char NameSeg\n", Name); + return; + } + NameString = ACPI_ALLOCATE (strlen (Name) + 1); if (!NameString) { @@ -588,14 +597,28 @@ AcpiDbExecute ( return; } - AcpiGbl_DbMethodInfo.Name = NameString; - AcpiGbl_DbMethodInfo.Args = Args; - AcpiGbl_DbMethodInfo.Types = Types; - AcpiGbl_DbMethodInfo.Flags = Flags; + /* Command (ALL ) to execute all methods of a particular name */ - ReturnObj.Pointer = NULL; - ReturnObj.Length = ACPI_ALLOCATE_BUFFER; + else if (Flags & EX_ALL) + { + AcpiGbl_DbMethodInfo.Name = NameString; + ReturnObj.Pointer = NULL; + ReturnObj.Length = ACPI_ALLOCATE_BUFFER; + AcpiDbEvaluateAll (NameString); + ACPI_FREE (NameString); + return; + } + else + { + AcpiGbl_DbMethodInfo.Name = NameString; + AcpiGbl_DbMethodInfo.Args = Args; + AcpiGbl_DbMethodInfo.Types = Types; + AcpiGbl_DbMethodInfo.Flags = Flags; + ReturnObj.Pointer = NULL; + ReturnObj.Length = ACPI_ALLOCATE_BUFFER; + } + Status = AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo); if (ACPI_FAILURE (Status)) { @@ -655,6 +678,7 @@ AcpiDbExecute ( (UINT32) ReturnObj.Length); AcpiDbDumpExternalObject (ReturnObj.Pointer, 1); + AcpiOsPrintf ("\n"); /* Dump a _PLD buffer if present */ Modified: vendor-sys/acpica/dist/source/components/debugger/dbinput.c ============================================================================== --- vendor-sys/acpica/dist/source/components/debugger/dbinput.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/debugger/dbinput.c Thu Oct 8 16:44:28 2020 (r366539) @@ -195,6 +195,7 @@ enum AcpiExDebuggerCommands { CMD_NOT_FOUND = 0, CMD_NULL, + CMD_ALL, CMD_ALLOCATIONS, CMD_ARGS, CMD_ARGUMENTS, @@ -275,6 +276,7 @@ static const ACPI_DB_COMMAND_INFO AcpiGbl_DbCommands { {"", 0}, {"", 0}, + {"ALL", 1}, {"ALLOCATIONS", 0}, {"ARGS", 0}, {"ARGUMENTS", 0}, @@ -377,6 +379,7 @@ static const ACPI_DB_COMMAND_HELP AcpiGbl_DbCommandH {1, " Type ", "Display object type\n"}, {0, "\nControl Method Execution:", "\n"}, + {1, " All ", "Evaluate all objects named NameSeg\n"}, {1, " Evaluate [Arguments]", "Evaluate object or control method\n"}, {1, " Execute [Arguments]", "Synonym for Evaluate\n"}, #ifdef ACPI_APPLICATION @@ -599,7 +602,7 @@ AcpiDbDisplayHelp ( } else { - /* Display help for all commands that match the subtring */ + /* Display help for all commands that match the substring */ AcpiDbDisplayCommandInfo (Command, TRUE); } @@ -945,6 +948,13 @@ AcpiDbCommandDispatch ( { return (AE_OK); } + break; + + case CMD_ALL: + + AcpiOsPrintf ("Executing all objects with NameSeg: %s\n", AcpiGbl_DbArgs[1]); + AcpiDbExecute (AcpiGbl_DbArgs[1], + &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP | EX_ALL); break; case CMD_ALLOCATIONS: Modified: vendor-sys/acpica/dist/source/components/debugger/dbmethod.c ============================================================================== --- vendor-sys/acpica/dist/source/components/debugger/dbmethod.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/debugger/dbmethod.c Thu Oct 8 16:44:28 2020 (r366539) @@ -170,7 +170,11 @@ AcpiDbWalkForExecute ( void *Context, void **ReturnValue); +static ACPI_STATUS +AcpiDbEvaluateObject ( + ACPI_NAMESPACE_NODE *Node); + /******************************************************************************* * * FUNCTION: AcpiDbSetMethodBreakpoint @@ -542,47 +546,30 @@ AcpiDbDisassembleMethod ( /******************************************************************************* * - * FUNCTION: AcpiDbWalkForExecute + * FUNCTION: AcpiDbEvaluateObject * - * PARAMETERS: Callback from WalkNamespace + * PARAMETERS: Node - Namespace node for the object * * RETURN: Status * - * DESCRIPTION: Batch execution module. Currently only executes predefined - * ACPI names. + * DESCRIPTION: Main execution function for the Evaluate/Execute/All debugger + * commands. * ******************************************************************************/ static ACPI_STATUS -AcpiDbWalkForExecute ( - ACPI_HANDLE ObjHandle, - UINT32 NestingLevel, - void *Context, - void **ReturnValue) +AcpiDbEvaluateObject ( + ACPI_NAMESPACE_NODE *Node) { - ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; - ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context; - ACPI_BUFFER ReturnObj; - ACPI_STATUS Status; char *Pathname; UINT32 i; ACPI_DEVICE_INFO *ObjInfo; ACPI_OBJECT_LIST ParamObjects; ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS]; - const ACPI_PREDEFINED_INFO *Predefined; + ACPI_BUFFER ReturnObj; + ACPI_STATUS Status; - Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); - if (!Predefined) - { - return (AE_OK); - } - - if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) - { - return (AE_OK); - } - Pathname = AcpiNsGetExternalPathname (Node); if (!Pathname) { @@ -591,7 +578,7 @@ AcpiDbWalkForExecute ( /* Get the object info for number of method parameters */ - Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo); + Status = AcpiGetObjectInfo (Node, &ObjInfo); if (ACPI_FAILURE (Status)) { ACPI_FREE (Pathname); @@ -624,13 +611,70 @@ AcpiDbWalkForExecute ( AcpiGbl_MethodExecuting = TRUE; Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj); + AcpiGbl_MethodExecuting = FALSE; AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status)); - AcpiGbl_MethodExecuting = FALSE; + if (ReturnObj.Length) + { + AcpiOsPrintf ("Evaluation of %s returned object %p, " + "external buffer length %X\n", + Pathname, ReturnObj.Pointer, (UINT32) ReturnObj.Length); + + AcpiDbDumpExternalObject (ReturnObj.Pointer, 1); + AcpiOsPrintf ("\n"); + } + ACPI_FREE (Pathname); /* Ignore status from method execution */ + return (AE_OK); + + /* Update count, check if we have executed enough methods */ + +} + +/******************************************************************************* + * + * FUNCTION: AcpiDbWalkForExecute + * + * PARAMETERS: Callback from WalkNamespace + * + * RETURN: Status + * + * DESCRIPTION: Batch execution function. Evaluates all "predefined" objects -- + * the nameseg begins with an underscore. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiDbWalkForExecute ( + ACPI_HANDLE ObjHandle, + UINT32 NestingLevel, + void *Context, + void **ReturnValue) +{ + ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; + ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context; + ACPI_STATUS Status; + const ACPI_PREDEFINED_INFO *Predefined; + + + Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); + if (!Predefined) + { + return (AE_OK); + } + + if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) + { + return (AE_OK); + } + + AcpiDbEvaluateObject (Node); + + /* Ignore status from object evaluation */ + Status = AE_OK; /* Update count, check if we have executed enough methods */ @@ -647,6 +691,56 @@ AcpiDbWalkForExecute ( /******************************************************************************* * + * FUNCTION: AcpiDbWalkForExecuteAll + * + * PARAMETERS: Callback from WalkNamespace + * + * RETURN: Status + * + * DESCRIPTION: Batch execution function. Evaluates all objects whose path ends + * with the nameseg "Info->NameSeg". Used for the "ALL" command. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiDbWalkForExecuteAll ( + ACPI_HANDLE ObjHandle, + UINT32 NestingLevel, + void *Context, + void **ReturnValue) +{ + ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; + ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context; + ACPI_STATUS Status; + + + if (!ACPI_COMPARE_NAMESEG (Node->Name.Ascii, Info->NameSeg)) + { + return (AE_OK); + } + + if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) + { + return (AE_OK); + } + + /* Now evaluate the input object (node) */ + + AcpiDbEvaluateObject (Node); + + /* Ignore status from method execution */ + + Status = AE_OK; + + /* Update count of executed methods/objects */ + + Info->Count++; + return (Status); +} + + +/******************************************************************************* + * * FUNCTION: AcpiDbEvaluatePredefinedNames * * PARAMETERS: None @@ -674,4 +768,39 @@ AcpiDbEvaluatePredefinedNames ( AcpiDbWalkForExecute, NULL, (void *) &Info, NULL); AcpiOsPrintf ("Evaluated %u predefined names in the namespace\n", Info.Count); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDbEvaluateAll + * + * PARAMETERS: NoneAcpiGbl_DbMethodInfo + * + * RETURN: None + * + * DESCRIPTION: Namespace batch execution. Implements the "ALL" command. + * Execute all namepaths whose final nameseg matches the + * input nameseg. + * + ******************************************************************************/ + +void +AcpiDbEvaluateAll ( + char *NameSeg) +{ + ACPI_DB_EXECUTE_WALK Info; + + + Info.Count = 0; + Info.MaxCount = ACPI_UINT32_MAX; + ACPI_COPY_NAMESEG (Info.NameSeg, NameSeg); + Info.NameSeg[ACPI_NAMESEG_SIZE] = 0; + + /* Search all nodes in namespace */ + + (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, + AcpiDbWalkForExecuteAll, NULL, (void *) &Info, NULL); + + AcpiOsPrintf ("Evaluated %u names in the namespace\n", Info.Count); } Modified: vendor-sys/acpica/dist/source/components/disassembler/dmbuffer.c ============================================================================== --- vendor-sys/acpica/dist/source/components/disassembler/dmbuffer.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/disassembler/dmbuffer.c Thu Oct 8 16:44:28 2020 (r366539) @@ -494,6 +494,10 @@ AcpiDmUuid ( { AcpiOsPrintf (" /* %s */", Description); } + else + { + AcpiOsPrintf (" /* Unknown UUID */"); + } } Modified: vendor-sys/acpica/dist/source/components/disassembler/dmcstyle.c ============================================================================== --- vendor-sys/acpica/dist/source/components/disassembler/dmcstyle.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/disassembler/dmcstyle.c Thu Oct 8 16:44:28 2020 (r366539) @@ -744,7 +744,7 @@ AcpiDmIsOptimizationIgnored ( * Only a small subset of ASL/AML operators can be optimized. * Can only optimize/fold if there is no target (or targets) * specified for the operator. And of course, the operator - * is surrrounded by a Store() operator. + * is surrounded by a Store() operator. */ switch (StoreArgument->Common.AmlOpcode) { Modified: vendor-sys/acpica/dist/source/components/events/evrgnini.c ============================================================================== --- vendor-sys/acpica/dist/source/components/events/evrgnini.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/events/evrgnini.c Thu Oct 8 16:44:28 2020 (r366539) @@ -183,6 +183,7 @@ AcpiEvSystemMemoryRegionSetup ( { ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle; ACPI_MEM_SPACE_CONTEXT *LocalRegionContext; + ACPI_MEM_MAPPING *Mm; ACPI_FUNCTION_TRACE (EvSystemMemoryRegionSetup); @@ -194,12 +195,14 @@ AcpiEvSystemMemoryRegionSetup ( { LocalRegionContext = (ACPI_MEM_SPACE_CONTEXT *) *RegionContext; - /* Delete a cached mapping if present */ + /* Delete memory mappings if present */ - if (LocalRegionContext->MappedLength) + while (LocalRegionContext->FirstMm) { - AcpiOsUnmapMemory (LocalRegionContext->MappedLogicalAddress, - LocalRegionContext->MappedLength); + Mm = LocalRegionContext->FirstMm; + LocalRegionContext->FirstMm = Mm->NextMm; + AcpiOsUnmapMemory(Mm->LogicalAddress, Mm->Length); + ACPI_FREE(Mm); } ACPI_FREE (LocalRegionContext); *RegionContext = NULL; Modified: vendor-sys/acpica/dist/source/components/executer/exregion.c ============================================================================== --- vendor-sys/acpica/dist/source/components/executer/exregion.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/executer/exregion.c Thu Oct 8 16:44:28 2020 (r366539) @@ -188,6 +188,7 @@ AcpiExSystemMemorySpaceHandler ( ACPI_STATUS Status = AE_OK; void *LogicalAddrPtr = NULL; ACPI_MEM_SPACE_CONTEXT *MemInfo = RegionContext; + ACPI_MEM_MAPPING *Mm = MemInfo->CurMm; UINT32 Length; ACPI_SIZE MapLength; ACPI_SIZE PageBoundaryMapLength; @@ -247,23 +248,48 @@ AcpiExSystemMemorySpaceHandler ( * Is 1) Address below the current mapping? OR * 2) Address beyond the current mapping? */ - if ((Address < MemInfo->MappedPhysicalAddress) || - (((UINT64) Address + Length) > - ((UINT64) - MemInfo->MappedPhysicalAddress + MemInfo->MappedLength))) + if (!Mm || (Address < Mm->PhysicalAddress) || + ((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length)) { /* - * The request cannot be resolved by the current memory mapping; - * Delete the existing mapping and create a new one. + * The request cannot be resolved by the current memory mapping. + * + * Look for an existing saved mapping covering the address range + * at hand. If found, save it as the current one and carry out + * the access. */ - if (MemInfo->MappedLength) + for (Mm = MemInfo->FirstMm; Mm; Mm = Mm->NextMm) { - /* Valid mapping, delete it */ + if (Mm == MemInfo->CurMm) + { + continue; + } - AcpiOsUnmapMemory (MemInfo->MappedLogicalAddress, - MemInfo->MappedLength); + if (Address < Mm->PhysicalAddress) + { + continue; + } + + if ((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length) + { + continue; + } + + MemInfo->CurMm = Mm; + goto access; } + /* Create a new mappings list entry */ + + Mm = ACPI_ALLOCATE_ZEROED(sizeof(*Mm)); + if (!Mm) + { + ACPI_ERROR((AE_INFO, + "Unable to save memory mapping at 0x%8.8X%8.8X, size %u", + ACPI_FORMAT_UINT64(Address), Length)); + return_ACPI_STATUS(AE_NO_MEMORY); + } + /* * October 2009: Attempt to map from the requested address to the * end of the region. However, we will never map more than one @@ -297,28 +323,38 @@ AcpiExSystemMemorySpaceHandler ( /* Create a new mapping starting at the address given */ - MemInfo->MappedLogicalAddress = AcpiOsMapMemory (Address, MapLength); - if (!MemInfo->MappedLogicalAddress) + LogicalAddrPtr = AcpiOsMapMemory(Address, MapLength); + if (!LogicalAddrPtr) { ACPI_ERROR ((AE_INFO, "Could not map memory at 0x%8.8X%8.8X, size %u", ACPI_FORMAT_UINT64 (Address), (UINT32) MapLength)); - MemInfo->MappedLength = 0; + ACPI_FREE(Mm); return_ACPI_STATUS (AE_NO_MEMORY); } /* Save the physical address and mapping size */ - MemInfo->MappedPhysicalAddress = Address; - MemInfo->MappedLength = MapLength; + Mm->LogicalAddress = LogicalAddrPtr; + Mm->PhysicalAddress = Address; + Mm->Length = MapLength; + + /* + * Add the new entry to the mappigs list and save it as the + * current mapping. + */ + Mm->NextMm = MemInfo->FirstMm; + MemInfo->FirstMm = Mm; + MemInfo->CurMm = Mm; } +access: /* * Generate a logical pointer corresponding to the address we want to * access */ - LogicalAddrPtr = MemInfo->MappedLogicalAddress + - ((UINT64) Address - (UINT64) MemInfo->MappedPhysicalAddress); + LogicalAddrPtr = Mm->LogicalAddress + + ((UINT64) Address - (UINT64) Mm->PhysicalAddress); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n", Modified: vendor-sys/acpica/dist/source/components/namespace/nsalloc.c ============================================================================== --- vendor-sys/acpica/dist/source/components/namespace/nsalloc.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/namespace/nsalloc.c Thu Oct 8 16:44:28 2020 (r366539) @@ -481,7 +481,7 @@ AcpiNsDeleteChildren ( NodeToDelete = NextNode; NextNode = NextNode->Peer; AcpiNsDeleteNode (NodeToDelete); - }; + } /* Clear the parent's child pointer */ Modified: vendor-sys/acpica/dist/source/components/namespace/nsarguments.c ============================================================================== --- vendor-sys/acpica/dist/source/components/namespace/nsarguments.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/namespace/nsarguments.c Thu Oct 8 16:44:28 2020 (r366539) @@ -205,7 +205,9 @@ AcpiNsCheckArgumentTypes ( ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList); UserArgType = Info->Parameters[i]->Common.Type; - if (UserArgType != ArgType) + /* No typechecking for ACPI_TYPE_ANY */ + + if ((UserArgType != ArgType) && (ArgType != ACPI_TYPE_ANY)) { ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, ACPI_WARN_ALWAYS, "Argument #%u type mismatch - " Modified: vendor-sys/acpica/dist/source/components/namespace/nsxfobj.c ============================================================================== --- vendor-sys/acpica/dist/source/components/namespace/nsxfobj.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/namespace/nsxfobj.c Thu Oct 8 16:44:28 2020 (r366539) @@ -169,7 +169,8 @@ * * RETURN: Status * - * DESCRIPTION: This routine returns the type associatd with a particular handle + * DESCRIPTION: This routine returns the type associated with a particular + * handle * ******************************************************************************/ Modified: vendor-sys/acpica/dist/source/components/parser/psparse.c ============================================================================== --- vendor-sys/acpica/dist/source/components/parser/psparse.c Thu Oct 8 12:56:23 2020 (r366538) +++ vendor-sys/acpica/dist/source/components/parser/psparse.c Thu Oct 8 16:44:28 2020 (r366539) @@ -662,8 +662,8 @@ AcpiPsParseAml ( } /* - * If the transfer to the new method method call worked - *, a new walk state was created -- get it + * If the transfer to the new method method call worked, + * a new walk state was created -- get it *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-all@freebsd.org Thu Oct 8 16:45:27 2020 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 C1F8B42BD9C; Thu, 8 Oct 2020 16:45:27 +0000 (UTC) (envelope-from jkim@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6cWq4n6Hz4F54; Thu, 8 Oct 2020 16:45:27 +0000 (UTC) (envelope-from jkim@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 6D340BABE; Thu, 8 Oct 2020 16:45:27 +0000 (UTC) (envelope-from jkim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098GjR7L003530; Thu, 8 Oct 2020 16:45:27 GMT (envelope-from jkim@FreeBSD.org) Received: (from jkim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098GjRfD003529; Thu, 8 Oct 2020 16:45:27 GMT (envelope-from jkim@FreeBSD.org) Message-Id: <202010081645.098GjRfD003529@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jkim set sender to jkim@FreeBSD.org using -f From: Jung-uk Kim Date: Thu, 8 Oct 2020 16:45:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r366540 - vendor-sys/acpica/20200925 X-SVN-Group: vendor-sys X-SVN-Commit-Author: jkim X-SVN-Commit-Paths: vendor-sys/acpica/20200925 X-SVN-Commit-Revision: 366540 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.33 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: Thu, 08 Oct 2020 16:45:27 -0000 Author: jkim Date: Thu Oct 8 16:45:27 2020 New Revision: 366540 URL: https://svnweb.freebsd.org/changeset/base/366540 Log: Tag ACPICA 20200925. Added: vendor-sys/acpica/20200925/ - copied from r366539, vendor-sys/acpica/dist/ From owner-svn-src-all@freebsd.org Thu Oct 8 17:30:06 2020 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 321C142C98A; Thu, 8 Oct 2020 17:30:06 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6dWL0YSCz4GkN; Thu, 8 Oct 2020 17:30:06 +0000 (UTC) (envelope-from imp@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 EBAEDC076; Thu, 8 Oct 2020 17:30:05 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098HU5qv028183; Thu, 8 Oct 2020 17:30:05 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098HU5kY028182; Thu, 8 Oct 2020 17:30:05 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010081730.098HU5kY028182@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Thu, 8 Oct 2020 17:30:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366541 - head X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head X-SVN-Commit-Revision: 366541 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.33 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: Thu, 08 Oct 2020 17:30:06 -0000 Author: imp Date: Thu Oct 8 17:30:05 2020 New Revision: 366541 URL: https://svnweb.freebsd.org/changeset/base/366541 Log: Race in 32-bit fixed Use install insteald of install.sh for 32-bit builds to fight races there. Reviewed by: markj Modified: head/Makefile.libcompat Modified: head/Makefile.libcompat ============================================================================== --- head/Makefile.libcompat Thu Oct 8 16:45:27 2020 (r366540) +++ head/Makefile.libcompat Thu Oct 8 17:30:05 2020 (r366541) @@ -10,7 +10,7 @@ __<${_this:T}>__: # Yes, the flags are redundant. LIBCOMPATWMAKEENV+= \ - INSTALL="sh ${.CURDIR}/tools/install.sh" \ + INSTALL="${INSTALL_CMD} -U" \ PATH=${TMPPATH} \ SYSROOT=${LIBCOMPATTMP} \ LIBDIR=/usr/lib${libcompat} \ From owner-svn-src-all@freebsd.org Thu Oct 8 18:02:07 2020 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 A707C42DCCB; Thu, 8 Oct 2020 18:02:07 +0000 (UTC) (envelope-from mhorne@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6fDH40n4z4KJd; Thu, 8 Oct 2020 18:02:07 +0000 (UTC) (envelope-from mhorne@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 6E1D6CC15; Thu, 8 Oct 2020 18:02:07 +0000 (UTC) (envelope-from mhorne@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098I27Kj052302; Thu, 8 Oct 2020 18:02:07 GMT (envelope-from mhorne@FreeBSD.org) Received: (from mhorne@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098I26Rq052294; Thu, 8 Oct 2020 18:02:06 GMT (envelope-from mhorne@FreeBSD.org) Message-Id: <202010081802.098I26Rq052294@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mhorne set sender to mhorne@FreeBSD.org using -f From: Mitchell Horne Date: Thu, 8 Oct 2020 18:02:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366542 - in head/sys: amd64/amd64 arm/arm arm64/arm64 kern riscv/riscv sys X-SVN-Group: head X-SVN-Commit-Author: mhorne X-SVN-Commit-Paths: in head/sys: amd64/amd64 arm/arm arm64/arm64 kern riscv/riscv sys X-SVN-Commit-Revision: 366542 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.33 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: Thu, 08 Oct 2020 18:02:07 -0000 Author: mhorne Date: Thu Oct 8 18:02:05 2020 New Revision: 366542 URL: https://svnweb.freebsd.org/changeset/base/366542 Log: Add a routine to dump boot metadata The boot metadata (also referred to as modinfo, or preload metadata) provides information about the size and location of the kernel, pre-loaded modules, and other metadata (e.g. the EFI framebuffer) to be consumed during by the kernel during early boot. It is encoded as a series of type-length-value entries and is usually constructed by loader(8) and passed to the kernel. It is also faked on some architectures when booted by other means. Although much of the module information is available via kldstat(8), there is no easy way to debug the metadata in its entirety. Add some routines to parse this data and allow it to be printed to the console during early boot or output via a sysctl. Since the output can be lengthly, printing to the console is gated behind the debug.dump_modinfo_at_boot kenv variable as well as the BOOTVERBOSE flag. The sysctl to print the metadata is named debug.dump_modinfo. Reviewed by: tsoome Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D26687 Modified: head/sys/amd64/amd64/machdep.c head/sys/arm/arm/machdep.c head/sys/arm64/arm64/machdep.c head/sys/kern/subr_module.c head/sys/riscv/riscv/machdep.c head/sys/sys/linker.h Modified: head/sys/amd64/amd64/machdep.c ============================================================================== --- head/sys/amd64/amd64/machdep.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/amd64/amd64/machdep.c Thu Oct 8 18:02:05 2020 (r366542) @@ -1853,6 +1853,15 @@ hammer_time(u_int64_t modulep, u_int64_t physfree) if (late_console) cninit(); + /* + * Dump the boot metadata. We have to wait for cninit() since console + * output is required. If it's grossly incorrect the kernel will never + * make it this far. + */ + if ((boothowto & RB_VERBOSE) && + getenv_is_true("debug.dump_modinfo_at_boot")) + preload_dump(); + #ifdef DEV_ISA #ifdef DEV_ATPIC elcr_probe(); Modified: head/sys/arm/arm/machdep.c ============================================================================== --- head/sys/arm/arm/machdep.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/arm/arm/machdep.c Thu Oct 8 18:02:05 2020 (r366542) @@ -1027,6 +1027,15 @@ initarm(struct arm_boot_params *abp) debugf(" dtbp = 0x%08x\n", (uint32_t)dtbp); arm_print_kenv(); + /* + * Dump the boot metadata. We have to wait for cninit() since console + * output is required. If it's grossly incorrect the kernel will never + * make it this far. + */ + if ((boothowto & RB_VERBOSE) && + getenv_is_true("debug.dump_modinfo_at_boot")) + preload_dump(); + env = kern_getenv("kernelname"); if (env != NULL) { strlcpy(kernelname, env, sizeof(kernelname)); Modified: head/sys/arm64/arm64/machdep.c ============================================================================== --- head/sys/arm64/arm64/machdep.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/arm64/arm64/machdep.c Thu Oct 8 18:02:05 2020 (r366542) @@ -1242,6 +1242,15 @@ initarm(struct arm64_bootparams *abp) panic("Invalid bus configuration: %s", kern_getenv("kern.cfg.order")); + /* + * Dump the boot metadata. We have to wait for cninit() since console + * output is required. If it's grossly incorrect the kernel will never + * make it this far. + */ + if ((boothowto & RB_VERBOSE) && + getenv_is_true("debug.dump_modinfo_at_boot")) + preload_dump(); + init_proc0(abp->kern_stack); msgbufinit(msgbufp, msgbufsize); mutex_init(); Modified: head/sys/kern/subr_module.c ============================================================================== --- head/sys/kern/subr_module.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/kern/subr_module.c Thu Oct 8 18:02:05 2020 (r366542) @@ -3,6 +3,8 @@ * * Copyright (c) 1998 Michael Smith * All rights reserved. + * Copyright (c) 2020 NetApp Inc. + * Copyright (c) 2020 Klara Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,7 +34,11 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include +#include + #include #include @@ -304,3 +310,249 @@ preload_bootstrap_relocate(vm_offset_t offset) } } } + +/* + * Parse the modinfo type and append to the provided sbuf. + */ +static void +preload_modinfo_type(struct sbuf *sbp, int type) +{ + + if ((type & MODINFO_METADATA) == 0) { + switch (type) { + case MODINFO_END: + sbuf_cat(sbp, "MODINFO_END"); + break; + case MODINFO_NAME: + sbuf_cat(sbp, "MODINFO_NAME"); + break; + case MODINFO_TYPE: + sbuf_cat(sbp, "MODINFO_TYPE"); + break; + case MODINFO_ADDR: + sbuf_cat(sbp, "MODINFO_ADDR"); + break; + case MODINFO_SIZE: + sbuf_cat(sbp, "MODINFO_SIZE"); + break; + case MODINFO_EMPTY: + sbuf_cat(sbp, "MODINFO_EMPTY"); + break; + case MODINFO_ARGS: + sbuf_cat(sbp, "MODINFO_ARGS"); + break; + default: + sbuf_cat(sbp, "unrecognized modinfo attribute"); + } + + return; + } + + sbuf_cat(sbp, "MODINFO_METADATA | "); + switch (type & ~MODINFO_METADATA) { + case MODINFOMD_ELFHDR: + sbuf_cat(sbp, "MODINFOMD_ELFHDR"); + break; + case MODINFOMD_SSYM: + sbuf_cat(sbp, "MODINFOMD_SSYM"); + break; + case MODINFOMD_ESYM: + sbuf_cat(sbp, "MODINFOMD_ESYM"); + break; + case MODINFOMD_DYNAMIC: + sbuf_cat(sbp, "MODINFOMD_DYNAMIC"); + break; + case MODINFOMD_ENVP: + sbuf_cat(sbp, "MODINFOMD_ENVP"); + break; + case MODINFOMD_HOWTO: + sbuf_cat(sbp, "MODINFOMD_HOWTO"); + break; + case MODINFOMD_KERNEND: + sbuf_cat(sbp, "MODINFOMD_KERNEND"); + break; + case MODINFOMD_SHDR: + sbuf_cat(sbp, "MODINFOMD_SHDR"); + break; + case MODINFOMD_CTORS_ADDR: + sbuf_cat(sbp, "MODINFOMD_CTORS_ADDR"); + break; + case MODINFOMD_CTORS_SIZE: + sbuf_cat(sbp, "MODINFOMD_CTORS_SIZE"); + break; + case MODINFOMD_FW_HANDLE: + sbuf_cat(sbp, "MODINFOMD_FW_HANDLE"); + break; + case MODINFOMD_KEYBUF: + sbuf_cat(sbp, "MODINFOMD_KEYBUF"); + break; +#ifdef MODINFOMD_SMAP + case MODINFOMD_SMAP: + sbuf_cat(sbp, "MODINFOMD_SMAP"); + break; +#endif +#ifdef MODINFOMD_SMAP_XATTR + case MODINFOMD_SMAP_XATTR: + sbuf_cat(sbp, "MODINFOMD_SMAP_XATTR"); + break; +#endif +#ifdef MODINFOMD_DTBP + case MODINFOMD_DTBP: + sbuf_cat(sbp, "MODINFOMD_DTBP"); + break; +#endif +#ifdef MODINFOMD_EFI_MAP + case MODINFOMD_EFI_MAP: + sbuf_cat(sbp, "MODINFOMD_EFI_MAP"); + break; +#endif +#ifdef MODINFOMD_EFI_FB + case MODINFOMD_EFI_FB: + sbuf_cat(sbp, "MODINFOMD_EFI_FB"); + break; +#endif +#ifdef MODINFOMD_MODULEP + case MODINFOMD_MODULEP: + sbuf_cat(sbp, "MODINFOMD_MODULEP"); + break; +#endif + default: + sbuf_cat(sbp, "unrecognized metadata type"); + } +} + +/* + * Print the modinfo value, depending on type. + */ +static void +preload_modinfo_value(struct sbuf *sbp, uint32_t *bptr, int type, int len) +{ +#ifdef __LP64__ +#define sbuf_print_vmoffset(sb, o) sbuf_printf(sb, "0x%016lx", o); +#else +#define sbuf_print_vmoffset(sb, o) sbuf_printf(sb, "0x%08x", o); +#endif + + switch (type) { + case MODINFO_NAME: + case MODINFO_TYPE: + case MODINFO_ARGS: + sbuf_printf(sbp, "%s", (char *)bptr); + break; + case MODINFO_SIZE: + case MODINFO_METADATA | MODINFOMD_CTORS_SIZE: + sbuf_printf(sbp, "%lu", *(u_long *)bptr); + break; + case MODINFO_ADDR: + case MODINFO_METADATA | MODINFOMD_SSYM: + case MODINFO_METADATA | MODINFOMD_ESYM: + case MODINFO_METADATA | MODINFOMD_DYNAMIC: + case MODINFO_METADATA | MODINFOMD_KERNEND: + case MODINFO_METADATA | MODINFOMD_ENVP: + case MODINFO_METADATA | MODINFOMD_CTORS_ADDR: +#ifdef MODINFOMD_SMAP + case MODINFO_METADATA | MODINFOMD_SMAP: +#endif +#ifdef MODINFOMD_SMAP_XATTR + case MODINFO_METADATA | MODINFOMD_SMAP_XATTR: +#endif +#ifdef MODINFOMD_DTBP + case MODINFO_METADATA | MODINFOMD_DTBP: +#endif +#ifdef MODINFOMD_EFI_FB + case MODINFO_METADATA | MODINFOMD_EFI_FB: +#endif + sbuf_print_vmoffset(sbp, *(vm_offset_t *)bptr); + break; + case MODINFO_METADATA | MODINFOMD_HOWTO: + sbuf_printf(sbp, "0x%08x", *bptr); + break; + case MODINFO_METADATA | MODINFOMD_SHDR: + case MODINFO_METADATA | MODINFOMD_ELFHDR: + case MODINFO_METADATA | MODINFOMD_FW_HANDLE: + case MODINFO_METADATA | MODINFOMD_KEYBUF: +#ifdef MODINFOMD_EFI_MAP + case MODINFO_METADATA | MODINFOMD_EFI_MAP: +#endif + /* Don't print data buffers. */ + sbuf_cat(sbp, "buffer contents omitted"); + break; + default: + break; + } +#undef sbuf_print_vmoffset +} + +static void +preload_dump_internal(struct sbuf *sbp) +{ + uint32_t *bptr, type, len; + + KASSERT(preload_metadata != NULL, + ("%s called without setting up preload_metadata", __func__)); + + /* + * Iterate through the TLV-encoded sections. + */ + bptr = (uint32_t *)preload_metadata; + sbuf_putc(sbp, '\n'); + while (bptr[0] != MODINFO_END || bptr[0] != MODINFO_END) { + sbuf_printf(sbp, " %p:\n", bptr); + type = *bptr++; + len = *bptr++; + + sbuf_printf(sbp, "\ttype:\t(%#04x) ", type); + preload_modinfo_type(sbp, type); + sbuf_putc(sbp, '\n'); + sbuf_printf(sbp, "\tlen:\t%u\n", len); + sbuf_cat(sbp, "\tvalue:\t"); + preload_modinfo_value(sbp, bptr, type, len); + sbuf_putc(sbp, '\n'); + + bptr += roundup(len, sizeof(u_long)) / sizeof(uint32_t); + } +} + +/* + * Print the preloaded data to the console. Called from the machine-dependent + * initialization routines, e.g. hammer_time(). + */ +void +preload_dump(void) +{ + char buf[512]; + struct sbuf sb; + + /* + * This function is expected to be called before malloc is available, + * so use a static buffer and struct sbuf. + */ + sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN); + sbuf_set_drain(&sb, sbuf_printf_drain, NULL); + preload_dump_internal(&sb); + + sbuf_finish(&sb); + sbuf_delete(&sb); +} + +static int +sysctl_preload_dump(SYSCTL_HANDLER_ARGS) +{ + struct sbuf sb; + int error; + + if (preload_metadata == NULL) + return (EINVAL); + + sbuf_new_for_sysctl(&sb, NULL, 512, req); + preload_dump_internal(&sb); + + error = sbuf_finish(&sb); + sbuf_delete(&sb); + + return (error); +} +SYSCTL_PROC(_debug, OID_AUTO, dump_modinfo, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, + NULL, 0, sysctl_preload_dump, "A", + "pretty-print the bootloader metadata"); Modified: head/sys/riscv/riscv/machdep.c ============================================================================== --- head/sys/riscv/riscv/machdep.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/riscv/riscv/machdep.c Thu Oct 8 18:02:05 2020 (r366542) @@ -949,6 +949,15 @@ initriscv(struct riscv_bootparams *rvbp) cninit(); + /* + * Dump the boot metadata. We have to wait for cninit() since console + * output is required. If it's grossly incorrect the kernel will never + * make it this far. + */ + if ((boothowto & RB_VERBOSE) && + getenv_is_true("debug.dump_modinfo_at_boot")) + preload_dump(); + init_proc0(rvbp->kern_stack); msgbufinit(msgbufp, msgbufsize); Modified: head/sys/sys/linker.h ============================================================================== --- head/sys/sys/linker.h Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/sys/linker.h Thu Oct 8 18:02:05 2020 (r366542) @@ -257,6 +257,7 @@ extern caddr_t preload_search_next_name(caddr_t _base extern caddr_t preload_search_info(caddr_t _mod, int _inf); extern void preload_delete_name(const char *_name); extern void preload_bootstrap_relocate(vm_offset_t _offset); +extern void preload_dump(void); #ifdef KLD_DEBUG From owner-svn-src-all@freebsd.org Thu Oct 8 18:15:02 2020 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 AE43842E2FD; Thu, 8 Oct 2020 18:15:02 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C6fWB4Bmlz4LLQ; Thu, 8 Oct 2020 18:15:02 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: from mail-vk1-f174.google.com (mail-vk1-f174.google.com [209.85.221.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) (Authenticated sender: kevans) by smtp.freebsd.org (Postfix) with ESMTPSA id 6E6C0225F4; Thu, 8 Oct 2020 18:15:02 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: by mail-vk1-f174.google.com with SMTP id n141so1520517vke.9; Thu, 08 Oct 2020 11:15:02 -0700 (PDT) X-Gm-Message-State: AOAM530n8sZ2Wu4wgR2ZiC8K3Q2lkpumfEx9mBJuC/Md/jJcKrBKbVgr aOCAAhqMng7tjwcngisGhwKSYM1+QPiwIwmAeSc= X-Google-Smtp-Source: ABdhPJwNpxFoNHCKcrMLj+U7wZbmMQm1AZESSCeUPGl4r1fP9cw423Pb6JqqvwXp6S/XzpxhPP0kYUFxeXKvqRshjrw= X-Received: by 2002:a1f:3a09:: with SMTP id h9mr5587639vka.6.1602180901810; Thu, 08 Oct 2020 11:15:01 -0700 (PDT) MIME-Version: 1.0 References: <202010081802.098I26Rq052294@repo.freebsd.org> In-Reply-To: <202010081802.098I26Rq052294@repo.freebsd.org> From: Kyle Evans Date: Thu, 8 Oct 2020 13:14:42 -0500 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: svn commit: r366542 - in head/sys: amd64/amd64 arm/arm arm64/arm64 kern riscv/riscv sys To: Mitchell Horne Cc: src-committers , svn-src-all , svn-src-head Content-Type: text/plain; charset="UTF-8" X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Thu, 08 Oct 2020 18:15:02 -0000 On Thu, Oct 8, 2020 at 1:02 PM Mitchell Horne wrote: > > Author: mhorne > Date: Thu Oct 8 18:02:05 2020 > New Revision: 366542 > URL: https://svnweb.freebsd.org/changeset/base/366542 > > Log: > Add a routine to dump boot metadata > > The boot metadata (also referred to as modinfo, or preload metadata) > provides information about the size and location of the kernel, > pre-loaded modules, and other metadata (e.g. the EFI framebuffer) to be > consumed during by the kernel during early boot. It is encoded as a > series of type-length-value entries and is usually constructed by > loader(8) and passed to the kernel. It is also faked on some > architectures when booted by other means. > > Although much of the module information is available via kldstat(8), > there is no easy way to debug the metadata in its entirety. Add some > routines to parse this data and allow it to be printed to the console > during early boot or output via a sysctl. > > Since the output can be lengthly, printing to the console is gated > behind the debug.dump_modinfo_at_boot kenv variable as well as the > BOOTVERBOSE flag. The sysctl to print the metadata is named > debug.dump_modinfo. > Hi, Why both a tunable and boot -v? The tunable is already specifically scoped to just this operation, it seems a little odd to double-gate it. Thanks, Kyle Evans From owner-svn-src-all@freebsd.org Thu Oct 8 18:19:57 2020 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 60A8A42E736; Thu, 8 Oct 2020 18:19:57 +0000 (UTC) (envelope-from rpokala@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C6fcs22Wjz4LCl; Thu, 8 Oct 2020 18:19:57 +0000 (UTC) (envelope-from rpokala@freebsd.org) Received: from [192.168.1.10] (c-98-207-126-143.hsd1.ca.comcast.net [98.207.126.143]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: rpokala) by smtp.freebsd.org (Postfix) with ESMTPSA id 8545022F1F; Thu, 8 Oct 2020 18:19:56 +0000 (UTC) (envelope-from rpokala@freebsd.org) User-Agent: Microsoft-MacOutlook/16.41.20091302 Date: Thu, 08 Oct 2020 11:19:51 -0700 Subject: Re: svn commit: r366542 - in head/sys: amd64/amd64 arm/arm arm64/arm64 kern riscv/riscv sys From: Ravi Pokala To: Mitchell Horne , , , Message-ID: <3173155C-6862-4DC6-964E-4F1B1FA941E9@panasas.com> Thread-Topic: svn commit: r366542 - in head/sys: amd64/amd64 arm/arm arm64/arm64 kern riscv/riscv sys References: <202010081802.098I26Rq052294@repo.freebsd.org> In-Reply-To: <202010081802.098I26Rq052294@repo.freebsd.org> Mime-version: 1.0 Content-type: text/plain; charset="UTF-8" Content-transfer-encoding: quoted-printable X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Thu, 08 Oct 2020 18:19:57 -0000 Hi Mitchell, +static void +preload_dump_internal(struct sbuf *sbp) +{ + uint32_t *bptr, type, len; + + KASSERT(preload_metadata !=3D NULL, + ("%s called without setting up preload_metadata", __func__)); + + /* + * Iterate through the TLV-encoded sections. + */ + bptr =3D (uint32_t *)preload_metadata; + sbuf_putc(sbp, '\n'); + while (bptr[0] !=3D MODINFO_END || bptr[0] !=3D MODINFO_END) { The same expression is on both sides of the "||" ...? Thanks, Ravi (rpokala@) + sbuf_printf(sbp, " %p:\n", bptr); + type =3D *bptr++; + len =3D *bptr++; + + sbuf_printf(sbp, "\ttype:\t(%#04x) ", type); + preload_modinfo_type(sbp, type); + sbuf_putc(sbp, '\n'); + sbuf_printf(sbp, "\tlen:\t%u\n", len); + sbuf_cat(sbp, "\tvalue:\t"); + preload_modinfo_value(sbp, bptr, type, len); + sbuf_putc(sbp, '\n'); + + bptr +=3D roundup(len, sizeof(u_long)) / sizeof(uint32_t); + } +} =EF=BB=BF-----Original Message----- From: on behalf of Mitchell Horne Date: 2020-10-08, Thursday at 11:02 To: , , Subject: svn commit: r366542 - in head/sys: amd64/amd64 arm/arm arm64/arm64= kern riscv/riscv sys Author: mhorne Date: Thu Oct 8 18:02:05 2020 New Revision: 366542 URL: https://svnweb.freebsd.org/changeset/base/366542 Log: Add a routine to dump boot metadata The boot metadata (also referred to as modinfo, or preload metadata) provides information about the size and location of the kernel, pre-loaded modules, and other metadata (e.g. the EFI framebuffer) to = be consumed during by the kernel during early boot. It is encoded as a series of type-length-value entries and is usually constructed by loader(8) and passed to the kernel. It is also faked on some architectures when booted by other means. Although much of the module information is available via kldstat(8), there is no easy way to debug the metadata in its entirety. Add some routines to parse this data and allow it to be printed to the console during early boot or output via a sysctl. Since the output can be lengthly, printing to the console is gated behind the debug.dump_modinfo_at_boot kenv variable as well as the BOOTVERBOSE flag. The sysctl to print the metadata is named debug.dump_modinfo. Reviewed by: tsoome Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D26687 Modified: head/sys/amd64/amd64/machdep.c head/sys/arm/arm/machdep.c head/sys/arm64/arm64/machdep.c head/sys/kern/subr_module.c head/sys/riscv/riscv/machdep.c head/sys/sys/linker.h Modified: head/sys/amd64/amd64/machdep.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D --- head/sys/amd64/amd64/machdep.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/amd64/amd64/machdep.c Thu Oct 8 18:02:05 2020 (r366542) @@ -1853,6 +1853,15 @@ hammer_time(u_int64_t modulep, u_int64_t physfre= e) if (late_console) cninit(); + /* + * Dump the boot metadata. We have to wait for cninit() since console + * output is required. If it's grossly incorrect the kernel will neve= r + * make it this far. + */ + if ((boothowto & RB_VERBOSE) && + getenv_is_true("debug.dump_modinfo_at_boot")) + preload_dump(); + #ifdef DEV_ISA #ifdef DEV_ATPIC elcr_probe(); Modified: head/sys/arm/arm/machdep.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D --- head/sys/arm/arm/machdep.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/arm/arm/machdep.c Thu Oct 8 18:02:05 2020 (r366542) @@ -1027,6 +1027,15 @@ initarm(struct arm_boot_params *abp) debugf(" dtbp =3D 0x%08x\n", (uint32_t)dtbp); arm_print_kenv(); + /* + * Dump the boot metadata. We have to wait for cninit() since console + * output is required. If it's grossly incorrect the kernel will neve= r + * make it this far. + */ + if ((boothowto & RB_VERBOSE) && + getenv_is_true("debug.dump_modinfo_at_boot")) + preload_dump(); + env =3D kern_getenv("kernelname"); if (env !=3D NULL) { strlcpy(kernelname, env, sizeof(kernelname)); Modified: head/sys/arm64/arm64/machdep.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D --- head/sys/arm64/arm64/machdep.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/arm64/arm64/machdep.c Thu Oct 8 18:02:05 2020 (r366542) @@ -1242,6 +1242,15 @@ initarm(struct arm64_bootparams *abp) panic("Invalid bus configuration: %s", kern_getenv("kern.cfg.order")); + /* + * Dump the boot metadata. We have to wait for cninit() since console + * output is required. If it's grossly incorrect the kernel will neve= r + * make it this far. + */ + if ((boothowto & RB_VERBOSE) && + getenv_is_true("debug.dump_modinfo_at_boot")) + preload_dump(); + init_proc0(abp->kern_stack); msgbufinit(msgbufp, msgbufsize); mutex_init(); Modified: head/sys/kern/subr_module.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D --- head/sys/kern/subr_module.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/kern/subr_module.c Thu Oct 8 18:02:05 2020 (r366542) @@ -3,6 +3,8 @@ * * Copyright (c) 1998 Michael Smith * All rights reserved. + * Copyright (c) 2020 NetApp Inc. + * Copyright (c) 2020 Klara Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,7 +34,11 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include +#include + #include #include @@ -304,3 +310,249 @@ preload_bootstrap_relocate(vm_offset_t offset) } } } + +/* + * Parse the modinfo type and append to the provided sbuf. + */ +static void +preload_modinfo_type(struct sbuf *sbp, int type) +{ + + if ((type & MODINFO_METADATA) =3D=3D 0) { + switch (type) { + case MODINFO_END: + sbuf_cat(sbp, "MODINFO_END"); + break; + case MODINFO_NAME: + sbuf_cat(sbp, "MODINFO_NAME"); + break; + case MODINFO_TYPE: + sbuf_cat(sbp, "MODINFO_TYPE"); + break; + case MODINFO_ADDR: + sbuf_cat(sbp, "MODINFO_ADDR"); + break; + case MODINFO_SIZE: + sbuf_cat(sbp, "MODINFO_SIZE"); + break; + case MODINFO_EMPTY: + sbuf_cat(sbp, "MODINFO_EMPTY"); + break; + case MODINFO_ARGS: + sbuf_cat(sbp, "MODINFO_ARGS"); + break; + default: + sbuf_cat(sbp, "unrecognized modinfo attribute"); + } + + return; + } + + sbuf_cat(sbp, "MODINFO_METADATA | "); + switch (type & ~MODINFO_METADATA) { + case MODINFOMD_ELFHDR: + sbuf_cat(sbp, "MODINFOMD_ELFHDR"); + break; + case MODINFOMD_SSYM: + sbuf_cat(sbp, "MODINFOMD_SSYM"); + break; + case MODINFOMD_ESYM: + sbuf_cat(sbp, "MODINFOMD_ESYM"); + break; + case MODINFOMD_DYNAMIC: + sbuf_cat(sbp, "MODINFOMD_DYNAMIC"); + break; + case MODINFOMD_ENVP: + sbuf_cat(sbp, "MODINFOMD_ENVP"); + break; + case MODINFOMD_HOWTO: + sbuf_cat(sbp, "MODINFOMD_HOWTO"); + break; + case MODINFOMD_KERNEND: + sbuf_cat(sbp, "MODINFOMD_KERNEND"); + break; + case MODINFOMD_SHDR: + sbuf_cat(sbp, "MODINFOMD_SHDR"); + break; + case MODINFOMD_CTORS_ADDR: + sbuf_cat(sbp, "MODINFOMD_CTORS_ADDR"); + break; + case MODINFOMD_CTORS_SIZE: + sbuf_cat(sbp, "MODINFOMD_CTORS_SIZE"); + break; + case MODINFOMD_FW_HANDLE: + sbuf_cat(sbp, "MODINFOMD_FW_HANDLE"); + break; + case MODINFOMD_KEYBUF: + sbuf_cat(sbp, "MODINFOMD_KEYBUF"); + break; +#ifdef MODINFOMD_SMAP + case MODINFOMD_SMAP: + sbuf_cat(sbp, "MODINFOMD_SMAP"); + break; +#endif +#ifdef MODINFOMD_SMAP_XATTR + case MODINFOMD_SMAP_XATTR: + sbuf_cat(sbp, "MODINFOMD_SMAP_XATTR"); + break; +#endif +#ifdef MODINFOMD_DTBP + case MODINFOMD_DTBP: + sbuf_cat(sbp, "MODINFOMD_DTBP"); + break; +#endif +#ifdef MODINFOMD_EFI_MAP + case MODINFOMD_EFI_MAP: + sbuf_cat(sbp, "MODINFOMD_EFI_MAP"); + break; +#endif +#ifdef MODINFOMD_EFI_FB + case MODINFOMD_EFI_FB: + sbuf_cat(sbp, "MODINFOMD_EFI_FB"); + break; +#endif +#ifdef MODINFOMD_MODULEP + case MODINFOMD_MODULEP: + sbuf_cat(sbp, "MODINFOMD_MODULEP"); + break; +#endif + default: + sbuf_cat(sbp, "unrecognized metadata type"); + } +} + +/* + * Print the modinfo value, depending on type. + */ +static void +preload_modinfo_value(struct sbuf *sbp, uint32_t *bptr, int type, int = len) +{ +#ifdef __LP64__ +#define sbuf_print_vmoffset(sb, o) sbuf_printf(sb, "0x%016lx", o); +#else +#define sbuf_print_vmoffset(sb, o) sbuf_printf(sb, "0x%08x", o); +#endif + + switch (type) { + case MODINFO_NAME: + case MODINFO_TYPE: + case MODINFO_ARGS: + sbuf_printf(sbp, "%s", (char *)bptr); + break; + case MODINFO_SIZE: + case MODINFO_METADATA | MODINFOMD_CTORS_SIZE: + sbuf_printf(sbp, "%lu", *(u_long *)bptr); + break; + case MODINFO_ADDR: + case MODINFO_METADATA | MODINFOMD_SSYM: + case MODINFO_METADATA | MODINFOMD_ESYM: + case MODINFO_METADATA | MODINFOMD_DYNAMIC: + case MODINFO_METADATA | MODINFOMD_KERNEND: + case MODINFO_METADATA | MODINFOMD_ENVP: + case MODINFO_METADATA | MODINFOMD_CTORS_ADDR: +#ifdef MODINFOMD_SMAP + case MODINFO_METADATA | MODINFOMD_SMAP: +#endif +#ifdef MODINFOMD_SMAP_XATTR + case MODINFO_METADATA | MODINFOMD_SMAP_XATTR: +#endif +#ifdef MODINFOMD_DTBP + case MODINFO_METADATA | MODINFOMD_DTBP: +#endif +#ifdef MODINFOMD_EFI_FB + case MODINFO_METADATA | MODINFOMD_EFI_FB: +#endif + sbuf_print_vmoffset(sbp, *(vm_offset_t *)bptr); + break; + case MODINFO_METADATA | MODINFOMD_HOWTO: + sbuf_printf(sbp, "0x%08x", *bptr); + break; + case MODINFO_METADATA | MODINFOMD_SHDR: + case MODINFO_METADATA | MODINFOMD_ELFHDR: + case MODINFO_METADATA | MODINFOMD_FW_HANDLE: + case MODINFO_METADATA | MODINFOMD_KEYBUF: +#ifdef MODINFOMD_EFI_MAP + case MODINFO_METADATA | MODINFOMD_EFI_MAP: +#endif + /* Don't print data buffers. */ + sbuf_cat(sbp, "buffer contents omitted"); + break; + default: + break; + } +#undef sbuf_print_vmoffset +} + +static void +preload_dump_internal(struct sbuf *sbp) +{ + uint32_t *bptr, type, len; + + KASSERT(preload_metadata !=3D NULL, + ("%s called without setting up preload_metadata", __func__)); + + /* + * Iterate through the TLV-encoded sections. + */ + bptr =3D (uint32_t *)preload_metadata; + sbuf_putc(sbp, '\n'); + while (bptr[0] !=3D MODINFO_END || bptr[0] !=3D MODINFO_END) { + sbuf_printf(sbp, " %p:\n", bptr); + type =3D *bptr++; + len =3D *bptr++; + + sbuf_printf(sbp, "\ttype:\t(%#04x) ", type); + preload_modinfo_type(sbp, type); + sbuf_putc(sbp, '\n'); + sbuf_printf(sbp, "\tlen:\t%u\n", len); + sbuf_cat(sbp, "\tvalue:\t"); + preload_modinfo_value(sbp, bptr, type, len); + sbuf_putc(sbp, '\n'); + + bptr +=3D roundup(len, sizeof(u_long)) / sizeof(uint32_t); + } +} + +/* + * Print the preloaded data to the console. Called from the machine-de= pendent + * initialization routines, e.g. hammer_time(). + */ +void +preload_dump(void) +{ + char buf[512]; + struct sbuf sb; + + /* + * This function is expected to be called before malloc is available, + * so use a static buffer and struct sbuf. + */ + sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN); + sbuf_set_drain(&sb, sbuf_printf_drain, NULL); + preload_dump_internal(&sb); + + sbuf_finish(&sb); + sbuf_delete(&sb); +} + +static int +sysctl_preload_dump(SYSCTL_HANDLER_ARGS) +{ + struct sbuf sb; + int error; + + if (preload_metadata =3D=3D NULL) + return (EINVAL); + + sbuf_new_for_sysctl(&sb, NULL, 512, req); + preload_dump_internal(&sb); + + error =3D sbuf_finish(&sb); + sbuf_delete(&sb); + + return (error); +} +SYSCTL_PROC(_debug, OID_AUTO, dump_modinfo, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, + NULL, 0, sysctl_preload_dump, "A", + "pretty-print the bootloader metadata"); Modified: head/sys/riscv/riscv/machdep.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D --- head/sys/riscv/riscv/machdep.c Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/riscv/riscv/machdep.c Thu Oct 8 18:02:05 2020 (r366542) @@ -949,6 +949,15 @@ initriscv(struct riscv_bootparams *rvbp) cninit(); + /* + * Dump the boot metadata. We have to wait for cninit() since console + * output is required. If it's grossly incorrect the kernel will neve= r + * make it this far. + */ + if ((boothowto & RB_VERBOSE) && + getenv_is_true("debug.dump_modinfo_at_boot")) + preload_dump(); + init_proc0(rvbp->kern_stack); msgbufinit(msgbufp, msgbufsize); Modified: head/sys/sys/linker.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D --- head/sys/sys/linker.h Thu Oct 8 17:30:05 2020 (r366541) +++ head/sys/sys/linker.h Thu Oct 8 18:02:05 2020 (r366542) @@ -257,6 +257,7 @@ extern caddr_t preload_search_next_name(caddr_t _b= ase extern caddr_t preload_search_info(caddr_t _mod, int _inf); extern void preload_delete_name(const char *_name); extern void preload_bootstrap_relocate(vm_offset_t _offset); +extern void preload_dump(void); #ifdef KLD_DEBUG From owner-svn-src-all@freebsd.org Thu Oct 8 18:29:17 2020 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 C409342E8CB; Thu, 8 Oct 2020 18:29:17 +0000 (UTC) (envelope-from mhorne@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6fqd4npPz4M9t; Thu, 8 Oct 2020 18:29:17 +0000 (UTC) (envelope-from mhorne@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 89386CF2D; Thu, 8 Oct 2020 18:29:17 +0000 (UTC) (envelope-from mhorne@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098ITHkj065742; Thu, 8 Oct 2020 18:29:17 GMT (envelope-from mhorne@FreeBSD.org) Received: (from mhorne@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098ITHNE065741; Thu, 8 Oct 2020 18:29:17 GMT (envelope-from mhorne@FreeBSD.org) Message-Id: <202010081829.098ITHNE065741@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mhorne set sender to mhorne@FreeBSD.org using -f From: Mitchell Horne Date: Thu, 8 Oct 2020 18:29:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366543 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: mhorne X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366543 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.33 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: Thu, 08 Oct 2020 18:29:17 -0000 Author: mhorne Date: Thu Oct 8 18:29:17 2020 New Revision: 366543 URL: https://svnweb.freebsd.org/changeset/base/366543 Log: Fix a loop condition The correct way to identify the end of the metadata is two adjacent entries set to zero/MODINFO_END. I made a typo and this was checking the first entry twice. Reported by: rpokala Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Modified: head/sys/kern/subr_module.c Modified: head/sys/kern/subr_module.c ============================================================================== --- head/sys/kern/subr_module.c Thu Oct 8 18:02:05 2020 (r366542) +++ head/sys/kern/subr_module.c Thu Oct 8 18:29:17 2020 (r366543) @@ -496,7 +496,7 @@ preload_dump_internal(struct sbuf *sbp) */ bptr = (uint32_t *)preload_metadata; sbuf_putc(sbp, '\n'); - while (bptr[0] != MODINFO_END || bptr[0] != MODINFO_END) { + while (bptr[0] != MODINFO_END || bptr[1] != MODINFO_END) { sbuf_printf(sbp, " %p:\n", bptr); type = *bptr++; len = *bptr++; From owner-svn-src-all@freebsd.org Thu Oct 8 18:31:42 2020 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 2ED3A42EB80; Thu, 8 Oct 2020 18:31:42 +0000 (UTC) (envelope-from mhorne@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C6ftQ0pYmz4M8v; Thu, 8 Oct 2020 18:31:42 +0000 (UTC) (envelope-from mhorne@freebsd.org) Received: from mail-yb1-f182.google.com (mail-yb1-f182.google.com [209.85.219.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) (Authenticated sender: mhorne) by smtp.freebsd.org (Postfix) with ESMTPSA id EE8C223244; Thu, 8 Oct 2020 18:31:41 +0000 (UTC) (envelope-from mhorne@freebsd.org) Received: by mail-yb1-f182.google.com with SMTP id h6so5236595ybi.11; Thu, 08 Oct 2020 11:31:41 -0700 (PDT) X-Gm-Message-State: AOAM5317XwCzKnLCGW1VrfjeOzWvnCF3q7IrVkEkPgfTxonieDj6Hx9j QCX5Rm4e8YMkOT7/CKgOqRMn5JVZr2Tt4HObbHw= X-Google-Smtp-Source: ABdhPJwBsEYzPFEqvJ064owZZ4NdQCNwiVjRZSzea4QH7gQvyZKKBmByo8ackAPSs+qklqJvc1VDBaH38L+ppemKLBk= X-Received: by 2002:a25:ca02:: with SMTP id a2mr14603996ybg.36.1602181901361; Thu, 08 Oct 2020 11:31:41 -0700 (PDT) MIME-Version: 1.0 References: <202010081802.098I26Rq052294@repo.freebsd.org> <3173155C-6862-4DC6-964E-4F1B1FA941E9@panasas.com> In-Reply-To: <3173155C-6862-4DC6-964E-4F1B1FA941E9@panasas.com> From: Mitchell Horne Date: Thu, 8 Oct 2020 15:31:29 -0300 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: svn commit: r366542 - in head/sys: amd64/amd64 arm/arm arm64/arm64 kern riscv/riscv sys To: Ravi Pokala Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Thu, 08 Oct 2020 18:31:42 -0000 On Thu, Oct 8, 2020 at 3:19 PM Ravi Pokala wrote: > > Hi Mitchell, > > +static void > +preload_dump_internal(struct sbuf *sbp) > +{ > + uint32_t *bptr, type, len; > + > + KASSERT(preload_metadata !=3D NULL, > + ("%s called without setting up preload_metadata", __func__)); > + > + /* > + * Iterate through the TLV-encoded sections. > + */ > + bptr =3D (uint32_t *)preload_metadata; > + sbuf_putc(sbp, '\n'); > + while (bptr[0] !=3D MODINFO_END || bptr[0] !=3D MODINFO_END) { > > The same expression is on both sides of the "||" ...? > > Thanks, > > Ravi (rpokala@) Thank you for catching this --- it should be checking bptr[0] and bptr[1]. Fixed in r366543. Mitchell > > + sbuf_printf(sbp, " %p:\n", bptr); > + type =3D *bptr++; > + len =3D *bptr++; > + > + sbuf_printf(sbp, "\ttype:\t(%#04x) ", type); > + preload_modinfo_type(sbp, type); > + sbuf_putc(sbp, '\n'); > + sbuf_printf(sbp, "\tlen:\t%u\n", len); > + sbuf_cat(sbp, "\tvalue:\t"); > + preload_modinfo_value(sbp, bptr, type, len); > + sbuf_putc(sbp, '\n'); > + > + bptr +=3D roundup(len, sizeof(u_long)) / sizeof(uint32_t)= ; > + } > +} > > > > > =EF=BB=BF-----Original Message----- > From: on behalf of Mitchell Horne > Date: 2020-10-08, Thursday at 11:02 > To: , , > Subject: svn commit: r366542 - in head/sys: amd64/amd64 arm/arm arm64/arm= 64 kern riscv/riscv sys > > Author: mhorne > Date: Thu Oct 8 18:02:05 2020 > New Revision: 366542 > URL: https://svnweb.freebsd.org/changeset/base/366542 > > Log: > Add a routine to dump boot metadata > > The boot metadata (also referred to as modinfo, or preload metadata= ) > provides information about the size and location of the kernel, > pre-loaded modules, and other metadata (e.g. the EFI framebuffer) t= o be > consumed during by the kernel during early boot. It is encoded as a > series of type-length-value entries and is usually constructed by > loader(8) and passed to the kernel. It is also faked on some > architectures when booted by other means. > > Although much of the module information is available via kldstat(8)= , > there is no easy way to debug the metadata in its entirety. Add som= e > routines to parse this data and allow it to be printed to the conso= le > during early boot or output via a sysctl. > > Since the output can be lengthly, printing to the console is gated > behind the debug.dump_modinfo_at_boot kenv variable as well as the > BOOTVERBOSE flag. The sysctl to print the metadata is named > debug.dump_modinfo. > > Reviewed by: tsoome > Sponsored by: NetApp, Inc. > Sponsored by: Klara, Inc. > Differential Revision: https://reviews.freebsd.org/D26687 > > Modified: > head/sys/amd64/amd64/machdep.c > head/sys/arm/arm/machdep.c > head/sys/arm64/arm64/machdep.c > head/sys/kern/subr_module.c > head/sys/riscv/riscv/machdep.c > head/sys/sys/linker.h > > Modified: head/sys/amd64/amd64/machdep.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D > --- head/sys/amd64/amd64/machdep.c Thu Oct 8 17:30:05 2020 (= r366541) > +++ head/sys/amd64/amd64/machdep.c Thu Oct 8 18:02:05 2020 (= r366542) > @@ -1853,6 +1853,15 @@ hammer_time(u_int64_t modulep, u_int64_t physf= ree) > if (late_console) > cninit(); > > + /* > + * Dump the boot metadata. We have to wait for cninit() since con= sole > + * output is required. If it's grossly incorrect the kernel will = never > + * make it this far. > + */ > + if ((boothowto & RB_VERBOSE) && > + getenv_is_true("debug.dump_modinfo_at_boot")) > + preload_dump(); > + > #ifdef DEV_ISA > #ifdef DEV_ATPIC > elcr_probe(); > > Modified: head/sys/arm/arm/machdep.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D > --- head/sys/arm/arm/machdep.c Thu Oct 8 17:30:05 2020 (= r366541) > +++ head/sys/arm/arm/machdep.c Thu Oct 8 18:02:05 2020 (= r366542) > @@ -1027,6 +1027,15 @@ initarm(struct arm_boot_params *abp) > debugf(" dtbp =3D 0x%08x\n", (uint32_t)dtbp); > arm_print_kenv(); > > + /* > + * Dump the boot metadata. We have to wait for cninit() since con= sole > + * output is required. If it's grossly incorrect the kernel will = never > + * make it this far. > + */ > + if ((boothowto & RB_VERBOSE) && > + getenv_is_true("debug.dump_modinfo_at_boot")) > + preload_dump(); > + > env =3D kern_getenv("kernelname"); > if (env !=3D NULL) { > strlcpy(kernelname, env, sizeof(kernelname)); > > Modified: head/sys/arm64/arm64/machdep.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D > --- head/sys/arm64/arm64/machdep.c Thu Oct 8 17:30:05 2020 (= r366541) > +++ head/sys/arm64/arm64/machdep.c Thu Oct 8 18:02:05 2020 (= r366542) > @@ -1242,6 +1242,15 @@ initarm(struct arm64_bootparams *abp) > panic("Invalid bus configuration: %s", > kern_getenv("kern.cfg.order")); > > + /* > + * Dump the boot metadata. We have to wait for cninit() since con= sole > + * output is required. If it's grossly incorrect the kernel will = never > + * make it this far. > + */ > + if ((boothowto & RB_VERBOSE) && > + getenv_is_true("debug.dump_modinfo_at_boot")) > + preload_dump(); > + > init_proc0(abp->kern_stack); > msgbufinit(msgbufp, msgbufsize); > mutex_init(); > > Modified: head/sys/kern/subr_module.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D > --- head/sys/kern/subr_module.c Thu Oct 8 17:30:05 2020 (= r366541) > +++ head/sys/kern/subr_module.c Thu Oct 8 18:02:05 2020 (= r366542) > @@ -3,6 +3,8 @@ > * > * Copyright (c) 1998 Michael Smith > * All rights reserved. > + * Copyright (c) 2020 NetApp Inc. > + * Copyright (c) 2020 Klara Inc. > * > * Redistribution and use in source and binary forms, with or withou= t > * modification, are permitted provided that the following condition= s > @@ -32,7 +34,11 @@ __FBSDID("$FreeBSD$"); > #include > #include > #include > +#include > +#include > > +#include > + > #include > #include > > @@ -304,3 +310,249 @@ preload_bootstrap_relocate(vm_offset_t offset) > } > } > } > + > +/* > + * Parse the modinfo type and append to the provided sbuf. > + */ > +static void > +preload_modinfo_type(struct sbuf *sbp, int type) > +{ > + > + if ((type & MODINFO_METADATA) =3D=3D 0) { > + switch (type) { > + case MODINFO_END: > + sbuf_cat(sbp, "MODINFO_END"); > + break; > + case MODINFO_NAME: > + sbuf_cat(sbp, "MODINFO_NAME"); > + break; > + case MODINFO_TYPE: > + sbuf_cat(sbp, "MODINFO_TYPE"); > + break; > + case MODINFO_ADDR: > + sbuf_cat(sbp, "MODINFO_ADDR"); > + break; > + case MODINFO_SIZE: > + sbuf_cat(sbp, "MODINFO_SIZE"); > + break; > + case MODINFO_EMPTY: > + sbuf_cat(sbp, "MODINFO_EMPTY"); > + break; > + case MODINFO_ARGS: > + sbuf_cat(sbp, "MODINFO_ARGS"); > + break; > + default: > + sbuf_cat(sbp, "unrecognized modinfo attribute"); > + } > + > + return; > + } > + > + sbuf_cat(sbp, "MODINFO_METADATA | "); > + switch (type & ~MODINFO_METADATA) { > + case MODINFOMD_ELFHDR: > + sbuf_cat(sbp, "MODINFOMD_ELFHDR"); > + break; > + case MODINFOMD_SSYM: > + sbuf_cat(sbp, "MODINFOMD_SSYM"); > + break; > + case MODINFOMD_ESYM: > + sbuf_cat(sbp, "MODINFOMD_ESYM"); > + break; > + case MODINFOMD_DYNAMIC: > + sbuf_cat(sbp, "MODINFOMD_DYNAMIC"); > + break; > + case MODINFOMD_ENVP: > + sbuf_cat(sbp, "MODINFOMD_ENVP"); > + break; > + case MODINFOMD_HOWTO: > + sbuf_cat(sbp, "MODINFOMD_HOWTO"); > + break; > + case MODINFOMD_KERNEND: > + sbuf_cat(sbp, "MODINFOMD_KERNEND"); > + break; > + case MODINFOMD_SHDR: > + sbuf_cat(sbp, "MODINFOMD_SHDR"); > + break; > + case MODINFOMD_CTORS_ADDR: > + sbuf_cat(sbp, "MODINFOMD_CTORS_ADDR"); > + break; > + case MODINFOMD_CTORS_SIZE: > + sbuf_cat(sbp, "MODINFOMD_CTORS_SIZE"); > + break; > + case MODINFOMD_FW_HANDLE: > + sbuf_cat(sbp, "MODINFOMD_FW_HANDLE"); > + break; > + case MODINFOMD_KEYBUF: > + sbuf_cat(sbp, "MODINFOMD_KEYBUF"); > + break; > +#ifdef MODINFOMD_SMAP > + case MODINFOMD_SMAP: > + sbuf_cat(sbp, "MODINFOMD_SMAP"); > + break; > +#endif > +#ifdef MODINFOMD_SMAP_XATTR > + case MODINFOMD_SMAP_XATTR: > + sbuf_cat(sbp, "MODINFOMD_SMAP_XATTR"); > + break; > +#endif > +#ifdef MODINFOMD_DTBP > + case MODINFOMD_DTBP: > + sbuf_cat(sbp, "MODINFOMD_DTBP"); > + break; > +#endif > +#ifdef MODINFOMD_EFI_MAP > + case MODINFOMD_EFI_MAP: > + sbuf_cat(sbp, "MODINFOMD_EFI_MAP"); > + break; > +#endif > +#ifdef MODINFOMD_EFI_FB > + case MODINFOMD_EFI_FB: > + sbuf_cat(sbp, "MODINFOMD_EFI_FB"); > + break; > +#endif > +#ifdef MODINFOMD_MODULEP > + case MODINFOMD_MODULEP: > + sbuf_cat(sbp, "MODINFOMD_MODULEP"); > + break; > +#endif > + default: > + sbuf_cat(sbp, "unrecognized metadata type"); > + } > +} > + > +/* > + * Print the modinfo value, depending on type. > + */ > +static void > +preload_modinfo_value(struct sbuf *sbp, uint32_t *bptr, int type, in= t len) > +{ > +#ifdef __LP64__ > +#define sbuf_print_vmoffset(sb, o) sbuf_printf(sb, "0x%016lx", o); > +#else > +#define sbuf_print_vmoffset(sb, o) sbuf_printf(sb, "0x%08x", o); > +#endif > + > + switch (type) { > + case MODINFO_NAME: > + case MODINFO_TYPE: > + case MODINFO_ARGS: > + sbuf_printf(sbp, "%s", (char *)bptr); > + break; > + case MODINFO_SIZE: > + case MODINFO_METADATA | MODINFOMD_CTORS_SIZE: > + sbuf_printf(sbp, "%lu", *(u_long *)bptr); > + break; > + case MODINFO_ADDR: > + case MODINFO_METADATA | MODINFOMD_SSYM: > + case MODINFO_METADATA | MODINFOMD_ESYM: > + case MODINFO_METADATA | MODINFOMD_DYNAMIC: > + case MODINFO_METADATA | MODINFOMD_KERNEND: > + case MODINFO_METADATA | MODINFOMD_ENVP: > + case MODINFO_METADATA | MODINFOMD_CTORS_ADDR: > +#ifdef MODINFOMD_SMAP > + case MODINFO_METADATA | MODINFOMD_SMAP: > +#endif > +#ifdef MODINFOMD_SMAP_XATTR > + case MODINFO_METADATA | MODINFOMD_SMAP_XATTR: > +#endif > +#ifdef MODINFOMD_DTBP > + case MODINFO_METADATA | MODINFOMD_DTBP: > +#endif > +#ifdef MODINFOMD_EFI_FB > + case MODINFO_METADATA | MODINFOMD_EFI_FB: > +#endif > + sbuf_print_vmoffset(sbp, *(vm_offset_t *)bptr); > + break; > + case MODINFO_METADATA | MODINFOMD_HOWTO: > + sbuf_printf(sbp, "0x%08x", *bptr); > + break; > + case MODINFO_METADATA | MODINFOMD_SHDR: > + case MODINFO_METADATA | MODINFOMD_ELFHDR: > + case MODINFO_METADATA | MODINFOMD_FW_HANDLE: > + case MODINFO_METADATA | MODINFOMD_KEYBUF: > +#ifdef MODINFOMD_EFI_MAP > + case MODINFO_METADATA | MODINFOMD_EFI_MAP: > +#endif > + /* Don't print data buffers. */ > + sbuf_cat(sbp, "buffer contents omitted"); > + break; > + default: > + break; > + } > +#undef sbuf_print_vmoffset > +} > + > +static void > +preload_dump_internal(struct sbuf *sbp) > +{ > + uint32_t *bptr, type, len; > + > + KASSERT(preload_metadata !=3D NULL, > + ("%s called without setting up preload_metadata", __func__)); > + > + /* > + * Iterate through the TLV-encoded sections. > + */ > + bptr =3D (uint32_t *)preload_metadata; > + sbuf_putc(sbp, '\n'); > + while (bptr[0] !=3D MODINFO_END || bptr[0] !=3D MODINFO_END) { > + sbuf_printf(sbp, " %p:\n", bptr); > + type =3D *bptr++; > + len =3D *bptr++; > + > + sbuf_printf(sbp, "\ttype:\t(%#04x) ", type); > + preload_modinfo_type(sbp, type); > + sbuf_putc(sbp, '\n'); > + sbuf_printf(sbp, "\tlen:\t%u\n", len); > + sbuf_cat(sbp, "\tvalue:\t"); > + preload_modinfo_value(sbp, bptr, type, len); > + sbuf_putc(sbp, '\n'); > + > + bptr +=3D roundup(len, sizeof(u_long)) / sizeof(uint32_t)= ; > + } > +} > + > +/* > + * Print the preloaded data to the console. Called from the machine-= dependent > + * initialization routines, e.g. hammer_time(). > + */ > +void > +preload_dump(void) > +{ > + char buf[512]; > + struct sbuf sb; > + > + /* > + * This function is expected to be called before malloc is availa= ble, > + * so use a static buffer and struct sbuf. > + */ > + sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN); > + sbuf_set_drain(&sb, sbuf_printf_drain, NULL); > + preload_dump_internal(&sb); > + > + sbuf_finish(&sb); > + sbuf_delete(&sb); > +} > + > +static int > +sysctl_preload_dump(SYSCTL_HANDLER_ARGS) > +{ > + struct sbuf sb; > + int error; > + > + if (preload_metadata =3D=3D NULL) > + return (EINVAL); > + > + sbuf_new_for_sysctl(&sb, NULL, 512, req); > + preload_dump_internal(&sb); > + > + error =3D sbuf_finish(&sb); > + sbuf_delete(&sb); > + > + return (error); > +} > +SYSCTL_PROC(_debug, OID_AUTO, dump_modinfo, > + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, > + NULL, 0, sysctl_preload_dump, "A", > + "pretty-print the bootloader metadata"); > > Modified: head/sys/riscv/riscv/machdep.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D > --- head/sys/riscv/riscv/machdep.c Thu Oct 8 17:30:05 2020 (= r366541) > +++ head/sys/riscv/riscv/machdep.c Thu Oct 8 18:02:05 2020 (= r366542) > @@ -949,6 +949,15 @@ initriscv(struct riscv_bootparams *rvbp) > > cninit(); > > + /* > + * Dump the boot metadata. We have to wait for cninit() since con= sole > + * output is required. If it's grossly incorrect the kernel will = never > + * make it this far. > + */ > + if ((boothowto & RB_VERBOSE) && > + getenv_is_true("debug.dump_modinfo_at_boot")) > + preload_dump(); > + > init_proc0(rvbp->kern_stack); > > msgbufinit(msgbufp, msgbufsize); > > Modified: head/sys/sys/linker.h > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D > --- head/sys/sys/linker.h Thu Oct 8 17:30:05 2020 (r366541) > +++ head/sys/sys/linker.h Thu Oct 8 18:02:05 2020 (r366542) > @@ -257,6 +257,7 @@ extern caddr_t preload_search_next_name(= caddr_t _base > extern caddr_t preload_search_info(caddr_t _mod, int _in= f); > extern void preload_delete_name(const char *_name); > extern void preload_bootstrap_relocate(vm_offset_t _o= ffset); > +extern void preload_dump(void); > > #ifdef KLD_DEBUG > > > From owner-svn-src-all@freebsd.org Thu Oct 8 18:35:22 2020 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 7B9B042EF08; Thu, 8 Oct 2020 18:35:22 +0000 (UTC) (envelope-from rpokala@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C6fyf2kgpz4MxS; Thu, 8 Oct 2020 18:35:22 +0000 (UTC) (envelope-from rpokala@freebsd.org) Received: from [192.168.1.10] (c-98-207-126-143.hsd1.ca.comcast.net [98.207.126.143]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: rpokala) by smtp.freebsd.org (Postfix) with ESMTPSA id B24BB2313C; Thu, 8 Oct 2020 18:35:21 +0000 (UTC) (envelope-from rpokala@freebsd.org) User-Agent: Microsoft-MacOutlook/16.41.20091302 Date: Thu, 08 Oct 2020 11:35:18 -0700 Subject: Re: svn commit: r366543 - head/sys/kern From: Ravi Pokala To: Mitchell Horne , , , Message-ID: <3C85CF6B-CB67-4446-879B-21FFB52A1AF4@panasas.com> Thread-Topic: svn commit: r366543 - head/sys/kern References: <202010081829.098ITHNE065741@repo.freebsd.org> In-Reply-To: <202010081829.098ITHNE065741@repo.freebsd.org> Mime-version: 1.0 Content-type: text/plain; charset="UTF-8" Content-transfer-encoding: 7bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Thu, 08 Oct 2020 18:35:22 -0000 -----Original Message----- From: on behalf of Mitchell Horne Date: 2020-10-08, Thursday at 11:29 To: , , Subject: svn commit: r366543 - head/sys/kern Author: mhorne Date: Thu Oct 8 18:29:17 2020 New Revision: 366543 URL: https://svnweb.freebsd.org/changeset/base/366543 Log: Fix a loop condition The correct way to identify the end of the metadata is two adjacent entries set to zero/MODINFO_END. I made a typo and this was checking the first entry twice. Reported by: rpokala Thanks! :-) Ravi (rpokala@) Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Modified: head/sys/kern/subr_module.c Modified: head/sys/kern/subr_module.c ============================================================================== --- head/sys/kern/subr_module.c Thu Oct 8 18:02:05 2020 (r366542) +++ head/sys/kern/subr_module.c Thu Oct 8 18:29:17 2020 (r366543) @@ -496,7 +496,7 @@ preload_dump_internal(struct sbuf *sbp) */ bptr = (uint32_t *)preload_metadata; sbuf_putc(sbp, '\n'); - while (bptr[0] != MODINFO_END || bptr[0] != MODINFO_END) { + while (bptr[0] != MODINFO_END || bptr[1] != MODINFO_END) { sbuf_printf(sbp, " %p:\n", bptr); type = *bptr++; len = *bptr++; From owner-svn-src-all@freebsd.org Thu Oct 8 18:50:28 2020 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 135B742EF38; Thu, 8 Oct 2020 18:50:28 +0000 (UTC) (envelope-from mhorne@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C6gJ36kJgz4NGk; Thu, 8 Oct 2020 18:50:27 +0000 (UTC) (envelope-from mhorne@freebsd.org) Received: from mail-yb1-f178.google.com (mail-yb1-f178.google.com [209.85.219.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) (Authenticated sender: mhorne) by smtp.freebsd.org (Postfix) with ESMTPSA id C474B2332C; Thu, 8 Oct 2020 18:50:27 +0000 (UTC) (envelope-from mhorne@freebsd.org) Received: by mail-yb1-f178.google.com with SMTP id x8so5275061ybe.12; Thu, 08 Oct 2020 11:50:27 -0700 (PDT) X-Gm-Message-State: AOAM530WWEhEEvkFmuKe9ylOTYhtD5lcsBDq4eVZVMhvHaLt1DAljjCC Ypy2ivwAzAPMIpiX9am8ceN7Xx84mCyY52M7q4w= X-Google-Smtp-Source: ABdhPJwqzfSqDhQYlKfd7Iew0ey8L8NxGv4kPE7NmWpZw6eFSi4JBuH7LSdJTmrjzmB+C+HTIBBoPxaBSY2FJ4mKcsc= X-Received: by 2002:a25:5507:: with SMTP id j7mr13114944ybb.214.1602183027289; Thu, 08 Oct 2020 11:50:27 -0700 (PDT) MIME-Version: 1.0 References: <202010081802.098I26Rq052294@repo.freebsd.org> In-Reply-To: From: Mitchell Horne Date: Thu, 8 Oct 2020 15:50:15 -0300 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: svn commit: r366542 - in head/sys: amd64/amd64 arm/arm arm64/arm64 kern riscv/riscv sys To: Kyle Evans Cc: src-committers , svn-src-all , svn-src-head Content-Type: text/plain; charset="UTF-8" X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Thu, 08 Oct 2020 18:50:28 -0000 On Thu, Oct 8, 2020 at 3:15 PM Kyle Evans wrote: > > On Thu, Oct 8, 2020 at 1:02 PM Mitchell Horne wrote: > > > > Author: mhorne > > Date: Thu Oct 8 18:02:05 2020 > > New Revision: 366542 > > URL: https://svnweb.freebsd.org/changeset/base/366542 > > > > Log: > > Add a routine to dump boot metadata > > > > The boot metadata (also referred to as modinfo, or preload metadata) > > provides information about the size and location of the kernel, > > pre-loaded modules, and other metadata (e.g. the EFI framebuffer) to be > > consumed during by the kernel during early boot. It is encoded as a > > series of type-length-value entries and is usually constructed by > > loader(8) and passed to the kernel. It is also faked on some > > architectures when booted by other means. > > > > Although much of the module information is available via kldstat(8), > > there is no easy way to debug the metadata in its entirety. Add some > > routines to parse this data and allow it to be printed to the console > > during early boot or output via a sysctl. > > > > Since the output can be lengthly, printing to the console is gated > > behind the debug.dump_modinfo_at_boot kenv variable as well as the > > BOOTVERBOSE flag. The sysctl to print the metadata is named > > debug.dump_modinfo. > > > > Hi, > > Why both a tunable and boot -v? The tunable is already specifically > scoped to just this operation, it seems a little odd to double-gate > it. > Hey Kyle, The original patch was gated behind just boot -v. In testing I realized this change is potentially quite noisy (even by bootverbose standards), so I added the tunable to make it opt-in. The thinking is that you could set debug.dump_modinfo_at_boot=1 once in loader.conf and forget it, as you wouldn't see the preload_dump() output on a normal boot. Thinking about it again, this might be overly complicated for what is at best a niche debugging feature. If gating it behind just the tunable is more in line with how other things work then I'm happy to change it. Mitchell > Thanks, > > Kyle Evans From owner-svn-src-all@freebsd.org Thu Oct 8 20:55:56 2020 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 AD330431122; Thu, 8 Oct 2020 20:55:56 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6k4r3znWz4TMs; Thu, 8 Oct 2020 20:55:56 +0000 (UTC) (envelope-from imp@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 67F5BEC7F; Thu, 8 Oct 2020 20:55:56 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098Ktu2A057313; Thu, 8 Oct 2020 20:55:56 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098KtuKC057312; Thu, 8 Oct 2020 20:55:56 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010082055.098KtuKC057312@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Thu, 8 Oct 2020 20:55:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366544 - in head/sys/modules: . apm X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head/sys/modules: . apm X-SVN-Commit-Revision: 366544 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.33 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: Thu, 08 Oct 2020 20:55:56 -0000 Author: imp Date: Thu Oct 8 20:55:55 2020 New Revision: 366544 URL: https://svnweb.freebsd.org/changeset/base/366544 Log: Remove apm module The apm code is about to be removed. Remove the module since it's about to be useless. Deleted: head/sys/modules/apm/Makefile Modified: head/sys/modules/Makefile Modified: head/sys/modules/Makefile ============================================================================== --- head/sys/modules/Makefile Thu Oct 8 18:29:17 2020 (r366543) +++ head/sys/modules/Makefile Thu Oct 8 20:55:55 2020 (r366544) @@ -41,7 +41,6 @@ SUBDIR= \ amr \ ${_an} \ ${_aout} \ - ${_apm} \ ${_arcmsr} \ ${_allwinner} \ ${_armv8crypto} \ @@ -744,7 +743,6 @@ _vmm= vmm # XXX some of these can move now, but are untested on other architectures. _3dfx= 3dfx _3dfx_linux= 3dfx_linux -_apm= apm .if ${MK_SOURCELESS_HOST} != "no" _ce= ce .endif From owner-svn-src-all@freebsd.org Thu Oct 8 20:56:07 2020 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 D32B24310E6; Thu, 8 Oct 2020 20:56:07 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6k533tYLz4TL8; Thu, 8 Oct 2020 20:56:07 +0000 (UTC) (envelope-from imp@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 5B7C9ED80; Thu, 8 Oct 2020 20:56:07 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098Ku758057427; Thu, 8 Oct 2020 20:56:07 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098Ku67C057424; Thu, 8 Oct 2020 20:56:06 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010082056.098Ku67C057424@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Thu, 8 Oct 2020 20:56:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366546 - in head/sys: conf dev/syscons/apm i386/bios i386/conf X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head/sys: conf dev/syscons/apm i386/bios i386/conf X-SVN-Commit-Revision: 366546 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.33 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: Thu, 08 Oct 2020 20:56:07 -0000 Author: imp Date: Thu Oct 8 20:56:06 2020 New Revision: 366546 URL: https://svnweb.freebsd.org/changeset/base/366546 Log: Remove APM BIOS support APM BIOS was relevant only to early laptops (approximately P166 or P200 and slower). These have not been relevant for a long time, and this code has been untested for a long time (as far as I can tell). The APM compat code in ACPI and the apm(8) command is not being retired. Both of these items are still in use (apm(8) is more scriptable than the replacement acpiconf, for the most part). This has been commented out of i386 GENERIC since 2002. This code is not relevant to any other port. Discussed on: arch@ Deleted: head/sys/dev/syscons/apm/apm_saver.c head/sys/i386/bios/apm.c head/sys/i386/bios/apm.h Modified: head/sys/conf/files.i386 head/sys/i386/conf/GENERIC head/sys/i386/conf/NOTES Modified: head/sys/conf/files.i386 ============================================================================== --- head/sys/conf/files.i386 Thu Oct 8 20:56:00 2020 (r366545) +++ head/sys/conf/files.i386 Thu Oct 8 20:56:06 2020 (r366546) @@ -162,7 +162,6 @@ acpi_wakedata.h optional acpi \ no-obj no-implicit-rule before-depend \ clean "acpi_wakedata.h" # -i386/bios/apm.c optional apm i386/bios/smapi.c optional smapi i386/bios/smapi_bios.S optional smapi i386/cloudabi32/cloudabi32_sysvec.c optional compat_cloudabi32 Modified: head/sys/i386/conf/GENERIC ============================================================================== --- head/sys/i386/conf/GENERIC Thu Oct 8 20:56:00 2020 (r366545) +++ head/sys/i386/conf/GENERIC Thu Oct 8 20:56:06 2020 (r366546) @@ -198,9 +198,6 @@ device vt_vga device agp # support several AGP chipsets -# Power management support (see NOTES for more options) -#device apm - # PCCARD (PCMCIA) support # PCMCIA and cardbus bridge support device cbb # cardbus (yenta) bridge Modified: head/sys/i386/conf/NOTES ============================================================================== --- head/sys/i386/conf/NOTES Thu Oct 8 20:56:00 2020 (r366545) +++ head/sys/i386/conf/NOTES Thu Oct 8 20:56:06 2020 (r366546) @@ -729,7 +729,6 @@ device hyperv # HyperV drivers # # Miscellaneous hardware: # -# apm: Laptop Advanced Power Management (experimental) # ipmi: Intelligent Platform Management Interface # smapi: System Management Application Program Interface driver # smbios: DMI/SMBIOS entry point @@ -739,10 +738,6 @@ device hyperv # HyperV drivers # si: Specialix International SI/XIO or SX intelligent serial card driver # tpm: Trusted Platform Module -# Notes on APM -# The flags takes the following meaning for apm0: -# 0x0020 Statclock is broken. - # Notes on the Specialix SI/XIO driver: # The host card is memory, not IO mapped. # The Rev 1 host cards use a 64K chunk, on a 32K boundary. @@ -761,8 +756,6 @@ device hyperv # HyperV drivers # is the only thing truly supported, but apparently a fair percentage # of the Vaio extra features are controlled by this device. -device apm -envvar hint.apm.0.flags="0x20" device ipmi device smapi device smbios From owner-svn-src-all@freebsd.org Thu Oct 8 20:56:06 2020 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 B1238430EC0; Thu, 8 Oct 2020 20:56:06 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6k4y6J8gz4T8Z; Thu, 8 Oct 2020 20:56:02 +0000 (UTC) (envelope-from imp@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 DA2DCEB2C; Thu, 8 Oct 2020 20:56:01 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098Ku1i2057373; Thu, 8 Oct 2020 20:56:01 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098Ku14p057370; Thu, 8 Oct 2020 20:56:01 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010082056.098Ku14p057370@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Thu, 8 Oct 2020 20:56:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366545 - in head/sys: conf i386/conf modules/syscons modules/syscons/apm X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head/sys: conf i386/conf modules/syscons modules/syscons/apm X-SVN-Commit-Revision: 366545 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.33 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: Thu, 08 Oct 2020 20:56:06 -0000 Author: imp Date: Thu Oct 8 20:56:00 2020 New Revision: 366545 URL: https://svnweb.freebsd.org/changeset/base/366545 Log: Remove apm screen saver. APM BIOS support is about to be removed. Remove the apm screen saver and its module. They are about to be irrelevant. Deleted: head/sys/modules/syscons/apm/Makefile Modified: head/sys/conf/files.i386 head/sys/i386/conf/NOTES head/sys/modules/syscons/Makefile Modified: head/sys/conf/files.i386 ============================================================================== --- head/sys/conf/files.i386 Thu Oct 8 20:55:55 2020 (r366544) +++ head/sys/conf/files.i386 Thu Oct 8 20:56:00 2020 (r366545) @@ -119,7 +119,6 @@ dev/sbni/if_sbni_isa.c optional sbni isa dev/sbni/if_sbni_pci.c optional sbni pci dev/speaker/spkr.c optional speaker dev/superio/superio.c optional superio isa -dev/syscons/apm/apm_saver.c optional apm_saver apm dev/syscons/scvesactl.c optional sc vga vesa dev/syscons/scvgarndr.c optional sc vga dev/tpm/tpm.c optional tpm Modified: head/sys/i386/conf/NOTES ============================================================================== --- head/sys/i386/conf/NOTES Thu Oct 8 20:55:55 2020 (r366544) +++ head/sys/i386/conf/NOTES Thu Oct 8 20:56:00 2020 (r366545) @@ -275,7 +275,6 @@ device nvram # Access to rtc cmos via /dev/nvram device speaker #Play IBM BASIC-style noises out your speaker envvar hint.speaker.0.at="isa" envvar hint.speaker.0.port="0x61" -device apm_saver # Requires APM ##################################################################### Modified: head/sys/modules/syscons/Makefile ============================================================================== --- head/sys/modules/syscons/Makefile Thu Oct 8 20:55:55 2020 (r366544) +++ head/sys/modules/syscons/Makefile Thu Oct 8 20:56:00 2020 (r366545) @@ -1,7 +1,6 @@ # $FreeBSD$ -SUBDIR= ${_apm} \ - beastie \ +SUBDIR= beastie \ blank \ daemon \ dragon \ @@ -14,9 +13,5 @@ SUBDIR= ${_apm} \ snake \ star \ warp - -.if ${MACHINE_CPUARCH} == "i386" -_apm= apm -.endif .include From owner-svn-src-all@freebsd.org Thu Oct 8 20:56:14 2020 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 E711E431413; Thu, 8 Oct 2020 20:56:14 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6k5B2FGsz4TFr; Thu, 8 Oct 2020 20:56:13 +0000 (UTC) (envelope-from imp@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 75E3DED0E; Thu, 8 Oct 2020 20:56:12 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098KuCKJ057481; Thu, 8 Oct 2020 20:56:12 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098KuCpU057480; Thu, 8 Oct 2020 20:56:12 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010082056.098KuCpU057480@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Thu, 8 Oct 2020 20:56:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366547 - in head/sys: i386/include x86/isa X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head/sys: i386/include x86/isa X-SVN-Commit-Revision: 366547 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.33 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: Thu, 08 Oct 2020 20:56:16 -0000 Author: imp Date: Thu Oct 8 20:56:11 2020 New Revision: 366547 URL: https://svnweb.freebsd.org/changeset/base/366547 Log: timer_restore is now unused, remove it apm was the only consumer of timer_restore. Now that it's gone, this can be removed. Modified: head/sys/i386/include/clock.h head/sys/x86/isa/clock.c Modified: head/sys/i386/include/clock.h ============================================================================== --- head/sys/i386/include/clock.h Thu Oct 8 20:56:06 2020 (r366546) +++ head/sys/i386/include/clock.h Thu Oct 8 20:56:11 2020 (r366547) @@ -30,7 +30,6 @@ void clock_init(void); */ void startrtclock(void); -void timer_restore(void); void init_TSC(void); void resume_TSC(void); Modified: head/sys/x86/isa/clock.c ============================================================================== --- head/sys/x86/isa/clock.c Thu Oct 8 20:56:06 2020 (r366546) +++ head/sys/x86/isa/clock.c Thu Oct 8 20:56:11 2020 (r366547) @@ -388,26 +388,6 @@ i8254_restore(void) set_i8254_freq(MODE_STOP, 0); } -#ifndef __amd64__ -/* - * Restore all the timers non-atomically (XXX: should be atomically). - * - * This function is called from pmtimer_resume() to restore all the timers. - * This should not be necessary, but there are broken laptops that do not - * restore all the timers on resume. The APM spec was at best vague on the - * subject. - * pmtimer is used only with the old APM power management, and not with - * acpi, which is required for amd64, so skip it in that case. - */ -void -timer_restore(void) -{ - - i8254_restore(); /* restore i8254_freq and hz */ - atrtc_restore(); /* reenable RTC interrupts */ -} -#endif - /* This is separate from startrtclock() so that it can be called early. */ void i8254_init(void) From owner-svn-src-all@freebsd.org Thu Oct 8 22:00:31 2020 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 E65C543252E; Thu, 8 Oct 2020 22:00:31 +0000 (UTC) (envelope-from alfredo@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6lWM5m31z4XSX; Thu, 8 Oct 2020 22:00:31 +0000 (UTC) (envelope-from alfredo@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 AA65AF780; Thu, 8 Oct 2020 22:00:31 +0000 (UTC) (envelope-from alfredo@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098M0V5f095151; Thu, 8 Oct 2020 22:00:31 GMT (envelope-from alfredo@FreeBSD.org) Received: (from alfredo@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098M0VOG095150; Thu, 8 Oct 2020 22:00:31 GMT (envelope-from alfredo@FreeBSD.org) Message-Id: <202010082200.098M0VOG095150@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: alfredo set sender to alfredo@FreeBSD.org using -f From: "Alfredo Dal'Ava Junior" Date: Thu, 8 Oct 2020 22:00:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366548 - head/sys/powerpc/powerpc X-SVN-Group: head X-SVN-Commit-Author: alfredo X-SVN-Commit-Paths: head/sys/powerpc/powerpc X-SVN-Commit-Revision: 366548 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.33 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: Thu, 08 Oct 2020 22:00:32 -0000 Author: alfredo Date: Thu Oct 8 22:00:31 2020 New Revision: 366548 URL: https://svnweb.freebsd.org/changeset/base/366548 Log: [PowerPC] add machdep.uprintf_signal sysctl Add support for sysctl 'machdep.uprintf_signal' that prints debugging information on trap signal. Reviewed by: jhibbits, luporl, bdragon Sponsored by: Eldorado Research Institute (eldorado.org.br) Differential Revision: https://reviews.freebsd.org/D26004 Modified: head/sys/powerpc/powerpc/trap.c Modified: head/sys/powerpc/powerpc/trap.c ============================================================================== --- head/sys/powerpc/powerpc/trap.c Thu Oct 8 20:56:11 2020 (r366547) +++ head/sys/powerpc/powerpc/trap.c Thu Oct 8 22:00:31 2020 (r366548) @@ -153,6 +153,11 @@ static struct powerpc_exception powerpc_exceptions[] = { EXC_LAST, NULL } }; +static int uprintf_signal; +SYSCTL_INT(_machdep, OID_AUTO, uprintf_signal, CTLFLAG_RWTUN, + &uprintf_signal, 0, + "Print debugging information on trap signal to ctty"); + #define ESR_BITMASK \ "\20" \ "\040b0\037b1\036b2\035b3\034PIL\033PRR\032PTR\031FP" \ @@ -489,6 +494,14 @@ trap(struct trapframe *frame) ksi.ksi_code = (int) ucode; /* XXX, not POSIX */ ksi.ksi_addr = (void *)addr; ksi.ksi_trapno = type; + if (uprintf_signal) { + uprintf("pid %d comm %s: signal %d code %d type %d " + "addr 0x%lx r1 0x%lx srr0 0x%lx srr1 0x%lx\n", + p->p_pid, p->p_comm, sig, ucode, type, + (u_long)addr, (u_long)frame->fixreg[1], + (u_long)frame->srr0, (u_long)frame->srr1); + } + trapsignal(td, &ksi); } From owner-svn-src-all@freebsd.org Thu Oct 8 22:31:12 2020 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 9FE98432D31; Thu, 8 Oct 2020 22:31:12 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6mBm3qXgz4Yf2; Thu, 8 Oct 2020 22:31:12 +0000 (UTC) (envelope-from kib@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 67693FC2B; Thu, 8 Oct 2020 22:31:12 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098MVCp1016808; Thu, 8 Oct 2020 22:31:12 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098MVCQm016807; Thu, 8 Oct 2020 22:31:12 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010082231.098MVCQm016807@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Thu, 8 Oct 2020 22:31:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366549 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366549 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.33 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: Thu, 08 Oct 2020 22:31:12 -0000 Author: kib Date: Thu Oct 8 22:31:11 2020 New Revision: 366549 URL: https://svnweb.freebsd.org/changeset/base/366549 Log: Do not allow to use O_BENEATH as an oracle. Specifically, if lookup() returned any error and the topping directory was not latched, which means that (non-existent) path did not returned to the topping location, give ENOTCAPABLE a priority over the lookup() error. PR: 249960 Reviewed by: emaste, ngie Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D26695 Modified: head/sys/kern/vfs_lookup.c Modified: head/sys/kern/vfs_lookup.c ============================================================================== --- head/sys/kern/vfs_lookup.c Thu Oct 8 22:00:31 2020 (r366548) +++ head/sys/kern/vfs_lookup.c Thu Oct 8 22:31:11 2020 (r366549) @@ -595,8 +595,17 @@ namei(struct nameidata *ndp) for (;;) { ndp->ni_startdir = dp; error = lookup(ndp); - if (error != 0) + if (error != 0) { + /* + * Override an error to not allow user to use + * BENEATH as an oracle. + */ + if ((ndp->ni_lcf & (NI_LCF_LATCH | + NI_LCF_BENEATH_LATCHED)) == NI_LCF_LATCH) + error = ENOTCAPABLE; goto out; + } + /* * If not a symbolic link, we're done. */ From owner-svn-src-all@freebsd.org Thu Oct 8 22:34:35 2020 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 B2EC4432EA5; Thu, 8 Oct 2020 22:34:35 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6mGg4JDxz4Yj7; Thu, 8 Oct 2020 22:34:35 +0000 (UTC) (envelope-from kib@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 72D26FB59; Thu, 8 Oct 2020 22:34:35 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098MYZgX019460; Thu, 8 Oct 2020 22:34:35 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098MYZmB019459; Thu, 8 Oct 2020 22:34:35 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010082234.098MYZmB019459@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Thu, 8 Oct 2020 22:34:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366550 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366550 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.33 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: Thu, 08 Oct 2020 22:34:35 -0000 Author: kib Date: Thu Oct 8 22:34:34 2020 New Revision: 366550 URL: https://svnweb.freebsd.org/changeset/base/366550 Log: sig_intr(9): return early if AST is not scheduled. Check td_flags for relevant AST requests lock-less. This opens the race slightly wider where sig_intr() returns false negative, but might be it is worth it. Requested by: mjg Sponsored by: The FreeBSD Foundation MFC after: 1 week Modified: head/sys/kern/kern_sig.c Modified: head/sys/kern/kern_sig.c ============================================================================== --- head/sys/kern/kern_sig.c Thu Oct 8 22:31:11 2020 (r366549) +++ head/sys/kern/kern_sig.c Thu Oct 8 22:34:34 2020 (r366550) @@ -3212,6 +3212,9 @@ sig_intr(void) int ret; td = curthread; + if ((td->td_flags & (TDF_NEEDSIGCHK | TDF_NEEDSUSPCHK)) == 0) + return (0); + p = td->td_proc; PROC_LOCK(p); From owner-svn-src-all@freebsd.org Thu Oct 8 22:41:03 2020 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 8252F433189; Thu, 8 Oct 2020 22:41:03 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6mQ72X7kz4Z6S; Thu, 8 Oct 2020 22:41:03 +0000 (UTC) (envelope-from kib@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 3A458FDA3; Thu, 8 Oct 2020 22:41:03 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098Mf3mc022275; Thu, 8 Oct 2020 22:41:03 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098Mf3qB022274; Thu, 8 Oct 2020 22:41:03 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010082241.098Mf3qB022274@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Thu, 8 Oct 2020 22:41:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366551 - head/sys/ufs/ffs X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: head/sys/ufs/ffs X-SVN-Commit-Revision: 366551 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.33 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: Thu, 08 Oct 2020 22:41:03 -0000 Author: kib Date: Thu Oct 8 22:41:02 2020 New Revision: 366551 URL: https://svnweb.freebsd.org/changeset/base/366551 Log: Do not leak B_BARRIER. Normally when a buffer with B_BARRIER is written, the flag is cleared by g_vfs_strategy() when creating bio. But in some cases FFS buffer might not reach g_vfs_strategy(), for instance when copy-on-write reports an error like ENOSPC. In this case buffer is returned to dirty queue and might be written later by other means. Among then bdwrite() reasonably asserts that B_BARRIER is not set. In fact, the only current use of B_BARRIER is for lazy inode block initialization, where write of the new inode block is fenced against cylinder group write to mark inode as used. The situation could be seen that we break dependency by updating cg without written out inode. Practically since CoW was not able to find space for a copy of inode block, for the same reason cg group block write should fail. Reported by: pho Discussed with: chs, imp, mckusick Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D26511 Modified: head/sys/ufs/ffs/ffs_vfsops.c Modified: head/sys/ufs/ffs/ffs_vfsops.c ============================================================================== --- head/sys/ufs/ffs/ffs_vfsops.c Thu Oct 8 22:34:34 2020 (r366550) +++ head/sys/ufs/ffs/ffs_vfsops.c Thu Oct 8 22:41:02 2020 (r366551) @@ -2582,6 +2582,7 @@ ffs_geom_strategy(struct bufobj *bo, struct buf *bp) error != EOPNOTSUPP) { bp->b_error = error; bp->b_ioflags |= BIO_ERROR; + bp->b_flags &= ~B_BARRIER; bufdone(bp); return; } @@ -2594,6 +2595,7 @@ ffs_geom_strategy(struct bufobj *bo, struct buf *bp) if (error != 0 && error != EOPNOTSUPP) { bp->b_error = error; bp->b_ioflags |= BIO_ERROR; + bp->b_flags &= ~B_BARRIER; bufdone(bp); return; } From owner-svn-src-all@freebsd.org Thu Oct 8 22:46:15 2020 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 E1E684331A9; Thu, 8 Oct 2020 22:46:15 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6mX75fswz4ZRM; Thu, 8 Oct 2020 22:46:15 +0000 (UTC) (envelope-from kib@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 A5A70F7F6; Thu, 8 Oct 2020 22:46:15 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098MkFrq025640; Thu, 8 Oct 2020 22:46:15 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098MkFBE025639; Thu, 8 Oct 2020 22:46:15 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010082246.098MkFBE025639@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Thu, 8 Oct 2020 22:46:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366552 - head/sys/vm X-SVN-Group: head X-SVN-Commit-Author: kib X-SVN-Commit-Paths: head/sys/vm X-SVN-Commit-Revision: 366552 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.33 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: Thu, 08 Oct 2020 22:46:15 -0000 Author: kib Date: Thu Oct 8 22:46:15 2020 New Revision: 366552 URL: https://svnweb.freebsd.org/changeset/base/366552 Log: vm_page_dump_index_to_pa(): Add braces to the expression involving + and &. The precedence of the '&' operator is less than of '+'. Added braces do change the order of evaluation into the natural one, in my opinion. On the other hand, the value of the expression should not change since all elements should have page-aligned values. This fixes a gcc warning reported. Reported by: adrian Sponsored by: The FreeBSD Foundation MFC after: 1 week Modified: head/sys/vm/vm_page.h Modified: head/sys/vm/vm_page.h ============================================================================== --- head/sys/vm/vm_page.h Thu Oct 8 22:41:02 2020 (r366551) +++ head/sys/vm/vm_page.h Thu Oct 8 22:46:15 2020 (r366552) @@ -639,7 +639,7 @@ vm_page_dump_index_to_pa(int bit) dump_avail[i] / PAGE_SIZE; if (bit < tot) return ((vm_paddr_t)bit * PAGE_SIZE + - dump_avail[i] & ~PAGE_MASK); + (dump_avail[i] & ~PAGE_MASK)); bit -= tot; } return ((vm_paddr_t)NULL); From owner-svn-src-all@freebsd.org Thu Oct 8 23:59:59 2020 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 1671B434666; Thu, 8 Oct 2020 23:59:59 +0000 (UTC) (envelope-from gjb@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6p9B6vvCz4dFs; Thu, 8 Oct 2020 23:59:58 +0000 (UTC) (envelope-from gjb@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 CC9A4109AF; Thu, 8 Oct 2020 23:59:58 +0000 (UTC) (envelope-from gjb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 098Nxw4p068447; Thu, 8 Oct 2020 23:59:58 GMT (envelope-from gjb@FreeBSD.org) Received: (from gjb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 098Nxwht068446; Thu, 8 Oct 2020 23:59:58 GMT (envelope-from gjb@FreeBSD.org) Message-Id: <202010082359.098Nxwht068446@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gjb set sender to gjb@FreeBSD.org using -f From: Glen Barber Date: Thu, 8 Oct 2020 23:59:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-releng@freebsd.org Subject: svn commit: r366553 - releng/12.2/sys/conf X-SVN-Group: releng X-SVN-Commit-Author: gjb X-SVN-Commit-Paths: releng/12.2/sys/conf X-SVN-Commit-Revision: 366553 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.33 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: Thu, 08 Oct 2020 23:59:59 -0000 Author: gjb Date: Thu Oct 8 23:59:58 2020 New Revision: 366553 URL: https://svnweb.freebsd.org/changeset/base/366553 Log: Update releng/12.2 to RC2 as part of the 12.2-RELEASE cycle. Approved by: re (implicit) Sponsored by: Rubicon Communications, LLC (netgate.com) Modified: releng/12.2/sys/conf/newvers.sh Modified: releng/12.2/sys/conf/newvers.sh ============================================================================== --- releng/12.2/sys/conf/newvers.sh Thu Oct 8 22:46:15 2020 (r366552) +++ releng/12.2/sys/conf/newvers.sh Thu Oct 8 23:59:58 2020 (r366553) @@ -49,7 +49,7 @@ TYPE="FreeBSD" REVISION="12.2" -BRANCH="RC1" +BRANCH="RC2" if [ -n "${BRANCH_OVERRIDE}" ]; then BRANCH=${BRANCH_OVERRIDE} fi From owner-svn-src-all@freebsd.org Fri Oct 9 00:16:27 2020 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 5430B435006; Fri, 9 Oct 2020 00:16:27 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6pXC1cKVz4dxb; Fri, 9 Oct 2020 00:16:27 +0000 (UTC) (envelope-from imp@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 00E3110EC1; Fri, 9 Oct 2020 00:16:27 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0990GQDj080875; Fri, 9 Oct 2020 00:16:26 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0990GQq2080874; Fri, 9 Oct 2020 00:16:26 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010090016.0990GQq2080874@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 00:16:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366554 - head/usr.sbin/bsdinstall/scripts X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/usr.sbin/bsdinstall/scripts X-SVN-Commit-Revision: 366554 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.33 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: Fri, 09 Oct 2020 00:16:27 -0000 Author: imp Date: Fri Oct 9 00:16:26 2020 New Revision: 366554 URL: https://svnweb.freebsd.org/changeset/base/366554 Log: Initial support for implementing the bootXXX.efi workaround Too many version of UEFI firmware (so far only confirmed on amd64) don't really support efibootmgr selection of boot. That's the most reliable, when it works, since there's no guesswork. However, many do not save, unmolested, the variables that efibootmgr sets, so as a fallback we also install loader.efi as bootXXX.efi (where XXX is either aa64 or x64) if it doesn't already exist in /efi/boot on the ESP. The standard only defines this for removable devices, but it's almost ubiquitously used as a fallback. Many BIOSes implement a drive selection feature that takes over the efibootmgr protocol, rendinering it useless (either generally, or for those vendors not on the short list). bootxxx.efi works around this. However, we don't install it unconditionally there, as that breaks some popular multi-boot setups. MFC After: 1 week Differential Revision: https://reviews.freebsd.org/D26428 Modified: head/usr.sbin/bsdinstall/scripts/bootconfig Modified: head/usr.sbin/bsdinstall/scripts/bootconfig ============================================================================== --- head/usr.sbin/bsdinstall/scripts/bootconfig Thu Oct 8 23:59:58 2020 (r366553) +++ head/usr.sbin/bsdinstall/scripts/bootconfig Fri Oct 9 00:16:26 2020 (r366554) @@ -124,6 +124,15 @@ if [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" done fi + case $(uname -m) in + arm64) ARCHBOOTNAME=aa64 ;; + amd64) ARCHBOOTNAME=x64 ;; + # arm) ARCHBOOTNAME=arm ;; # No other support for arm install + # i386) ARCHBOOTNAME=ia32 ;; # no support for this in i386 kernels, rare machines + *) die "Unsupported arch $(uname -m) for UEFI install" + esac + BOOTNAME="/EFI/BOOT/BOOT${ARCHBOOTNAME}.EFI" + for esp in $ESPS; do f_dprintf "Formatting /dev/${esp} as FAT32" newfs_msdos -F 32 -c 1 -L EFISYS "/dev/$esp" > /dev/null 2>&1 @@ -141,6 +150,21 @@ if [ "$(uname -m)" = "arm64" ] || [ "$X86_BOOTMETHOD" f_dprintf "Installing loader.efi onto ESP" mkdir -p "$mntpt/EFI/freebsd" cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/EFI/freebsd/loader.efi" + + # + # The following shouldn't be necessary. UEFI defines a way to + # specifically select what to boot (which we do via + # efibootmgr). However, virtual environments often times lack + # support for the NV variables efibootmgr sets. In addition, + # some UEFI implementations have features that interfere with + # the setting of these variables. To combat that, we install the + # default removable media boot file as a fallback if it doesn't + # exist. We don't install it all the time since that can + # interfere with other installations on the drive (like rEFInd). + # + if [ ! -f "${mntpt}/${BOOTNAME}" ]; then + cp "$BSDINSTALL_CHROOT/boot/loader.efi" "${mntpt}/${BOOTNAME}" + fi if [ "$num_esps" -gt 1 ]; then bootlabel="FreeBSD (${esp})" From owner-svn-src-all@freebsd.org Fri Oct 9 00:27:41 2020 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 444FF435292; Fri, 9 Oct 2020 00:27:41 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6pn90qbKz4g3j; Fri, 9 Oct 2020 00:27:41 +0000 (UTC) (envelope-from imp@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 EEFA310E44; Fri, 9 Oct 2020 00:27:40 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0990ReAp087034; Fri, 9 Oct 2020 00:27:40 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0990Rex8087033; Fri, 9 Oct 2020 00:27:40 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010090027.0990Rex8087033@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 00:27:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366555 - head X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head X-SVN-Commit-Revision: 366555 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.33 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: Fri, 09 Oct 2020 00:27:41 -0000 Author: imp Date: Fri Oct 9 00:27:40 2020 New Revision: 366555 URL: https://svnweb.freebsd.org/changeset/base/366555 Log: Eliminate building LINT makefiles LINT config files are about to be checked in directly. Eliminate building them by hand here from NOTES files. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D26540 Modified: head/Makefile Modified: head/Makefile ============================================================================== --- head/Makefile Fri Oct 9 00:16:26 2020 (r366554) +++ head/Makefile Fri Oct 9 00:27:40 2020 (r366555) @@ -682,13 +682,6 @@ universe_${target}_${target_arch}: universe_${target}_ universe_${target}_done: universe_${target}_kernels .PHONY universe_${target}_kernels: universe_${target}_worlds .PHONY universe_${target}_kernels: universe_${target}_prologue .MAKE .PHONY - @if [ -e "${KERNSRCDIR}/${target}/conf/NOTES" ]; then \ - (cd ${KERNSRCDIR}/${target}/conf && env __MAKE_CONF=/dev/null \ - ${SUB_MAKE} LINT \ - > ${.CURDIR}/_.${target}.makeLINT 2>&1 || \ - (echo "${target} 'make LINT' failed," \ - "check _.${target}.makeLINT for details"| ${MAKEFAIL})); \ - fi @cd ${.CURDIR}; ${SUB_MAKE} ${.MAKEFLAGS} TARGET=${target} \ universe_kernels .endif # ${__DO_KERNELS} == "yes" @@ -760,9 +753,6 @@ universe_epilogue: .PHONY fi .endif .endif - -buildLINT: .PHONY - ${MAKE} -C ${.CURDIR}/sys/${_TARGET}/conf LINT .if defined(.PARSEDIR) # This makefile does not run in meta mode From owner-svn-src-all@freebsd.org Fri Oct 9 00:27:47 2020 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 5A7DE434D6D; Fri, 9 Oct 2020 00:27:47 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6pnH017gz4g4B; Fri, 9 Oct 2020 00:27:46 +0000 (UTC) (envelope-from imp@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 3FD39111B2; Fri, 9 Oct 2020 00:27:46 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0990RknO087090; Fri, 9 Oct 2020 00:27:46 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0990RkFC087089; Fri, 9 Oct 2020 00:27:46 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010090027.0990RkFC087089@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 00:27:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366556 - head X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head X-SVN-Commit-Revision: 366556 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.33 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: Fri, 09 Oct 2020 00:27:47 -0000 Author: imp Date: Fri Oct 9 00:27:45 2020 New Revision: 366556 URL: https://svnweb.freebsd.org/changeset/base/366556 Log: Stop ignoring makeLINT generated files We're going to check these files in shortly since we don't need to generate them anymore. Generated files cause issues for different work flows anyway. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D26540 Modified: head/.gitignore Modified: head/.gitignore ============================================================================== --- head/.gitignore Fri Oct 9 00:27:40 2020 (r366555) +++ head/.gitignore Fri Oct 9 00:27:45 2020 (r366556) @@ -17,19 +17,3 @@ GTAGS ID cscope.out ?cscope.out -# Ignore LINT generated configs. -/sys/amd64/conf/LINT -/sys/amd64/conf/LINT-NOINET -/sys/amd64/conf/LINT-NOINET6 -/sys/amd64/conf/LINT-NOIP -/sys/arm/conf/LINT -/sys/arm/conf/LINT-V5 -/sys/arm/conf/LINT-V7 -/sys/arm64/conf/LINT -/sys/i386/conf/LINT -/sys/i386/conf/LINT-NOINET -/sys/i386/conf/LINT-NOINET6 -/sys/i386/conf/LINT-NOIP -/sys/powerpc/conf/LINT -/sys/powerpc/conf/LINT64 -/sys/sparc64/conf/LINT From owner-svn-src-all@freebsd.org Fri Oct 9 01:04:28 2020 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 E69AB435A1E; Fri, 9 Oct 2020 01:04:28 +0000 (UTC) (envelope-from rmacklem@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6qbc5XqCz3SMB; Fri, 9 Oct 2020 01:04:28 +0000 (UTC) (envelope-from rmacklem@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 A1A4911AA4; Fri, 9 Oct 2020 01:04:28 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09914STc011335; Fri, 9 Oct 2020 01:04:28 GMT (envelope-from rmacklem@FreeBSD.org) Received: (from rmacklem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09914S2U011334; Fri, 9 Oct 2020 01:04:28 GMT (envelope-from rmacklem@FreeBSD.org) Message-Id: <202010090104.09914S2U011334@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to rmacklem@FreeBSD.org using -f From: Rick Macklem Date: Fri, 9 Oct 2020 01:04:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366557 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: rmacklem X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366557 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.33 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: Fri, 09 Oct 2020 01:04:29 -0000 Author: rmacklem Date: Fri Oct 9 01:04:28 2020 New Revision: 366557 URL: https://svnweb.freebsd.org/changeset/base/366557 Log: Make vn_generic_copy_file_range() interruptible via a signal. Without this patch, when vn_generic_copy_file_range() is doing a large copy, it will remain in the function for a considerable amount of time, delaying handling of any outstanding signals until the copy completes. This patch adds checks for signals that need to be processed after each successful data copy cycle. When sig_intr() returns non-zero, vn_generic_copy_file_range() will return. The check "if (len < savlen)" ensures that some data has been copied, so that progress will be made. Note that, since copy_file_range(2) is allowed to return fewer bytes copied than requested, it will never return EINTR/ERESTART when sig_intr() returns non-zero. Reviewed by: kib, asomers Differential Revision: https://reviews.freebsd.org/D26620 Modified: head/sys/kern/vfs_vnops.c Modified: head/sys/kern/vfs_vnops.c ============================================================================== --- head/sys/kern/vfs_vnops.c Fri Oct 9 00:27:45 2020 (r366556) +++ head/sys/kern/vfs_vnops.c Fri Oct 9 01:04:28 2020 (r366557) @@ -3017,7 +3017,7 @@ vn_generic_copy_file_range(struct vnode *invp, off_t * struct uio io; off_t startoff, endoff, xfer, xfer2; u_long blksize; - int error; + int error, interrupted; bool cantseek, readzeros, eof, lastblock; ssize_t aresid; size_t copylen, len, rem, savlen; @@ -3027,6 +3027,7 @@ vn_generic_copy_file_range(struct vnode *invp, off_t * holein = holeout = 0; savlen = len = *lenp; error = 0; + interrupted = 0; dat = NULL; error = vn_lock(invp, LK_SHARED); @@ -3116,7 +3117,7 @@ vn_generic_copy_file_range(struct vnode *invp, off_t * * support holes on the server, but do not support FIOSEEKHOLE. */ eof = false; - while (len > 0 && error == 0 && !eof) { + while (len > 0 && error == 0 && !eof && interrupted == 0) { endoff = 0; /* To shut up compilers. */ cantseek = true; startoff = *inoffp; @@ -3177,6 +3178,8 @@ vn_generic_copy_file_range(struct vnode *invp, off_t * *inoffp += xfer; *outoffp += xfer; len -= xfer; + if (len < savlen) + interrupted = sig_intr(); } } copylen = MIN(len, endoff - startoff); @@ -3198,7 +3201,7 @@ vn_generic_copy_file_range(struct vnode *invp, off_t * xfer -= (*inoffp % blksize); } /* Loop copying the data block. */ - while (copylen > 0 && error == 0 && !eof) { + while (copylen > 0 && error == 0 && !eof && interrupted == 0) { if (copylen < xfer) xfer = copylen; error = vn_lock(invp, LK_SHARED); @@ -3239,6 +3242,8 @@ vn_generic_copy_file_range(struct vnode *invp, off_t * *outoffp += xfer; copylen -= xfer; len -= xfer; + if (len < savlen) + interrupted = sig_intr(); } } xfer = blksize; From owner-svn-src-all@freebsd.org Fri Oct 9 01:37:18 2020 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 41FCC436317; Fri, 9 Oct 2020 01:37:18 +0000 (UTC) (envelope-from kevans@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6rKT4Tlmz3TbW; Fri, 9 Oct 2020 01:37:17 +0000 (UTC) (envelope-from kevans@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 7824C118F8; Fri, 9 Oct 2020 01:37:17 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0991bH9f029927; Fri, 9 Oct 2020 01:37:17 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0991bHIG029926; Fri, 9 Oct 2020 01:37:17 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <202010090137.0991bHIG029926@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Fri, 9 Oct 2020 01:37:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366558 - in head/sys: amd64/conf arm/conf arm64/conf i386/conf mips/conf powerpc/conf X-SVN-Group: head X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: in head/sys: amd64/conf arm/conf arm64/conf i386/conf mips/conf powerpc/conf X-SVN-Commit-Revision: 366558 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.33 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: Fri, 09 Oct 2020 01:37:18 -0000 Author: kevans Date: Fri Oct 9 01:37:17 2020 New Revision: 366558 URL: https://svnweb.freebsd.org/changeset/base/366558 Log: sys/*/conf: drop the svn:ignore We're going to commit the LINT. Modified: Directory Properties: head/sys/amd64/conf/ (props changed) head/sys/arm/conf/ (props changed) head/sys/arm64/conf/ (props changed) head/sys/i386/conf/ (props changed) head/sys/mips/conf/ (props changed) head/sys/powerpc/conf/ (props changed) From owner-svn-src-all@freebsd.org Fri Oct 9 01:48:17 2020 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 9BD99436428; Fri, 9 Oct 2020 01:48:17 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6rZ93YZmz3Txd; Fri, 9 Oct 2020 01:48:17 +0000 (UTC) (envelope-from imp@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 5CEFE11976; Fri, 9 Oct 2020 01:48:17 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0991mH3X036089; Fri, 9 Oct 2020 01:48:17 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0991mEjc036077; Fri, 9 Oct 2020 01:48:14 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010090148.0991mEjc036077@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 01:48:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366559 - in head: . sys/amd64/conf sys/arm/conf sys/arm64/conf sys/i386/conf sys/powerpc/conf X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: in head: . sys/amd64/conf sys/arm/conf sys/arm64/conf sys/i386/conf sys/powerpc/conf X-SVN-Commit-Revision: 366559 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.33 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: Fri, 09 Oct 2020 01:48:17 -0000 Author: imp Date: Fri Oct 9 01:48:14 2020 New Revision: 366559 URL: https://svnweb.freebsd.org/changeset/base/366559 Log: Create in-tree LINT files Now that config(8) has supported include for 19 years, transition to including the NOTES files. include support didn't exist at the time, nor did the envvar stuff recently added. Now that it does, eliminate the building of LINT files by just including everything you need. Note: This may cause conflicts with updating in some cases. find sys -name LINT\* -rm is suggested across this commit to remove the generated LINT files. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D26540 Added: head/sys/amd64/conf/LINT (contents, props changed) head/sys/amd64/conf/LINT-NOINET (contents, props changed) head/sys/amd64/conf/LINT-NOINET6 (contents, props changed) head/sys/amd64/conf/LINT-NOIP (contents, props changed) head/sys/arm/conf/LINT (contents, props changed) head/sys/arm64/conf/LINT (contents, props changed) head/sys/i386/conf/LINT (contents, props changed) head/sys/i386/conf/LINT-NOINET (contents, props changed) head/sys/i386/conf/LINT-NOINET6 (contents, props changed) head/sys/i386/conf/LINT-NOIP (contents, props changed) head/sys/powerpc/conf/LINT (contents, props changed) head/sys/powerpc/conf/LINT64 (contents, props changed) Deleted: head/sys/amd64/conf/Makefile head/sys/arm/conf/Makefile head/sys/arm64/conf/Makefile head/sys/i386/conf/Makefile head/sys/powerpc/conf/Makefile Modified: head/UPDATING Modified: head/UPDATING ============================================================================== --- head/UPDATING Fri Oct 9 01:37:17 2020 (r366558) +++ head/UPDATING Fri Oct 9 01:48:14 2020 (r366559) @@ -26,6 +26,19 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 13.x IS SLOW: world, or to merely disable the most expensive debugging functionality at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20200923: + LINT files are no longer generated. We now include the relevant NOTES + files. Note: This may cause conflicts with updating in some cases. + find sys -name LINT\* -rm + is suggested across this commit to remove the generated LINT files. + + If you have tried to update with generated files there, the svn + command you want to un-auger the tree is + cd sys/amd64/conf + svn revert -R . + and then do the above find from the top level. Substitute 'amd64' + above with where the error message indicates a conflict. + 20200824: OpenZFS support has been integrated. Do not upgrade root pools until the loader is updated to support zstd. Furthermore, we caution against Added: head/sys/amd64/conf/LINT ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/amd64/conf/LINT Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,5 @@ +# $FreeBSD$ + +include "../../conf/NOTES" +include "../../x86/conf/NOTES" +include NOTES Added: head/sys/amd64/conf/LINT-NOINET ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/amd64/conf/LINT-NOINET Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,8 @@ +# $FreeBSD$ + +include LINT +ident LINT-NOINET +makeoptions MKMODULESENV+="WITHOUT_INET_SUPPORT=" +nooptions INET +nodevice gre +nodevice netmap Added: head/sys/amd64/conf/LINT-NOINET6 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/amd64/conf/LINT-NOINET6 Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,6 @@ +# $FreeBSD$ + +include LINT +ident LINT-NOINET6 +makeoptions MKMODULESENV+="WITHOUT_INET6_SUPPORT=" +nooptions INET6 Added: head/sys/amd64/conf/LINT-NOIP ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/amd64/conf/LINT-NOIP Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,21 @@ +# $FreeBSD$ + +include LINT +ident LINT-NOIP +makeoptions MKMODULESENV+="WITHOUT_INET_SUPPORT=" +makeoptions MKMODULESENV+="WITHOUT_INET6_SUPPORT=" +nooptions INET +nooptions INET6 +nodevice age +nodevice alc +nodevice ale +nodevice bxe +nodevice em +nodevice fxp +nodevice jme +nodevice msk +nodevice mxge +nodevice sge +nodevice sk +nodevice txp +nodevice netmap Added: head/sys/arm/conf/LINT ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/arm/conf/LINT Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,4 @@ +# $FreeBSD$ + +include "../../conf/NOTES" +include NOTES Added: head/sys/arm64/conf/LINT ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/arm64/conf/LINT Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,4 @@ +# $FreeBSD$ + +include "../../conf/NOTES" +include NOTES Added: head/sys/i386/conf/LINT ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/i386/conf/LINT Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,5 @@ +# $FreeBSD$ + +include "../../conf/NOTES" +include "../../x86/conf/NOTES" +include NOTES Added: head/sys/i386/conf/LINT-NOINET ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/i386/conf/LINT-NOINET Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,8 @@ +# $FreeBSD$ + +include LINT +ident LINT-NOINET +makeoptions MKMODULESENV+="WITHOUT_INET_SUPPORT=" +nooptions INET +nodevice gre +nodevice netmap Added: head/sys/i386/conf/LINT-NOINET6 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/i386/conf/LINT-NOINET6 Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,6 @@ +# $FreeBSD$ + +include LINT +ident LINT-NOINET6 +makeoptions MKMODULESENV+="WITHOUT_INET6_SUPPORT=" +nooptions INET6 Added: head/sys/i386/conf/LINT-NOIP ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/i386/conf/LINT-NOIP Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,20 @@ +# $FreeBSD$ +include LINT +ident LINT-NOIP +makeoptions MKMODULESENV+="WITHOUT_INET_SUPPORT=" +makeoptions MKMODULESENV+="WITHOUT_INET6_SUPPORT=" +nooptions INET +nooptions INET6 +nodevice age +nodevice alc +nodevice ale +nodevice bxe +nodevice em +nodevice fxp +nodevice jme +nodevice msk +nodevice mxge +nodevice sge +nodevice sk +nodevice txp +nodevice netmap Added: head/sys/powerpc/conf/LINT ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/powerpc/conf/LINT Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,9 @@ +# $FreeBSD$ + +include "../../conf/NOTES" +include NOTES +machine powerpc powerpc +nodevice mlx5 +nodevice mlx5en +nodevice mlx5ib +nooptions RATELIMIT Added: head/sys/powerpc/conf/LINT64 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/powerpc/conf/LINT64 Fri Oct 9 01:48:14 2020 (r366559) @@ -0,0 +1,5 @@ +# $FreeBSD$ + +include "../../conf/NOTES" +include NOTES +machine powerpc powerpc64 From owner-svn-src-all@freebsd.org Fri Oct 9 01:48:23 2020 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 09EBA4364AC; Fri, 9 Oct 2020 01:48:23 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6rZG1pRJz3VFK; Fri, 9 Oct 2020 01:48:22 +0000 (UTC) (envelope-from imp@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 8A48A11EC7; Fri, 9 Oct 2020 01:48:21 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0991mLuZ036142; Fri, 9 Oct 2020 01:48:21 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0991mL57036141; Fri, 9 Oct 2020 01:48:21 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010090148.0991mL57036141@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 01:48:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366560 - head/sys/conf X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/sys/conf X-SVN-Commit-Revision: 366560 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.33 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: Fri, 09 Oct 2020 01:48:23 -0000 Author: imp Date: Fri Oct 9 01:48:21 2020 New Revision: 366560 URL: https://svnweb.freebsd.org/changeset/base/366560 Log: Remove now-unused files makeLINT.mk isn't needed or used anymore, remove it and all the files it uses. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D26540 Deleted: head/sys/conf/makeLINT.mk head/sys/conf/makeLINT.sed From owner-svn-src-all@freebsd.org Fri Oct 9 02:18:00 2020 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 E16E5436D39; Fri, 9 Oct 2020 02:18:00 +0000 (UTC) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: from gndrsh.dnsmgr.net (br1.CN84in.dnsmgr.net [69.59.192.140]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4C6sDS2QK6z3WG9; Fri, 9 Oct 2020 02:17:59 +0000 (UTC) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: from gndrsh.dnsmgr.net (localhost [127.0.0.1]) by gndrsh.dnsmgr.net (8.13.3/8.13.3) with ESMTP id 0992HqFn009695; Thu, 8 Oct 2020 19:17:52 -0700 (PDT) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: (from freebsd@localhost) by gndrsh.dnsmgr.net (8.13.3/8.13.3/Submit) id 0992HpT9009694; Thu, 8 Oct 2020 19:17:52 -0700 (PDT) (envelope-from freebsd) From: "Rodney W. Grimes" Message-Id: <202010090217.0992HpT9009694@gndrsh.dnsmgr.net> Subject: Re: svn commit: r366537 - head/libexec/rc/rc.d In-Reply-To: <202010081145.098BjBun018733@repo.freebsd.org> To: Pawel Biernacki Date: Thu, 8 Oct 2020 19:17:51 -0700 (PDT) CC: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Reply-To: rgrimes@freebsd.org X-Mailer: ELM [version 2.4ME+ PL121h (25)] MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII X-Rspamd-Queue-Id: 4C6sDS2QK6z3WG9 X-Spamd-Bar: ---- Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:13868, ipnet:69.59.192.0/19, country:US] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Fri, 09 Oct 2020 02:18:00 -0000 > Author: kaktus > Date: Thu Oct 8 11:45:10 2020 > New Revision: 366537 > URL: https://svnweb.freebsd.org/changeset/base/366537 > > Log: > [pf] /etc/rc.d/pf should REQUIRE routing > > When a system with pf_enable="YES" in /etc/rc.conf uses hostnames in > /etc/pf.conf, these hostnames cannot be resolved via external nameservers > because the default route is not yet set. This results in an empty > (all open) ruleset. Use of hostnames in pf, or any firewall for that mater tends to make my hair stand on end, unless those hostnames resolve via /etc/hosts or a link local resolver. > > Since r195026 already put netif back to REQUIRE, this change does not affect > the issue that the firewall should rather have been setup before any > network traffic can occur. This well cause any system that requires pf rules before routing can work to fail, aka almost any real router running a real routing protocol well now fail or have issues during route daemon start up as without firewall rules the default is to deny the routing protocol packets. This should be reverted, or at least made knobable in some way. > > PR: 211928 > Submitted by: Robert Schulze > Reported by: Robert Schulze > Tested by: Mateusz Kwiatkowski > No objections from: kp > MFC after: 3 days > > Modified: > head/libexec/rc/rc.d/pf > > Modified: head/libexec/rc/rc.d/pf > ============================================================================== > --- head/libexec/rc/rc.d/pf Thu Oct 8 11:30:22 2020 (r366536) > +++ head/libexec/rc/rc.d/pf Thu Oct 8 11:45:10 2020 (r366537) > @@ -4,8 +4,7 @@ > # > > # PROVIDE: pf > -# REQUIRE: FILESYSTEMS netif pflog pfsync > -# BEFORE: routing > +# REQUIRE: FILESYSTEMS netif pflog pfsync routing > # KEYWORD: nojailvnet > > . /etc/rc.subr > -- Rod Grimes rgrimes@freebsd.org From owner-svn-src-all@freebsd.org Fri Oct 9 04:03:58 2020 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 64B454384F0; Fri, 9 Oct 2020 04:03:58 +0000 (UTC) (envelope-from lwhsu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6vZk1tdpz3bKk; Fri, 9 Oct 2020 04:03:58 +0000 (UTC) (envelope-from lwhsu@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 237DE1377C; Fri, 9 Oct 2020 04:03:58 +0000 (UTC) (envelope-from lwhsu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09943wB9023156; Fri, 9 Oct 2020 04:03:58 GMT (envelope-from lwhsu@FreeBSD.org) Received: (from lwhsu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09943wIX023155; Fri, 9 Oct 2020 04:03:58 GMT (envelope-from lwhsu@FreeBSD.org) Message-Id: <202010090403.09943wIX023155@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: lwhsu set sender to lwhsu@FreeBSD.org using -f From: Li-Wen Hsu Date: Fri, 9 Oct 2020 04:03:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366561 - head X-SVN-Group: head X-SVN-Commit-Author: lwhsu X-SVN-Commit-Paths: head X-SVN-Commit-Revision: 366561 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.33 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: Fri, 09 Oct 2020 04:03:58 -0000 Author: lwhsu Date: Fri Oct 9 04:03:57 2020 New Revision: 366561 URL: https://svnweb.freebsd.org/changeset/base/366561 Log: Correct the primary to find(1) Sponsored by: The FreeBSD Foundation Modified: head/UPDATING Modified: head/UPDATING ============================================================================== --- head/UPDATING Fri Oct 9 01:48:21 2020 (r366560) +++ head/UPDATING Fri Oct 9 04:03:57 2020 (r366561) @@ -29,7 +29,7 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 13.x IS SLOW: 20200923: LINT files are no longer generated. We now include the relevant NOTES files. Note: This may cause conflicts with updating in some cases. - find sys -name LINT\* -rm + find sys -name LINT\* -delete is suggested across this commit to remove the generated LINT files. If you have tried to update with generated files there, the svn From owner-svn-src-all@freebsd.org Fri Oct 9 05:27:08 2020 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 EF7B24391D1; Fri, 9 Oct 2020 05:27:08 +0000 (UTC) (envelope-from jkim@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6xQh67sqz3dtb; Fri, 9 Oct 2020 05:27:08 +0000 (UTC) (envelope-from jkim@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 B599614561; Fri, 9 Oct 2020 05:27:08 +0000 (UTC) (envelope-from jkim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0995R8Kq075040; Fri, 9 Oct 2020 05:27:08 GMT (envelope-from jkim@FreeBSD.org) Received: (from jkim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0995R27I075009; Fri, 9 Oct 2020 05:27:02 GMT (envelope-from jkim@FreeBSD.org) Message-Id: <202010090527.0995R27I075009@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jkim set sender to jkim@FreeBSD.org using -f From: Jung-uk Kim Date: Fri, 9 Oct 2020 05:27:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366562 - in head/sys/contrib/dev/acpica: . common compiler components/debugger components/disassembler components/events components/executer components/namespace components/parser comp... X-SVN-Group: head X-SVN-Commit-Author: jkim X-SVN-Commit-Paths: in head/sys/contrib/dev/acpica: . common compiler components/debugger components/disassembler components/events components/executer components/namespace components/parser components/utilities include X-SVN-Commit-Revision: 366562 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.33 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: Fri, 09 Oct 2020 05:27:09 -0000 Author: jkim Date: Fri Oct 9 05:27:02 2020 New Revision: 366562 URL: https://svnweb.freebsd.org/changeset/base/366562 Log: MFV: r366539 Merge ACPICA 20200925. Modified: head/sys/contrib/dev/acpica/changes.txt head/sys/contrib/dev/acpica/common/ahpredef.c head/sys/contrib/dev/acpica/common/ahuuids.c head/sys/contrib/dev/acpica/common/dmtbinfo1.c head/sys/contrib/dev/acpica/compiler/aslcompiler.l head/sys/contrib/dev/acpica/compiler/aslload.c head/sys/contrib/dev/acpica/compiler/aslmessages.c head/sys/contrib/dev/acpica/compiler/aslmessages.h head/sys/contrib/dev/acpica/compiler/aslparseop.c head/sys/contrib/dev/acpica/compiler/aslprepkg.c head/sys/contrib/dev/acpica/compiler/aslutils.c head/sys/contrib/dev/acpica/compiler/aslxref.c head/sys/contrib/dev/acpica/components/debugger/dbexec.c head/sys/contrib/dev/acpica/components/debugger/dbinput.c head/sys/contrib/dev/acpica/components/debugger/dbmethod.c head/sys/contrib/dev/acpica/components/disassembler/dmbuffer.c head/sys/contrib/dev/acpica/components/disassembler/dmcstyle.c head/sys/contrib/dev/acpica/components/events/evrgnini.c head/sys/contrib/dev/acpica/components/executer/exregion.c head/sys/contrib/dev/acpica/components/namespace/nsalloc.c head/sys/contrib/dev/acpica/components/namespace/nsarguments.c head/sys/contrib/dev/acpica/components/namespace/nsxfobj.c head/sys/contrib/dev/acpica/components/parser/psparse.c head/sys/contrib/dev/acpica/components/utilities/utpredef.c head/sys/contrib/dev/acpica/components/utilities/utstrsuppt.c head/sys/contrib/dev/acpica/include/acconfig.h head/sys/contrib/dev/acpica/include/acdebug.h head/sys/contrib/dev/acpica/include/acexcep.h head/sys/contrib/dev/acpica/include/acpixf.h head/sys/contrib/dev/acpica/include/acpredef.h head/sys/contrib/dev/acpica/include/actbl1.h head/sys/contrib/dev/acpica/include/actypes.h head/sys/contrib/dev/acpica/include/acuuid.h Directory Properties: head/sys/contrib/dev/acpica/ (props changed) Modified: head/sys/contrib/dev/acpica/changes.txt ============================================================================== --- head/sys/contrib/dev/acpica/changes.txt Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/changes.txt Fri Oct 9 05:27:02 2020 (r366562) @@ -1,6 +1,80 @@ ---------------------------------------- +25 September 2020. Summary of changes for version 20200925: + +This release is available at https://acpica.org/downloads + + +1) ACPICA kernel-resident subsystem: + +Preserve memory opregion mappings. The ACPICA's strategy with respect to +the handling of memory mappings associated with memory operation regions +is to avoid mapping the entire region at once which may be problematic at +least in principle (for example, it may lead to conflicts with +overlapping mappings having different attributes created by drivers). It +may also be wasteful, because memory opregions on some systems take up +vastchunks of address space while the fields in those regions actually +accessed by AML are sparsely distributed. + +For this reason, a one-page "window" is mapped for a given opregion on +the first memory access through it and if that "window" does not cover an +address range accessed through that opregion subsequently, it is unmapped +and a new "window" is mapped to replace it. Next, if the new "window" is +not sufficient to access memory through the opregion in question in the +future, it will be replaced with yet another "window" and so on. That +may lead to a suboptimal sequence of memory mapping and unmapping +operations, for example if two fields in one opregion separated from each +other by a sufficiently wide chunk of unused address space are accessed +in an alternating pattern. + +Added support for 64 bit risc-v compilation. Useful for acpica tools and +incorporating ACPICA into the Firmware Test Suite. Colin Ian King +. + +Added support for SMBus predefined names (from SMBus Control Method +Interface Specification, Version 1.0, December 10, 1999. New predefined +names: + _SBA + _SBI + _SBR + _SBT + _SBW + +AML Disassembler: Added a new command, "All Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode); + Node->Type = TargetNode->Type; + if (Node->Type == ACPI_TYPE_METHOD) + { + /* Save the parameter count for methods */ + + Node->Value = TargetNode->Value; + } } return (AE_OK); Modified: head/sys/contrib/dev/acpica/compiler/aslmessages.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslmessages.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/compiler/aslmessages.c Fri Oct 9 05:27:02 2020 (r366562) @@ -381,6 +381,9 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_DUPLICATE_EXTERN_MISMATCH */ "Type mismatch between multiple external declarations detected", /* ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE */"Duplicate external declaration:", /* ASL_MSG_CONDREF_NEEDS_EXTERNAL_DECL */"CondRefOf parameter requires External() declaration", +/* ASL_MSG_EXTERNAL_FOUND_HERE */ "External declaration below ", +/* ASL_MSG_LOWER_CASE_NAMESEG */ "At least one lower case letter found in NameSeg, ASL is case insensitive - converting to upper case", +/* ASL_MSG_LOWER_CASE_NAMEPATH */ "At least one lower case letter found in NamePath, ASL is case insensitive - converting to upper case", }; /* Table compiler */ Modified: head/sys/contrib/dev/acpica/compiler/aslmessages.h ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslmessages.h Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/compiler/aslmessages.h Fri Oct 9 05:27:02 2020 (r366562) @@ -383,6 +383,9 @@ typedef enum ASL_MSG_DUPLICATE_EXTERN_MISMATCH, ASL_MSG_DUPLICATE_EXTERN_FOUND_HERE, ASL_MSG_CONDREF_NEEDS_EXTERNAL_DECL, + ASL_MSG_EXTERNAL_FOUND_HERE, + ASL_MSG_LOWER_CASE_NAMESEG, + ASL_MSG_LOWER_CASE_NAMEPATH, /* These messages are used by the Data Table compiler only */ Modified: head/sys/contrib/dev/acpica/compiler/aslparseop.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslparseop.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/compiler/aslparseop.c Fri Oct 9 05:27:02 2020 (r366562) @@ -388,6 +388,8 @@ TrCreateValuedLeafOp ( UINT64 Value) { ACPI_PARSE_OBJECT *Op; + UINT32 i; + char *StringPtr = NULL; Op = TrAllocateOp (ParseOpcode); @@ -408,11 +410,35 @@ TrCreateValuedLeafOp ( case PARSEOP_NAMESEG: + /* Check for mixed case (or all lower case). Issue a remark in this case */ + + for (i = 0; i < ACPI_NAMESEG_SIZE; i++) + { + if (islower (Op->Asl.Value.Name[i])) + { + AcpiUtStrupr (&Op->Asl.Value.Name[i]); + AslError (ASL_REMARK, ASL_MSG_LOWER_CASE_NAMESEG, Op, Op->Asl.Value.Name); + break; + } + } DbgPrint (ASL_PARSE_OUTPUT, "NAMESEG->%s", Op->Asl.Value.String); break; case PARSEOP_NAMESTRING: + /* Check for mixed case (or all lower case). Issue a remark in this case */ + + StringPtr = Op->Asl.Value.Name; + for (i = 0; *StringPtr; i++) + { + if (islower (*StringPtr)) + { + AcpiUtStrupr (&Op->Asl.Value.Name[i]); + AslError (ASL_REMARK, ASL_MSG_LOWER_CASE_NAMEPATH, Op, Op->Asl.Value.Name); + break; + } + StringPtr++; + } DbgPrint (ASL_PARSE_OUTPUT, "NAMESTRING->%s", Op->Asl.Value.String); break; Modified: head/sys/contrib/dev/acpica/compiler/aslprepkg.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslprepkg.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/compiler/aslprepkg.c Fri Oct 9 05:27:02 2020 (r366562) @@ -318,6 +318,17 @@ ApCheckPackage ( */ for (i = 0; i < Count; i++) { + if (!Op) + { + /* + * If we get to this point, it means that the package length + * is larger than the initializer list. Stop processing the + * package and return because we have run out of package + * elements to analyze. + */ + return; + } + ApCheckObjectType (Predefined->Info.Name, Op, Package->RetInfo.ObjectType1, i); Op = Op->Asl.Next; @@ -917,7 +928,7 @@ ApPackageTooSmall ( UINT32 ExpectedCount) { - sprintf (AslGbl_MsgBuffer, "%s: length %u, required minimum is %u", + sprintf (AslGbl_MsgBuffer, "%4.4s: length %u, required minimum is %u", PredefinedName, Count, ExpectedCount); AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer); @@ -946,7 +957,7 @@ ApZeroLengthPackage ( ACPI_PARSE_OBJECT *Op) { - sprintf (AslGbl_MsgBuffer, "%s: length is zero", PredefinedName); + sprintf (AslGbl_MsgBuffer, "%4.4s: length is zero", PredefinedName); AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer); } @@ -975,7 +986,7 @@ ApPackageTooLarge ( UINT32 ExpectedCount) { - sprintf (AslGbl_MsgBuffer, "%s: length is %u, only %u required", + sprintf (AslGbl_MsgBuffer, "%4.4s: length is %u, only %u required", PredefinedName, Count, ExpectedCount); AslError (ASL_REMARK, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer); Modified: head/sys/contrib/dev/acpica/compiler/aslutils.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslutils.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/compiler/aslutils.c Fri Oct 9 05:27:02 2020 (r366562) @@ -1074,14 +1074,16 @@ UtDoConstant ( { ACPI_STATUS Status; UINT64 ConvertedInteger; - char ErrBuf[64]; + char ErrBuf[128]; + const ACPI_EXCEPTION_INFO *ExceptionInfo; Status = AcpiUtStrtoul64 (String, &ConvertedInteger); if (ACPI_FAILURE (Status)) { - sprintf (ErrBuf, "While creating 64-bit constant: %s\n", - AcpiFormatException (Status)); + ExceptionInfo = AcpiUtValidateException ((ACPI_STATUS) Status); + sprintf (ErrBuf, " %s while converting to 64-bit integer", + ExceptionInfo->Description); AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber, AslGbl_CurrentLineOffset, Modified: head/sys/contrib/dev/acpica/compiler/aslxref.c ============================================================================== --- head/sys/contrib/dev/acpica/compiler/aslxref.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/compiler/aslxref.c Fri Oct 9 05:27:02 2020 (r366562) @@ -433,6 +433,7 @@ XfNamespaceLocateBegin ( UINT32 i; ACPI_NAMESPACE_NODE *DeclarationParentMethod; ACPI_PARSE_OBJECT *ReferenceParentMethod; + char *ExternalPath; ACPI_FUNCTION_TRACE_PTR (XfNamespaceLocateBegin, Op); @@ -1263,7 +1264,15 @@ XfNamespaceLocateBegin ( Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_CONDREFOF && !XfRefIsGuardedByIfCondRefOf (Node, Op)) { - AslError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL); + ExternalPath = AcpiNsGetNormalizedPathname (Node, TRUE); + sprintf (AslGbl_MsgBuffer, "full path of external object: %s", + ExternalPath); + AslDualParseOpError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL, + ASL_MSG_EXTERNAL_FOUND_HERE, Node->Op, AslGbl_MsgBuffer); + if (ExternalPath) + { + ACPI_FREE (ExternalPath); + } } /* 5) Check for a connection object */ Modified: head/sys/contrib/dev/acpica/components/debugger/dbexec.c ============================================================================== --- head/sys/contrib/dev/acpica/components/debugger/dbexec.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/debugger/dbexec.c Fri Oct 9 05:27:02 2020 (r366562) @@ -252,7 +252,8 @@ AcpiDbDeleteObjects ( * * RETURN: Status * - * DESCRIPTION: Execute a control method. + * DESCRIPTION: Execute a control method. Used to evaluate objects via the + * "EXECUTE" or "EVALUATE" commands. * ******************************************************************************/ @@ -504,11 +505,12 @@ AcpiDbExecutionWalk ( Status = AcpiEvaluateObject (Node, NULL, NULL, &ReturnObj); + AcpiGbl_MethodExecuting = FALSE; + AcpiOsPrintf ("Evaluation of [%4.4s] returned %s\n", AcpiUtGetNodeName (Node), AcpiFormatException (Status)); - AcpiGbl_MethodExecuting = FALSE; return (AE_OK); } @@ -525,7 +527,8 @@ AcpiDbExecutionWalk ( * RETURN: None * * DESCRIPTION: Execute a control method. Name is relative to the current - * scope. + * scope. Function used for the "EXECUTE", "EVALUATE", and + * "ALL" commands * ******************************************************************************/ @@ -569,6 +572,12 @@ AcpiDbExecute ( return; } + if ((Flags & EX_ALL) && (strlen (Name) > 4)) + { + AcpiOsPrintf ("Input name (%s) must be a 4-char NameSeg\n", Name); + return; + } + NameString = ACPI_ALLOCATE (strlen (Name) + 1); if (!NameString) { @@ -588,14 +597,28 @@ AcpiDbExecute ( return; } - AcpiGbl_DbMethodInfo.Name = NameString; - AcpiGbl_DbMethodInfo.Args = Args; - AcpiGbl_DbMethodInfo.Types = Types; - AcpiGbl_DbMethodInfo.Flags = Flags; + /* Command (ALL ) to execute all methods of a particular name */ - ReturnObj.Pointer = NULL; - ReturnObj.Length = ACPI_ALLOCATE_BUFFER; + else if (Flags & EX_ALL) + { + AcpiGbl_DbMethodInfo.Name = NameString; + ReturnObj.Pointer = NULL; + ReturnObj.Length = ACPI_ALLOCATE_BUFFER; + AcpiDbEvaluateAll (NameString); + ACPI_FREE (NameString); + return; + } + else + { + AcpiGbl_DbMethodInfo.Name = NameString; + AcpiGbl_DbMethodInfo.Args = Args; + AcpiGbl_DbMethodInfo.Types = Types; + AcpiGbl_DbMethodInfo.Flags = Flags; + ReturnObj.Pointer = NULL; + ReturnObj.Length = ACPI_ALLOCATE_BUFFER; + } + Status = AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo); if (ACPI_FAILURE (Status)) { @@ -655,6 +678,7 @@ AcpiDbExecute ( (UINT32) ReturnObj.Length); AcpiDbDumpExternalObject (ReturnObj.Pointer, 1); + AcpiOsPrintf ("\n"); /* Dump a _PLD buffer if present */ Modified: head/sys/contrib/dev/acpica/components/debugger/dbinput.c ============================================================================== --- head/sys/contrib/dev/acpica/components/debugger/dbinput.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/debugger/dbinput.c Fri Oct 9 05:27:02 2020 (r366562) @@ -195,6 +195,7 @@ enum AcpiExDebuggerCommands { CMD_NOT_FOUND = 0, CMD_NULL, + CMD_ALL, CMD_ALLOCATIONS, CMD_ARGS, CMD_ARGUMENTS, @@ -275,6 +276,7 @@ static const ACPI_DB_COMMAND_INFO AcpiGbl_DbCommands { {"", 0}, {"", 0}, + {"ALL", 1}, {"ALLOCATIONS", 0}, {"ARGS", 0}, {"ARGUMENTS", 0}, @@ -377,6 +379,7 @@ static const ACPI_DB_COMMAND_HELP AcpiGbl_DbCommandH {1, " Type ", "Display object type\n"}, {0, "\nControl Method Execution:", "\n"}, + {1, " All ", "Evaluate all objects named NameSeg\n"}, {1, " Evaluate [Arguments]", "Evaluate object or control method\n"}, {1, " Execute [Arguments]", "Synonym for Evaluate\n"}, #ifdef ACPI_APPLICATION @@ -599,7 +602,7 @@ AcpiDbDisplayHelp ( } else { - /* Display help for all commands that match the subtring */ + /* Display help for all commands that match the substring */ AcpiDbDisplayCommandInfo (Command, TRUE); } @@ -945,6 +948,13 @@ AcpiDbCommandDispatch ( { return (AE_OK); } + break; + + case CMD_ALL: + + AcpiOsPrintf ("Executing all objects with NameSeg: %s\n", AcpiGbl_DbArgs[1]); + AcpiDbExecute (AcpiGbl_DbArgs[1], + &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP | EX_ALL); break; case CMD_ALLOCATIONS: Modified: head/sys/contrib/dev/acpica/components/debugger/dbmethod.c ============================================================================== --- head/sys/contrib/dev/acpica/components/debugger/dbmethod.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/debugger/dbmethod.c Fri Oct 9 05:27:02 2020 (r366562) @@ -170,7 +170,11 @@ AcpiDbWalkForExecute ( void *Context, void **ReturnValue); +static ACPI_STATUS +AcpiDbEvaluateObject ( + ACPI_NAMESPACE_NODE *Node); + /******************************************************************************* * * FUNCTION: AcpiDbSetMethodBreakpoint @@ -542,47 +546,30 @@ AcpiDbDisassembleMethod ( /******************************************************************************* * - * FUNCTION: AcpiDbWalkForExecute + * FUNCTION: AcpiDbEvaluateObject * - * PARAMETERS: Callback from WalkNamespace + * PARAMETERS: Node - Namespace node for the object * * RETURN: Status * - * DESCRIPTION: Batch execution module. Currently only executes predefined - * ACPI names. + * DESCRIPTION: Main execution function for the Evaluate/Execute/All debugger + * commands. * ******************************************************************************/ static ACPI_STATUS -AcpiDbWalkForExecute ( - ACPI_HANDLE ObjHandle, - UINT32 NestingLevel, - void *Context, - void **ReturnValue) +AcpiDbEvaluateObject ( + ACPI_NAMESPACE_NODE *Node) { - ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; - ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context; - ACPI_BUFFER ReturnObj; - ACPI_STATUS Status; char *Pathname; UINT32 i; ACPI_DEVICE_INFO *ObjInfo; ACPI_OBJECT_LIST ParamObjects; ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS]; - const ACPI_PREDEFINED_INFO *Predefined; + ACPI_BUFFER ReturnObj; + ACPI_STATUS Status; - Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); - if (!Predefined) - { - return (AE_OK); - } - - if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) - { - return (AE_OK); - } - Pathname = AcpiNsGetExternalPathname (Node); if (!Pathname) { @@ -591,7 +578,7 @@ AcpiDbWalkForExecute ( /* Get the object info for number of method parameters */ - Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo); + Status = AcpiGetObjectInfo (Node, &ObjInfo); if (ACPI_FAILURE (Status)) { ACPI_FREE (Pathname); @@ -624,13 +611,70 @@ AcpiDbWalkForExecute ( AcpiGbl_MethodExecuting = TRUE; Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj); + AcpiGbl_MethodExecuting = FALSE; AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status)); - AcpiGbl_MethodExecuting = FALSE; + if (ReturnObj.Length) + { + AcpiOsPrintf ("Evaluation of %s returned object %p, " + "external buffer length %X\n", + Pathname, ReturnObj.Pointer, (UINT32) ReturnObj.Length); + + AcpiDbDumpExternalObject (ReturnObj.Pointer, 1); + AcpiOsPrintf ("\n"); + } + ACPI_FREE (Pathname); /* Ignore status from method execution */ + return (AE_OK); + + /* Update count, check if we have executed enough methods */ + +} + +/******************************************************************************* + * + * FUNCTION: AcpiDbWalkForExecute + * + * PARAMETERS: Callback from WalkNamespace + * + * RETURN: Status + * + * DESCRIPTION: Batch execution function. Evaluates all "predefined" objects -- + * the nameseg begins with an underscore. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiDbWalkForExecute ( + ACPI_HANDLE ObjHandle, + UINT32 NestingLevel, + void *Context, + void **ReturnValue) +{ + ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; + ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context; + ACPI_STATUS Status; + const ACPI_PREDEFINED_INFO *Predefined; + + + Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); + if (!Predefined) + { + return (AE_OK); + } + + if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) + { + return (AE_OK); + } + + AcpiDbEvaluateObject (Node); + + /* Ignore status from object evaluation */ + Status = AE_OK; /* Update count, check if we have executed enough methods */ @@ -647,6 +691,56 @@ AcpiDbWalkForExecute ( /******************************************************************************* * + * FUNCTION: AcpiDbWalkForExecuteAll + * + * PARAMETERS: Callback from WalkNamespace + * + * RETURN: Status + * + * DESCRIPTION: Batch execution function. Evaluates all objects whose path ends + * with the nameseg "Info->NameSeg". Used for the "ALL" command. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiDbWalkForExecuteAll ( + ACPI_HANDLE ObjHandle, + UINT32 NestingLevel, + void *Context, + void **ReturnValue) +{ + ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; + ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context; + ACPI_STATUS Status; + + + if (!ACPI_COMPARE_NAMESEG (Node->Name.Ascii, Info->NameSeg)) + { + return (AE_OK); + } + + if (Node->Type == ACPI_TYPE_LOCAL_SCOPE) + { + return (AE_OK); + } + + /* Now evaluate the input object (node) */ + + AcpiDbEvaluateObject (Node); + + /* Ignore status from method execution */ + + Status = AE_OK; + + /* Update count of executed methods/objects */ + + Info->Count++; + return (Status); +} + + +/******************************************************************************* + * * FUNCTION: AcpiDbEvaluatePredefinedNames * * PARAMETERS: None @@ -674,4 +768,39 @@ AcpiDbEvaluatePredefinedNames ( AcpiDbWalkForExecute, NULL, (void *) &Info, NULL); AcpiOsPrintf ("Evaluated %u predefined names in the namespace\n", Info.Count); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDbEvaluateAll + * + * PARAMETERS: NoneAcpiGbl_DbMethodInfo + * + * RETURN: None + * + * DESCRIPTION: Namespace batch execution. Implements the "ALL" command. + * Execute all namepaths whose final nameseg matches the + * input nameseg. + * + ******************************************************************************/ + +void +AcpiDbEvaluateAll ( + char *NameSeg) +{ + ACPI_DB_EXECUTE_WALK Info; + + + Info.Count = 0; + Info.MaxCount = ACPI_UINT32_MAX; + ACPI_COPY_NAMESEG (Info.NameSeg, NameSeg); + Info.NameSeg[ACPI_NAMESEG_SIZE] = 0; + + /* Search all nodes in namespace */ + + (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, + AcpiDbWalkForExecuteAll, NULL, (void *) &Info, NULL); + + AcpiOsPrintf ("Evaluated %u names in the namespace\n", Info.Count); } Modified: head/sys/contrib/dev/acpica/components/disassembler/dmbuffer.c ============================================================================== --- head/sys/contrib/dev/acpica/components/disassembler/dmbuffer.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/disassembler/dmbuffer.c Fri Oct 9 05:27:02 2020 (r366562) @@ -494,6 +494,10 @@ AcpiDmUuid ( { AcpiOsPrintf (" /* %s */", Description); } + else + { + AcpiOsPrintf (" /* Unknown UUID */"); + } } Modified: head/sys/contrib/dev/acpica/components/disassembler/dmcstyle.c ============================================================================== --- head/sys/contrib/dev/acpica/components/disassembler/dmcstyle.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/disassembler/dmcstyle.c Fri Oct 9 05:27:02 2020 (r366562) @@ -744,7 +744,7 @@ AcpiDmIsOptimizationIgnored ( * Only a small subset of ASL/AML operators can be optimized. * Can only optimize/fold if there is no target (or targets) * specified for the operator. And of course, the operator - * is surrrounded by a Store() operator. + * is surrounded by a Store() operator. */ switch (StoreArgument->Common.AmlOpcode) { Modified: head/sys/contrib/dev/acpica/components/events/evrgnini.c ============================================================================== --- head/sys/contrib/dev/acpica/components/events/evrgnini.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/events/evrgnini.c Fri Oct 9 05:27:02 2020 (r366562) @@ -183,6 +183,7 @@ AcpiEvSystemMemoryRegionSetup ( { ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle; ACPI_MEM_SPACE_CONTEXT *LocalRegionContext; + ACPI_MEM_MAPPING *Mm; ACPI_FUNCTION_TRACE (EvSystemMemoryRegionSetup); @@ -194,12 +195,14 @@ AcpiEvSystemMemoryRegionSetup ( { LocalRegionContext = (ACPI_MEM_SPACE_CONTEXT *) *RegionContext; - /* Delete a cached mapping if present */ + /* Delete memory mappings if present */ - if (LocalRegionContext->MappedLength) + while (LocalRegionContext->FirstMm) { - AcpiOsUnmapMemory (LocalRegionContext->MappedLogicalAddress, - LocalRegionContext->MappedLength); + Mm = LocalRegionContext->FirstMm; + LocalRegionContext->FirstMm = Mm->NextMm; + AcpiOsUnmapMemory(Mm->LogicalAddress, Mm->Length); + ACPI_FREE(Mm); } ACPI_FREE (LocalRegionContext); *RegionContext = NULL; Modified: head/sys/contrib/dev/acpica/components/executer/exregion.c ============================================================================== --- head/sys/contrib/dev/acpica/components/executer/exregion.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/executer/exregion.c Fri Oct 9 05:27:02 2020 (r366562) @@ -188,6 +188,7 @@ AcpiExSystemMemorySpaceHandler ( ACPI_STATUS Status = AE_OK; void *LogicalAddrPtr = NULL; ACPI_MEM_SPACE_CONTEXT *MemInfo = RegionContext; + ACPI_MEM_MAPPING *Mm = MemInfo->CurMm; UINT32 Length; ACPI_SIZE MapLength; ACPI_SIZE PageBoundaryMapLength; @@ -247,23 +248,48 @@ AcpiExSystemMemorySpaceHandler ( * Is 1) Address below the current mapping? OR * 2) Address beyond the current mapping? */ - if ((Address < MemInfo->MappedPhysicalAddress) || - (((UINT64) Address + Length) > - ((UINT64) - MemInfo->MappedPhysicalAddress + MemInfo->MappedLength))) + if (!Mm || (Address < Mm->PhysicalAddress) || + ((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length)) { /* - * The request cannot be resolved by the current memory mapping; - * Delete the existing mapping and create a new one. + * The request cannot be resolved by the current memory mapping. + * + * Look for an existing saved mapping covering the address range + * at hand. If found, save it as the current one and carry out + * the access. */ - if (MemInfo->MappedLength) + for (Mm = MemInfo->FirstMm; Mm; Mm = Mm->NextMm) { - /* Valid mapping, delete it */ + if (Mm == MemInfo->CurMm) + { + continue; + } - AcpiOsUnmapMemory (MemInfo->MappedLogicalAddress, - MemInfo->MappedLength); + if (Address < Mm->PhysicalAddress) + { + continue; + } + + if ((UINT64) Address + Length > (UINT64) Mm->PhysicalAddress + Mm->Length) + { + continue; + } + + MemInfo->CurMm = Mm; + goto access; } + /* Create a new mappings list entry */ + + Mm = ACPI_ALLOCATE_ZEROED(sizeof(*Mm)); + if (!Mm) + { + ACPI_ERROR((AE_INFO, + "Unable to save memory mapping at 0x%8.8X%8.8X, size %u", + ACPI_FORMAT_UINT64(Address), Length)); + return_ACPI_STATUS(AE_NO_MEMORY); + } + /* * October 2009: Attempt to map from the requested address to the * end of the region. However, we will never map more than one @@ -297,28 +323,38 @@ AcpiExSystemMemorySpaceHandler ( /* Create a new mapping starting at the address given */ - MemInfo->MappedLogicalAddress = AcpiOsMapMemory (Address, MapLength); - if (!MemInfo->MappedLogicalAddress) + LogicalAddrPtr = AcpiOsMapMemory(Address, MapLength); + if (!LogicalAddrPtr) { ACPI_ERROR ((AE_INFO, "Could not map memory at 0x%8.8X%8.8X, size %u", ACPI_FORMAT_UINT64 (Address), (UINT32) MapLength)); - MemInfo->MappedLength = 0; + ACPI_FREE(Mm); return_ACPI_STATUS (AE_NO_MEMORY); } /* Save the physical address and mapping size */ - MemInfo->MappedPhysicalAddress = Address; - MemInfo->MappedLength = MapLength; + Mm->LogicalAddress = LogicalAddrPtr; + Mm->PhysicalAddress = Address; + Mm->Length = MapLength; + + /* + * Add the new entry to the mappigs list and save it as the + * current mapping. + */ + Mm->NextMm = MemInfo->FirstMm; + MemInfo->FirstMm = Mm; + MemInfo->CurMm = Mm; } +access: /* * Generate a logical pointer corresponding to the address we want to * access */ - LogicalAddrPtr = MemInfo->MappedLogicalAddress + - ((UINT64) Address - (UINT64) MemInfo->MappedPhysicalAddress); + LogicalAddrPtr = Mm->LogicalAddress + + ((UINT64) Address - (UINT64) Mm->PhysicalAddress); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n", Modified: head/sys/contrib/dev/acpica/components/namespace/nsalloc.c ============================================================================== --- head/sys/contrib/dev/acpica/components/namespace/nsalloc.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/namespace/nsalloc.c Fri Oct 9 05:27:02 2020 (r366562) @@ -481,7 +481,7 @@ AcpiNsDeleteChildren ( NodeToDelete = NextNode; NextNode = NextNode->Peer; AcpiNsDeleteNode (NodeToDelete); - }; + } /* Clear the parent's child pointer */ Modified: head/sys/contrib/dev/acpica/components/namespace/nsarguments.c ============================================================================== --- head/sys/contrib/dev/acpica/components/namespace/nsarguments.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/namespace/nsarguments.c Fri Oct 9 05:27:02 2020 (r366562) @@ -205,7 +205,9 @@ AcpiNsCheckArgumentTypes ( ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList); UserArgType = Info->Parameters[i]->Common.Type; - if (UserArgType != ArgType) + /* No typechecking for ACPI_TYPE_ANY */ + + if ((UserArgType != ArgType) && (ArgType != ACPI_TYPE_ANY)) { ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, ACPI_WARN_ALWAYS, "Argument #%u type mismatch - " Modified: head/sys/contrib/dev/acpica/components/namespace/nsxfobj.c ============================================================================== --- head/sys/contrib/dev/acpica/components/namespace/nsxfobj.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/namespace/nsxfobj.c Fri Oct 9 05:27:02 2020 (r366562) @@ -169,7 +169,8 @@ * * RETURN: Status * - * DESCRIPTION: This routine returns the type associatd with a particular handle + * DESCRIPTION: This routine returns the type associated with a particular + * handle * ******************************************************************************/ Modified: head/sys/contrib/dev/acpica/components/parser/psparse.c ============================================================================== --- head/sys/contrib/dev/acpica/components/parser/psparse.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/parser/psparse.c Fri Oct 9 05:27:02 2020 (r366562) @@ -662,8 +662,8 @@ AcpiPsParseAml ( } /* - * If the transfer to the new method method call worked - *, a new walk state was created -- get it + * If the transfer to the new method method call worked, + * a new walk state was created -- get it */ WalkState = AcpiDsGetCurrentWalkState (Thread); continue; Modified: head/sys/contrib/dev/acpica/components/utilities/utpredef.c ============================================================================== --- head/sys/contrib/dev/acpica/components/utilities/utpredef.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/utilities/utpredef.c Fri Oct 9 05:27:02 2020 (r366562) @@ -317,7 +317,7 @@ AcpiUtGetArgumentTypes ( static const char *UtExternalTypeNames[] = /* Indexed by ACPI_TYPE_* */ { - ", UNSUPPORTED-TYPE", + ", Type_ANY", ", Integer", ", String", ", Buffer", @@ -499,7 +499,7 @@ AcpiUtGetArgumentTypes ( { ThisArgumentType = METHOD_GET_NEXT_TYPE (ArgumentTypes); - if (!ThisArgumentType || (ThisArgumentType > METHOD_MAX_ARG_TYPE)) + if (ThisArgumentType > METHOD_MAX_ARG_TYPE) { printf ("**** Invalid argument type (%u) " "in predefined info structure\n", ThisArgumentType); Modified: head/sys/contrib/dev/acpica/components/utilities/utstrsuppt.c ============================================================================== --- head/sys/contrib/dev/acpica/components/utilities/utstrsuppt.c Fri Oct 9 04:03:57 2020 (r366561) +++ head/sys/contrib/dev/acpica/components/utilities/utstrsuppt.c Fri Oct 9 05:27:02 2020 (r366562) @@ -207,10 +207,16 @@ AcpiUtConvertOctalString ( while (*String) { - /* Character must be ASCII 0-7, otherwise terminate with no error */ - *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-all@freebsd.org Fri Oct 9 05:28:33 2020 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 952FE4396B2; Fri, 9 Oct 2020 05:28:33 +0000 (UTC) (envelope-from pfg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C6xSK3PLqz3f3n; Fri, 9 Oct 2020 05:28:33 +0000 (UTC) (envelope-from pfg@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 594BB14990; Fri, 9 Oct 2020 05:28:33 +0000 (UTC) (envelope-from pfg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0995SXZK075220; Fri, 9 Oct 2020 05:28:33 GMT (envelope-from pfg@FreeBSD.org) Received: (from pfg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0995SXXP075219; Fri, 9 Oct 2020 05:28:33 GMT (envelope-from pfg@FreeBSD.org) Message-Id: <202010090528.0995SXXP075219@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: pfg set sender to pfg@FreeBSD.org using -f From: "Pedro F. Giffuni" Date: Fri, 9 Oct 2020 05:28:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366563 - stable/12/sys/fs/ext2fs X-SVN-Group: stable-12 X-SVN-Commit-Author: pfg X-SVN-Commit-Paths: stable/12/sys/fs/ext2fs X-SVN-Commit-Revision: 366563 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.33 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: Fri, 09 Oct 2020 05:28:33 -0000 Author: pfg Date: Fri Oct 9 05:28:32 2020 New Revision: 366563 URL: https://svnweb.freebsd.org/changeset/base/366563 Log: MFC r366501: ext2fs: minor typo. Obtained from: Dragonfly Modified: stable/12/sys/fs/ext2fs/ext2_alloc.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/fs/ext2fs/ext2_alloc.c ============================================================================== --- stable/12/sys/fs/ext2fs/ext2_alloc.c Fri Oct 9 05:27:02 2020 (r366562) +++ stable/12/sys/fs/ext2fs/ext2_alloc.c Fri Oct 9 05:28:32 2020 (r366563) @@ -192,7 +192,7 @@ static SYSCTL_NODE(_vfs, OID_AUTO, ext2fs, CTLFLAG_RW, static int doasyncfree = 1; SYSCTL_INT(_vfs_ext2fs, OID_AUTO, doasyncfree, CTLFLAG_RW, &doasyncfree, 0, - "Use asychronous writes to update block pointers when freeing blocks"); + "Use asynchronous writes to update block pointers when freeing blocks"); static int doreallocblks = 0; From owner-svn-src-all@freebsd.org Fri Oct 9 09:33:46 2020 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 8E0F543D6BE; Fri, 9 Oct 2020 09:33:46 +0000 (UTC) (envelope-from rscheff@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C72vG3D51z46mV; Fri, 9 Oct 2020 09:33:46 +0000 (UTC) (envelope-from rscheff@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 51BFC17578; Fri, 9 Oct 2020 09:33:46 +0000 (UTC) (envelope-from rscheff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0999Xk2C030319; Fri, 9 Oct 2020 09:33:46 GMT (envelope-from rscheff@FreeBSD.org) Received: (from rscheff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0999XkUu030318; Fri, 9 Oct 2020 09:33:46 GMT (envelope-from rscheff@FreeBSD.org) Message-Id: <202010090933.0999XkUu030318@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rscheff set sender to rscheff@FreeBSD.org using -f From: Richard Scheffenegger Date: Fri, 9 Oct 2020 09:33:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366564 - stable/12/sys/netinet/cc X-SVN-Group: stable-12 X-SVN-Commit-Author: rscheff X-SVN-Commit-Paths: stable/12/sys/netinet/cc X-SVN-Commit-Revision: 366564 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.33 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: Fri, 09 Oct 2020 09:33:46 -0000 Author: rscheff Date: Fri Oct 9 09:33:45 2020 New Revision: 366564 URL: https://svnweb.freebsd.org/changeset/base/366564 Log: MFC r366149: TCP newreno: improve after_idle ssthresh Adjust ssthresh in after_idle to the maximum of the prior ssthresh, or 3/4 of the prior cwnd. See RFC2861 section 2 for an in depth explanation for the rationale around this. As newreno is the default "fall-through" reaction, most tcp variants will benefit from this. Reviewed by: tuexen MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D22438 Modified: stable/12/sys/netinet/cc/cc_newreno.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/netinet/cc/cc_newreno.c ============================================================================== --- stable/12/sys/netinet/cc/cc_newreno.c Fri Oct 9 05:28:32 2020 (r366563) +++ stable/12/sys/netinet/cc/cc_newreno.c Fri Oct 9 09:33:45 2020 (r366564) @@ -213,12 +213,19 @@ newreno_after_idle(struct cc_var *ccv) * wirespeed, overloading router and switch buffers along the way. * * See RFC5681 Section 4.1. "Restarting Idle Connections". + * + * In addition, per RFC2861 Section 2, the ssthresh is set to the + * maximum of the former ssthresh or 3/4 of the old cwnd, to + * not exit slow-start prematurely. */ if (V_tcp_do_rfc3390) rw = min(4 * CCV(ccv, t_maxseg), max(2 * CCV(ccv, t_maxseg), 4380)); else rw = CCV(ccv, t_maxseg) * 2; + + CCV(ccv, snd_ssthresh) = max(CCV(ccv, snd_ssthresh), + CCV(ccv, snd_cwnd)-(CCV(ccv, snd_cwnd)>>2)); CCV(ccv, snd_cwnd) = min(rw, CCV(ccv, snd_cwnd)); } From owner-svn-src-all@freebsd.org Fri Oct 9 09:37:44 2020 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 3D14C43DC89; Fri, 9 Oct 2020 09:37:44 +0000 (UTC) (envelope-from rscheff@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C72zr0vPmz46rN; Fri, 9 Oct 2020 09:37:44 +0000 (UTC) (envelope-from rscheff@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 F19701799E; Fri, 9 Oct 2020 09:37:43 +0000 (UTC) (envelope-from rscheff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0999bhpt030652; Fri, 9 Oct 2020 09:37:43 GMT (envelope-from rscheff@FreeBSD.org) Received: (from rscheff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0999bhLc030649; Fri, 9 Oct 2020 09:37:43 GMT (envelope-from rscheff@FreeBSD.org) Message-Id: <202010090937.0999bhLc030649@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rscheff set sender to rscheff@FreeBSD.org using -f From: Richard Scheffenegger Date: Fri, 9 Oct 2020 09:37:43 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366565 - stable/12/sys/netinet X-SVN-Group: stable-12 X-SVN-Commit-Author: rscheff X-SVN-Commit-Paths: stable/12/sys/netinet X-SVN-Commit-Revision: 366565 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.33 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: Fri, 09 Oct 2020 09:37:44 -0000 Author: rscheff Date: Fri Oct 9 09:37:43 2020 New Revision: 366565 URL: https://svnweb.freebsd.org/changeset/base/366565 Log: MFC r366150: TCP: send full initial window when timestamps are in use The fastpath in tcp_output tries to send out full segments, and avoid sending partial segments by comparing against the static t_maxseg variable. That value does not consider tcp options like timestamps, while the initial window calculation is using the correct dynamic tcp_maxseg() function. Due to this interaction, the last, full size segment is considered too short and not sent out immediately. Reported by: tuexen MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D26478 Modified: stable/12/sys/netinet/tcp.h stable/12/sys/netinet/tcp_output.c stable/12/sys/netinet/tcp_subr.c Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/netinet/tcp.h ============================================================================== --- stable/12/sys/netinet/tcp.h Fri Oct 9 09:33:45 2020 (r366564) +++ stable/12/sys/netinet/tcp.h Fri Oct 9 09:37:43 2020 (r366565) @@ -80,6 +80,8 @@ struct tcphdr { u_short th_urp; /* urgent pointer */ }; +#define PADTCPOLEN(len) ((((len) / 4) + !!((len) % 4)) * 4) + #define TCPOPT_EOL 0 #define TCPOLEN_EOL 1 #define TCPOPT_PAD 0 /* padding after EOL */ Modified: stable/12/sys/netinet/tcp_output.c ============================================================================== --- stable/12/sys/netinet/tcp_output.c Fri Oct 9 09:33:45 2020 (r366564) +++ stable/12/sys/netinet/tcp_output.c Fri Oct 9 09:37:43 2020 (r366565) @@ -577,6 +577,20 @@ after_sack_rexmit: if (len >= tp->t_maxseg) goto send; /* + * As the TCP header options are now + * considered when setting up the initial + * window, we would not send the last segment + * if we skip considering the option length here. + * Note: this may not work when tcp headers change + * very dynamically in the future. + */ + if ((((tp->t_flags & TF_SIGNATURE) ? + PADTCPOLEN(TCPOLEN_SIGNATURE) : 0) + + ((tp->t_flags & TF_RCVD_TSTMP) ? + PADTCPOLEN(TCPOLEN_TIMESTAMP) : 0) + + len) >= tp->t_maxseg) + goto send; + /* * NOTE! on localhost connections an 'ack' from the remote * end may occur synchronously with the output and cause * us to flush a buffer queued with moretocome. XXX Modified: stable/12/sys/netinet/tcp_subr.c ============================================================================== --- stable/12/sys/netinet/tcp_subr.c Fri Oct 9 09:33:45 2020 (r366564) +++ stable/12/sys/netinet/tcp_subr.c Fri Oct 9 09:37:43 2020 (r366565) @@ -2941,7 +2941,6 @@ tcp_maxseg(const struct tcpcb *tp) * but this is harmless, since result of tcp_maxseg() is used * only in cwnd and ssthresh estimations. */ -#define PAD(len) ((((len) / 4) + !!((len) % 4)) * 4) if (TCPS_HAVEESTABLISHED(tp->t_state)) { if (tp->t_flags & TF_RCVD_TSTMP) optlen = TCPOLEN_TSTAMP_APPA; @@ -2949,26 +2948,26 @@ tcp_maxseg(const struct tcpcb *tp) optlen = 0; #if defined(IPSEC_SUPPORT) || defined(TCP_SIGNATURE) if (tp->t_flags & TF_SIGNATURE) - optlen += PAD(TCPOLEN_SIGNATURE); + optlen += PADTCPOLEN(TCPOLEN_SIGNATURE); #endif if ((tp->t_flags & TF_SACK_PERMIT) && tp->rcv_numsacks > 0) { optlen += TCPOLEN_SACKHDR; optlen += tp->rcv_numsacks * TCPOLEN_SACK; - optlen = PAD(optlen); + optlen = PADTCPOLEN(optlen); } } else { if (tp->t_flags & TF_REQ_TSTMP) optlen = TCPOLEN_TSTAMP_APPA; else - optlen = PAD(TCPOLEN_MAXSEG); + optlen = PADTCPOLEN(TCPOLEN_MAXSEG); if (tp->t_flags & TF_REQ_SCALE) - optlen += PAD(TCPOLEN_WINDOW); + optlen += PADTCPOLEN(TCPOLEN_WINDOW); #if defined(IPSEC_SUPPORT) || defined(TCP_SIGNATURE) if (tp->t_flags & TF_SIGNATURE) - optlen += PAD(TCPOLEN_SIGNATURE); + optlen += PADTCPOLEN(TCPOLEN_SIGNATURE); #endif if (tp->t_flags & TF_SACK_PERMIT) - optlen += PAD(TCPOLEN_SACK_PERMITTED); + optlen += PADTCPOLEN(TCPOLEN_SACK_PERMITTED); } #undef PAD optlen = min(optlen, TCP_MAXOLEN); From owner-svn-src-all@freebsd.org Fri Oct 9 10:07:42 2020 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 9B5E143DF42; Fri, 9 Oct 2020 10:07:42 +0000 (UTC) (envelope-from rscheff@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C73fQ3gqBz494Q; Fri, 9 Oct 2020 10:07:42 +0000 (UTC) (envelope-from rscheff@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 5D26317F90; Fri, 9 Oct 2020 10:07:42 +0000 (UTC) (envelope-from rscheff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099A7gax048974; Fri, 9 Oct 2020 10:07:42 GMT (envelope-from rscheff@FreeBSD.org) Received: (from rscheff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099A7fJb048970; Fri, 9 Oct 2020 10:07:41 GMT (envelope-from rscheff@FreeBSD.org) Message-Id: <202010091007.099A7fJb048970@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rscheff set sender to rscheff@FreeBSD.org using -f From: Richard Scheffenegger Date: Fri, 9 Oct 2020 10:07:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366566 - head/usr.bin/netstat X-SVN-Group: head X-SVN-Commit-Author: rscheff X-SVN-Commit-Paths: head/usr.bin/netstat X-SVN-Commit-Revision: 366566 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.33 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: Fri, 09 Oct 2020 10:07:42 -0000 Author: rscheff Date: Fri Oct 9 10:07:41 2020 New Revision: 366566 URL: https://svnweb.freebsd.org/changeset/base/366566 Log: Extend netstat to display TCP stack and detailed congestion state Adding the "-c" option used to show detailed per-connection congestion control state for TCP sessions. This is one summary patch, which adds the relevant variables into xtcpcb. As previous "spare" space is used, these changes are ABI compatible. Reviewed by: tuexen MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D26518 Modified: head/usr.bin/netstat/inet.c head/usr.bin/netstat/main.c head/usr.bin/netstat/netstat.1 head/usr.bin/netstat/netstat.h Modified: head/usr.bin/netstat/inet.c ============================================================================== --- head/usr.bin/netstat/inet.c Fri Oct 9 09:37:43 2020 (r366565) +++ head/usr.bin/netstat/inet.c Fri Oct 9 10:07:41 2020 (r366566) @@ -85,6 +85,8 @@ __FBSDID("$FreeBSD$"); #include "netstat.h" #include "nl_defs.h" +#define max(a, b) (((a) > (b)) ? (a) : (b)) + #ifdef INET static void inetprint(const char *, struct in_addr *, int, const char *, int, const int); @@ -204,6 +206,7 @@ protopr(u_long off, const char *name, int af1, int pro struct xinpcb *inp; struct xinpgen *xig, *oxig; struct xsocket *so; + int fnamelen, cnamelen; istcp = 0; switch (proto) { @@ -236,6 +239,28 @@ protopr(u_long off, const char *name, int af1, int pro if (!pcblist_sysctl(proto, name, &buf)) return; + if (cflag || Cflag) { + fnamelen = strlen("Stack"); + cnamelen = strlen("CC"); + oxig = xig = (struct xinpgen *)buf; + for (xig = (struct xinpgen*)((char *)xig + xig->xig_len); + xig->xig_len > sizeof(struct xinpgen); + xig = (struct xinpgen *)((char *)xig + xig->xig_len)) { + if (istcp) { + tp = (struct xtcpcb *)xig; + inp = &tp->xt_inp; + } else { + continue; + } + if (so->xso_protocol != proto) + continue; + if (inp->inp_gencnt > oxig->xig_gen) + continue; + fnamelen = max(fnamelen, (int)strlen(tp->xt_stack)); + cnamelen = max(cnamelen, (int)strlen(tp->xt_cc)); + } + } + oxig = xig = (struct xinpgen *)buf; for (xig = (struct xinpgen *)((char *)xig + xig->xig_len); xig->xig_len > sizeof(struct xinpgen); @@ -341,9 +366,19 @@ protopr(u_long off, const char *name, int af1, int pro xo_emit(" {T:/%8.8s} {T:/%5.5s}", "flowid", "ftype"); } + if (cflag) { + xo_emit(" {T:/%-*.*s}", + fnamelen, fnamelen, "Stack"); + } if (Cflag) - xo_emit(" {T:/%-*.*s}", TCP_CA_NAME_MAX, - TCP_CA_NAME_MAX, "CC"); + xo_emit(" {T:/%-*.*s} {T:/%10.10s}" + " {T:/%10.10s} {T:/%5.5s}" + " {T:/%3.3s}", cnamelen, + cnamelen, "CC", + "cwin", + "ssthresh", + "MSS", + "ECN"); if (Pflag) xo_emit(" {T:/%s}", "Log ID"); xo_emit("\n"); @@ -518,9 +553,24 @@ protopr(u_long off, const char *name, int af1, int pro inp->inp_flowtype); } if (istcp) { + if (cflag) + xo_emit(" {:stack/%-*.*s}", + + fnamelen, fnamelen, tp->xt_stack); if (Cflag) - xo_emit(" {:cc/%-*.*s}", TCP_CA_NAME_MAX, - TCP_CA_NAME_MAX, tp->xt_cc); + xo_emit(" {:cc/%-*.*s}" + " {:snd-cwnd/%10lu}" + " {:snd-ssthresh/%10lu}" + " {:t-maxseg/%5u} {:ecn/%3s}", + cnamelen, cnamelen, tp->xt_cc, + tp->t_snd_cwnd, tp->t_snd_ssthresh, + tp->t_maxseg, + (tp->t_state >= TCPS_ESTABLISHED ? + (tp->xt_ecn > 0 ? + (tp->xt_ecn == 1 ? + "ecn" : "ace") + : "off") + : "n/a")); if (Pflag) xo_emit(" {:log-id/%s}", tp->xt_logid[0] == '\0' ? Modified: head/usr.bin/netstat/main.c ============================================================================== --- head/usr.bin/netstat/main.c Fri Oct 9 09:37:43 2020 (r366565) +++ head/usr.bin/netstat/main.c Fri Oct 9 10:07:41 2020 (r366566) @@ -205,7 +205,8 @@ int Aflag; /* show addresses of protocol control bloc int aflag; /* show all sockets (including servers) */ static int Bflag; /* show information about bpf consumers */ int bflag; /* show i/f total bytes in/out */ -int Cflag; /* show congestion control */ +int cflag; /* show TCP congestion control stack */ +int Cflag; /* show congestion control algo and vars */ int dflag; /* show i/f dropped packets */ int gflag; /* show group (multicast) routing or stats */ int hflag; /* show counters in human readable format */ @@ -251,7 +252,7 @@ main(int argc, char *argv[]) if (argc < 0) exit(EXIT_FAILURE); - while ((ch = getopt(argc, argv, "46AaBbCdF:f:ghI:iLlM:mN:nOoPp:Qq:RrSTsuWw:xz")) + while ((ch = getopt(argc, argv, "46AaBbCcdF:f:ghI:iLlM:mN:nOoPp:Qq:RrSTsuWw:xz")) != -1) switch(ch) { case '4': @@ -280,6 +281,9 @@ main(int argc, char *argv[]) case 'b': bflag = 1; break; + case 'c': + cflag = 1; + break; case 'C': Cflag = 1; break; @@ -886,7 +890,7 @@ static void usage(void) { (void)xo_error("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", -"usage: netstat [-46AaLnRSTWx] [-f protocol_family | -p protocol]\n" +"usage: netstat [-46AaCcLnRSTWx] [-f protocol_family | -p protocol]\n" " [-M core] [-N system]", " netstat -i | -I interface [-46abdhnW] [-f address_family]\n" " [-M core] [-N system]", Modified: head/usr.bin/netstat/netstat.1 ============================================================================== --- head/usr.bin/netstat/netstat.1 Fri Oct 9 09:37:43 2020 (r366565) +++ head/usr.bin/netstat/netstat.1 Fri Oct 9 10:07:41 2020 (r366566) @@ -28,7 +28,7 @@ .\" @(#)netstat.1 8.8 (Berkeley) 4/18/94 .\" $FreeBSD$ .\" -.Dd September 13, 2020 +.Dd September 25, 2020 .Dt NETSTAT 1 .Os .Sh NAME @@ -172,8 +172,10 @@ associated with a socket; used for debugging. .It Fl a Show the state of all sockets; normally sockets used by server processes are not shown. +.It Fl c +Show the used TCP stack for each session. .It Fl C -Show the congestion control of TCP sockets. +Show the congestion control algorithm and diagnostic information of TCP sockets. .It Fl L Show the size of the various listen queues. The first count shows the number of unaccepted connections, Modified: head/usr.bin/netstat/netstat.h ============================================================================== --- head/usr.bin/netstat/netstat.h Fri Oct 9 09:37:43 2020 (r366565) +++ head/usr.bin/netstat/netstat.h Fri Oct 9 10:07:41 2020 (r366566) @@ -41,7 +41,8 @@ extern int Aflag; /* show addresses of protocol control block */ extern int aflag; /* show all sockets (including servers) */ extern int bflag; /* show i/f total bytes in/out */ -extern int Cflag; /* show congestion control */ +extern int cflag; /* show congestion control stats */ +extern int Cflag; /* show congestion control algo and stack */ extern int dflag; /* show i/f dropped packets */ extern int gflag; /* show group (multicast) routing or stats */ extern int hflag; /* show counters in human readable format */ From owner-svn-src-all@freebsd.org Fri Oct 9 10:55:20 2020 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 B35A443EE47; Fri, 9 Oct 2020 10:55:20 +0000 (UTC) (envelope-from rscheff@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C74jN4Cbnz4DjF; Fri, 9 Oct 2020 10:55:20 +0000 (UTC) (envelope-from rscheff@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 740E9187AC; Fri, 9 Oct 2020 10:55:20 +0000 (UTC) (envelope-from rscheff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099AtKoT079817; Fri, 9 Oct 2020 10:55:20 GMT (envelope-from rscheff@FreeBSD.org) Received: (from rscheff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099AtKVN079816; Fri, 9 Oct 2020 10:55:20 GMT (envelope-from rscheff@FreeBSD.org) Message-Id: <202010091055.099AtKVN079816@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rscheff set sender to rscheff@FreeBSD.org using -f From: Richard Scheffenegger Date: Fri, 9 Oct 2020 10:55:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366567 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: rscheff X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366567 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.33 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: Fri, 09 Oct 2020 10:55:20 -0000 Author: rscheff Date: Fri Oct 9 10:55:19 2020 New Revision: 366567 URL: https://svnweb.freebsd.org/changeset/base/366567 Log: Extend netstat to display TCP stack and detailed congestion state (2) Extend netstat to display TCP stack and detailed congestion state Adding the "-c" option used to show detailed per-connection congestion control state for TCP sessions. This is one summary patch, which adds the relevant variables into xtcpcb. As previous "spare" space is used, these changes are ABI compatible. Reviewed by: tuexen MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D26518 Modified: head/sys/netinet/tcp_subr.c head/sys/netinet/tcp_var.h Modified: head/sys/netinet/tcp_subr.c ============================================================================== --- head/sys/netinet/tcp_subr.c Fri Oct 9 10:07:41 2020 (r366566) +++ head/sys/netinet/tcp_subr.c Fri Oct 9 10:55:19 2020 (r366567) @@ -3437,6 +3437,13 @@ tcp_inptoxtp(const struct inpcb *inp, struct xtcpcb *x xt->t_sndzerowin = tp->t_sndzerowin; xt->t_sndrexmitpack = tp->t_sndrexmitpack; xt->t_rcvoopack = tp->t_rcvoopack; + xt->t_rcv_wnd = tp->rcv_wnd; + xt->t_snd_wnd = tp->snd_wnd; + xt->t_snd_cwnd = tp->snd_cwnd; + xt->t_snd_ssthresh = tp->snd_ssthresh; + xt->t_maxseg = tp->t_maxseg; + xt->xt_ecn = (tp->t_flags2 & TF2_ECN_PERMIT) ? 1 : 0 + + (tp->t_flags2 & TF2_ACE_PERMIT) ? 2 : 0; now = getsbinuptime(); #define COPYTIMER(ttt) do { \ Modified: head/sys/netinet/tcp_var.h ============================================================================== --- head/sys/netinet/tcp_var.h Fri Oct 9 10:07:41 2020 (r366566) +++ head/sys/netinet/tcp_var.h Fri Oct 9 10:55:19 2020 (r366567) @@ -768,7 +768,13 @@ struct xtcpcb { int32_t tt_2msl; /* (s) */ int32_t tt_delack; /* (s) */ int32_t t_logstate; /* (3) */ - int32_t spare32[32]; + uint32_t t_snd_cwnd; /* (s) */ + uint32_t t_snd_ssthresh; /* (s) */ + uint32_t t_maxseg; /* (s) */ + uint32_t t_rcv_wnd; /* (s) */ + uint32_t t_snd_wnd; /* (s) */ + uint32_t xt_ecn; /* (s) */ + int32_t spare32[26]; } __aligned(8); #ifdef _KERNEL From owner-svn-src-all@freebsd.org Fri Oct 9 11:24:20 2020 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 2876743F059; Fri, 9 Oct 2020 11:24:20 +0000 (UTC) (envelope-from ae@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C75Lr09vrz4Fbp; Fri, 9 Oct 2020 11:24:20 +0000 (UTC) (envelope-from ae@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 DE50618CD0; Fri, 9 Oct 2020 11:24:19 +0000 (UTC) (envelope-from ae@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099BOJed098227; Fri, 9 Oct 2020 11:24:19 GMT (envelope-from ae@FreeBSD.org) Received: (from ae@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099BOJuc098226; Fri, 9 Oct 2020 11:24:19 GMT (envelope-from ae@FreeBSD.org) Message-Id: <202010091124.099BOJuc098226@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ae set sender to ae@FreeBSD.org using -f From: "Andrey V. Elsukov" Date: Fri, 9 Oct 2020 11:24:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366568 - head/usr.bin/cpuset X-SVN-Group: head X-SVN-Commit-Author: ae X-SVN-Commit-Paths: head/usr.bin/cpuset X-SVN-Commit-Revision: 366568 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.33 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: Fri, 09 Oct 2020 11:24:20 -0000 Author: ae Date: Fri Oct 9 11:24:19 2020 New Revision: 366568 URL: https://svnweb.freebsd.org/changeset/base/366568 Log: Fix EINVAL message when CPU binding information is requested for IRQ. `cpuset -g -x N` along with requested information always prints message `cpuset: getdomain: Invalid argument'. The EINVAL is returned from kern_cpuset_getdomain(), since it doesn't expect CPU_LEVEL_WHICH and CPU_WHICH_IRQ parameters. To fix the error, do not call cpuset_getdomain() when `-x' is specified. MFC after: 1 week Modified: head/usr.bin/cpuset/cpuset.c Modified: head/usr.bin/cpuset/cpuset.c ============================================================================== --- head/usr.bin/cpuset/cpuset.c Fri Oct 9 10:55:19 2020 (r366567) +++ head/usr.bin/cpuset/cpuset.c Fri Oct 9 11:24:19 2020 (r366568) @@ -253,7 +253,7 @@ printaffinity(void) printf("%s %jd%s mask: ", whichnames[which], (intmax_t)id, levelnames[level]); printset((struct bitset *)&mask, CPU_SETSIZE); - if (dflag) + if (dflag || xflag) goto out; if (cpuset_getdomain(level, which, id, sizeof(domain), &domain, &policy) != 0) From owner-svn-src-all@freebsd.org Fri Oct 9 12:06:45 2020 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 6B0E93F8B5E; Fri, 9 Oct 2020 12:06:45 +0000 (UTC) (envelope-from rscheff@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C76Hn25vfz4Jc1; Fri, 9 Oct 2020 12:06:45 +0000 (UTC) (envelope-from rscheff@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 2CB1C190FD; Fri, 9 Oct 2020 12:06:45 +0000 (UTC) (envelope-from rscheff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099C6jDD025010; Fri, 9 Oct 2020 12:06:45 GMT (envelope-from rscheff@FreeBSD.org) Received: (from rscheff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099C6hPe025004; Fri, 9 Oct 2020 12:06:43 GMT (envelope-from rscheff@FreeBSD.org) Message-Id: <202010091206.099C6hPe025004@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rscheff set sender to rscheff@FreeBSD.org using -f From: Richard Scheffenegger Date: Fri, 9 Oct 2020 12:06:43 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366569 - in head/sys: net netinet netinet6 X-SVN-Group: head X-SVN-Commit-Author: rscheff X-SVN-Commit-Paths: in head/sys: net netinet netinet6 X-SVN-Commit-Revision: 366569 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.33 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: Fri, 09 Oct 2020 12:06:45 -0000 Author: rscheff Date: Fri Oct 9 12:06:43 2020 New Revision: 366569 URL: https://svnweb.freebsd.org/changeset/base/366569 Log: Add IP(V6)_VLAN_PCP to set 802.1 priority per-flow. This adds a new IP_PROTO / IPV6_PROTO setsockopt (getsockopt) option IP(V6)_VLAN_PCP, which can be set to -1 (interface default), or explicitly to any priority between 0 and 7. Note that for untagged traffic, explicitly adding a priority will insert a special 801.1Q vlan header with vlan ID = 0 to carry the priority setting Reviewed by: gallatin, rrs MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D26409 Modified: head/sys/net/if_ethersubr.c head/sys/netinet/in.h head/sys/netinet/in_pcb.h head/sys/netinet/ip_output.c head/sys/netinet6/in6.h head/sys/netinet6/ip6_output.c Modified: head/sys/net/if_ethersubr.c ============================================================================== --- head/sys/net/if_ethersubr.c Fri Oct 9 11:24:19 2020 (r366568) +++ head/sys/net/if_ethersubr.c Fri Oct 9 12:06:43 2020 (r366569) @@ -1388,6 +1388,13 @@ ether_8021q_frame(struct mbuf **mp, struct ifnet *ife, } /* + * If PCP is set in mbuf, use it + */ + if ((*mp)->m_flags & M_VLANTAG) { + pcp = EVL_PRIOFTAG((*mp)->m_pkthdr.ether_vtag); + } + + /* * If underlying interface can do VLAN tag insertion itself, * just pass the packet along. However, we need some way to * tell the interface where the packet came from so that it Modified: head/sys/netinet/in.h ============================================================================== --- head/sys/netinet/in.h Fri Oct 9 11:24:19 2020 (r366568) +++ head/sys/netinet/in.h Fri Oct 9 12:06:43 2020 (r366569) @@ -483,6 +483,10 @@ __END_DECLS /* The following option is private; do not use it from user applications. */ #define IP_MSFILTER 74 /* set/get filter list */ +/* The following option deals with the 802.1Q Ethernet Priority Code Point */ +#define IP_VLAN_PCP 75 /* int; set/get PCP used for packet, */ + /* -1 use interface default */ + /* Protocol Independent Multicast API [RFC3678] */ #define MCAST_JOIN_GROUP 80 /* join an any-source group */ #define MCAST_LEAVE_GROUP 81 /* leave all sources for group */ Modified: head/sys/netinet/in_pcb.h ============================================================================== --- head/sys/netinet/in_pcb.h Fri Oct 9 11:24:19 2020 (r366568) +++ head/sys/netinet/in_pcb.h Fri Oct 9 12:06:43 2020 (r366569) @@ -748,6 +748,13 @@ int inp_so_options(const struct inpcb *inp); #define INP_SUPPORTS_MBUFQ 0x00004000 /* Supports the mbuf queue method of LRO */ #define INP_MBUF_QUEUE_READY 0x00008000 /* The transport is pacing, inputs can be queued */ #define INP_DONT_SACK_QUEUE 0x00010000 /* If a sack arrives do not wake me */ +#define INP_2PCP_SET 0x00020000 /* If the Eth PCP should be set explicitly */ +#define INP_2PCP_BIT0 0x00040000 /* Eth PCP Bit 0 */ +#define INP_2PCP_BIT1 0x00080000 /* Eth PCP Bit 1 */ +#define INP_2PCP_BIT2 0x00100000 /* Eth PCP Bit 2 */ +#define INP_2PCP_BASE INP_2PCP_BIT0 +#define INP_2PCP_MASK (INP_2PCP_BIT0 | INP_2PCP_BIT1 | INP_2PCP_BIT2) +#define INP_2PCP_SHIFT 18 /* shift PCP field in/out of inp_flags2 */ /* * Flags passed to in_pcblookup*() functions. */ Modified: head/sys/netinet/ip_output.c ============================================================================== --- head/sys/netinet/ip_output.c Fri Oct 9 11:24:19 2020 (r366568) +++ head/sys/netinet/ip_output.c Fri Oct 9 12:06:43 2020 (r366569) @@ -62,7 +62,9 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include +#include #include #include #include @@ -324,6 +326,7 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct rou int hlen = sizeof (struct ip); int mtu = 0; int error = 0; + int vlan_pcp = -1; struct sockaddr_in *dst, sin; const struct sockaddr_in *gw; struct in_ifaddr *ia = NULL; @@ -345,6 +348,9 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct rou m->m_pkthdr.flowid = inp->inp_flowid; M_HASHTYPE_SET(m, inp->inp_flowtype); } + if ((inp->inp_flags2 & INP_2PCP_SET) != 0) + vlan_pcp = (inp->inp_flags2 & INP_2PCP_MASK) >> + INP_2PCP_SHIFT; #ifdef NUMA m->m_pkthdr.numa_domain = inp->inp_numa_domain; #endif @@ -717,6 +723,9 @@ sendit: } } + if (vlan_pcp > -1) + EVL_APPLY_PRI(m, vlan_pcp); + /* IN_LOOPBACK must not appear on the wire - RFC1122. */ if (IN_LOOPBACK(ntohl(ip->ip_dst.s_addr)) || IN_LOOPBACK(ntohl(ip->ip_src.s_addr))) { @@ -1210,6 +1219,7 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt) #ifdef RSS case IP_RECVRSSBUCKETID: #endif + case IP_VLAN_PCP: error = sooptcopyin(sopt, &optval, sizeof optval, sizeof optval); if (error) @@ -1305,6 +1315,28 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt) OPTSET2(INP_RECVRSSBUCKETID, optval); break; #endif + case IP_VLAN_PCP: + if ((optval >= -1) && (optval <= + (INP_2PCP_MASK >> INP_2PCP_SHIFT))) { + if (optval == -1) { + INP_WLOCK(inp); + inp->inp_flags2 &= + ~(INP_2PCP_SET | + INP_2PCP_MASK); + INP_WUNLOCK(inp); + } else { + INP_WLOCK(inp); + inp->inp_flags2 |= + INP_2PCP_SET; + inp->inp_flags2 &= + ~INP_2PCP_MASK; + inp->inp_flags2 |= + optval << INP_2PCP_SHIFT; + INP_WUNLOCK(inp); + } + } else + error = EINVAL; + break; } break; #undef OPTSET @@ -1425,6 +1457,7 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt) case IP_RSSBUCKETID: case IP_RECVRSSBUCKETID: #endif + case IP_VLAN_PCP: switch (sopt->sopt_name) { case IP_TOS: optval = inp->inp_ip_tos; @@ -1511,6 +1544,14 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt) #endif case IP_BINDMULTI: optval = OPTBIT2(INP_BINDMULTI); + break; + case IP_VLAN_PCP: + if (OPTBIT2(INP_2PCP_SET)) { + optval = (inp->inp_flags2 & + INP_2PCP_MASK) >> INP_2PCP_SHIFT; + } else { + optval = -1; + } break; } error = sooptcopyout(sopt, &optval, sizeof optval); Modified: head/sys/netinet6/in6.h ============================================================================== --- head/sys/netinet6/in6.h Fri Oct 9 11:24:19 2020 (r366568) +++ head/sys/netinet6/in6.h Fri Oct 9 12:06:43 2020 (r366569) @@ -511,6 +511,10 @@ struct route_in6 { * set/get multicast source filter list. */ +/* The following option deals with the 802.1Q Ethernet Priority Code Point */ +#define IPV6_VLAN_PCP 75 /* int; set/get PCP used for packet, */ + /* -1 use interface default */ + /* to define items, should talk with KAME guys first, for *BSD compatibility */ #define IPV6_RTHDR_LOOSE 0 /* this hop need not be a neighbor. XXX old spec */ Modified: head/sys/netinet6/ip6_output.c ============================================================================== --- head/sys/netinet6/ip6_output.c Fri Oct 9 11:24:19 2020 (r366568) +++ head/sys/netinet6/ip6_output.c Fri Oct 9 12:06:43 2020 (r366569) @@ -92,7 +92,9 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include +#include #include #include #include @@ -436,6 +438,7 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt, u_char *nexthdrp; int tlen, len; int error = 0; + int vlan_pcp = -1; struct in6_ifaddr *ia = NULL; u_long mtu; int alwaysfrag, dontfrag; @@ -460,6 +463,9 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt, m->m_pkthdr.flowid = inp->inp_flowid; M_HASHTYPE_SET(m, inp->inp_flowtype); } + if ((inp->inp_flags2 & INP_2PCP_SET) != 0) + vlan_pcp = (inp->inp_flags2 & INP_2PCP_MASK) >> + INP_2PCP_SHIFT; #ifdef NUMA m->m_pkthdr.numa_domain = inp->inp_numa_domain; #endif @@ -1098,6 +1104,8 @@ nonh6lookup: } passout: + if (vlan_pcp > -1) + EVL_APPLY_PRI(m, vlan_pcp); /* * Send the packet to the outgoing interface. * If necessary, do IPv6 fragmentation before sending. @@ -1265,6 +1273,8 @@ sendorfree: counter_u64_add(ia->ia_ifa.ifa_obytes, m->m_pkthdr.len); } + if (vlan_pcp > -1) + EVL_APPLY_PRI(m, vlan_pcp); error = ip6_output_send(inp, ifp, origifp, m, dst, ro, true); } else @@ -1752,6 +1762,7 @@ ip6_ctloutput(struct socket *so, struct sockopt *sopt) #ifdef RSS case IPV6_RSS_LISTEN_BUCKET: #endif + case IPV6_VLAN_PCP: if (optname == IPV6_BINDANY && td != NULL) { error = priv_check(td, PRIV_NETINET_BINDANY); @@ -1945,6 +1956,29 @@ do { \ } break; #endif + case IPV6_VLAN_PCP: + if ((optval >= -1) && (optval <= + (INP_2PCP_MASK >> INP_2PCP_SHIFT))) { + if (optval == -1) { + INP_WLOCK(inp); + inp->inp_flags2 &= + ~(INP_2PCP_SET | + INP_2PCP_MASK); + INP_WUNLOCK(inp); + } else { + INP_WLOCK(inp); + inp->inp_flags2 |= + INP_2PCP_SET; + inp->inp_flags2 &= + ~INP_2PCP_MASK; + inp->inp_flags2 |= + optval << + INP_2PCP_SHIFT; + INP_WUNLOCK(inp); + } + } else + error = EINVAL; + break; } break; @@ -2168,6 +2202,7 @@ do { \ case IPV6_RECVRSSBUCKETID: #endif case IPV6_BINDMULTI: + case IPV6_VLAN_PCP: switch (optname) { case IPV6_RECVHOPOPTS: optval = OPTBIT(IN6P_HOPOPTS); @@ -2264,7 +2299,18 @@ do { \ case IPV6_BINDMULTI: optval = OPTBIT2(INP_BINDMULTI); break; + + case IPV6_VLAN_PCP: + if (OPTBIT2(INP_2PCP_SET)) { + optval = (inp->inp_flags2 & + INP_2PCP_MASK) >> + INP_2PCP_SHIFT; + } else { + optval = -1; + } + break; } + if (error) break; error = sooptcopyout(sopt, &optval, From owner-svn-src-all@freebsd.org Fri Oct 9 12:44:57 2020 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 A9AC13F8B6F; Fri, 9 Oct 2020 12:44:57 +0000 (UTC) (envelope-from rscheff@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C777s43tLz4L9N; Fri, 9 Oct 2020 12:44:57 +0000 (UTC) (envelope-from rscheff@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 69FE519E27; Fri, 9 Oct 2020 12:44:57 +0000 (UTC) (envelope-from rscheff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099Civ4P049455; Fri, 9 Oct 2020 12:44:57 GMT (envelope-from rscheff@FreeBSD.org) Received: (from rscheff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099CivKY049453; Fri, 9 Oct 2020 12:44:57 GMT (envelope-from rscheff@FreeBSD.org) Message-Id: <202010091244.099CivKY049453@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rscheff set sender to rscheff@FreeBSD.org using -f From: Richard Scheffenegger Date: Fri, 9 Oct 2020 12:44:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366570 - head/sys/netinet X-SVN-Group: head X-SVN-Commit-Author: rscheff X-SVN-Commit-Paths: head/sys/netinet X-SVN-Commit-Revision: 366570 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.33 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: Fri, 09 Oct 2020 12:44:57 -0000 Author: rscheff Date: Fri Oct 9 12:44:56 2020 New Revision: 366570 URL: https://svnweb.freebsd.org/changeset/base/366570 Log: Stop sending tiny new data segments during SACK recovery Consider the currently in-use TCP options when calculating the amount of new data to be injected during SACK loss recovery. That addresses the effect that very small (new) segments could be injected on partial ACKs while still performing a SACK loss recovery. Reported by: Liang Tian Reviewed by: tuexen, chengc_netapp.com MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D26446 Modified: head/sys/netinet/tcp_output.c head/sys/netinet/tcp_sack.c Modified: head/sys/netinet/tcp_output.c ============================================================================== --- head/sys/netinet/tcp_output.c Fri Oct 9 12:06:43 2020 (r366569) +++ head/sys/netinet/tcp_output.c Fri Oct 9 12:44:56 2020 (r366570) @@ -336,7 +336,7 @@ again: sendalot = 1; TCPSTAT_INC(tcps_sack_rexmits); TCPSTAT_ADD(tcps_sack_rexmit_bytes, - min(len, tp->t_maxseg)); + min(len, tcp_maxseg(tp))); } } after_sack_rexmit: @@ -858,7 +858,6 @@ send: if (flags & TH_SYN) to.to_flags |= TOF_SACKPERM; else if (TCPS_HAVEESTABLISHED(tp->t_state) && - (tp->t_flags & TF_SACK_PERMIT) && tp->rcv_numsacks > 0) { to.to_flags |= TOF_SACK; to.to_nsacks = tp->rcv_numsacks; Modified: head/sys/netinet/tcp_sack.c ============================================================================== --- head/sys/netinet/tcp_sack.c Fri Oct 9 12:06:43 2020 (r366569) +++ head/sys/netinet/tcp_sack.c Fri Oct 9 12:44:56 2020 (r366570) @@ -787,15 +787,16 @@ void tcp_sack_partialack(struct tcpcb *tp, struct tcphdr *th) { int num_segs = 1; + u_int maxseg = tcp_maxseg(tp); INP_WLOCK_ASSERT(tp->t_inpcb); tcp_timer_activate(tp, TT_REXMT, 0); tp->t_rtttime = 0; /* Send one or 2 segments based on how much new data was acked. */ - if ((BYTES_THIS_ACK(tp, th) / tp->t_maxseg) >= 2) + if ((BYTES_THIS_ACK(tp, th) / maxseg) >= 2) num_segs = 2; tp->snd_cwnd = (tp->sackhint.sack_bytes_rexmit + - (tp->snd_nxt - tp->snd_recover) + num_segs * tp->t_maxseg); + (tp->snd_nxt - tp->snd_recover) + num_segs * maxseg); if (tp->snd_cwnd > tp->snd_ssthresh) tp->snd_cwnd = tp->snd_ssthresh; tp->t_flags |= TF_ACKNOW; From owner-svn-src-all@freebsd.org Fri Oct 9 13:00:38 2020 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 4852D3F9F7F for ; Fri, 9 Oct 2020 13:00:38 +0000 (UTC) (envelope-from alna_veselova_81@bk.ru) Received: from smtp45.i.mail.ru (smtp45.i.mail.ru [94.100.177.105]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4C77Tt4545z4M1M for ; Fri, 9 Oct 2020 13:00:33 +0000 (UTC) (envelope-from alna_veselova_81@bk.ru) Received: by smtp45.i.mail.ru with esmtpa (envelope-from ) id 1kQs0b-0007Pw-Mi for svn-src-all@freebsd.org; Fri, 09 Oct 2020 16:00:30 +0300 MIME-Version: 1.0 From: "Hostels rent for TripMyCity" To: svn-src-all@freebsd.org Reply-To: "Hostels rent for TripMyCity" Date: 9 Oct 2020 16:00:19 +0300 Subject: Hostels rent TripMyCity Message-Id: X-7564579A: 646B95376F6C166E X-77F55803: 4F1203BC0FB41BD9E98D72920672523010A9549839D63C80596237CA58A39AA1182A05F538085040CCC888295B64960F047000776BA4CA4274CC53048E3B3EAF3A239246557F0464 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE78CB87876C5D626D4EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F7900637D24CDE3D695BBBC6EA1F7E6F0F101C674E70A05D1297E1BBC6CDE5D1141D2B1CFD43AE60FEB3A35419808CD263260F2965FB44988E83B6699FA2833FD35BB23D9E625A9149C048EE33AC447995A7AD18BDFBBEFFF4125B51D2E47CDBA5A96583BD4B6F7A4D31EC0BB23A54CFFDBC96A8389733CBF5DBD5E9D5E8D9A59859A8B68424CA1AAF98A6958941B15DA834481F9449624AB7ADAF37E7815D572A9D6896D8FC6C240DEA76428AA50765F79006375F2C7CE003639A1CD81D268191BDAD3DBD4B6F7A4D31EC0B7A15B7713DBEF166D81D268191BDAD3D78DA827A17800CE7DD8D5B9DF24928F9EC76A7562686271E8729DE7A884B61D135872C767BF85DA29E625A9149C048EEB78838A84DA73BB8CCFFBAE954C2DE444AD6D5ED66289B524E70A05D1297E1BB35872C767BF85DA227C277FBC8AE2E8B393AA33B530809D575ECD9A6C639B01B4E70A05D1297E1BBC6867C52282FAC85B5698D31FB5189B627F269C8F02392CD5571747095F342E88FB05168BE4CE3AF X-C8649E89: B1BC2F5B25300AE55A2B4894F77013D4A1DBFC5ECD6F45EBB8EBE9B31A912A08AEABC55BAF9C5547 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojbL9S8ysBdXj0eXS0Sjr01F6OgatpKmUZ X-Mailru-Sender: 678D33E606C71D1E2C5650F738271616AE6473F78310E2C8D8AEF8F39B80BB473E29E88B20533B6474B1BAB8F3268D1B6361700F9270F8AB8EE47A569BF15C8F8A049EDFD2B15E914EC93F0C23D7CCFF3A8E30011F4B90D4F3CB5744B36FE136EAB4BC95F72C04283CDA0F3B3F5B9367 X-Mras: Ok X-Rspamd-Queue-Id: 4C77Tt4545z4M1M X-Spamd-Bar: + X-Spamd-Result: default: False [1.74 / 15.00]; HAS_REPLYTO(0.00)[alna_veselova_81@bk.ru]; FREEMAIL_FROM(0.00)[bk.ru]; R_SPF_ALLOW(-0.20)[+ip4:94.100.176.0/20]; HAS_ATTACHMENT(0.00)[]; TO_DN_NONE(0.00)[]; DKIM_TRACE(0.00)[bk.ru:+]; DMARC_POLICY_ALLOW(-0.50)[bk.ru,reject]; NEURAL_HAM_SHORT(-0.42)[-0.420]; RCVD_COUNT_ZERO(0.00)[0]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+,1:~,2:~]; FREEMAIL_ENVFROM(0.00)[bk.ru]; ASN(0.00)[asn:47764, ipnet:94.100.176.0/20, country:RU]; RCVD_IN_DNSWL_LOW(-0.10)[94.100.177.105:from]; ARC_NA(0.00)[]; NEURAL_HAM_MEDIUM(-0.11)[-0.106]; R_DKIM_ALLOW(-0.20)[bk.ru:s=mail3]; REPLYTO_EQ_FROM(0.00)[]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; NEURAL_HAM_LONG(-0.43)[-0.433]; MIME_GOOD(-0.10)[multipart/mixed]; FREEMAIL_REPLYTO(0.00)[bk.ru]; MIME_BAD_ATTACHMENT(1.60)[jpg]; RCPT_COUNT_ONE(0.00)[1]; MIME_HTML_ONLY(0.20)[]; R_EMPTY_IMAGE(2.00)[]; MAILMAN_DEST(0.00)[svn-src-all] Content-Type: application/octet-stream; name=avlqbk.jpg Content-Transfer-Encoding: base64 Content-Disposition: attachment X-Content-Filtered-By: Mailman/MimeDel 2.1.33 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Fri, 09 Oct 2020 13:00:38 -0000 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQH/wAARCAKnAzgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQF BgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEI I0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLD xMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEB AQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJB UQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaan qKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oA DAMBAAIRAxEAPwD/AD/6+0dH/wCCb3/BRHxF4D0r4qeH/wBgr9tHXPhhrvhGx+IGifEf R/2W/jjqfgPWPAep6NF4j03xtpXi+y8Cz+HtQ8I6h4emh16x8SWmozaNd6NNFqkF7JYy JOf9x66t0uofKkNyqia2mza3VxZzb7a5iuYx51rNBKYWkiVbm3Mhgu7Yy2l1HPbTzQyc RdS3OtR6D4b8YaVeaZqOq2tj4gnHg3WvG9xpWn6z4V1bStXuNNuPG+kaF4USHTGvP7LS 2s9cm0VvHumf27o934avdEh1yylS0knUahRdSjT54tTqqVWU1Jqg3TvGEYpxl7VQlOSp zlSbpupcI88lG03ZSnJRjdqnTXNOUbtJuMFKTTtaMXK/KpOP+GD4o/ZX/af8D65qXhjx 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 yxs6xySZ/wA9GyjkjtNLv5rVXs7oGaC3kuFJlit5zFNFKIJhcwKXR4hu8mQofMhO0q9f sHh5iYxy7E0OWLrU685TglTjUqTdPnjTpSm4LmahUlKM5xWjcpcsXKP4V4rLkzvBzqOn ShjMLh6dFtRpuU8PSnFxSjHmlNUqc6tRUk51VGdaqqk05FZM5OcHBPJAzyT/AI/pz1qa d7fyrYQxTxyiF1vGlnjliln+0TMj20cdtA1tCLVreJ4ZZbt3njmnWdI5ktoDfE16zS2p S2cTMYra4aMwsyt9njiedLhnjRyu/wAwtI8cZXzPMfzFuQT29rbT+UJmvbqLyGkZbfyb aBnkFxGglhuJ3luIhAFureawkt0+02zLdRXBI+/nNyUpwptOCjenJwhNOo6a3lUUKipu pF1XQlWajGrKEarptH5vHDNc3NWj7CMPrDlSxFCcpxjXlg4OOGqYmhUqVfaTc1h5QWJj hZvGKj9XUqii1jQdb8PXyWPiLQfEHh7UTZ2d9FYeINJ1TQLybTNYtLfUtL1SKw1a3s57 jTNX064tNT0XVI4ZLLVNLu7fUdMubixu4p5f60/+DbSDVW+DX7Qs8AuLfRU+NBj1NrmS a7ttTv5fhv8ADr+x4tKhHiRYNDutGhh1iTXrn/hEpJvE8GteHYD4gVPCi6eP5GYDMYoz cxQwzeXmWKCVrmJGyeEnkt7Z5FAx8zQRHtt4yf7AP+DbKUj4B/tKW2CoT45aNdAEEZF1 8NPC8e4A9m+ycEDBA4J7fD8ZvFS4bh7fEc1WFXCOrKjReHo1Xf34Rw9eeKq4ejKrJ140 nXnWp1ElKvJc3N914b8tLimEJwhUl9WxVODlLnVOSSbqUZ0qihN2Uoqf7ylKFSTSbcJL +h3wzomneCfDZtpF8OacsL6rr/iTUdF0Sx8I6Jfa7q93da94s8UT6ZBcT29hPrms3mpa 9rF1c313cXF9eXd9qGoXdzNPdSV9PtNYj8ca5fxC0Xwjqnhrw5cW7W1ppSPe+K4rzXLb VdQuL+3f+1b538PQ+FLOL7ZGbKG1soFsZ3c3MUMEfhPWJNW17+1/FH/CReENfl1EXfg7 XdA0q8tYdP1DSdN046Jb3sYg87Rlmg1W7uLXU7HUZr1dXeynufs1pGsnSG1vrJLC30lr Q2y6gDeR33mKLfSGiuD9l0lLSOOOOS2m+yRWcU6+RHZrKjMXEZr8dpyVfmdanV+se1rW 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 uh2kVzHbxaNpWhX9zpvkNMyWWmSHypPzaCnKMpxvSq0+SrBS5E7upCN4zVW0qkW4zUaS qSspOfKqcrfuWIwsKalSp1KVejVpqPtKMZwp1Lxgp04U8Th6VT3HKVCfNTUW4ylScqbj Ul/Cz+1T4a+K/wCyD+0J8YvgX4X+IXjvwj4OsfEt74h8N6RpfiTVNJ0XUfDfiCdtS025 isIJltZHYTFZFjXd5kRWUv0H3P8A8EdfAPjT9on9qyb4vfEbW/EHi3RPgVoVzfaU3iHU b3VLPT/F3ihTZ2sGmLfTTR27W+nJLNtQiQRTIQcCvor/AIL5fAC6u9F+GH7TOg29tb3O jyDwJ8QDHbyO8Olao7XPhvULpSqzI0N0PsTiWMeWHYbiFFfaf/BH/wCEVv8ABP8AZd8L Wl9bmH4o/GnS9W+LV5DNp189pb6EtwmleH21C8SKOCOJRLbKlkt0L2aO5EkUKxo8qfp+ OzzCS4Kp1qdKnHM8WvqmInG3tk4QhGtUTu+Vzp0ocyVk3eVuaUm/58yzhTFYfxEr4SrV qyyjA1oZhh4ScpYeMXNLD0baqXJVrTS091KK2St+vlmk9tbRQ3Fw13MBiS4eKGJ5GLEq PLjVIVbGF2oFGFyBnOedg8OXQ8SXfiOTxJrkk11aadZf2Kl2qeGrSysGuZZEtNGeN7WO +1G6unnv9akM2typDbadFqUem20Fmu3FJJHHpyX91apqdxEvm28REUdxdLbBrmOyiuJG uGjiYSSpH5jypFjzmO0mvjj9nHSfjD4P+LP7T8XxWvvFl74Y8V/FLTNe+DDatqep+KLO Dwdc6VFZXllpzxfbLTw7p9trII/su4ltjGGa7CLbpJKv5VGooRr1qsoUVKCpUo1VTjCq 6jhzezVnGMpThyfu1GelSnG0HJP97qYhYL2WHX8GtFUp1atRzlyRdOUF7es5VeacqcU5 c/tKivGcmpzUvgf/AILl+DLS9+Bvw5+LN3GfEtl8NfiDDp0/hK8e2h8Mn/hIYJ4b6/1W 8063tvExcPZ6fbXWnw6/b2M0MESC3gnaa4n/AAj8GXfxH/Z51XwL+1P8MPCP/CEa54T1 O0i+Ifw603xXp3izQJvDesWdtqMN7Lp8ms634t8O+EvF2nSiNNH8cCW40bU0hubS8uLN YmX+n3/gqj8ONL+LH7G/xns7jwyLvVvA3hi98ZaD4lu9G0y6Ok6lpN3ZfbLPRnvJP7Xg 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 sLyOSaz1aFYbqRbqSKSCP7Okkv4hKE5Olyzp03KSnKk4Sq1J07uLp0lGpH2dTmlBqdR1 Eo6ck3OLX9Ixi5QrWalVUIKgpS5XVrSnBSbhSoTi1FOTdP8A2dSbXs5e7yS6n7PD9o+1 eUv2jyfI87Hz+TvMnlg9l3kscdT16U6WKKdDFPFHNGxUtHKiyISjB0JRwVJV1V1JHyso YYIBqjpH9sCwiGvHTW1TzLrzzpC3SWBh+1z/AGLylvXkuBILH7MLrexU3YnMWITGBZtL 2zv4FurC6tr22aSeJbi0niuYGltp5La5jWWFnjMlvcwy286Bt0U8UkUgWRGUJR5OZxSX v3lKKsnN/abSV5NR0b1aXkRFuykk47PVWab1s7bS367pmdea3Da3smmRWOrahqSaeuqL bWenXC28to16liwj1m9Fn4fF5HI5mbTZdXi1I2qPcx2kkQVm2qxdLtngub97mzj/ALQm FubvWYLS2tYtURXu/sduAl3cXjvpVqyQSNdJFGzS+ZalhJNHDDPayPqzajd6zq9lpwtD oqaA76Jb6Ne3tzeWk9vrkV1BZN4kTU8htJtoP7etdPkiluPN0Sa6a1vlfJy1JudaMYqF opSdWjJwlUlGpTnHDwqRniKcqfNTrv2dKUFT5oy9pOorST95q7s4qNmkmuaN2r++01zJ v3WuWykpX/zI/wDg9V/5SnfAT/swH4Wf+tE/tU0Uf8Hqv/KU74Cf9mA/Cz/1on9qmikM /wBMy61C31/W9V8IRSXkMWl6dYXniCaD/hKNEvFGsPcnRotE16yi0yzmaQ6ZfSalLpGt 3V5pywwWd/ZWy6pbznTu7O5/tvTtRtYVlQ2t5p+pPPrurW0dtZMFu7eWy0CKK40XUr+S /gggkvLv7Be2dg9wLa+mjZ7CexcXE8rW9tZXVjYajLOly9tqMAu7i40ixv7aLVGt7W11 K0lVpbaZILXUDLPBp1zfWU95ZXXOnzXZVmIm8qSNHMJELSQtIscnzfPIqzRGVMlf3avC 2Aw835gVlKo4RvOUVOXtIuMXBez500nGpz6ShBUqrilKTUpRVKVlDBRoVZTqQcHV56Ua soqLqw9klWpUqvPFuCUazlGnZSgq8qkVCVVzf+fN/wAFv4Fi/wCCk3xnjMO77To/gq43 4JCF9IkIZ+nXZhT68dK/LaysIrma2tI5rKJ7ggGS6dbW0gkZmwLiecKiBFUO0mWjAdRu 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 Zbg6ZJFf6hcTwXer3Or2Mtpfw2stjqWl6Q1hq0sN7ol5fWlnqcSm21iIaFFb6pbTQ2ko XX59T03z9Q1m0TSryBDZS6dd6Tp+kalLrLadqN1dHTNQsHsYNQ0y20m0lvrXUdLluLOe 8N/b3Vwv9l3dlDbRQWYvtO1OCZjdrfznWLTUo5gs8UlmtkLK30+60+W3uZ/t10bqFLHW TjaMbSfNL35xatGMWpxaTUJrWFpcs5e0U4wlGMPaCVWcaTlTo2rOFRcteVJ03z0lyxdq df2UoycoyrQ9rKMrToxTgpT/AMxT/g9V/wCUp3wE/wCzAfhZ/wCtE/tU0VB/wemCcf8A BUn4CG4mguHb9gX4ZuktvC0Ef2d/2kP2rXtE2NcXRaSK1aGKecSql1MklzHBaxzLbQlL 8QTvqf6dsup20sKLb3lvY31/c6jpWk/2taz27XOqWK6g0scGn3Umm3mpRxx6Ze6gqWcs a3+l2kuo2V0bBkvakur+yhtrm7uLiGLTbe1vpL3UmuYYrOzSxYpd/aLjzkaAwbZzLLwl ubacTyQuqB6VtpUGkwy6mbZ9d8QpoenaZf601nolt4k8Sw6Cmoz6db3lzbwaNphlN5qu sXNpagaZo1je61qL2sOnW93OB5r8KPh/cfDfRPCXw8s9cW18JfCXwZbfD/wX4a0270+5 TWvAdrpvhXTfBGveOLW/0F9c0vxh4UtvC+s+E7J/Dvin/hFfElvca54o1DS477U9H8N/ D/k56sKsaNWTbqRnKOJo0Jxw0ZUacJKjUUqtapGeLmsQ6UlSVOFNRo4ivRrLD1MTclSl Fqm6sa3sqcuar9XVGUrtVIRi8VGtKqpVKapUcPSxLrYejisVXrYONOnSl/C7/wAFxPBu neBf+ChfjPw/of8AbbaRF8NPh7eW8uv+IvEvi3Unm1Ndb1a+Fx4i8W6preu3wS5vpDbx Xep3Eem2TWunWKWum2tlaw/ktHOtlFPPLNLb+TaSZljYqoRlEdwk7BlYQvam4R1UOZDi NkMbOR+2f/Bwel1N+39q1rJ4hvHsl+Gnge8t/DKz6j5Gm3NxottbXuuwQTRjR45vEEWn 2OnXMtjK+pTp4Ytk1OOO1ttJaT8R4bOQxXKp9pkRWWSRsl2RBKYyxIHypuZV+bje4Byz KD/RHDtetiMlwtbEtTrVcPJTnWdWq6kpVakI1qkq0aVSpUqXVWbd4yqSfJVrQ5as/wCX +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 thb6jKNQkxc3P9qX2oeVKoWx+yQM0Jj1a1vp9JvIrC7vrG7a2cw3enRWEt/FIo3qbWLV YbjTZJ32mNFvYngy437R8639OuXn022vrq3m0g3Nvb3E9lqL2aXVjJNCsj2l29tdXVmL u1ZzDP8AZru7tmkR/IuJo9krYrSFqd+eacZtpTbSlGceRKDnB+7y86eqvGUoQlJScedy laN4/u1FpqUm5XulFTdR8qjFuSpqKUklKTckr0YC5AI3AjIHBAZuMjORnnGeSB3FSpb2 7TXN0IIDctafYjdooW8No0nmNam5QLOsHmO0ixrLt3nzAA/zGmj+ZOjw3drNZiGQOieX NM87PG0cvnRXG2OJY1lUwvbM8rNHIs0axNHJctXDxlLk20NxJv3QwTFt0BdkR1d0tpix i8sybYx5UjGNXcKsj37LEUabr05VoKTp05TXNCUJzftFGy9k5O1By05oR9zmkpuLWyoV 2+TEU6sFJt2lSfJUptcslJTi4uL59nKLlJaWjeLi0uxTQ7PTdI0nT72axgCWwabU5r6a 2hkmYyTXF5q97caleNFvaRmknuJ3QhELYCjUlmhkvLNbSCO7ngvJrWS8a1d10/y4Fe8T zsK9vLNGYoomXMc74RzisnRdYi1ixhfT7PXNH8yPUo4Jdd0PUbCaA6RqcukPJdW2pCCc rdPbteadJOy/2npckWqW0ktrMkrdVLJO8ljJbTWpsQLie83q8k01q1s5hks3iODi4aF3 kYSK8G5IxvdSM6kXTrVYVVTji6NTGwr+1ji/rVSrTh7yxcpVp0Iuo6k4xjSU5zq03Trq EKirS76Xs5OPM41Ob2lSEqjcZySjzUpxS5k2qns5RWrcmouprclnjW7ia0eW4gEoVWlt J5LW4XZIso8ueIq8e4ptfaRuQshyGIKqt480jSzxeWs05SKCLasluVUW4uHlaVzPG292 e3aGNyVUxgA5qmVrmwkutN2XM0lk1xYxu/2bz2eHzLYM0sUjW4lLxhnlt38oNl4mI2Gf RZNcudNspvEFhDpuoi0sori0g1JdVjilazt5bmMXaWOnRuIb2S7tlZLSJJkhW5VIhP5E Xl1qMvYzrTcYpVIQjBypqpKUk5cypOareySg06sacqany05SjKaTtOm679yXtZRjGdSM ZOKVFucadSpFWg060pRhJx5lKS1T5WouoLaK8vr4Lp8Fokz3F7eyW0MK2dshmlu3nEzR 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 62CwtWrUdGm8FQnh3Q6VB0aEo4eNN8spSjCcYwg9JuNKMqUF7KPtJK9T2dZqN+anUnZq K5crHIyxvK6xyFIUZFeVlBKxqZGjjV3YBVMkiICcsyrkjMlvL2O3sZItLuLiS5ns4rq2 FzZRy6dDPj7RdTyPcCGcWA/10VnNPLNjFqJhg1syxdCoPTA5zwMD7xPJx6nJ6nNYmoSx WsmnTzWmo3Ltfw2UB0+2vLoQSXx+zGe8jtdyR2MSyF7i7ukNtaIDO7R7A4yweHqYjEQp UcL9blKcnTpTjWTrKMZStKNGtTkkkvaPkqJpxtzyjdPrV5wjCHu1JOCUotXvJpPlcoTi 3a/KpU/edleN7q/bXEFzGZYZo5o38wCWFlkjdo2aNgHQlSyOjo+MlXVlbBBA53V7KOV7 fVINKTVNY0gXJ0qOW8Njta+WO2ulE5WWFA9uCS0sEuNuECs26uht9PtNNt1tbG1t7K3W SVkt7WCK3gWS4lkuJ3WKFUjVp5pZZ5X2gyTSPI5LuxOPrM+p2dhe3WkaamralBE8llps l4mnR3sygbbd76WG4S0D5/1zwyKuOVIxTVSVDFOWBrV6UJPEYenUlP6vVnhcTCeGqUsR KlVUYQxOFqzoYqmqrpTpVatKUpU5SvrC7ScrOyTny80ldK7UbLmeu1lzPorkWNUi1bf5 unroK6ewkjaK4/tIan9pUpL9qNyLNbAWnmI8BtTcG5KSC5EQaJtU7TjdkdccHNYFsXE0 2pNBrSHUZfss9vduJLKxXTvtwinS18+SG1GoKpffbCSa7DWbXCJ5f7pJ7nU5rnRpNPSN tOlmmk1V57hrOeK0fTrl7RorKbS7qW6le/NpHJbNdaNJBG0lw9xObc6dd6YihJSpRlUp QisKpRqctOlGbpRqe0jJ03U56rxFKth6c5vmruNOfu05prdUr1KkYVVzU5PmTk7xmown NRbbUoKM6aXJePNLlupOys6jbXU2lXUGYbm5mgnhIiu73RUZJtyfu76z+2X+nzLA3yXV qzXCTqJYGgYqYi0to7K2t7e3MzRW0EVvEbm4uLu4aOGNY0M11dST3V1MVQGW4uppridy ZJpJJHZzLI/nxOImEqssqZR3VSw3IV86Dc0ZVwVZlPmRsDtAdaz20pb/AEVNL1BLmJJb GC2vEstX1gXEbCOMOtvrsLWGsysjoVGomS1vbgfvpgkkjqMFGEl+/qOnD6xGNb2cKUqk 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 FlijgMUS/pHh3RVPjDhmrFPEex4gy91LUp/VlRWJw9OlNVb06yjVqSlFqdOjKF6Vp89R xpeDi683RxHLCcoKi/azSl+753CklU5IpRjJ1FBvmSk24auUUfuxZ2Tah/Y2razY/Y9Y 0+O5mitrfUbmSCykv4TBPDMIJIbPUJFtmVGM8NzDBcB3s3OEnbzbxfHrHg/V/B+p6Jr1 zDpS3/iF/EHh59FtbmDxTc6haPONR1nWrONNQsJtLEY+xzQWdwk7+UNQLRQ7q9ajSay0 5FjNxqdza2axq9xJbx3WoTQQhA08qR29olxdugMkiQwW6ySFljijGxYdOMuo2Gjalq2j rperGyt7ubTrmWz1C50K/vLNPt1gmoWhltppbVpZrGa7sZWt7pUdopHgkUn/AEJjyqc6 sKNCnOrCtJKVCFaEKtSkqcJOM5Nz9klTjGftfaxjThyVVKEJL4TG08XUws6OCxSo4n93 Tp4qrCVRQpqtB15ckJUZN1KPtVyRnR5pTs5Qi5NQWl+b6BbeZ7SPxDY2WnX2raJZapHL Jp93eW8kkNrcyRgSizuJ4bmK2uJ7eOO8jt5JUjYI6rdnivLzTJoUuJNH1C7sJIlu7QW1 5Lpd5PblFuLYXttLZ3cljOwkh+12clrO0S+fbPEzxFZFsrNr7UBbItw0ETXs8Fruu7mK 1WY28btFGZ7owh5hbxZkKGV1jVTIQ2bo1xpgu9Us4NSnm1aU2Ov6pol/qq32p6FBrMD2 2nxvp/2q4fSNOuX0e+WzgiC2E97aatJaPNIt04d3CcKl1FczUISUZU5SVp/DUUnNqC1i 3KLjfnjLc6HFq1nzRdoVHKcYzu4NqSjGKk23CS93ljFXe9kSaIZINL0m3e41DWZxbra3 +t3lhaaXd397Yw/Z7vVtSsYLbSoIJ9Surd5Sum6ZFZmSZWtLeGwMRXZeRIkaSR1jREaR 3chVREGXdicAKo5ZjwByawrq+1HT9Z0iyttB1LVNN1u4vxqWtW+oWLQeGprfT3urWbUb HUr21ujpOoNaf2ZCdBTUru31i8sGn0hNNuNU1nTOH01/7Burjxx8X2+FWgeJL3xNP4F8 EazpqfZLzT/CfizxJouleDfAlz4z8SSWt94g8R+NfEdto+o3Gl6Tp3h3TLjxFqmi+E9M 0XXb7w/beK/Eeyp88sRVdVe/ONSnQcYKb9o4wdChDDUVCKi4zrS9qoKN3GHKpUKAQTjG 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 aa4E955s8U3lStCtpH9khupTc3EG+JIPOuIYdKuDqVpZXTWGoWBvLGyvmtdSijgu7Rry LzTY3cUUs6R31nzFfQrK8cUxCpNKBmti3sZhe3EzXk01rPbWVvFprxWgtbSW3e/e6u4p kt1vZJtQS5tYbmO5upraKPTrZrOC2kmvXuqq1I0qlWjWw1JSpSrXTnVlzutSpxpRhKlW nTawspOvSu4c81UhiKleCp0l6CoSp16jqqMk6VlhlO9OlKSqWnCpBuo6iVWE0qterS/c 0oyjd1oVq2lajbavZxahaLeJbzrI0K3+nahpV3+6maF/OsNUtrO+t/njbYLi2jMkZSaP dFIjtc0ePV7az8rWb2y1LUJLvUtt3pek3ekWYs5Lq7n023azn1XXJI5rLSmtbC/vpNQW HVdQhmv7ey0qK+h0iz47VvA+o+KdP0/QNSbRdG8ErDqen6/4QstF0jxJbeKdEg1O2ttI 0HULjxNpNxo1r4T1rwtDe2fi7w7beFm1X7RqlraaD4y0630S4uvEPo87Gytbi4mWUpDD LcMttBNezNGsfmFYLa1WW4uJtqgLbQRyXEj4iRGlOyuXFvDx5qeF9riIVsVU9nFQtisL yrEUcvpzxcacqcqtbmdfE4fCwdGtClQVOuqjksL2YehJ06Kc6VaFelCc4QpShUhXbrU4 Qq/WML7WlZWqqjRr1IVoVVGulXoQdEiijnglBYSRTK8LtFK3Iy8U6iSJgyOrB42KMrxy KQCrrxDaaNb6Vp9vp+ixw2EcLaervKs15NcwWcdpaSG7upp/tt7fzabaJaDUr25ubrcs U1w10YtjpoOlQ6NpVvp0UGlWxVpbq9/sfTItF0671jVLufUdb1KHTY5rgWsms61eXmqX CyXd5czXl7NNdXl5dSy3Mu+sBJAdsKxJz/If4dO1crnOhKvQpYh1cN7aM04831fEey5v ZVpUKiSb5JXUa1Pnp88oTjGXNE6Jx0nThUlOkqsuW3PTU+RypxqqElGUW4uXLJpNQk7O zZz9xZ6X4y0K5tYbuc2lxNd2i39lI9rfWOo6VfTWT3Wn3EsRls7/AE3UrOUW13EgaG4h E9u5ARzr2+iQWVrHBpgi0iRruG6vHtbeGY3a/b5dRv7VmuxM4gvZrq9UPu861F3I9q0U m0jZiiUMobkKVLhcA7MndtLZAYjOM8ZGaoWl/a6nc6pbWspkudB1JNM1ANbXMAt72fSd N1hI4pZ4ooryM6brGny/abN7m1WSeS0aUXdrdwQRDFYqnS5KEr0o1I1p0ZRU8O5Jwgqt ajOFWlU5Oa1ONWEouT5G4e0bOiMuWrz0YKyqR9lGv7OvaLm7Rlz0vZ1ZRg25p0YQqySv GMXaOij7dwP3fXuME4APvn9K8u8b6ZPcNLp8TSCzvLj+1Zjd6hfX6vefZktPssdjcHyr HT4lhtpo7SznS2muZbm5+z29w8s9z6Bq7X9naWYsiJL671C1jiV9JvNTS5gtFfVNUtWa 1ubG10u4v9H0/UrPS9U1W/tNJtdZn05bhb15YNLvuPutD/4R6ew0nQ7C3l06TWda1HW5 NQ1vUWurA+IbnX/E+oX2mi6tdWfUprnxPqNtbQ6NNfaNp+l6Pe3D6ddpDoun6DffQcK4 eniMRNudJ1fq9SKo1ZqkqdLD044utiJ1ZYmhSdaTp08Pg8NOni/rcqmJjTjTxlPBe1+1 4DyqWMzzBVqlSpThTo4jGOhyU+WvQ9jWwrjVnVpy5aar1IzpvC1KdV4jD8rqqkp0q/kd t4LWKC3FzHaTXyQwrc3VlbPaQS3CxIs0tvbSXF5NaxSzB3jgkvLqSFCI3uZ2UyvWk8FT SaxYaoL2eAWFrfQIIJ9Rt73zbs26qRf22oQA2SwpOJdOuLO6jmu2sr6OW3n0+PzPcfsS ZOI1GfoT39xjqelYL6XrGpW/ifT74waHBPcSWXhrV/D2pNd6yulT6Jpu7VryHVNDXT9J 1601+bWoLSwiXxFpz6dY6RqdxdtcajeaNpv29OmkpOEaSVODbc/Z83LJxpWpqfvTn7+0 LzUFOp8MJSX77Ghh6VGNOOGp14RpOlGNWlDEuaVJxSnUxCqXnJRsq1WfN7RqTqe0akcO 2maqZIgdV1kJbFmgP9q35jZpo5IpkMP2nY48s4KzRunzBkG5NwuWza9asltZeIdTga1h iRIIbpA1tbNlIE8razQwN5DCFQFjPkMqA7Dt7dLW48uS8vrcW0tjbshhivLZ9Pu5HtLS 5nu4JJFilRLe4F1YQy3gs3EazzSwCKeFxPpegzfbJ0uJory61C9RLWaOxitXhszNGlnp 80qPI1ybaSeeSK4kKEmaQiJPnLRWwNNTlCrhqfM+WFlGnNyfu0Yuy5r8jXI1KySpTp+7 y8q4nQwdWVRV8FCdKlWxGHdetRoQSpxqJr2cVCnVVH6xNxoSjTcK9Gj9a9rUhVo1q3ll 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 Fp0IU/PAWdk84dYw0UgLYypGawh8bU8R+GxJF4X1rR5tZ0tJoI9UtLV7rT/tsIlt11LR 9REZS8t0dPtumXSqYLlZbSUt5Zc8L/wj9nJ4mk1A3OupLaaXZxf2e7Onh1pLi41GOC8i zbBJ9Wij+1291DHeNHHbXVhPeWZl/sq4j6E6We8TgYJ+aNugGSegGAMn8q4q3hjwfh40 4RweJniISwmOp1/rGJp+x56Ma8qahNJ1U08PNVpWglSl7OM6dV1J9zyHLqU1L2UmuSlK L95O8qdOU41IVIpXhU9pT911adSmoz5k5SpU+ll+NbIrmHwXqc7C/tIMNqljBmwmkthd 36sIpRm0jlupFtGAluWtfLV4/PR1RfifoVtealrFt4RvRq+o2lna3VyLi2WW8h0v7a+m 288/kMFjtpNQvfKby5PL+1zNtfOw8pcWEuwfZRbrL51v5hnVnj+zieL7UE8tlPnNbect sxYotwY2kV0V0qidDs5Nag1A3l59rsNLu7P+z49RnTTpLbV7uwm+232kJKLS5vIpNE8j S9TuYXuLKCbWbWyljivr9ZeCl4V8JU6dVRweLoU61OVOtOGNxjWIhz0cRSw9eP1mNOpR +sUMPNRnFqNRQrOM506VtHlmCcY8lJrWHJNzvG8rxlKF3Juapwqysrbyimle3YQfHeys fDllq3irwteaHdpplhca/DDqsOq6bot9LBCdRjGsGx0oXGmaddPMsutXGnaZb/YoG1G8 t9OgWVIdaL4u6ZCjJ/wjuvsN0ki+ZPZTsGllaR1R57tpAqtIfLRmWOOJBFFtSOKOvMS+ qwf2obnQHu1hXUbnSo9GvbG4lv7Wyt7A2tnc/wBqzaNBaa3q95PfpY2/myaRFb2iyajr VlJKIzX0vVtOvde1/wAKXF5YDxJ4eTTdUutKjvdIXUX8MeJZNSXwx4jOiWut6rrNjouo 3mi+JPDNnqmt2uj/ANteIfBXi19MsRp1lHIxPwk4Um8RJZfWUaFas8Q6GO56MFSrUKf7 tQqVFKg514wp4mk6tGrCdqNVSg5OaeGwcprDxpYyM6dWtSnWqQUaU5UKlKMaVN1lz13i FCtVhXw7xFKph4Oo6lGSput6v/wuPTv+hb8Qc44D6bjP/Ab1eMnjO49cCs0fGrTbqa0a Pw94rgEc12zo8dpBb3Bt3k08w3RuXLBGlmW6sTE0LXaRJcwSzWYkWXmP7PPmuSw8krCs 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 fNqbh7Cio+1rJ8k5czpqN40zSfLzxp25lNwjGynUjLmowlU537KHs7VHVpOLTjeKUKtX ni5ZGnX3xCk0rTdd8Q6Do+mXlv4d12fXPAXhfUZPFOp3HiUXVm2gQ+HfG2syeBNFns/7 Mg1SG8tNc8L2Ed3quqaXKNa0ey0S8bWerg0+7iuNOnk1zVLqOy0qfT7m0mh0VbbV7uV9 OdNc1A22kW91FqlstlcxQRaVdaZopj1fUDcaRcSR6VJpi3N3fRXFi0Fvp0mmTzwJeX1z qktpPbw3FvqGx7S0Gm3EV9cSakui2UNtLfWKzQale3QnWfTbaw1d+kapba3pWmazZR38 Vnq1hZ6laRarpOq6DqkdtfW8dzDHqWh65Z6drWjX6Ryqt3pWr6fY6np9wJLS/s7a6ilh S1UU3KcKPJ7KdWjKXsqypv20Kc+RKtelW9nH+DiIqdaDdSCruVNxp3WqwxTqctBUIUsQ ny0I4mlCnzy+sUaMatScqlejBOUITqVq8qsYVKFetWdGcIfwG/8AB8rLJKv/AAS8eS3l tWEn7b8YimaB3KQ3H7JsUc4NtNPH5V1GiXUClxMsM0a3MNvciWCMr6T/AOD1b4VeDPHn 7C/7Ef7VAuPGlj4r8CftHah8KPCuhalYyeG9Ok8G/tGfCDxD8RPFdz4u8JeIvD1p4y0z xlpGp/s4+A7TR7O6vNBbQrbVPGGneI/D+oanc6ZN4fKnVaPp3I5ZQ9yfNzQ92XOkp80d HzJKKUrp8yUYpO6SWx/aRofh/wAKeAtCTRtGstM8PaIdV1K9eIGK2hu/EHjLxFd6xrOo 3k07A32u+LfF2vX+q6rfXUk2oa94i1m6vLqW61HUJZJdi80vT9Qkt5L+2S8+ytHJBBcl 5rNZ7e/0/U7S8axdjZSX9hqOmWN5pt/JbveaZcQmSwntmmn8zMmm8NSGXxZqENjav4Zt vEWnv4g1qxOly6Npkdzay+I9moatBayWuiXE2gWF7d3kUi6VqEOl2GpLPcW1va3AsyrL qyXttcQpFod3pxhjvrTV7q11OZrlryC6aCTTVhfTrf7ELO603VrHWhqPmXMp+z6bLZwz 3ClWWJh7bnliPrTqzeIc3Wo4mM1Bz5qqjKEpVPayc3KpN1oVLqLUZ3inKFSXLPktTqU6 1OUKkasnSi6M6VdU5Rp8laniI1HS5atTm9lTqxqU5qap/j7/AMFKNE+z+NvCVxo97NY6 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 hoHRdhCGK4EihJ5mM3mQxRMFmBjjhWbLou5JeMtHKE07MbcLcO0ymaViyxojiF5mdIlx uUtDCyxCRh+8KeYygswGcogbyZJo41aJldJJduY5JFaJSrv8qylZngVkKswcx8hjutWk d/HcXc8l1HdWE0xeG2NqsM2nolrZQLbxzRsftSzXKXl5JLOFkjM8dvF+6iBPn06dSNN0 /wB24ucar9pTpOTlRc+WEaqhzxhKNR89OMoQqtQdVTnTpOHVCqpaqFOCSpvkUakuecVC Ls587TlzSq1YuUKfxcqilSplzSnvJ4JpL+wj0+UXt/DFDHdreCWyt765g0+9MqRwiN9Q sUt76S0Ks1lJcNZtLM0BmktaVo9vZXl3qTzXV9e3d3dXAnvZ2nNjBcwafbPp2lxt+603 Tdml2EklnaJFFc3sUmpXYuNRurq5mcCqMuCjHG0AttPzgEkZ69h+A45rRt5ODwQOQWPK nucEKeuB156Y56zL2tP27w05YZYqnKlXp0XOEfYzmpSwym6tSrUoOMafNGpNuTXLUU1H nl3U8Q4xqU4txjXjGFWK2nGFSnXjF3u5RjWo0qsbu6nCMt4plDUNJ1LUZd1p4n1/w/FH oWvaM0GmW/haeCTUNZOlSad4pjfW/D+tXI1vwoLK7h0O2eVfDdz/AGzqp8S+HPEfk6HL petdXFzDNDBb6Tf6grpG0txbvYRQWoe9tbQCZr29s3lYQ3FzqEiWkdwyWemXSlReXGl2 moOslghgjtkmcpEqqHne7vJ2VFVQ09xO7TSyNj5ppZHdj8zksGLWtPt307TbS1m1a81i W1t4optU1IabHf6hJEgWS8vI9LsNM06K4nIMkosdPsrRXY+Rawx4RfOhh1GPtayoVZ0r UqWFl7anOUqyqzlXlUw9Kn7aGFkuVe1xNKt7WeGUYVsNTrUl30qzlhvZT5YqEpVIyhTo +156ygqidZUHOtRpwoQjClVkoU5VXUox5quJcrAsRMoWeCKSISRShJVWRTJBLHPBIFcM BJBNHHNC4w0cqI6kOisLdukbxoY3VoNieS6yCRXUj5WEhL+ZkYw+5s5zkkmsbRRqsc+p SazLZXe6+uBpM+npeWynRmlkuLCC9sJ7q8hi1GxS4NjdX1tOyaubZNR8jTkuI9KsLlnD Dp9rFbWEQWztEmjt7KKG3hjhRW/0eztlhSGC2t7RF+zQRCP5YhGHclCzupl8o3pwrOrC Hs+WSuqXPiKcJTcW24xT5FGTqeyqtU4+1pU5QlTh0Sjh4OzqJ1pRoOPKoOMqU6TqVE6k ZytKlOdOCg/hlKp7VUpwlA2EEcTRq7486Tyoh8zb5BHJMVyAcDy4pDl8Lldo+YgGG+bU I59IGnpA0EupNBq7SwvM8emNpepyK1u6XNutvMdSj06MzSRXiGB54PsyvMl3a17q4vI4 LmSzsJLu6tbWW6tLT7ZFZrqF6sM/k6dLcOkiQRzSeUhuHRoo2kWQq3lMrYmk6TbaDHp2 u67PqE+t2uj6b4X1HV3eS7udahW/Eenz6nZ6Vbi2muFv7+5uEmiskjsP7Rv3LRWrSuk0 ME1NJ0o4idanicNSw7hHEupUr0JUqa9lCXPGpzVqboe7K9aN480qcoHQpQo0I4iM6E5u vTo+wnJxn7OVvb4ltQnThHDU5RqRdaVF16k408P7X2WJlh9vwzo+qWer+N7nUbDw/a2O seJrG/0OfRIrlNT1XTo/BfhTSJ73xc9wxhn16LV9N1PTbSWzC26+FtP8NwuDdxXRr578 bfFex0rxhr2lyTAPp179kcMyggxKsZBweeV5/wAmvq8MUO4FiEwRycf3ug65IA4+lfg7 +0b4wv8AQfjz8TLCXWLm6tT4y1OVZ9li9xaWk128n2OK1s1sI2XT0dra0S8aO6uIYIXv LyaSVrt/o+E8POpjK86tXmn9Ww1Jc7k5unSjCjSSnK8I06VOnTprmnHljycqcU+X9L8N 6sXmeKu6am8IqcI2jByiqi25Yxh7qh+8bfNKX7yTnL2kl+i9t8XNKihiiW4O2JEiRpbl 55WVVCgyzzSSTTyYHzSTO8kjHe7sxJNOy+OmiXWo21hbzXd7b3ulHWrbWYLeWbRngkuj HHbDVo4l043EiSJJZ20VxNcy2kclxMqJ5M11+SEfxL1kxvIssrwxuitKFbbG0m4xCRss qGQI5UFjuKNt3bSaJvi1rdvDLJF5t3JHDJJFaxyRxS3EkaM6QRyTyRwI8zARq80kcas2 6SRU3EffUqWEc5yrRnWkoVKceXEKlGFWpTjyTqrkqKfJN0a1pOF4Jx54xquR+wSmpKKp 1ORYetF1YUlGfNBUJ/7POCi5wbVWjXgoOMrRguWUZn7Jn4n6NPHJDPNHLFKjRyQy+XJF JHKpSSORGBSRHQlWRgVYEqQQTS6h8V7a303Up9LdJ9Tt9M1C50y385I3n1C3s5ZbC3jd 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 ftipKJDatZX1vf2d08zBI3xaQySIDE86Ql8+5f8ABNbWbXVf+Ch37Puu3rX3h3xDqfx+ 0BLeG68Ka9faLLq2oLcWm6T+x7y30a2vZEll+z3Mt8NOsk2b7MIq2y/rfhdgJZfmGJxj VO1XD+zjU5aTqQ563J7KM3epRqSmnenz01Uh7OrUjyKjI/FfGTEU1hOGqUMbBVK2c0pS oxxVW9OjGrRXtMVgqc5Ko/cTo1XQq4mhTdZUXShiKyq/6JlzfpafZg1tfT/ar+KwU2ln NciF5Q5FzcmJD9nsI9hEt5JiCIsiswLAVaZnSKRo4/NkWNmji3CPzHAcpHvbKpvYBd7c LnJ4FQ3SXMttcR2twtpdSwSx2900K3K207oyxTtbNIqzLFIVkaEyIsgTyy65LDDvdP8A E9xpP9n2Wv2mnaidMt4m8SJpMVzcDVoZ7f7Tdx6LcStYC0vIY7kfZnuXa2knTY8gjDH+ h7xSilF80V775rqT6JJW5dPN33uj4tX1bd03HljytNaa3fVX9GttTX0+e+uorg6lpq6c 63U8MMP2uK+FxaLtEV0zRRosRnBbNswZotuGdtwqdYzP/wAfVrEht7pntcSCb5YwUhuR +7TyZGR3Bj+Yxgld7A5qG/XU2+xnTJLJGW+tjfC+S4kV9M3/AOmpai3li235jwLSSYyW 8b5MsUgwBhP9n0fWdUNtdXl3rXiSzkvtO0rV/EciaVNc6JaJALLRbK5mu30lJllin1WX SNJmgGTfXqSXBRZs5wVaVpJqnFOToqEalKpJODjzKcZ1F7NRlUUozjaUVzKSa5buqtSa VNU0rOMYpum/hbtKpOclGK5pSlOT5WuzvHYvLK9mv7C9t9VvLe2sodRS50SOLTDp2tyX cUKWjajc3Om3eqWx054nktTpV7ZJI1zN/aEN/GkEcRMJ9Ns5ZrO0vdRma5+0SWMd2lzc SG6mUTx2c+sahZW1tb2xkMyQ+fDBDbQvDZ2vmNDAa3hzWn8QaBYav9jksrm5gcXVhPDq lqLXUrWWS0v7SNtZ0nRtSntIb+3uIrPUptHsk1OzWDU7W3+y3UBan4d0/UJVt/EXiPSN P0Lxde6cLLWtO0DxPq/iDQEEVy724hurzSfC8GrTxwrF5eq3fhbT9Sgjkl0+J/sgPnW9 JSpT9pCTU27QleMoJRUZc1oQlzyiuWXvW55RhPknEiVSUKtKHJGolJupFupGm6dOV5Xq 0ItTlKcoxjB1qU50nOVOpy0rL+Sr/g9VIP8AwSz+AYBzj9v/AOFucdj/AMM6/tU9feis 7/g9MsNOsf8AgmD8EJrZfJvNV/4KAfCq7u4hdTskz2/7Of7U8BuorF5mt7d2DxrdT2sE LXMhia7eWRY2BVTUU1yOTi4xd5wUHdxXOklKa5Yz5oxlzXnFKTjBtwjckk9OZqyaco8r emuicla90nfVK+j0X9e2g6FaeHbJ7Cylvp4pLy8vnn1K9uNSvpZ72dp5TcaheSTXl0VZ vLha6mmkht0hto3W3ghjjz/D3hTSPCejT6JYT6/qGnXOo65qly3i7xb4q8dXzza/qV5q 2o27ax431rxBq6aPFcXs8Gk6El8mh+HtJW10LQdP0zRLCx0+317mwuriXTXXWNRtobJp zfWtsmnLHraTWM9osV/NJYS3totvPMmpQSaJdaTcfbLaBJZ5bEz2c0E9hbQaZ/Z9xG2o aJDpMthd2N/Fea9eahbJbpBsup7ye9u9Wae0SeG8ivIr+81WWcPLPJKZVuBzk6dSk3Vn GtWhKpSVpU6sv3i9tNSqJTlD21RRThKXLUqqPxcs+fD0KFH2dKlhoYejhlGhRVKnSjGN FxpNrDwpyXJTulFwl7JynSvyuPJUl/Kr/wAHIGoWfge3/ZjXw6th4asfEGreObi8l0e1 gsIby+fTrZxfzNY2UsFxc3UUMMPnyhZZVjhBnYIoH8t7ePPFnnJLcXy6lAhSea+e+kml SxwFLORcQulwUAEIcYyu19wUkf1K/wDBxNqPh6P4W/sY65oHhXT7TwvLr3iHRdA8E+JN BvfAeqWdpH4YZdE0m28Cazo+n+INFSwW0t7WDSpNEsP7PH2S2kgiR4oX/mIj+IniHQNN vvDtz4K8PWd5Za3qrXNvq1vfSxabPLILKSx1f7JayQ747q0aOaF5YRafNst7ZpGY9WHp YT2dOHscNKcl7SEeWEak6dN04NxUYyahTVVJyUbR51HRzjf8W41pOlxBjZRp3pUpUqT9 vGdO8pRThRmqaqxp1pqnKpOlOpGPLSqWqSnCMZfAf7RGjfGXxx8RtK8c/DO01ySD+yo9 ERtMuHnnX7K8s8W5HZ43WWEqzt8x8wMm4jFYfg67/af8IHz9Y8Dx6sDHL515rNxpltqE yK242ccyXkcsrySIUhhaMkygAZAr9KtG+KnizSLW2tUsvANsI9Qn2LoHhm7lXUbu7yNs kl35RitYYVm8uVGDMGgjI3YFee+JvHfiFri2uNTsvDWmH7LLd6fFP4eZLhYy0Msc0pMo W7lf5GSRYmWRJjtVvnxyY7h7L81VSOJyzCSw8moc/NaVpe9FqapKacoqUoqUk2k7p8rt 9Nw34v8AFHDlDD4XArDwo4KkqVKmq9dU43vLl9muWltJtXdpLrfb5o1zxpr/AIy8EeK9 D8Y+B9T8I3F7plva6fpkN5pl/qGtz6hfW9ndLplvJqMCG4sbOWTUdly9vFLFbvBG3nso riPgv4M8RfCufWBp3wr+MF5peryxNYX2reHbITzrDDCoMohuLS3XzlNxcLHaQagsYaG0 8662NfSfYdt458ZXtxdPcaRNqF1Zx6a8epw+Drr7WDPELeyEDaLpV7CVtkSFbdb11t5I xCrxGTaiekWfiaK7kvtIu4fFcHiIyzxy6rqVvNqmj2wjtGkvNIuba20oXVs1zLLbLbSt r2m2mnxRzxSaXNJc/aLPwa3B2VQy/EZXRp1MPhcQ6dXF4ehX9rTlVg0nOjKcIyfIuWDl FQjKmqb5OeUj6d/SE4tlmmGzfGYbLq+YZfRdHD1vcvHD+zoU5YWPsbRrpug3GrXjUqRj iKkYVIU3BU/Etc1fWJPBGpqPB3jaw1KaKwW10Z/h/wDEEahfpeNdrc3FlNZeFJ9AaHRz b2zapLd6nZJMmpWY0mTVHS/jsvgLxX8LviBrfi+18Ral4K8eW9zZR29w2oT+F7qSUSaf PCbKSTTNWsHi1NElaFGspbeZJoN0U8ZgLiv140DXdO8NTXVr4fsfEvik3k5k0zyNS8Z3 sekYtcuC9/4pXRRZTMCY0udEuYLaO6a2trmOVFljzfE2s+O4bm1udI8J+KdJgnmdJNKl sdVnsBfWyyCaxR72G6vNSsdTk33ETwa3MkSqPLa1KxY4sm4My3JK9dYH29H20m26rpVY JShCM1rzt052ldVFKXNOaVqfJFdOb/SSz7Pb0MxyLKfYRnSdLDxlUp0ISowprnpyjWq1 eaU+ecpTc5+1nP2ajR9nGP4+Wn7Pl9rGo6lr/ia38b2Jv9RnuXWDwI2nqbi9mNxO0NhY QR2enwtLIfLtLO3tbe1ykMNvHEqKv0D8Nvhuvwk8XvrtppXjfXLOWwisbjT7fwbrMdrL JLG7waje/Zlm+2Xlq8qrMVESSFVVwoRyft7Q9S+N76nDd6dPpHhLRlij1WbRrpPs0btJ 5Ze/ltL3VLrUFjYwlmlSV0zDteVt7RDtY/G/jXSYb++8Ra21ze3lwwbVtFTUJ7fT7OS3 imdUshdsslp5FxG/mPGGWN45x+6dQ3bmfDtbMMNicHVzCtPL6lJUqmHpxoU6apP2ajaN KjFUHGo+SDhJvl5HzRlLlXBg/HOeBnGtS4Vy116TnKFenj8w9py1YxhUlOopQlDWUo8q nKNnFqSlLlj+enxL8BfDPxZfyapeeBPG+nazc5Y3Ok+HNatri724KTXMKW+LiWMjAnAL fNk9Mj598VfCG3v9NT+wNM8Vy6xbaFFY6dpSeEL+x+2Bbi4JGrzpoyvd6xIXLXN1I1xN cqsCPcEIAn60fGD4y+Gfhb4PbxprtvpzWdzZaQ2l6bqMup6V4l1jVIlAhfw/YpcSSyQz 7jc3dwZI4IN4WWNh5aP8R6p/wUV0jW9WgvdQ+HOsG009Y30qyh12OJLLUI1aOTUHuBai 7uLqRSwlHnrbtlU8vYipUZXkWIy1RoU8yxtXDwUHGnKrTqU0oWtD3oKo1KLaberUWpSV oxf0c/FfM+Kfa5hHw+yyvOSqxpZhRxVenUp1pygqlTDQjOEXKrFu7dKVODU5WjOS5/j3 TfhT42vb/R4PH+rX+jWnhy+07SodGvLHxJrepafp80P9qxTabbafpl1o9np6uYra5hOp NqEV5Osf9mssVy9v+mWj/GPw3Z6bpujGTxLClpBBIlgfCviie3F1a2/kyXyQ22nXsSXc cCSPLkJIFZyrRxDYPE4/26/hvrV5Dp954P8AFOh6dqN+kuq3s2qz3sCTO423E7abJbaj HZ26opki06OS6ZVP2fy2yD1Xw8/ai8B+KdX8Z3/gX4b/ABAVdE8Na38RfFkB0X4fzWHh 3wd4WEV7rEsniXxD430/VrvT4g9raafpuuarq2qeItdvtJ8PaWLrXtR02K55c/4PyrO4 5f8A2lUrUsPhYyvRwSoYWhKpB05V6j9pPE1MPUqqopQrSpzw8eR/HKE0/W4a8XOLOFqk pPgV4udWnh5Y3FzxlS1ZRqQtyfWJ4iEK16cvYScMRPCRfvSaqJVuv8Q/G74Zaz4e1fSb u7ubm31u2l037e2ja/HeaeHwk09vbKkS+ZKJhFKt5bujruWLZIN4/MmPT/Gfw31TUD8P /ETTWlzK6pqemIqm6gRj9mjuLPUbRJrS4iUYm2B0eTcMkIa++LH9vj4badf3+qaBL8Td FudQOFtL3w9p2s6YskTuba5fTz8Q0s0uPKZ1nMVkbflB9neWIXEvQ6D+3L8D2ttQbxLJ 4judXvpGZr3WPh7Y63DHz5gntIobp/s1z5hYKBHNAsQjTLEEmMi4OwXDlPE0MPPF4jC4 z2bq4bE1YVoSnCnGPMrwtTXNeailZdeaV5yef+LnGGe1KGJq8G1aGKw8pSo4jC4mrRq0 vaOCkoXnKMbwik1Hli7zlyp1JJ878EPjOl54V16x+KUss32iWK30q1vYrjU7k2EtjDFq Av7qy062iuEuLpZ5VhMEHlxzrAXfYJn+QfHPwktNJ1W41r4feM2t9FvNWu7q1jkg1PTZ dJLM5khjmtwqiC1SaO2hMuZGhOzcwV8fZsf7Zfwcjtmi0fxNqNndancmO/8At/w6mhsr aJnCLdWcljFLcrIIs/untysTysUjkGMSv+0/8JfDenQE+ONaWHxXajVVtLzwBHe211pT 6jd2LzqxujLaSTXmn3sLxMtvMxg87y1gkhZ5wnClDK8ficZh8X9SqZk/ZvAONCthsTyJ z5eSdOPNU9nCVSfK+aKjL3nFOT3xnjDnGY4HA4DNuBsZjKmX0uTB4yWPlRxtOtL2Uq06 laHPVxX7uNWEIutTlzunXbtCVGfwnZX3xk8LR+V4e+KmpWzRSACGz8UajaxRROhkMsiS ooQH5PlWN0dH3q/ykH9IvgX+0loS+FfDeifFfxfYP4j0iw1Ndb8QXqajqP2szpKbB7H+ z5bCG61S3AVbZ7u7tbOS5f8A4mZltFKHzLXvjR+wv4ukNprGn6gtteQwrq9/N4Sk026m EbxyrHZX2l3kmqJJ5kQCSXJNsGMAYMqsY/GfHfgf9mTxnLqXi34G+JPHS6lZ3OmLF4W1 nT/Cug+GX8OWENjomrvY3V3daLqXiDxNbXt5oM11pfhXTNYvms9U1PxXq6Wdpp1/dS4c QcK4DNadGpi8JOtGniqUpfVssnZpThCP1l4BwqLCPm5cRV9pShCD55ThBudP6ng3xPr0 MV+4wGc5TTrYKeFhHMMTUxFCM58jlUhz08RRWKUqsFCWIiqN0vcbjUQ7xl8HtC8R/FK7 8e+C/it4b8P+EvFv9oT6zFD4ijg8XW41axax8Q6XbWGnKY5LDVrW7mspVunt4Lq1uL22 aC9t3uBX0JJ4b+Hj6D4Z8FeHJY0stOjghn0iW50++m1fUNzTXN6I7HTrO8srS7t5oRBp 0xuoY5UmuVu3DIlt4lpfwtsdasLi2upNR0x7V/M0Q2Wl6cBqepXl5p1vdQa1rL6nper2 Wn22lJc3uny/ZtcWO9g+xW+m2UOrX2r2n2Z8Dv2RdF12w8WQ3q6heeJtGtzLossd1dIr 3giM0QNvIwklcfuQIbgGG5V8SxeU3Px/E2Nng8FTw9TOcyeHy506VDD0oN0KP7lQlOcZ pymlzQjCq6jqQpRdKpUrz5pn6nkmMyqLxuJwmUYDB4nMPaYiVXFVa1an9ZlFJy5Izopw qVG5ulTUHBOMI1Oen7Q/NP4i/Azx5ZeNLjxb8PfDGtW+jz6s0mlpo32u/Gn7VAW4t7x4 pDJa3IJcG5aQZLxSuylN3t/gu2/b9v7yzsvD3hTxBdToqWlsb7w9FbQXEXlsAZVcwW4e NEBRl2JkbQOa/wBAv9hv9nnw18PP2ffhfaeLfAXh+XxxB4R0i/8AEI1fwh4Rg1P/AISa 9E2o3cpOn6ZFZAA3CixcKptLWaK3T7OA8S/Y3hz4NfDCzk0rX7P4WeEdN1yLT7nTDBLp 9nMlnpuuatZ63runtbwR3GlXV/8Ab4Ee1umjfyWh+x2d3b6bNLE/4nivpCwxEa2XY7Ic Li44KtPBUq+LjQqvEVYUq1OjOVKpjaE6dHmpU4VMTChWVKFacpL2kaVDEfK4zH5JleKx FTLZ59g6tZQqYill+MbwccTvWdFuFOtXhRqSXs48tF14N8zoPb/PM+CGtftD6fql7f8A xxvtKOnTQBILKLT0hv7W8kE1tDa3MVtFDFFZ20vk313eO1xKY9sG9l3Knybo/hPxyf2l 7zx7451Ow0Cyt/Eep6hprxXJezv12n7GtiVVbSyjv7eKNzNePaB5NqXRRhuH9+Xxr8V/ sfeBvihr3hjxXpnwv0rXLS/gOrQ33huw8y0a6sIb5SVh0yQSBjNBviiaNBvWVixiCHwj xJ8V/wBhDwtG+qTw/B/xUNW1+zZrC9trNbqxj1CTT9OnvLEXui3Fva6RptqjalJp0SKL hhdNCVuLosfFwPi/UjVx1enwlClUzTLo5dVhlUKVOEaEKtanOlOVP93Rq1aanUU8RTlW moxdnScJP9Nq4qWY4Hh6SwHE1X+zG8xwlbFqliZYivCUUquIUYU51oU5JKmpVISlGabm 4+xZ/Lbrf7RHwm8f+A/Fvw9vNdvbaPxLoculXV9eeCLq8uIG+Zrc6ZcmwmvLa4luBEki Wkto15Efs0krxSGM/Lv7GHxXh/Z48cfEX4Y6hcy3ng/xLcaP/Z/ijWvCek+HdQfVtKni jv4L1dY1u61Lw7ZRLLqKwRqtze3V5bRW91DpcV9MYP7cbT4vf8E6JbV0s/F/7LVrPKpW M6jaeE7A+ZKpVY5YtTsrBpsMpV4o3X5c4YZDqI3/AAT91ey0nVtSv/2PtX8RaRbxSS30 Mfw30ywfVH097W/vYrK7n1QW1hcedOI7O/v9Wlgtnjhlnvp4jcPhlniLgsuyTOcmfCGd 1MDnalRqQnP29qkqTi69LmoR96jOMUnHEwjGM5c1GtdOGOacU4rGZ9k/EFTCZlgcxyep y81PCYL2eMw31rC1lh8ZTxGGxM1aOH9lTq03CrBSc6VSliKdDE0P4yP2xPj38RvH11d/ BT4b+HNO1Hwv4l0iJtQ1y3tpNc1XV5ZXLLo1lc2hXTdMaWRI0a4mnkIaRRJJaH52+evg f+038aP2XLE+ER8PLnxVbszmeLUNf1C7fT7OSQfZNM02XS7fUoNPtLcyXINj588U8twZ E+zqHEv9P/x31P4HT/GefWfD9x8CYvDukW0gt/B/wxufBtxY+IZSYo7S+udWtfA9po+h 3slpEiy20XiKFrZwrefmeR25CO0+GHhe712+8KeCfAEspXTntbPxPrfg7VLKwSJvOE4n sZ9Ri0aa4tY5oIoblbeO6kRXgMJKuP3Hhmlkb4OwuRSyTBPL8bh6WKxGHrtQlWxF4uFb E1YvSqoJc3LrH3lzySu/5+4o8fOIcLxlmea4XI+LaeZYSc8to4uFGOIw2Gyx18NXVDBz r4VyUlVpyq1JU+Wq6SlR55wr1Kc/xR/bA0U/tNfDv4VfFvwlNa6L8S/DGitcX/gO+neX VWjurmO6jsLRUg/eanb3lqs8CyrGLi2DRt5bsFPxM3jj40fEv41eAPiJ4+8PtPf/AA/G hRiCGymstOfTtEukxmMSMsDTztuuLhVI8xlZo2JAP9QuieJPDer67pV3L4F8AaLbG9nA v/7J0iW2MkolS0efXLNUlu/LBna2umeFIrosJWzKim4tn8MPCV5m28H+FLmG91W4sv7d 8IaZoXia5u7BU3wtZaQ7qdPFpH5TNcXjlPMt2KK5Bc+jkGHw2S5WshrYeGInTwuaYfAx h7GrXy+hmNF2wuHrqH72hGbak5xdR0rqLUmlH5/iP6QX9oZnT4h/1W4gwb9vleNzSVWr Tw+Cx2Y5byyWNxNGeFfs60pOcYzjKMXdPli5SivwG/aE8Xah4k/ba+H3jj4dfa7Cw0HS PDceseLI2mj0u6si8s2pWjXDRIFW3tJ57KeIEvOH3BVUc9P+3BrcHjHxZonxp+HWteBf FcnhPTdFsNY8N65psM3iaaaw8WWE+nS+GJ7iza+U/aZM66dJ1LTLp9DFxu+0WcdxDX79 +K7bwDpdnon9l+CPh/qOkQC8i1VdT8N6fp2pWeozOLyXUru/lu4NEt3uI7eyggh/0s4j Gy0jnkZh5/4ds/CniNdUt9X8LQXOo3ps71U0/wAIeCrSXRd1w0M4sZ7u01We/wBNFtNb l7pbC0meIv5ELFvIbzcLlFLD1MhzGFGnbIssjkscPKi61TEYHEYqMpwrO0K1F6yVOftY ww7/AH8ounCz1xv0mcpxmBz3CVOH8dOWf55R4jli6ONo/wCzY7ApTo+yhUw9CFWrTVNN wVKrGc5+zpurK1/5i/2kv2h/i1+0NovhTQfEHw003QG8NXP9r2134VsPFK3HnSxTW4sb qbVZ102SSJHEsZtI7tEE8aJdNK8yJ9zfsl/tLSeJfDZ8H+PNBm8E6j4W02xt0128uZRY +IFR2tZbiU3qLdw3zFVJsrbzY9sbGK4YFdv7sQfDrw5ceIrJ9Dm+H1zbaPZaVpU/ga80 bwppP7rV4jEk11qemfDpdV03X7vJnS503xLdNKZZLm806CNvOfrJvAHwr0C2ZdV+Cmue FBZXOj295rutWeifFLSxarBZDTo7SXVPBWqa9Ya3q4F9BfPY29/c2s5sbi5g1Q3TW9tO cUshzfJYcNUcrhgoUK8p4CdGtWl9SnVcqlXE1KdanUrNyaXNThQxEZc8+WfPGHtfS4a+ lHLIM8r8R4rD57mWKxtOlhs1o11glTxeHoRth6cp0qMIYeVHaM6TjeneMpWnJS/LfXb7 wB4u8K3mk+Iv7L1zQb6J0ubS/ube48xHTLiSecRT+UwKkRxvF/yzc7XVa6b4DfH34d/B uxtfCFj4mmvfBuhaXqGm2mh3GsvLY6da3VvcBrY3d5NcRFbRiZo1aZpVjSRAMqBX6H65 4H+C3iXTI9Wt/BP/AB82l/o1pbzeD2gkt7rzrOV/EWraJqPw+s9ZH2UWEllZXJW0sp9O 1S9mvLCW4jsp7Tn/AAl8PP2d9Sa6s7z4TfBo6XcTxJfTXsFlpFjba5CqosV5otvYW0M2 oSSC7vLa/ZowltfMkieWjq3wtDgegsCqeOx2Z4jC0rV44CFR0lCtGcoxio4iEqXtIr96 /ZwjGVKbhGoqt4r9BzH6ZnDWaKr/AMYNHD4yrSjR+vYidJV5U5OKap1cPTjVl7Ny9qlV rUo3p35npCXyPZfte/DTSVt9eudS0C+1vS9KvtH0u++2O6BLjCxySBQWd7WAvDbPwkhY N2FdVpH7W/w08S6RqE66jZR+Lb/QB4cuLhr930K7SEZtb02Txb47hBwxV4wWB3HHA+pv EPwU+CX2HRLXRvh18PtQvLO60rXIn03RI9CtpdDv1t4pMzvGzantnWS6jtoE+z3OjxCT zI5jcJXY6j8MPgloPg3VNR1v4V/BTVILLVjYyyWMd1dSy2trJplu4a2XbPbapPI2oxza dai9JNtBcxupme3XycTwNldCNFReOp1nKMksRSouoqiSbjOhKUlJwmpQlGbV2mpRWqXm Q+lRwfi1iI4zhnGckHVw1SOBzGKnLD+0UabwuOU6Fa9SEoVP9n5Z0eZunUqKn7Y+LR+0 p8KdAmk8X6ncTa74u0nw3fzO1lrGn/2fqj22lCOM3C6teR+R5aRFUt7WWR5GZvKt5JZf Jr5n1j4yL8TbT4e6p4QuPEPhzXvAba5cXN9b3djGtrPreoRarZDSdR0+63vBKnnRzWl1 EiRxhQwl807f1N1DwB8D59PlstJ+E/wi1tJtDs9R0nQfD1jo9t4wghubk2UTa3pOpaTc zzXaSWtw6291JoupXMTW9/NHcpdweZ84/tG/C3RfC0XgqbQPh14f8D6VqR1v7LPpbaTd anrkcQ0yQx6hFYeDvDDQWumyzSRWTXD30jyTXaAxmFt+TyDLcrpVMTaP1mcnONBOolh6 bqzjGk41p1XVSUU4r21eUIOPtasqvMl7eW+PXDfG2ZYPh7KMtzjDVsRQotfWFFQwvs3W UY1Kvs6Sqcyi6jeGc6ShUpXcZuVKPiA/am+P8kGnxjXLXSrvR0+yvqw8N+F57nxCwnku 4NS1K5nj1Rlu4lmjsbeTTBoSrBYCS40yW7kfULmyn7VXx8kaZ7rVvDN7LKztLc3vhu2N 1JO58x5ZGt7i3E0khyzsVLNvLYycjk4fDcZgFwiwN/pU9nIttNZT3kFxBDaXDRXdnBcr eWYaG+tpbd7qGOK6V3+zGUwT+Vdk8Jw211LAkKNuW0umlWG1xLNdWVvOzSyWd3exNMgY QSK832iIxGG6jtriKS2iylLDXlOvQhCrCNCdKl9VpqlN2pOLqx9yMYOl+9jJU5uvJ3mm pymfXUY0JQnCGIqV3Ulilf6zKrUcoYh08VCNRVPaQjhq0nRcKbSw01Gjy03FJdpb/tR/ FljNNeaZ4GvZ5bM2aY0HVrdUhedJpSI/7bMLPIE2+ayCRAfkkA+U3Yv2qPiXb2tpBb+G PA7LatbxyJLY6gpWxVlSURMLm4eSfacRtM7AvzK+MmuJbwvEWOY18wEoTEm5WYEgbGAK kHBwy9Rgg85qVPCrgF0SRflO6RkJQbNgKc5Ab584xjAOccVyw+pSlGLwtC0by5EnBfu1 KTd5XTlGLnq1KSS5VpZLulWxdSioQr1HTShKClKdSlFRvGnL2ftIxtFVZRg7q3tJJaSa fra/tU+KobWwuP8AhEPBN1d3L3H2qyFtrUQsoopI1tme4juVjnlu18yRo0RVgSNC7O0u 2Ozb/tZ+JTc2v2r4aeD5rFZJTex2d5rFtfSIsbGNbWeW/ligfzApJa1ucx5CxhjuHlMH hVI5EeSNp8FHbbujVvlBZDtKsuSSpKkHjK45q7F4ZWXzIIo7bz4IHu5XaQq8tuLi2tTj zWETypNdwBbe3H2h4TLc+U0FtcTRcjp4OKqKUYPmU0qkmoz/AH0mlTh7KEHGdKM4xpzt GouWEvaTrpyYo163NCCmrw5nKF78sU3KXutzXLGLnNtKMU7ppJqPrVl+1ldCKZrv4XWc lwgTyVh16+him3yL5iyy3NtcNbqsW6RGMd0HdUjZUB81br/tZQSKA3wgWAgh/Oj8exFc gNkPG3ge4jZGOMqksEmAR51eMDwvFLHLHMbZSEYEKZEdgxCYjZCxSRVbcXLx/cYowfYh gsvCUdu1pYWun3L2sVkQuozzreKrWxt7eG2uZ7u8k1W6vrpJHnF28Vysgtrh7y8S5lhW 50hhsvnG0adKNaMZSSlJwjUp0lUqzqSq4itGCxD5VTo4eNPnr2UYRdSUI16pPE0ZVP37 qRqcripxoyjBNQh7Gmow51HmpurOdVynerJRm6TVOn7kv7U2g3UrPN8MtViSNFlaKy8T W9wqsrgq5lbQrTcQQBsOy3ZX2srHgaUP7THgqa9F9deAvGL2q2gglsYNR0CayLtPHIt2 8bJFIb2PYYI385IvKkcNCXKyL4dD4ZZPOjjlmSG5hWO7ijllEc8cc6TxJcQxuFkRJokl jEodFkjWQAOisI4vCdxdTLbWlo8hkfYrosbK0vmQqtsY5JUffcRyMUZQVjCEuQSgdwoY GriKaWGtZRkqUHOK54xi4aydatU9rUjCcqcL1Kzm6OHUJSpcuUKFWp7ak1NKvUag6c6k 5qc4Qp0pJOFXl9nWacaMYSpcqWilOXL7Rd/tR+E7FtQv9O+GvirWTDY+dY6FHqXh/TLi 5vYT8sCXk5uLRIrlW+aacAwNGihZFkLL+B/jr4G/F/xP+0TqHx3T4Ua/H4L1T4m23ii7 0+TV9Jv7mwX7ct5LpdlchIdIubp9OtQUhk5kdZZWDRAFf2PXwxIhh8u3RWjUIQsa5JLF w0mSwOM7c8DaFGNwLGZ/DtxAtnZaj5iWl4h1KCwjvI8XMEU0tjNexWwaVVeOQSWxllhD xiRA2I5o/M+g4Z4mnwtHGvB4Wgq2Y05YWtOqq0q0qEoc07Wm4e7S9pNSilKM+WXNZO3j 5/llPM1hJY6rFSoTTpUacaalVlRpSlCnhY81OMsVLkjo3ecVOTlz3mvbtP8A2l/hV4k0 MXGr+CfiZ4LvLt50FhdxaRLqscCP+6ni1HTNVtYIzLtZS0UiFdjLxnA6Fvj18D7o+Zep 44haVmmljXw3pBhEjMXARLbXYfLVSTtWJDGoAVUAAr5gPhWUABIAiIoTLAiNVz8qgh48 Y4/i9flPWrOnaZqOmNei3h0l/t2m32nTpd6bp+q77TUbdrWV4YNRsr+OC8gDifTtShVL 7Sr6OG/026tr2GGdfl61LCVq3NTqVKdH2lSrSpxrP20JVZRlOfvt3lJwhe876Rd3ZH0X tcbhfZeytWr0XF0686kqE1TUoP2kZwVaUK0YwhJKL1nBWnFe8vqxfjz8CtSn86/1nxfJ cMAjyz+FpvOJjhWKATXFne38sggjSJNpzJ5SLGhQbSFi+MnwEVZBF4t1QO1w7rHqHhDx SoiDpGnkrKmjZEKMjSqzebL5k0mZnTyki+Sj4SuIYrqJZreKNZIbS7tzeRk3I3ySxeXB H5bXlsktpv8AtcIns4ZBb75UkubUyNbwoEhDKRMyswMfkzr5YXYRlvK2uHLED52PyEuF ym/BYDAU6TpUHK0aUYYinWWGiqDp4iHJRw65p1X+7WHlN0vq9aKlXpODw9OVWo6GOp4i 9TDKk8P7RU6MsPiXiYfu6FPn9p7OEadJxqOrCNNyqqMPYuVWVWSjH7GHxf8AgeLxJbLx dGgEMSvFLoWtJH5sUhYXXmX1oXDMDtlh2CJ9qFUjwwedvib8F7sSNdeLrGKWRg7ma2ub ZJDLmQusfkq0aHcHVVVVVSNvy4FfE8fhsGUeZDEpnfyY2dEjiEh7STPgIq8F2fCoMsxA rdtrRBp4sbyzvb6C6hup7u0nnt7cRarb2V9peh31rexJc3s1vp0N1HcPp8r29vdbPssi KixzR50stoR/fxr1KM8MoulOj7KGJ9rCUHTjS5qlOTnGdpTqJuVKKcneUYRlye0jhfq2 Dw2Hni4Yn20JOvLE47kpVYyqz9vicR9Z5cNUVOtGnSrVo0ald0aEFGLlKHeftJ/tB/DX 4JfCLxd8W/Buo6P8Q/F9ja6Np9l4MN1qcWlJLfawunrqepvbWscyWGk2841LVLu0lSZL JZY4jujYn5o/Zz/aG8Pftljw2PHtlpvwz0T4ZeM5fEXjN4Lq8vvh/wDEjVtJSX/hDbTw jqOolr46bY6ylvreqadqFpc281vCpa6ha4FnXa3PhRJvLivLAXMU8WHgnSCWGeH5oPLl V0dQrCNlbcmSAeOcmjZ+H9JltLT+ytETTcS3SSRQacthYotv5NnGltpsVnZFJjLbXMlz czl/tZeGaIBWeSX62jjcuw2VYiNfLZzzhOhh8HmUqtWDw+BeH9nSjTpS5lCccL/u/PUl zc/to/w4yOLE4fH4zNcNWhiowy1019awNKlRaqYrDypxdSdWV7pTpOFRwXtI1bK8ZSco /oRd6t8L70lP+FkeCVWRfNLN4gsIHl+YqI2W5mgMbgjPllEZVKttZGV6dp0fwrv5ZYV+ JXw7tpYbeSdDc+OPC/76WFGdbO3h/tCe4jubgqIY5Xt4beN5E864hjEjr+f0nhowZbyi hJDHyoohuxgZYzHao6A4yCOOmKrz+HoDdy3h0+0S5vdrtcQR2FvuAaQqpjhSLEcZnl8m CKIW8Qd1iRQcH4+GAwaVROtiZRcYyoKs/aclTnp3dSVLEUpT/dRlG7VTm5nH2ak1Wh9J XqVJqny+4n7lSpTahJxUWoxUJUau03CXNywd0rynFSjP9BrrQfA2u2dzp93r3gnV7LUm a3urC48TaFrFjcwDBEU+nlprC7tyMLIJbeRWJYHfjFZf/Ch/hHc+IZfFOneA/hVe+LJk tlfxMNF8HnVFeyt4rOwzq72Ml6ps7S2tbW0e3kV7a1t4LeFUjiRV+ArrRJJHkAtxE0aq oP2a08iRUSJFkCWyQld3CtIQZHdXeYMz+Y9H+w78MI10+1BJGZwLaMAsAFKDzgxbnAJ+ YfiQemjh8VhacadDMa9GhXipVcPQxEoUKkX7jnVp0a8Up2Ul7GtG/LK/KlU5nyyqYPmj icfhYqeFUZ4nEKCSp0oypVMRHD18RToOpTS3rckIzjBSnyezbp/phq3w+8PQyXmvtD4b GpNpr6fqmpzPpct1NpKOsn2GbUEeS9urFG8xxaTlrdJNpjjy7482n/ZM+Dmr289pqHwj +G17bzzfaJoofDmjyK86q8XmFol81d0UsuViwpdlbbn7vwtDpGo2ewWshwqoJGjnNuQO AGYQsA7NwWCkZJJAArQEGrMNq6rqNurj/W2+rX6EnOQB+/CgEYIzwSOucVdBZhgbRwud YulOMasJ1cPXrUY1cO7xp0rUakZydLm/d3k17NQXJeEnNVqeExvO6+X0ZKVWjVgqtOmp xacJzhJypuHI2uWolaU06l5++kvv/wAI/s8eF/BGna9pXhvwJofh/SNZlL3OmaVpU1tY 31itktmp1K3kEsUjiB7i2kOyOFYHRRGpDE/Ncf8AwTT/AGYbXW7jxJZ/BDTIdUS4aeFv tGoT6BYXrzLKskXhu9e78OyJEwzFZ3OmT2wYLugkQGOvGtNtr37Tu1LxFr0drFDe+abS 9ku7q6aOCWa1sN8twEt4765it4pbpt62Yc3DW115Ihke2t+PrRrY2HjHxJEtzGzZ0rWt VSexZDdYjumhlt9pY26EPbrdEC7tjvz9ojh6+bOcLUrSweeV6X12TjifZY2c51J4aK53 Xq0+WEozhBSpyjzQrp+yjUrVHKJhiYZZiVQoyyin9Vo0aVLDwnh5RlB143cqU4xhKjUj O95NUpYa8W5JpVD7U+IGu/Dr4OeHrHWfiV4v8GfDnQri6sdE06/8Y63pPhjTri/kjK2u mWM19JFa3Eq20Jf7HZQyLZ2cLySW9rbxtIngPxD+Gng79oT4/fB7Q7fStI1zS/g7p0Xx s1rW9OuZ9S0tf7dtJtJ+HuhWmpfabu11GDxbdLc+K5IpLyexn0vQ7l7OCINagfEf7SHw j8Q/tL6P4asvEHxM8aWur+ENSvLvQNSvb698SWtt9stzZ38BsNU1e1a2MwQIbuwvLaa3 lXJt542mt39Y/Z88Ka3+zH4Ej8E/C3xprVlBeY13XrkRQNd63r3mtYOdU+0aO9nvt7ON JtOtLR30+w0txF9uuNXudQWT1cJhMDlOWLMaWZVq3EU3iMPLCyiqccLGanQqcs2lUgvY 15XjOMlOtKElFvDyUoxEcbjMw+pYjBxpZXRqRdeVaVKFeX1ZYeSpulOtzOtGpFxlB0oz SpJUqlaVWrCl+mDeHXvft9lvtLqBpWsdVhkV3QLLBG9xbSyRxs8cz29xGTCjxF451LOF l3D8+/Bf/BND4GfCn426d8XbLUvEV3cRa3d674T8GX5hn0bStfAuNQFxFcpELi8tbBRP NY2V1EgiSNEkmuCuG9Qi+PfxttYpJG8aXk7JGrlZdH8P3Dt0JCxxaWrHJUldg34+Qbic 1JZ/tDfGaJ4mt9Q03VL7UrqSaaSfw9bSeZHLFaxWYtkWfzBI6IsUkMMUMRkVJ44t88wH k5fis5y3+0KeX4mWFp5jhK9DF0sNio4RY6boSX7yawip06FOo+aOHpYaE5UKiwcJe0ks RDoxOXZNipUHWwdKvVw1V4qnXxMqftKMsNRhGOJqSqS58XWqU8NQpKdapKrJUqcIznNU oT978V/Crwz8QPDmp6D4r0GLxL4f8R6bJZ3thc2++3uLG7VHK4OPLkJ2SxTYEtvIFeNl Yc/Gnw+/Y98afsxDxlD8G/ijZ6T8PtWuE8SXvhjx/wCD77xjcaHdrHLHG2iXmgXOm6xe Dyd6PAz3k1yQhuI3KRivZLf44fFbWNKOoatZ+CdR0nSfEmiQvc6jptjZNY65NJe6zoNw 0FreR6hNb2baLcXDzQ2VxZwLbW0GpyeZf2sd3fm/an8b3EP2W98MeDtQhmIWVfseowpI hUq0bi3u4VKMCcr0OfTmtMHWz7J8PHBwxjWXY+pGdbAVqSxNCGFp1abo4mlDFU44etzX rqLpxgueEk3FTss5QyfNMZUr16Vd4nBwp4aGLwtalSr0alV054ilU9lOddShh3Gq6FSd BXr4epCpOnGcJ9B4N+CWoaRq99428ceKb/x346vdNbRYdZkt7TR9K0DSWkEx0jwnoVii 2+mabPcRxT3s8wn1bU3SIahfzhI1Txf9rH9iT4eftN+GNGTV9Uv/AAN420KH+z9C8dra waiBe6hOyf2XqWmMdOTUtDv3NmiaabyPUo76My2WqAzLaL7Wn7WGrqIVf4e+HL6OMRvJ Ik+taczStGnnQiP+2b7KQzGaKKd0KTxpHc+XCzrHHqv+1JO1rb3uofCS7/s+/ubyzF3a eKRZWVxPZwWMl1aafeXXhl/9N06LULWW68q9kngj1DTpWhthLHJNlhcfxHhcyhnGHxDo YjB16dCCozwVBQptNOnSor2knhLU2tMPLD05OEJxjOrTU8sTgMrr4SGX16M8VSxdRwq1 JurUlHlpVKkMViVWr0ZyqSceS1ByqzqVISkqdONScPmHQfhr+1x4d+CkXwnt/C3wR17V tJ8Py+ANF+JU3xL8U6ZDcaaLSey0vXtS+H138M5NcWSz075Lqy0/XdQ0xbm3RF1NBcRP Nyf7JH/BOzRf2bJZfG3iXWovH3xRubaXTodS0/TTa6D4as54hBdQaIl6Rd3t5cINtxqt xBZkQyta22nxNuuZPsyw/aU8Eafb29tceAPGdjHa2y2iy3HivTPEcjxrEkUbyT6pJY3N 9MAo8y4ubia5uGBlmkeR5JDqW/7QXgLVNQ0iCCHxbo9p9uMerrf6J4WulvLSezuIbeC1 1BPEa/2AsWqPp+oXWovFdxyWVncae8cIvvtdt01+Is/+r5jgcDSwuAp5xXdfNJYb2kJY +UklKDcfrMoRlZ8tGiqNN1J8s5Rg3UhjSyLL1jKGIrVcRmDwM/YZWsRCmvYYa8IwUoKc oSmnHmlUnKrUhG0IKcoJ1Py+/bn/AGV/2hf2i9T0TTvAngzw7HongzULu4tdZ1Hxpp9r c+IY7mzihhlk0i5lDaZNa3E15bvuX98irKzEBQnr/wCzD4E+OHwJ/Z7/AOFe+J/hCdS1 vwx9pksl0Dx3oU0fim41fUh5scHlwPHaR6XFIt7LNes5lMTxQxb/AC3r79t/jr8DpWjV r7xVZyLjKXXh2WQOw97QSIIwpCqDghg2QQQz6w+K/wAELpogviqdGulYzrJo+oWX2SXz Tg7pQylXUo+9OmCrKgTLdb4wzmrkmFyGrluX/wBm4KpSq0I/V8RSq06lOcU5c31pqq5J uE1yP3JSkko6rkfDuBjmeIzRYvFrFYpTpcvtaUqaTjzRUY+ycVZQ5lzWtKK2mrL+eb4T /sqftN/C/wDaE0H4sH4G6zNZ6bqfiHVNRhtdb0XW/tmpa5qGs3NvfRWsup6H/osNtfWN tcWyXsT77Ka6ST9+sSfRf/BSL4bfGD40Wngfwj8NPgp8Q9WPg/VpNavtWH/CN/2HdxX/ AIdjjdNMmHiZruea0u7qS2uftGm2gSWCZYXuIVSeX9q4/GXwks4GMnxA0m1hu7m9s0Fx LqD2t7Lptzb/AGuKO8gs5LOR4DLp81wkUr+THd2kj/u7m3kldHrnwt1UQG28c+EW2TK7 ST63Y20U0PlXK+Qx1Jo4xGsrxzI8UUVwJIUXzhA08cntVvEDM3nOUZvicmwjxmU4erDC ycsTGPK1ywTnBTdejywlGjLm9nCdSVrRSkuCHCmCWW4/LMNmU1gsxr+3mtKk6c/aKcab cuV3p3UJOS5kopy1PzA/YD8P+J/h38IrD4O+Ofh1478I+LtOuNY8RX95r3h6IeE57fVb ixNlaad4jstSvrK/v3gZJpdPAjkhCXW9g9tLEn3cPDbyzIYLOezPmQx+adnl7pk+aSOA T3UojjfJBhhLkKuQGkER95bTPCNvIYh4i8Ki7eG1uY7Z9e0dbyS11Gyi1CwnEC6m8rw3 mn3Nve2dx5bR3FrcwzQtLFNE7S2/hX7fp1nqOk2iy2WpWCXKTNAqzxx3cKGNbm1v7aO5 sblYpW8yG8htbyxuEWKW3iuFYRfJZlj6md5xj88o4Gpg8PXxE685fWFOlhqtalVrwtjK tOnGWJlSo1J0acI06+JlSl9UhGaSj7eFwMctyuhgniKeJdKjHC0ksLGcKkavJRcp0V7W Xsk6ms5SdOhF+0rTtDnXgFxoNxBeXaLeRXFvExihureC4hSeO3MgNwhu44H+z3Sqk1vH cW1nPEdqvGsz+WlVdES4u2vZ5PNgtrWVIbK1aWHybmWNYIrtpxc3AkjADGS1kR1klk3x Pb7FA97k8AaukaoyS3SwpHGk95HazzMPLwZRHbSokjMwBPlQRKCx2qq4QUz8MtSKiWd7 4q7I6RQQm2QtE2+FGkTc7gSDOwjZtLBgUJVvK56cPrEXVjy3UadShRcoSUZqnde19jXh CVCVVwlK1Vz9n7WN+Zx65xnXo04Sco1J06VOfLUjhq6SoxhZzwPs4qrJ2VaVJxhVk6tR ubfv+BgLYXdikEN9I99JdQtJpgd/7P2Wk07Sasysslna3scclrayEFbq5/0cD7xCS2Uc 7LsjllhYKyCZZ4tobbjo0eVPPXkZwRXuU/w+aLdOycuxhlghSRriT7K42meWNULQgzyi MM33lnCgbmyyTwZqXmLFBBE/l7NqyxSyRqHAKk4cFmYEnaTxjOe1OVanP2fLFw9nThGM nUhLmUZVJ1Hyxi5xvVnJwUpKUY391xnBmGHdW2Mp1KdZShjZU1Ooock4KFKrF4eCnUkq ahKlRc4ujKdanXUqN5OcvC9U0y1sLK/ubKwvrpIrKSc6bbNPcXl4Y4B50MRtmibMs28R qpidY2RDMHBkPyB/wpvToba51rVPglfacl3pGvahbWuuajrt9b6tsRrgw2kWjJqOsaZq 17FM1to1xqenXNmb94JhqmnG3nvI/uD4meGdbuR4e8I6XY6F9q8VeItM0y+XV7/VoHsv D09yIdQ1ay0vRNd8O3+rPa3z2O7T5ta0jT761e4tbzUbaKQzL8dSeEP7ZsNU17xRf/DC C6tY7rTGt9H+LXxF8CXmg39vfRSTWd/YeJvjJo8WpWEnlyzQwyWmn3V80lrI1phZbS7/ AF7w7wWDWCqY6tD203Xi5ztiFCNPFRksHTqOU4U1KpPA42UOWNOqoqo3UlBRjD+a/Gbi PMqedZdgcmx1bDUsDh6tHMlTdedGrGtTTdCP7ynThi6ftKE51+SpVpr2lOPLOoq1HzTw D4x8NaRb3Ntd/BG88EyebeQaDaap4Mg16TXDL5USCTWvH3gbwnFdWpdEmEd9rmtLA3my xz6faC4mb7w/4J7eIruy/bE/Zc1bxJ4u0Z9W1X46/DTRNE07RPhUui3EFlretwC80QeJ NEh1vSBBZNdSaVfr/bFom6882za/tLi4uIPzsTwnf/Ea68Krb6/40ilsdd1W0i0Kz8K/ ErXNF0tLW2tYEurHx3Hd6UX/AOEhisor6Vrfxd4rjlisIpfs94Imht/0q/Yv8FeFYP2i /wBiwJYa5pmo+Hv2nfhJqp1a7s3g1nU73/hPNC01g1lqsXiC5i0S/m1C2t9UvtNu9J8y Oe3mlnZEjnh/XadLAUK2CjGhNV8RWjOpGnD21KEYO1OzqU4Spp0les9VFXjTk4wcqn8/ 0MRjMZmFGtUbnKliaHJOpzzq2ddVMRUV5TUZTcpSlNRu7zlKUHJtf3p/2/pS63ZeHJL1 V1zUNJvdftNOeKZLh9I02806wvrs5Ty4hbXer6bbvFI6TM9ypSNljlMejGtlplvHF5iW 0DXJji+0XDHfc3t0xSFZLmRneWe5m2QQhyS7pDCuNiB6yh5mjCuNqxSbjG4jYStLgJKR 5cki+WTIisWjDRlgBKhNTVkkktYkj01NUZtR04GJpreA2kZ1CBZdWikuUdPtGjxF9TgS MC4kltUjtmWdo2H6SrXS1s3Hm1Vm9rq9kvdenM3a7d7M/a0sNKWHqck+aFN061W8Ks25 VL1vYfuoSpU5KnRUqMpVW6lHnlUa5IU7IS6I8szFdksUn2gJETOnnO8luYdpESiIJD5o JkIYupVxkrcxtMskMRkt53tpxBqEcVvI1nK6+Ukka3Cyo0ymTzY0kglgcRsswKnY+Xez jwv4YuLhrlbtfD+iPI174h1eKxW5XTLLLXet67cxNBa+asJm1DVJ4THGWluZI9oK1x/i eC4v/FVvo+t+MpvDHhfxN4c1PwhoWh6d4i0/Qda8Y+MdUiu/EF7daFqFvZ2HjLTPEXgz wl4S1i90xfDHiRlvdK1jxHrF/pcEnhOy1OJ4eEHUa9pyKjClOo5ydWSpc/s04U60/wDa KmsnKnFuc4xlOq1SjKcdZ0787jKLp3rRhK7g5+zjFt8kXKrT51KLi2lFNys1GnU5exj0 u4m8P2+javqGqahcfYrewv8AWLW8/sbVr+SFUil1VrvQF0RdNvL0x/bLlNGjsYbaWaWC xiWBY0O9WKt5HrEmo2dhd6pp8+h61Y2eoTHSZ7RLiSK20rXJbSyuNb0trLVtLvtP1C3s bzVtDN3BBNJqWm2uqWWv6Vepp21RO0pzrONONSq3z8lNU7Ru5xSjGMYRpp1JunCHuwTk lGKavzQlL+GvaOnTjHklKcZwcnzQmovnlVdSKpw9rKokpXhyylJVFH+OL/g9UtPC91/w Ta+AupLZ6HceMtF/bk+F2mNqP2Wxk8SaX4d8QfAL9qS9bT/t3lnUrTRta1Dw9BdyWYlj sr+80SCd45Z9OjaEq5/wem3d1cf8ExvgrBjTX06y/b7+D0MU1tfyz6kuqSfs5/tYXGo2 epaebOOCwjgspdGurCVNQup71b+4M9nYxW9rNqBS5q0oxVaqqrhzRpuPNy06LqTqUqUV KpV5XTjPlqcsoxlW9pNU6XP7OJTxH1iCkqkqkac61CPMppQ9hXq0504xnqoxqxqWcbQm 26kPdmm/657fwzobeJdZ8Uf2NLba9dx6Fpdxqs02TqFl4ci1a60iWyjhvJltobV/Fev2 EsjQWN7eCa8tbuO500WbS2bl7n/hJ9LRNM1yS0Oh628usw32mJ4bs7kaj4eW303UtMk1 WLWbrXNQja5utEvrPRL3TLKx0zX7fUdV0u61HS7TV265BJLqfg+VfF194bS08R3M02jW i+GzbeP0k8J+J7RPCWqHXNH1PVEsrOa5i8cxHwbfeHfEZ1PwZp6XWr3HhJvFGga30Dkh SR7/AMj3yMfmPqKzfPJWdWpeEopSfJKXIpqapWcZJU+WXsrcsZqDcoyjO1Q0hUSlUaUW 7OE1zS0lKhGnzPlmpcypOFozduWMIuDpcsX/ACxf8HN2nXOofDj9la80+PX7t7T4i+Nl EOh2Fnewzz2ugWapa3l9LcW89hcRXTCaJdOkkvH+yXfkxAwTyQfyjXUsus3C+ItI0e10 mfSYQ+vJq+o3yRXd1p3l30fm2d6s02o3NhHayRvbi1uPtV0LdD5w8xh/WP8A8HKnhyHR Pgx+ylF4Q0mw0K0Hxt+Jl5dJpuiiLQ49W8XeGNS1jVdT1a105Y7OK61/xBqura1qurXW nX82o6veX9/etcXl5cSTfy7+Grzx9o9tHqut/DXwx4n1670v+yNCjt91n52p4guF1ayv To2m6UmqQWsEcCWn74FHngmSRp8w+1QxE6dGjBQnUjGpHlpxqct+epCNScU2ow5YJSai 3KXs0o80nGJ+F8bzh/b6VSnfko4RYiDquVOcp39q6b9nGUI8nLBNwlJuHtGveVOPkvhW W/t7q01iwstH1N9USyuoTL4gZ7Wzt2s5ru5jL3jOsd6Z3hnhaNjBEdjW7kSR59Fv/irP pF1ZW89ho0tzr0llqVnDql3a3d6jTXL215bQxvBcXjRXisZgIfKhghhkkXyzIAyeGmvf GkdtNYaL4f07SbazW8ujIukC+1GCfyLS00oi5a3EjpB5LtbrbhTaQJLGACFrY1bwjqmi aheatp/w+1DxP4ivvsqaZdWsDad4d0VtOSK0le6nsYraO6mulSZk0l7qO0nCzrkoZMmK q4Z1p81FUlNzjThNuUoU3Wc4QhOUqk6SjFU4y56tWp7jUq0oylF/H1pUniJRnFc1OLhG U4xhU5eZtxlZWgm+Vzh71qkE01olqr8XPihoNx4i8PIPCP8AZeoTPc+H9Gg1nw2k0lks iNDe3Md1qdtqk3nYgisJJFsvKcMzRoiNcx8jHqviu51qGN/D0FjPqlnYavaz6Zp0trql xeadDMVvJ7rRNL1DTpNHs7mKLbdjWJZdSxBZ3UktraXEM/qFn4UvI49Qbxj8MfB9vq8V hcTC/wBMt7a21i2OpWEUWjaWdN0G3ilt/JmtjcM1zqNxNAtzcyAyj7JCfZ47v4e6N4K0 qx8W+BbzTtAsnR55dU8G6VH4be6njHL6p4h8S2eo6rqZ1FBfSzx+DtSuFkZ2t9jW7XcX jYqrQocnJRpzk5xa9g5VJyvFPkcHC7kn7suX3XKL1nTd5YVatKl7sI0K7nGmuem6zlSk /ZVZKnC1FyrU2pYeqpxqUXepKnzr2VY+bF8Z+ItE0geJPFpXWNS1XwpceHdEm0vQ/hNr EZgn1y71N5NeutR0DTdfu20i7mvEt/E76i2sajpVvpfhbU7w+FNKfRpbPhr4jX2vLrV9 q3iDTtMu9G0W0tzperaV4Sjm1W4u/sGm3K6Do2jaONGsrq2t7X+3LiXWb+xXUbKy1C+v Xvda1G0a89gm+B/w08WWUFh8Kfhta+INNvbPTb6Xx0/w4vnvNE15tClvvE2n3X9jWmg6 Rd2Ees3Op2VreXz+Ikn0jTNP1q+s/DF/qg8MW/M6N8I93iKy1LXNI0eSXQbK21TU7fSY fCkF3HbTw2NzpF1DqeiLcPp+myWDW1zpsMV7cWN5azxX9mJHMUZ56mLy+UOSlKjQrzoQ r0YQjDDVKkKX1atiKToVsMqkPZVcTDDY1qn+7dZSpVVKdGq9pYjDyq4f60qlRQhH285U qc61GliK9Wn/ALLeqniKcvqlSpRUqtDD1MVRxEeWUadWrU8y0nXkXW4rnRvCmq+OdQW9 s47xdEvtPt9MvNO8m+tY106DShpWijNzqFtLPaX8U16bm0FurSiSWWXzj41fGHTfhT4X Xxt4s1DX/Cmo32oaja6T4SdPDF14i8T3ulWkUElncmB38jThFPpFlNLdhYobeC6to2/0 JIz9z2cvgaawh8F+CfB3h3TdUvNW1GbUoNR1KO+1C+svEMI0qawktpPsFity0Mgvdkf2 mXT4P9M08W9wwnn8O+KH7LvgHxpaa38OvFlt4Cs7zSbQ+I4tc03Q9WuZ9Av7kadZJHNI jmK7tF1GaxsJbVT5sxniuZGZI3c4VcdClNU/fo0qksO503VXtqzUXOVOcOaUFRc1h50Z Rb9taovZwlJNdPD88sq5lRjiliI4SpJPGRjH36dJRw3PUlFTqOFGEozU48kU4xjXtTm6 qj/Px8bvG/xE+Mfiyfxr4hnuteW8itV065tbO4sdI0+3bTbK4m0LRdMllYRW+iXq3Fm2 oRxI2ryRNqACxTQRx+XT+BfGEMFrO/h3WP8ASiViRbXfmIW1jdJOqJI8/lzR6hESzxLG G+QSGRJ44f23+E/7POi+F/C2i6Bq+iwXviPwavibSdV1RI9QkPia6vNY1qTSPEKWWpxm PT7G60Q+HII9LtlCpb2s12/lahf3Br6I0z4XeBRa3LzeCzDqLGxWOY20TWKWflztqLCB 4hKt7Lcmw+zS211bxW8SXkEkFwt1G9v+YZv4uYHKMdicuWXTq1cPGEFLE4mlgk5VKtCE J1PbujZpVFzU1CCjGcq7lClRnGX+iPCngxh8fkeW4jB5xhqeDrYSlOg4SpSoyTqwgrVq XPRrOpKNZctFwpupKl7NqmuU/nCuPA/ifT7a0N74X12C91N7S70qWSPNvJpzSXltOJdP +zyXTzXF0ltJayPPbhbOGaX7FeQahZXUelf/AA3+IjJ4g1i68K3dnLpPiK30bWdLNrYa Nq9prGrf23OsFp4NdrDWF0+0m0TUbHUbjTNF/sbwzfHS9H1eXSrvWtBs9Q/U79quzl8H fEzR7nw/t1HwzpWp6rrHhjVtS8J6Zo2vyQOmlaSdJ1W9tP7Rv59Mm0jw9YXuk6Be61qu leHtT1fxI+mQ+dqeq32rel6p8Q/DWifCOHxTLqd7pFn4r8mOO7023g13X7S81TUJZLqP Ror+KOL7XFNl7Sxl1DSV26ZHpCazpWkTyLXo0vESvXy/JcXhMvVX+3a1GVFU5zqUKdOq 6nIsUqtXDzwuIhQdD2tOdO9CdTFOcPaUFQr9n/EJ6NKjjZYrOKuEhgqNXFTpU8JOtVr0 sNzVIRpYaEYV6uIxcXOhQfLUqYepXpx5MRThKMvxv17wPq0Q0KwsPB3iPT7+20KzPie6 n1S18RWWo6vqV7qGqWmpabBpmi2R8M2qeGr3QtMuvDl9e6/qlrrWl6ze3WqWj6h/wjmg 7Gj/AAn8UXuo3mmXHhLX1jupLWz03UL2S10WTSIzrdhFNqmqw3zPp/y6Wl5Zz2U+q2EF jd3KXkuotb6fLFcfoJ+znoGsXWtNPrWr6msGlaHbWOsSSXcEcWsXl/rEuohpvtUHmaxd WzzSWry+Rc6hDps0UKNb2GnJHZfdniB/C3w28LQeMNWe11bSzbi7s9J0+Cy1ee38rVb6 xgt7y0WIJp9xPd2sl5FZalBAZdOvLbU3ha0vYJZlxN4lf2Pjf7OwWAp4qeManhqbq16u KoyUYwhTqKLhQmpYmdWnG/s61Snh/bSw+Fp4ilCpthPBWjmEPaSx+OpUIV4zq0q1R0p+ zs8RCFPEU6UnWqU6kaFOrUUVhFTqV6MqdZwnhaf8/lt8F/infrFLYeC9ZuUubiG3t5be 2aWKS4luY7SOITRhollkuZEghDMGed0iXLOFPbw/s7fHTw/Dc6refDaQ2rWGs6bMdbtb ee2txd6bcWk12kNxlILyyiuWvdLvR81hfW0V5ERLCmf3Y+C2r6D4w8CNeeE9I1DQtKjv 3srzSr4xNLb3K3InUPNDvTUoWks3nhZQEtpoI8LE8carkftOXcOhfDGW1Ekt4/27SLm/ t4UeNnsbtT5tpLeMvWZWiiuEZgsUxkgLbywHyT8Xc2q5lgcoeQ0sLLF1nSqyx1W8PZTm 6NlTp1VaUKlKtTqN1JKT5eSEVHnqfQ0/BHJuSrWjnOJqUY1OROjGH7n2VOpKvKbjzuta VoeyjTjOm4y5pycvZ0/wAfwBrlraTaTcaboranJqFi8N8NejF5BAkN9G9hFbfbItONvf yz2tzLc3MQnhfT4o7e4himukm9X+HfwZ+IFl4hXX7LRb2/8ADeg3OpNNq0U+nubiwvFG m2U2n6JbXN7LLfO1xFPf2OmXuqSQwSmdmS00y7vh9mNfeDv+FK614sudS0ZNO0ttFl17 wppPh+LT9VbVNNfV/Jt9RluHuGudVtYfEes6TomuSwywrp9zDLJA8QSzt2fAn4j+Gfh/ barYaxHfwaHqml2GvQ6fpwtLiNLy432135cNzcxXABS6ss/ZkkdFW5nKLDBI1fdYzi/N llGNng8vpV8VhsYsI8LTniXUqclKlKs1anRoQhJ15KnyyxkpPDQnzU1J0n5+A8KOHqmK oxq5tJUq1P69hXD21KpRwqlVo0JYmhiIRhT9tzQrYjDYmjDFUJ0/ZuVOUZyeyPil4E8K 28dnq97qOjaxas+LS506a5vJLbd9nAW3S3u3uA0DvNbXZSYWd01s0UtpeQ28y/fv7JP7 SXw70z4j2HiyCDWNY+H8PjS1Opa3H4V1G58QX+kQLE0Fvd6JY3s8Ok3VmqW12yImq77g 3umrNerPbT2/5i/FP41+C/HPjeXVfh9p+s2viFLWyltYIr/SdP0XRY7BZL21J1bU21u+ gkto5be1WF7warJcbbG5uku3nZfW/gTdztrutatrWt6+2oajounNrkUkUMun3k8M+ljT JtW1abUkuJnisYtXgWEWUflPFZW8ZvYNSuX0v4viPDyxnDVetjcJDCY2rhZqvQqy5qtJ VZPC14QoOkmqvLUp1ozdKrVoqPt4yoOhKS9jA8CZRiMVXhhcxxeaUaFWlCcMJQVOMKm0 KEsbRrVklQqTtX/dOjB+1lOUaaUqn9uH/D1f9iDR9OutYl+IWs2cVtEzvZy+BPFGnO62 0MflxRS6lp1lp8O9UAElxdW1sDIGlmjXcwtJ/wAFl/8Agnk2nSahafHewhtzcsA9zoGu OHtVmRPtsSQWrODPGs5so3wZLhYVYBWYj+Jnxl+0t8PdP1LWfhk8V7HFPrM8LTyadLeL YagtxJMNLN1O0vlW9vKUsrco9wYIwkM97PLbTSHqPgx4a0H4kza5FcXQ0iy0uQx21rp9 kouLmEW0c8l84Ef+kNbzXiQ+Xt3GUhuQFNfz6/CTLcBhKma53/beHwUnGr7bDx9o6mDr yS+sU6U6UIyq8vvQj7SMZNpSlF35focB4T8DZ2q0sJxBXjicLiFRxGGdejiJwxkaaq+w bhTXJT5rwlNxbajLlUmlf9T/AI4/tG/D/wCOPxW+K/xB8B+MtF1rQfEHjDxLqtm1w7Nf jQJpmi0mSW1kAurNP7PitnaOVfLt1OwAlOPhnRNd03x54obT/CviTw/4iuoXm8zQG1K7 t4tRsoZPKV4JrdA01pJISoutJuJJkjU3EEkbmJx4J478FWfwa8fyXeg6zp2vR6NbeE/E lqt9pT6bcXst4Zp9U0i80qQG21zRdJvtJvtD1l55EgmN3EFgeC9xFCmpaJ4A+OnhGz8J Sp9pOteE7LTLCAeW03/CU3Vvp39krI08kjJPHqFtOfNaJbed/LVSsTmvpcn4RwGAwX13 Ja2KxcsRgqmZ4OOYYP2cacaFKFaMcXRrxu5SbkpUK1GLgoShUi3KSX7H7ZrLMLltbE4P D5fhsJh8Hh68Z1MHWnTfNTqL2kPZYihWp0vYVFVjVjOLqe5yTouT9g1j4B69qNxJBquk Wetaha4Yy37a1LZtdyZDW67NIS9V4hHtdTAkQkzyYszR1o/2avFSXizaf4N8M2tk0dik 8l23ip4/tggt47qa3nTwlNGYp7wz/YI7mztpoIpI7S6eUoL68/VbX/D/AIw8H6lZ2HjH w1quhXwt5pPI1CyUXcro0Ihns71LuS2ubeNVmM2yGUSvNbsxgVfLn5fUNS1AT2q2V21k kMvn30F5p0l/I9t5cjRxWssesWkdqXlx5k0tnMwWRwnlt5ZHwlPxDzNRqYdUcqhFwlVg 6lOs5qUOeEcPCdOlJRlXUnUkko0Jr2bnUjKCjDkhw+q1DAV28VnFWMXh6uIwlPAOlVeI rwdXHVoynh6MqeDUHC1NzrRp86hQr1ZNy/Na9/Z2n0jXptWHhm71rRrqzjSKwWXVNMuL J4Y4WuRJc3HhuULieKQJdW7wS31uVaOVYZfJe4vw5mu/E+meIpvh7Isdjd6RIdJspoNM F3BoMFla29uiz6BLp6zTW9nFDd3d/ot6dRuTNqeox39zc3clx+tnwkl0K/8Aipp/hfxx aGd7m21vTDpWqRXdtDZ6xZWst7b299bySRrHLHNp93bm0njjAuLgRMPNSBFyPjVqd34f 0+0Ou/s9x6cs+pi1tPFeg64f7OsYIXa7hlkS1neAyzR2cNkkMxnud120kcYjtrmaP08N x7nuKqyhRoTpezWKoYejWxUX9Xwn72pUwdadaGGoVeaDnCrR9jSjjK05wjhuesqMvCxX D+UUsaskxOWwx0sXh6dStiY08LRjiquMp06c62Fs61aNOVk7KvUnh6cYN1mqXtF+LPiX 9mzxjqOgXtt4Oi1Tw14mGsaTqKa9Hqa3UdvoljDf2+q6XDoX9mIt1dal9p05or4XETwn T1gMVx/aE09v9Y/s6X+i/D/UNTh13UPiVYTyWVtJrepW/hWy1K4newu7ZpbXT4NSVbGJ r23FzaJKqFIg4EmQwB/QjQvFfgHxt8I/ixrjfDzR9A8RfDPwtpi2V7Zam95JFeeIItVd boJJc3DWCRX2nG6eCWS5D+fJiRprcu3kfwY0pPiJ4c+NDWkV14o8e+GPCnhXUfD09vK1 vBNcahcahZ61pP2MxmO4k1e1tVtoJwu2KSNJMeZJFn26PHOdVOariFGjHA14vE16soRr uWIu5VaVGpUpOtTWHtUjThUpUnV3nTlWi5/NZ94f8IcU5ZxTg85wNXLcDWdLL8x+rqhC VKEo0X7bD1KcaVGjWU+efLFxcqbVKnF8jUbehfF/4WNcJqWu+C/Gupa5dSaY5ki8MQT2 knMFnaXV1p9lZXMOsawb6T7NBdXsMcsFx5H2dornyWlsaz8WP2Y21K48T+IPhVaXFxcw 2dvYa9dfCfUta1qFbeytjbWsdvb+NbKxuIb972OJn+ytew3tv86WLDc+v4y+FGv2FloE fgGTUvH+pp4T0nxR4sttJ05LH+wG12+eTSIGhn8m+aeXyLphZzp/aMR02S6mhgQwRr5n q/gf4t6B4bh8R6p4UutF0OeVAt1e3FnAESW3Mkb38O43VissUczNdTW0Mf2eOWeURpHI BrLxHz2Vdxo4ePtqkcLQeHpzqUqkqskva4dUuWpKM4V5xo0pcqcpQm+S9WMaf5Bg/ol+ DmJp0qq4nxdDDTnP6rCvmOGpurUc40cNGUpShKUMV7tRU6XLOo5UabqypxnGr9IfCTw3 8Efj1puueIPDdt4Jt7Wxnt7a604+BdR8K+M49O05raK3vJrm6+I3iO50XQbiaCS2ivr3 So4xfWguIpZ1eO4j+k9Q8LfDzSLe78D6x8ULrStW/sS7/wCEWuT4i1DR/E39nz6mmqrZ 6X4Q8I69BrfiTRNIsbWWx0SSc3VxEIrrULyfUonuo5/yp0n4g+J/hxq1l4gsL3U9Lv8A S0vWg1Dw5ZTzzwm4s50iFxJNaXGl6vY+YVm1DTbiOa01WJbiz+06eLz7db/oB4A8ZyfG j4fSfEePQ/BPgrWxNb2Ora94z8HR3ngdvEmmXUF7aeKNCuNMu7vxBFq99HfXSTxJBq9v pepaZ9g15XisdHefoyTifMMxx0Fj8RWo4fEVqsKE8HUoSqc/s3CdOrywqVKcXh6kaUqs 6Sjip80aSqOnOjT/ACrxx+jTW8NsjlnnCVWhj8jjS5MxePqUMPi6D5Z1ufCOrUj7RtJY erQh7GniaM4QjGtiYxvieNdStfDWp6jp2maz4g8VeIdO/szS9K+1J4Yjh0r7ZeQwaVrC /wBu69Bq0EWgG7e4f7Ld6dd6ha2iAJHd3SM+J4os7eW3v7rxZ4h8Y/DyJYdPi0nw5rfg Xw7rr+KVsDYR26+IPFnh2++wtd6zqZZp5fs9q7SXNvFDaW7Fmb6M0rxH49fSZ9T8Q3nh v4t6LreqSz3nib4f3mj/ANnwR2jxppdvejXrS3u9P/s92SNorSG4bz4RPJaB2wfYPDfx O+EdpLZ3jeIvAqNcRWmnta+JNS8N6Vr0+s3GoW1jYoizWNmZil9v0+3PkSsZLqK3kkVQ C/6LLNcTh6eFpQy763VhUryp4nLoy+vVJ1KVKMY14VMNVpeypSoqpTpKh7VqriEqsHUh Kn/GVOhQxF8NKqqTqVYUvZVaNGnUnWryVCjTpVYx56lSVWqoU6UZN1ZzjCC53Br5P0bw v8Q7Sx0yx0rwF4VnfTNMs9HjSO7HiXW77VLmJWt7PUrq/FhJYRabFe3OqhtKt3tRYMkb pvjZpPa/AGhXl54ZutSaLwhYa1pyanb6zpl/otx/Yl5q+latb3txq2oafp81rfZtLjTr 37JG0Nymp3ahAN8MSXXr7+MtD8TW3hbU5ba18H2U0mn6pcHxFqnhyPXFn1EwW9lpc1rH cR/Zb/zLmDTXsBtu5rkfYVjY+WjQ6/rXgz+zr7WfCevaLr+q2+rwalf6ZqdvDqEtnMZJ b22W5bTZIr+SIXdxK8Mt06WojuGhd3MPyfN4zN8zxtNTo5f9X5JKHM44hUlRcqdCvOrV UK8Y8sKl7z5JTrzpR9rSdVVI+zhMuw+BnXr4WrCb+qyoudWhSzCnCjKn9XVWUMQqjVSn PERVPEuf1qjXqU61OvHFKjUXE29l4g1HRHu7vxXPpev6tcaO+v2nh+V49It/DS3OnxXm qWeq33gjStc0q7ihlubmDTmFgbiVbexF1awGW8seS+P3w00L4s6d4Psbfxj4W8IXvhBd Zs7WbxhcTafZ6xPqE+kxqj6xf+KNeuraxWytZ5or61stQgS6extfJtDfm7tvXNQ1rwLq fhjUNL8cy+HNWaOG18Q6Zps+kWUlhaLbPCt21tfX1l4pCSreTx3cEd2ERZJlgsYHMUiL 8TfFrT/DGlXOiapomk+DvGNvrttLe2/ijxJ8IPAMF7Oq6faWph8O3reEdNtX0BbO9ksL ZP7Mtb6MJf2915tnNbvN42Jnha8MbUzCWKpRw05Sn7D2iUpTpRVGEI1Zcs/q7qe0irc8 lJ8861KUeX9A4JhxFSz/ACpcMLA08zxcqc8NLF3jh6lCM8R9br8koqn7GnUpVcLKUXy0 6nPCnaVOpby2++AXj7wRqFg0uv8AgR9d8rRda0s+HvHHhbR9cWy1TTrTxB4P1Cz0Q61p /iZZdR8OXOl65YambBX1mC8svEFrI0Go25rk7fwLfQSzLqWmagDAlzD5flXVuVnMTxwT vK1rJHLFb3LwyyxKJGuYVeBJ4TKLiL3+y+MPxEkOlSQ6joFlNpMUVtpctn8NfhcktjHD ny7e2uY/C5uzGBuzDHIqk/MTuXnpL/4sfE7xHKbzU/FEF3di3Nuznw94XsLiNGdF2xSa ZodvPZnO1yy3EEh2YEwJCP8AJYrG4SdSUsLLFzcp8/tMRSoRiuaScrwpqKSeyUUoxutO VOL/AK4yyn4hUqUFj6fCiknShJYNYqlNUYNfuafL7OmmqcpRpSgvZ0pS5lTlFOEvl1PC U1jNlplEyNBMiy2cihBIgmik2THlWUqyhotjowJBBGX2ng24ErrOLMwiGARiKWTz1uW3 vceah+QRKv2cwgnzAzSiUDEefZ9S0u78Ya1YanqdrBe6pBC1paXhW4haUTFRsnjtNQt7 a9ndosRT3drcTBicSjc2cay8HzpdW0A1OP7VctErzXpa2j82UBWZ8F9qxhNzgmQpCucs E555c9SFSdHlcJVaVCEZqbqOU+edOPt1COHXLGLVRTdOU3NTpU+RVnT+sw2KxrdHD4yj GjKNOria6jiadalypUozqUcPzKvTnWnGnafJUp+yo1IVayqxoRqcjp3hWZJZ4ZtTltYb i2vJC8NqbkSzxWV5Fa2rpmMgXbTtZyXBLC2iuZJykwj2Oy38LaXdwtCJtPhuLa4u/tdy 5meR2e1tJrewuI0zDbtEqmS2YW8UsjaiPtUzW4tmi9Mh8IauU3+bICj7iI5GCnAb5QiO uQcnqfTj0taR4O1u1uLprmS41C3upfOs4LpILSHT4XtbXSY8XFsttNPBHqMcl59s1K5n xe3DWs8xtI4bdJpYh1Iyg6lNT9tSjh8C44mpPEe2qJ1I4ZwhVUHTVKHP+9o1qlOVoTqt Sidbwspe0cJwpe2w6oPFRlCOLp1+aKw9WFGWCqYevSUZYjnVWvSdLESwsaOExNKtinh/ I5fASrDMbe4gjudksdu72FxdQq8oZ4nMdvPDNLAu2IzxLcwCZl+WSI7CmuPCt3ZRaedJ ikhvLO+kvl1K3GpW+pszvpxtgJxcz29qmkC0urqwa0021vJbq/lW81JoY7JLT1qxgmQS GK3gv4T9stpG86dkjmQTWchWW1cOLqwuvnEKthbm38q6iliE9vIwadaG5hnuIUkvYbe6 soLq8szdXdvZXslncX1rbTXNp9qhgu5tO0+W4jjdYJ3srRpVZ4ICmc8yxU1Si52jQnUn S5YRjOlzzjV9nTqRUalOjGrHnp0oTVOjOpWnThGVet7TpxtGVSNehKlCnUlLERqJ0cPB ReMpywmKi6M8PWpzeHoOU8PhsRh54ejXVOdKNKonVp+OQeB4ZJ57pbWWOZ44YJpyyxl1 gMhhgciKN3WIz3DRIzMI2lmKqC7Evm8BRIInXbFHHdpdXagmOS4aOI+Vlo3jIMc0dq7O wlE0UAtXQxyEr7hYae41K4EOm6dDpv2GzNteJDMmoTX7XF6NQhuLU6dDbw2cNummSWdy mo3E13PcX0U1lZpZW8970f2C0ZW3xwyFVBw0RCO25QVJUdAhZvmwp246lQYWY46lXjVj iOasqFOMasq0J8tKnhoRowjUqSkozw9GNOGHimquGqUqMaCp16VJRI4enWpODhJQ9pzc qdSi5OnVU3dxcHKFScb1ItuniaUpQqKpSqyjP5ri8Oy3jTiG0nSzFpYT2947wxvcT3L3 S3Nj9lYC5hksY4bWWV5lVJRebIsvazhZ5/Bcd0QXhayns4PKhkXy7iXUN11A86fMq/ZY 3iIWTBZWa0iJAknVk+nItGsnDPthiQ4GFwSrEYyuSQAAT1xyASalTw5Cz/KjSKOFZVj2 4JBPKAjOB09Cc81j/aE/bynCjTp0+RRhBOVVXVNQ5n7WU5SnKcVWqaxpTnOUI0oUP3Jc MJJzUqlZzUcR7WEOSmoqCpRiqNROM1VgqrnWTajNNQi5SjFufy9D4OQIwW0dBjDF22gs f7yruHv1ByRjgiqyeDIImec2m2X55D/rpgwUcgYXAbB/1Y+Y9h1r6ou/DqxJLKYVaOJD I42zyERpgsVjgieR3AHyoiszdFBY4rF1DRbe1tnnkS33G4itIRb2Mt/J517dQWUAkiht 7qSKJbi4iN3dSwC30+3Wa9vpYLS2uJY49vNyhyqVpuEFzSjaVTlp86UrRive1S3hFx5t bs2pU4VZxhTi51VNqFJKXtZuNTkShSa55czVoOMXGo9afNFxPm+78Mabb2Ut/Owt/s8c ks93PPDBZ2sUa3D3DOWWRyscawXQujJAlv5M8c1vNGwcQSeFreWKRZJrhLpLiPy42CPC 9uVm8+WSeUR3EcqSLarDCtrJFOk07yTwG3jS5+kT4Pu1RUa6jEa8uWjhlyNwbYhWOKOF cgf6qR0wNpyGrIi8NwXyXsh/tAwQ3d1FHEtlfWE4NhI1rOPLn2y3sU11b3NxZXlvClpf Wc1pLYm7gaO8uNoYqNXDqnHSvSqVaknKdO1eFWWCo0aGHhCiqsq0Je3qSU686cqNnSp0 qlOtKvz11VgoU6tRxpyknCpCjT9rTUJ1cXX+s1YU/ZLCexhTwsalWnGpCLUHiJV6tKa+ fLrwpLcLbJbXDQS29xG+11aVWtnuLWS/RbUvDEkl7bWq2y3Y3SW7eVMFmWMwyVr/AMEr CZL9NPefUba0u4reIytH5xeSGV7QlmFvG081tDGJ5UYwYOGVDIG+o5PCsMUIkjuJEmDw oLbZPLLNG8c29hKQ8aLCyRb1dldjIvlhgsjJQfQkhLCYKLQWtxcvdvcRKsUkEtqqQvHI 6svmwzXU5uOIoFsnSUh54cmFxFd1aMqdOlNRnWfs6zlRpVnRhCvUourKdBT9tT5qf1el V9vXnVjSor21WnGps8TGjyxqVYKlh171KNCdatF4yvSjTrN0uZxwjqPESrznSnQg5V8R UrYenRxcp/OP/CIMBLlYwxI2lYtzhcfdO7JyeDkcjAyap/8ACO6jHFdQxrAY5olhcyRx /aIQk8VyJYJfLdrZyYBE8kZRmgllhLGOV1P1BeeHjOzeReQ3Bi0+y8uSSNE8+dVtYmsh 5TBkW0tjIv2l96ztaH5f9IR1w49HfLJEBDcTWcLXVsJA0/lyTmWM3MBmcAebbhFwGhaS 1JQs8bGuaOJrUWvazp06ijOE1RrwrxcvepVIQqU7RnGVp8s2oe0pP2ijaUYvL2uHxcYU 5U5f7xSUIYqlWwylUoulioVKXtqcHWcFGFan7JT/AHkHTm6cqVf2PzVH4ULoAwLyb8/a Eu53KAK6smQhiRWLKzO0cjqUCqFV3zStvC8NzGbiPz1RL3ULSSG5jvrK7WTTbl7Oa6+y anp0P2uznuIp/sF5Dug1C2jTULRpdOvLG7u/p+x8K2dhbwWtvptlDBa2clpYwTRSQW8K JZyw2vkfYRmFrUiJrONlFuJY4Uula0M6NCfDxUu6yW0k2GVov3LAeZE8TsEdpUaVVdvL nWGN4XCyQvHKqMOl5hB03GVOTlFwhQrqdCnH2cZ1qlZVaFNOrVxEnUoqFerVVOFJToxW Ilyzwm/1XkrYl0Klaq5y+sRp13UjSbdCOHo0adS1eOHot4d1q1KhGrOFerKs01Vca3y7 e6baPJp8Ul15dw3naZp/+jW+mT3LbbzVJLZBHZRtqE4hgurpjI88/wBksgD/AKLYxrAu peDtQDx3VxBcGO/Et3A1xAsMcsH2ue3ZoRa6ZaRBI7q1uLbEXlRI8EqKiBNo+h9S0e9s zpy2eiahq/23UYLO7eyudJjGk2ssM7y6vejVL/TmmsbZ4o4JYNNF/qjy3UTQafNAlzNB X1zw+Ee71TVJrl4vKvdS1PU7i5LpGYc3Fzc3TyM87ySqZ55JmV+I5WldXaMP0qso4TDu DpQVd1bU44vAzk6tGrWq1ZzoRlHE4JTVeKpUq8P9trutXo1ajSpQJUqykqUZ040Kc3Lk dGcZxjU5qip0pt8v7zE16+JxE4NQvLlq0JVW8RD5vXw758YMcFqqsyszKrsu1443UGQK Aw2ASLwceYxLngCIeGLuSa5luHT7MtxbparZ6XDDDbQC0iRYJZlVjeXNxPb3199ouSJX 854APItY9v0ND4EtdHsrS10xJZ4baztorczz3VyyxxwRoiSTXDPcXMka/u5Jp5JXldTM 0sjHea7eHb+e2toxC9sqhPtFug/dzyCS5cSTNu2yzxC6kgil2grAEjUAAls5Y+bUuVt0 6ihRk70VNRhG9KUUk5J89KmpSp+8k2p1Jczc6q4XnUeeMnOjJVIcs3CUZOlUo8/LGUVU SpzqLVShGUoTdqipyPArrw0otoxHLayf6VdRNstGac+WkGJXCQRBrabfm1LMzB4rgtFH wZKp8JS6PrhtdRMEp0+9a2ukia1uEka3uRHcLHewpfadcKQkiwXKRXto6EPGLmFhv93g 8NxyxxzxR20cd1Ctxb/afMDyoVRt32aVYZY2AZdwdQY9wWRVY8NXw60Vz59t/ZyYtby1 uTd2VpdBpb22aBZLP7bFLbwtDa3EjQziGe4tr7yb2zubS6tU21GeJSrc0vZuhGvzKqqt CSqU6ijCl7SnF1KLhUSw3OoNqq4t1ITT5s6mFnicLKUVHEU5YdtqShKFanV5acHJ8tSn 7GXNyScqVSE01pJ+5U+fH0Bbl4Im061KW0bRQObW0glZTPNO0twIrdZbqQSXDqt3M9zK sIhtvMEMUEUaL4Sn1CHVxpgmMmh2EF/qz2ljHdwaTZahef2Xp99qKR+W9rY3WqMtlBcX LW0E93/okc/2h1WvcL7SlS2aFG0qK8t0vmsp7oWcFzPLOlurQXOqW9jcXosZnsrZxGRP DbYkuIbAzyyiSG28KuCztdLMhjk+a2LgCVkYRMW8tciOQq7qpVpI1aNXjL+YvZHERc1P F1/ac18PGaxVNujUoxp06NSooQxdaphKVL2dlClBVVGpRw1VujIxm6lTDynCjKpNwnVl h6d44mtRcZulTpvETwP1bFV0oWeIlCFGpz05VLR9vHwj/hE4nhaRr2LKmDbCm5blziUG RWigaAeSSA5llRv3uIg/z7Z7fw9F/YVlrNhrdq2px3VxcfYIZr+G/isYH0NtL1O3vWt4 be4m1KbU7swW9pcPd2UWiXt3dRwwy2ckvvMOg32k3E0lnPFNJJb3tnvksk+yywX8Etjd yJFeQSqJnsrmdraaRFuraQx3FvNbXUUUseAPD98Hup4I1DSahfXRW5uFufKju7q4ufsd uRGuzTrbzhBpkE3nXNrYRW1vc3V3cRSXctUq0IRqOtKi50506MVTxDlUk5Ks6lenGEZ0 ZQoyjQSn9ZjCpGfLCnUcnXpXPDKHNGblNtprWlKEUoxp1aSgoawm/wB9CU605ObqRU3S 5Irxqz8OzTvJDJZwxSBbi58pm80mGGD7QZi8YIybeMMQ5GwN8+0RuVrz6CdryvHaeSSc fPFlBEqbwYwGPBdQHCYY8KTyB6x/wjFzb6jLrDS3DB7BLFtMilJsY2T7ev26CML5kV3P b6nc2l6wZkvIEsVdB9kQss2hWaCKZmSCOa4SFJpkESxtIXWIzGWRVUTS+XBGieZI9xND EqHeSN6tSlNx+r1ZV3Upwk/aS5Z0JJSthrz5fb+zo00nVhCEZSdJU+S6pTyanTpw/h2c sNCtJ0XzurL6xTl9WjSxDcadepVws6lStSquj7CdP3I1HiJ+PC3SWztYLZAg88SHdEIJ ttybYXKPPHbySzfZ4oDJbwMfJE/mRxyQi6lmq1qPh42V3ewxXdpe2sV1PaQalbSagtnf xxTFEvrSO8s9L1Bbe7SMT26XtraXQhdRc2kE4aOL11dFWIqXmtV+bK+VEx3MBj5neTOS DyB8vB4OOIk0TUpXvvtMWn2lut2qaa8N/JfveWf2e2f7TeQS2diun3P2s3kH2OKbUYhb wwXP27zLl7S15HiHVcqsJRUKb1pxnzSaqumqUYxnKVWoqCg4x9mm1GpN1+e1N02sNRhz +xhSoQqVKteNKnKHJGWIrVcRVmrt1JOdWdSVScpSvN3m+ed5ePW+jxTTSG+u54rdbe88 t7S1luWe5gtJTYxMklxZxRQXF6ttDeXYnkktbeSe7jtr6eNbWegLFjLHGIJZ0nid5J1J khjKGNY4mZ5tztKruyeXGVUQP5jxkxrJ7V/wiayfuo7a08wyO48qwsVWWW4cl2eRs7d7 uZJZTt+Ys8jrlichPD8104Agu7EQRXdmUhtYV3yPIircutzpck6y2/kObR45fsskc7vJ HcBrd4++jWozrTfO/qznUg8ViaVWE4RqRmqdatRw9SvOFXR1IwhOtD2sXGbrU4yT5lBR lCHtOSUo0+WjHkSUac0pumnFSlD3lCbS+GK9nGE9/JY9A8x3VQ8RL4/1LrjHzdC5AGQO RkjjjBJq4vh8y2t7m5VLlJraGKDypS0kEqXRuLmOZ18lXtpIrVPIcM8wumkQ7LabPqkv hm5kYqrSKrfI8b2aRh1xuC+bhWyGVWGwoxK9dm5TS0nwza+Sbv8AtC6mstXvoLu1ZYYv L06wfT7G38q3TbHPLCZrS81HzblpLoz6k9srJbxW6RqnVpzU5e25OT2Si6yfJUq1a0Kc KMZRTpRlyOeIviqmHo+zw9Zc7mqdOqThKMeb2GIlHV1JQUZuEYwnVb5FJ1KnMocijShK u5zShTsnUXk8/hiCIi5tln+1fZRb3JmeV4y0U9y8XlRb/LiUJIokbyxJJLnzHZEgWOnF 4alZIfNh82QqBMYZUcBQX25DkbBz8wBB4GMAnPuEWmtE15ayWEk0JSxmtdSN3++YK+pR 3ti+nIoiVWQ6bcm7d5SWBhgSIJM01WTwdbatJHpyLJbTX7Q2yOl4+mOjXu1IXku2e3js 4yJQ4vnnhggXbNJNGo8xU8W5SvWlKUIKlRdaHvxp04KEY7uzUacJKEOam9N0kKNKPLyw i3UqKU4QlJRlJuUeays52i5Rj8L5bxT3s/E59FgaZI4oV8/O0+bAkpAClQMr5jNhcBQx CDAG9cKDmTaItmjSRRT2iwme4ZoopzczE+ZNKqRwtcyS5LHyII0JXakUCDbGg9gn8Pwx TNFbQ3jzICGYXN2iEIQCS4gdZBn+HcVYcgkClXQxeX9jounXum/29eC2eayudTttIj0u 2vLxrPTb2/1G5uLVLO1uri2vfNvb5INJt4rTzn1LzYryGz2puOIlKcIRhSo06M67ppSc aUZ4ehOtGFaqnUqTqTjOVKM0lOo3GNOhD926k4qDpSlGhCbotU+apKnVxFGHuVORyknV S9tWTlKEad6saTpqUYPzJZ/EVjCj2fivxRp07SSoIrfWr6G3jhVYTA8ckd+HDyEXCyxm CJIkSFkeVpmWDWsvGHj+wjdE8e+LRJujkhKeLdWmQRxiQyoYLiSZGaUmIhzKBD5bDY/m Ax91/wAI7NHf3Om6lf6JYJbrqEb3sV7Jrdk91p9vcvDa211pMV/DdjUrqFLKzvLeZrAz XcFzNdw2Amuo83X9JsZL6abSTqU0PmzztPd6bZaVIPNvm8sR21rfXVmQtu8Mj/ZvLRJB MkMKwxLIynyqM1VdKnUjWhh3h3TSqXUZKrKac1Km4ThCL5koyqVWouPI4LghVhaj7KrV xdHEUqmLpYpNOi4zq0qlClGtRgqMqUo1uXD3nzzoUYOftXKc322gfGX4laT4Xjtn+Ikl rf3+rX11a/2zpEOtxtb2tjZJN5moTTW6WMCyuSihiHld3fLMAItU/aY0DQ9Oh1bxT+0x pfhLSooJ9Nij17w1fahZ3+qXF5cm/wBSu00rV2ubu10t5pIYrVofs+xbSFXkgtkK1rLw t4gvNH07VLbTdZn0q98TPd3Xh+PRNLTTGSIm5WLRrjVZJ5b6KWRhBeaXG7R7dsbuAhY1 PFWm2vgi20Tw5ZeBLuy0LXrBb+x8W+MfAtj481bT7aOXU9Bu5PENrpmhapJp1pcavHb2 cLafGGjiimeYGaW3lH6XkWW5bVweDWJoUPayTrOcoYWN1CMqjpJ1KNWo5zjBpKKu7u0o pNr+SOK+KM5XE2dSw+ZYjD4anmMnHBwxGJTUY06cp0nLDVaa0nGpFyg1ZpSUkndXPAt7 qni7SrfxB4G8UeE/jHrMfhqOy8ONpWh6ZdaHoemWN1a6Vb27x2txqAsrSDTFe5X7Bc2X 2vTElKPqMv2ZZ/HtZt9e8MTXfi7xR8RdI0vxlazWOhN4buvFcXhaXTX1LUPEOqSX+mWs PhiDU9f/ALHguJmn128jmg0Wxh0jw/c6ndQ/2ZZ3vrXgLTNOi0zxI91qFr4QuIDcaRrN /pPh8+C/DerQX7ebFHpcWvfDbT5rWS8dnhjXSL2TVJPIdDdo0iy1xOqfsgL4k8VjU7vS tN8eWC3ttZ+FLkan47tYb6fVriCGyTxN4pvLXTNJt1spbx7Z5X1u00O2WSfUNRv7SxtL ya4+sy+pgaeLrU8bWp0aPJWrxqex/f16jpNqhOfJOMo1Kik7wp0ZTnO1Wuqbc4fnWKxl PMZupOlHF4ijPFVI4nFYjErF06lWUYQrPn5lNwlQr0YylTdPE08TiPfVqFWh4l4u+Ouk +GvGAt4/jbo/ifT7Cz0fVvtfgHU9B+HetLqh8Pw3niHw5qfi4ad8NNU8QW2k3st1pd7F eaNH4ck1S2uzY32uaVFZeI9V+o/2b/jD4T8WftNfsrN8OvG9jc/EL/hf/wAAT8P/AAdr fi+G/wDB+tX4+JGi6hc6N4t8YeH7yUeHNKj8RQeG7Jk0jwl40vG0q81DU9J0mTUNOsNJ 1ryLS/gl8H/Cyav4gv8A4X6gup61Lf6X4e1zxVd+MdT8KHVPDMOnatexPLf6TFc20Gna fc202q2mizSPDZXen3lzrAtX86X0f9j3wFqfiP8Aae/Zh1JYvhXrZ0j9qj4I+JTa20ut S3ltdaV8V/Cfij+0PDk1p4WvZ4ZNOh0u7mtdEvfFtzb2yktcrDayX7TfTYXGZXPEw/d4 3C0VisNXneOHp4WoqcqclVjQozhDkhGrWox9u6FVwdZU5wg/azxo0Z0nhcTWoqnD2sVG s4v2DnTnhp16TrynTajSpVKdapKLqOLlh/a01GqpR/0PrLXNTXxPcaFqemD7NfnVdR8M 6ro8Gq6hpw0PQrLwZaX9v4v1R9Pt9J0DxXdeJ/EGtxaHoMN7qH9seHNEn1e1ujcWWt6f pWvrWl3Opx6c1lf/ANmXum61pmpxXf2VbwNa294i6xp5tpJYoj/bWhS6pogun8xtMbUV 1S2ie8srcVni5kh1O30jw9Y6YkMF+b/xOzx3FnDb2+rQa5fzTafJZ2ktreeI7vWzYX1/ Y3slo/8AZ2p3OrXNw9xPZw3mpqE+pxeQmnwwSvcXdhCrzpcPFDF5rT6pLdGDBiX+zoZI 7CXLIdUmto7hRA5av0l1LRc1Su4U3KVOinO86NNc6gp2cpScHZWipTekY8yiv2CFSfs+ eMX7SFGaqRw7lLmlCnJVoU21By5kpw5Wo892nFKXKodTu7eXUdN8PSG1lbV7XV7y8sby xu7mK80PTobazv1inRDp0Nwmpa1oatb6g5a8sZb/AOy20xgmmtbENpBbf2RYNb3V9/Z9 q7WuqXzLfTW8tpbw6eJLi+upXvX1O+tby4Bugsj3MS6h9pnQyhLitfx+JG1zQpNMm0ZP D0cWqjxJDexag+rzSuln/Yx0aS3njsYlilW9Oo/b4Lhnja2W0MTecza0od5YojBHJbFX klleXDxTwS272qpB5ZEgc+bIZfNjMDwRgJJ5paJ1XVdOao2jUXLKN2oRqODc1Cc+Sq4x qKUqUqipynCE26cXOMTVv2cablJTjNX5aanKVNynOivaRj9tP95e/IqUoOo1FStnHxFo Q12Lww2rWCeIZ9Pu9WttGe5jj1C703TptOg1O8s7Z2WS8h0qXWdETV2thL/ZX9vaCdQF suuaUbzRMyzC6itbiA3FuTBJ0n+y3LwRzxJcwpLG4byZ4LjyWkhd4JY3VlWVHORq+hrq moeGtQW5uLWTw7rU2rFba91iyW/jn0HWdEksL6LStV0211SyLarDff2d4httc0UX2naf qaaSmu6XoWs6Pv1pNL3HCd761Iyp25dJR5ITVT3rtRq+0cI8sZOh7OTh7ecQuk3NqUuZ uPLDkjFcycVJSnV9raGkpWpJzekFGPv/AMuX/B3P8INM+NX/AAR2+JHjOx8c2Wl3f7If 7RvwF+MGs6Ba6bDrk/iPUfE91J8AofBGo3UWtae/g28h0j9p3S/iTHqdxY65LdafoFjo 66LDB4qg8RaOV7X/AMHSVqNa/wCCHv7Zes6b4p1OGx0K7+Adpf6NpEuiT6Jr92f2wPgD pU1p4ge50q/1RZ/Dt/bzvbQ6Nq2iyQanHNDqwvoozZoU3FRjTaqQqOcZTlGEakXSftak I0588VGU+SMKnNSlUpuNSPvRqKpSp3OPJyq/vWfPBqSlSmpSi4T5oxXNaKn7vMlGcYuX OpRj+9fiuy1mLU/CviTQ0vr6XSNSbS9Z0S3lupk1Pwz4lks7PUbm20648aeE/C8Or+H9 SttF8Qf8JJrdp4n1TTPCeneMtA8KaHPq/i7bJes7rRQmtaVot++uX2i68Br2nw+In1fV dE1TXZ7XxO1nqT6jqz3WlQRadrtrq9hoM9xbQWvhi406y0TTRo76Xp77t5qWn6d9m/tC /s7H7bcizs/tl1Bbfa7wwT3ItLbz3Tz7k21rc3Agi3ymC3nl2+XDIy4llqniG41LUtM1 Dw42m28NtLeaZ4ltNV07VtA1CKbUNRtLCxeF5dK8R22vRWFrZ6vrFm2hf2BapqdtY6T4 t1y6hvvsl+/OlOEp1FFQ/dt1lGNNqejhTqqcJqDq1pRp04qSqVp1XzLnjInXk40qU1z0 4RtGlGmlGajOpUtVnCMeaTdapGE61TmjCXJTlGEbL8IP+C//AIN/4S/4MfASFtXu9KOn fFLWrtUtOP7QWTwpcwPazyHUtMWKLZKS7/vZEVTjOPm/lRPhO0m8RX2i6f4j1nxr4esG 1PRY/D9hrniO10LV5dNvrS9h1DTtRurPS9S0+LWIEvtOi8tpdR0+1S7M/wBkmlsmj/qM /wCDg/4ayeL/ANn34aQ6XdXsdzrnxbH2+S48Xa7pdlBfL4Wh0+zk08R3sltpQEOnqHsL L7Fp15cvdXt9a3Go3VxeP/IZ4s8AW/h7R7+58QfFWHRLm0vrhdL0m2uHt77TpGmkebTN Hli1DxGXt4MqbOTVtU+2TRhGkllkIUZ4dynGf+106Vf3oex9nLEqMJThyzVOHsayrTw6 fIoyUKcqknL23JTm/wAA8QqFePEE2oVKUMTQw06WIlTk6b9k1CcYJyh7Vt88W4OShOk1 Jx+Cfv1n8JPCHgvU77UPCUukabqF1BNLZaXrcuteJL2CdWS4M6Tz6bbQw2NjEJMszO84 iUTOcKK8u1GxvvEE2oarc/Fxp0truJLiy03/AIk1gLq2uQGvvENso1C3t7RpS9nCLeMN kFWTJZhwM/if4vaf4Y1K5+HOra7qL/YVe5vvHdxZajCliuEZrTSnvJ5iJmM0sgeWG3kB J2K0jip/hp4v1PxDHeeG/Fnxb+H+nxaqtsbLQ1+GHhQakEEscy6fqUzRXMLXRljkaS2S RI2ednI/eSsy+rY3Dw53WWNpvljO9o1Yx5Z81WVGNGpPmUo0+eK5Ir2llyqNn8msJF0a 2LniKEantVCOHiq0nyS5pc0eb2rUKfK6dpznLWLnN31+mbjwnN9kv/Fvgnxt4Kg1ePSG vm8Nv4VufFFzqaWuk3TXlwr2VlY3FvqptI5E06RL218+9jji04HUDbxjxqb4iXX9mWl/ rVj4+0vVbO8trRLNvh7rGgRXJnlSCMxza54ja+sIjMgkS8sZ5/tSAzy2l2/7l/Z7rwX4 I0nTxLB4C1rVYp4o7e8vNCbwj4V0yOWGeCe71NLG+F9o0JmBCI1pHHcSlrg2rpIjbOj8 T/EfwlpejeHIvBujzXF9oijR4/D/AIh1Pwf4kjdby32DVrRbXUtQv3eCRctHYORcOrwz WkCbivJ7atBU6ChUqwqTdSNJtU1GduT2ylKPIuZqVOM0m4ulUjK3up8KxNaMPq8uZ0JN 16V1yQ57+ynWUopr7HJzqMXGUJx5r3immDw9e6RcakPDi6R4e1aSwk1vRfiBqoaS8uZF Wxh1Dww/hyHTL3Xhfz3nlvp9/Y65d28Jv7pNLXTl1C4t+C1/xH4d03V7FdBk8WRwanHq Gmah4d8BeF72DShbWV1MwuNTu28Jpf3yXjWNlBb2dzqceqSJdWizxW0azJBzt3ZeGfE9 lBqHiyz/ALVvbG5YweDNX8AeIfDtlBbcrNNYwXGptYXYnuk3SXmk2GssI41WG0VwGV2l +AvjTfaRqk8+seJPB+ntIkXhyLQPD13ol7qFo8ZjgluNdX4fC/j08QSbYooVEQKREYaP dEsPh6EKznKvabjU54YhypwgnB8yhWjJOUrXSUHHnb5XGfNytRq0qdGtTlSU51J0ZLEv 6wq9OnCNaE6FFU6qpTo4h1qc67nQqVovDUnQq0acsTCvkaV4ttbvxBcSWtu/gS+03QrC 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 FwvGSUHKpBW9pODvGcvDx2PzSrmOV1v7Tx+Ixk8RhcRDLq1WjP8As6WJWGjbF4aHtMNT lh0m69OVTERXPUhRnUpTpxP7AP22LOwufilbSyXV3bTab4O0m1ht7SOzntry4GoFnieS a4sHtFto7vUJ3vYzcmbEdulrI8n2iL5Sis9Gjt7tbiyjvPttuiedNf3jS2kq3FvKLu1j i1eBGm8uGS1CXKXFr9nu7hhb/aVt7iDuf21vEuq6t8Qo3+HXibwNfaWdHs5Wv101tcW4 vCxjuTb3+i+ILS1Fu3lIFt4smM5JkkeSVm+EtR8U/FPTzK8viDwbNdIIGYx6T4le1ENv GkAS3jvvFavb2jQQ7DHDDZMZGeYbJmaU/wAU4XJp4/C0pqvh8PiIwfJSi2q9ZqqlKGIT xCjh+SPP7OrClOVSTjTrWTVSH9V8L1sdg+Hsrpzw1ZzeHxMoRp15P2kaFWVWnTw9aVPD UXWxXNFfVsXiqUVTdSMJ1MPQqqP2R4d8P/Dq61KM+PbjW7PQltFXTbnQUhuLizv4bp3E 9/mO4u5gUlmjt5bdXuIJI44xN5SxiHrvGOq/CZvAWv8Awq8A+Lta8bT3viPTtS1y4177 XJc+HIrS0tLq1sbee4to5IZLiIWt2tqEDLHdu4AWcM35xH4x+MNPsrk69428NQWdscQX EtldK8EsyyHakjanIYw4d2SOMblPmZZw5CeTal8WtLk1FGsfGGoaxaNHcwWl9bwa/p90 JAksttc3Onx+JP7IDT3TRfaHaW4HlF3/ANJKLE30OB4PzrE0pRVd39lSVKrCdSrGMoqC gpNwb5KVOHs/dSjB8vLJwivaRnE8DHE4fOMdiZUoYOpCdHLZ4qmqVSdCN4Oap+0nTvUb TjGUnKL5lFtyjH9J/BXgT4ceC/gz8a/Cdm12mt/FPV9ASWC4utSvJ9Tt7DzJGjgubySW aG2i87Vc2cDxRW7S3EkcSG5kY3f2aRB8Pvidd6VNqVtofh/xL4Yh0eS/uh5UcGo6Zd3W oaC1xKQgeOJpLmHzZnJdbmNS37lCPzQk/aA+J7YguPE3h7S7bbNJaNb6NJd3VtcCCXdc xymWcrd3nzWonUKVW4kMhKtKxytX+K/ii5g0nUJ/FWvTabaT6TLqsl4bC3kkkia1m1WK 2Wz81Wsi4njszOFm8ph54DFq+inwhxTiJVPr+ZYfERnhqMJTcak6sKWGpqhhl7kadOVS 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 PJIVl5hkjABBEhg+UHBGFZiMk9vlHHah7K3cu1xJallDO0piVDj7zNhBsVRyckYA9ua9 IXT0RCJrJw64AZDDOq5GR84GM9CB3/ln3OiXJ/1qKFkjMiZRQzRSjIzsBXay5GDnI4K4 rFuTvJwnaFlKXIvcU7NXlbRT5U10lZWvY1nFv3o1KTrOFSNF1NL35ZSjfSfI5Qpuoo78 sb6xTXlGrG3NhcvZRPPdPbH7CY7e4nhMz4SCe4jha2le2RmD3CRSxStEGEbh9tVEsNF8 iO6vbB2viGt7afyLlr+yKi2e68qae0eaDTrxSqS28EsZup7S1eZmFiit6ZcaaoXCX6Bw hXa0y9QPlXBXKrxg9cY+6elZ8+lxMpNwrNKYxGrwhmhVucOse1Yd6lj+8fJIAVlI4HVD EwdOMHCn7s5tTlFTlPmUOX2kZJ39l70oTUFJTd1rCKXPLD1JJzqVZKqqcZONFPlqVIKN 6dNutF0I1ZfE5TmnGPJJNSczzG9sbdbG/TQLK3bUPKu5rBL4X0NlJqUscskD33lWc84h kvGVrqWFGm8tpWQGQjOlqh1DX7HTbTxBqGoam2lWUem2Ml5faxeNp+lxRAW+iWH2vUPs 1lo9hIbmSwtbSytmhe7nLMQY0j3J9PdWh8me3IScG7N5pIvJHtxFL+6tVtp7TyZ3mMJ+ 0SC4jjjWUG2lLRsmY1nNJNLL/o6AQBZI2fUIo9kbswZLeQpbGXdIQTFEbiRCF3MkahNn jcTUnCSqTeJ+syxcsXGpifrdSpaHL7So6nLU9lKEq1OSi6salSc5Tf7tQiFCEYU4RpqM KaXJTgowhFcrjypQVpJRaj7KTdONlJRTV3xFz4dtS4jtLBbhzl/LRo43xEhld1VGGAqI zu3L7Qx3YzTYPDH22409YrVxNe3Y063LXAS2N5dvCixuTOVcpmCTzHw0al9h5ydZ77Tx fXulmC/lv4rCOcS28F5FZ27SShLcSXL2k1tK6RpKTp4niuRFJHPujixvu6ENMg1rR08U afqWt2kU4N7pukoLbU9QUo22CzjcyeXO7mLaGLKQDu68b4KpUjOs4VJ061ZLBwndqtOO OpzVerQcVOnyujGeFxCrzpVJxxbdGnUjGdWn5+Y4qtgsHjsyoV4U6WBo1pQgoNyxC+rY zD4qFWpGpOCgpThD2fJCpSrUW3KtGpKND6D8R/CD4AeGfDdtY+In8Ly+KZZb+zsprPxf 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 xPBA80Eb3DlII5ZgJJ5UjedlhQsDLIsMUsjKA+IkkkI2xll4LT3xJwsm0cZa5jVRweSG 5JJ+XA5yR2ya7aT+z/3aqyXKiK3fzpogjpNLbxm4iVQ0/EM7y2yShv8ASI0E2yIS+WmN eTkqNoxTUGv3bprnSnLkc4U4pqaatJzvKUVCTspRcunBQjSlivaVKlVe1lUpqUaylSc8 NRfJGtiJ1o1qXtnOpzUFTpQhN4ZRVWjUqPQur23hvNNtLiW/im1a7mtrP7Bp2oXNsJra yutTkN/dWNncWWk2htrKZY7jVZLKyubk22mQSyX97Z2s/lHx9/Z2+H37TPw9n+HHxIuP FFtpo1Gw17w/4i8JaxJoHjDwf4m0qUvYa/4a1xdOvYtPv4wxWOKezmhubN7iKaGaIsF9 TtxdfaoTbRB7IxTeaxuJVkgnWSAW8MNqLMiaGWJrppZ2vYpIHgt0ENyLmSS2svJa6XrM lzd3l9Lc61Y6TZ2Wiwz+IL+4MOm6u2n3Wq22jRXt7aW+n2t14s0mLXtcsNDsBp9qbK48 VazPpdppQ0juwCxdOrhZ5asdHM6HJXwdLDwqYmVfEqvU5p0YYeEauF9nh40p+yqU8Q6n sKlZ1aaqUaUSeFo4qNb2lGNVVqU/bxpxjKbw1CjWqVHXcJuUoUI+1m048tOEnUajFOq/ i/wD/wAE3vgzoHiP4R+KPiBrvjD4133wG8OQeFfg7pPjvS/Aul+DvBWkWt9/aEE58N+C vCXhqLxJrP28C9m1LxbeavDd3KfaruyllVpW/QtmLMZZrydQxQu0m2Ji8shCh3ZdzSzs xVQMtIRySQpK2yJHDMgtyJZIgLeQ3EirDN50TtJLGYnadTAs0SxK0JWWSOdpGSJoZGyx 27RW0F7Cl2Q0TEyW6TFpbMrPbTnYix+bFOomgcKpimXfGsbBDWWZZpjs4k6uY46viZUJ wjTioKPLDEVfa4iVOnC2HjBzSnWtKNWrWnCTUl7Wcc8JgqOXOFLBYNwpuFSVatKpGUZS h7Olho1ZqXtak3CcnTioclONKalKM/ZRqMGsXctuJLm1vreWOWdYrf7TbzStHbySW9tK htm8ofaraKK4RMiSMTLHcBZ1kAei2k9wJZ4Ldr2HY5aYRSXkXmpPFHJJJgzKjx/aYo2J AdfORSV3iornVtPsDJ5/+ipDDPLJMyRRRpbW4Hn3DPI4VYIgUMkx+RA6l2GRSBZUkE9r HGJpWgSWS4DtvtlnVpUYKQfNSAzi0LbkimkLMpRnRvNcKsZVOeVWDneFrySb51zRk225 xVtm5PminfQ7oujKlT5KVOUYKnUpcsYqKg+RU5Rja0VGHNyOKW6SsaV7fvcPNFC8Mdyl vAoit4tkMSrCbe3le1haP5Jjbs8rAo1xIk7BxIXIxLSx1aRbKa612aO/itoP7Yit7WUa Jf3kNlMsq2en382oTWFvLeSvPAsF6Ln93axX19dRROXtSSXO6+XTXt3vTB53lXcxmSF5 QsNpK9vF5dytqHtpmWGKSBJ3F2VcTF3SayvbzULKG9sorMQXltaXtp/aD6lYzyx3r2wi je1k0z7Za3KxXHny219DazRJBPC6C8EdrJTVSXtVDETbxC5a7d4SbfssQ4TdVezlFzjC pCznCUoQlZTjymH1nCVIznGLlHB1ZUo+zhKu4zpQpU6s6MKMZymqcq0sNUcY81Oca1Cq koy5nQB3Z3njlBQgBxHJGlwD5YZkNu8yrjewIn8lswvtBBiMs8jxBseQ0eHxvc+b5ihQ VK5ZiACdpDYYEE7du0t5RrPxz+F2hatremat8UPhZ4fk01dPFrP4j8daLodtqEur6pda Xptkl5dapHph1eSaxvYL3Q9O1PVNa0y+OmW99YxWmvaPqF76ULa6mjVNQisEdHt5wLG5 vY8vFKkyZm3xO6Epl4yWinj3Ryo8TspMZl2LwDh9cwWLwbmoyoyxOGrUIV4Tw+GxUKmH qVacIYmjLDYrDV4VqEqlKVOvTlGfLJJ9FDExxNCVbBzp10p1aUb3p0ZYilFQlQnW9nVl T5KjSq2pzqUpqzhJJ0y6y3h+yukvlxebOspSKLfJGqHyk2CRpYArSRN5rI6zmORVVRu8 vGvYNXn1DTbu01Ca3sLa6kbVNPa0t7hNStls7yCKGCdzFLprxahNbX0lzGs7TpYizMaJ O0q6ocQxxQ28KhYoYoEUzSzZEMQiDtLPLLLJI+zzJXeRmaQueMgDGupPETzyC1s7GW1F o8sTteyxSG8Rtv2WWMRbVSaNg8M6uyo0UyzKmYi/PSpVa8OafLCUKLk4VJxi4x3dOm3L llOPO+SNN805JukuZpGjqqHs6laE/bOrTlywlWxNOjWq0vqrSi48sKCU2ueVKlQpycsV OFOo5VY6cx80MqW8zuVUh/mSMsuSA7KwJUZzjGT9abcSRbd9wYoraN4v3j4IW48xTboo wS8zOuYVXMjyKFjVmIxGy6ogtPLuNORBKzX5YTFzbC3n2/Z3Zgqzfafs+5pg8f2fz1A8 xo3Uu7hbRUe5Mk0TzW8flxQxyfvppo4YWIRCwAldCZDhIlzJIyxqzC6EKc6ipey9vNqX LSo39s5VI8lNx5LybjUjenHlkpSUk4yTlEyrP2blX9v7FKOHnX9rJexp4ejWq1KspRn7 lJ1acqqnWf2VCTf7vSnZalpup+TqWj3drcJbr9nvWaznXUrWO8sbbUEspYy1vdaVdstx pt5cWd/brci2dFltonlilj0FuTLlI5VLdQRH5B9PmdpZM+nzKv4Eip4JoiG8uML5jb5A ojBZtqqWcJjewRVXJydqgdFGM2C60pY5tQisp7drnUm064mj0TVIbya5t9RbRvOnt207 7VJZLPHmLVWhfTW0vbrEV3/YzJfEqwoSk5OFahh6cHGk58lacG1OpTp1aqWFg05e0bqK ClGEW40pcnKumrOtTg6uHoUnCNejHEzqzdCnTUn+/qTqwoVVKvGlTqzo0qkY+1dONKde lCMq0JF1OH7TcaeNStJL+ygsri+sEuLWS5tbTU5LqCyuriKSbdFFctZXq20xjUzPZ3It y0kLBblstwYFWe6iuZPNkfzLeHycx+c7xR+W01wT5UBijlfzP3zI8qrEJFjjybuytY72 4vLi/wBXnhnt7KCLT47xra0spLaW8aW7tnhS1uvtGoLdxQ3oury4tRFYWYs7azla9kvV hu9OiYQmC7BDD5p7maYZPT960jhuTzhjnuea0xFOlyQhQTlSUKUuZyqVZOtUw+H+sRTn ToxhFV41LRhRvFP2csRjI06eIlhRdq88RUg6VeXtaF3y0+elCvP2MpqnUqKpeCjOnKrO UqcZz5YYWVavRNGfUtPtJFiuru3SSTISNvlcHnGdoJBPTkf1NRQXMF6FleJLWRZrg+QJ vOR4kmlhglaWNQsnnW6x3ARjuiZ0jkzJGRVU3nh671KfTYzbTavY2llqNxaug86G01WW +trO4dmA3R3Muk36RjecNaTEqucv8w/F39tD9nH4D6oIvi18Qj4Bjj1C/wDDcUOreG9U W11fWbKO1nnbSLpbZ5NQXTLVS17JYrNaR/2lavdSRyS2qybYbJMyx2LWCwWW43EY6WDp 4pYeFGt7V4TEYf63TrrD3tKjWw1sRTxEoO+HXtYThSnLmqeOjhlKviq9Chh4+0U60qrc IuM+WEHaN+eaur25YSUoylyrnPq2edUNuY0tpIJS32qSSdomskWO4ZGEZj/fO0kKK6h1 WOGYTGQkeUzIry2u4Y57WaC5tLiGOe3uYHSS1kjlXdHLC6yyx3EcsRWSOZNqOJAVUgB2 +SYf23v2dtY8Fnx9p+qeMdX8CLoR8UyeLtP+GHjjVdBi8MBrxH8RSzaZpNzONFQ6XqJl v1tzBGmnX8r/ALuzuWT0f9nz9pD4E/tH+E08TfBL4h+GPGNla2Gn3ep6NpTS2fiPwvHf RKba38ReFtRhttX0h9/mWayzWn9nyXVvdW9neXL20m2sXw9nGGwcsTispr0KWCqww2Ir RpVoSVWt7atD63Tdep+8VNqmpU6VHDqlTw8p0/rE3XrlLNMBiZUKcMZTeIk/a4aNKpKC xGHlTn71WFRv28nzxlCVJUqUYxh+7nUUq0/bThslxE+wbQSUAAPTCrkk5wf1OcVgXaOb hb+2u7yOJLK+sv7NeKxXT5rprq3I1O5hvbaDU2nsxZzQ2Xkanb2FzaXtxLJbXbtYXVt2 LXUqKkcUhjJ+0gSJDDbystzHHBPHLcrA0skLxLtEMrPEqPOERDcTeZRSHcG84wMA2082 8mcjPAW1TIGQCSQM7hyeK8vDqXs0505e0k6sYxjarTWGvKCknOlzKrUjOEm4qH1ao3GF StKUasbqVJ+1VOpVw1CjXUqVBe2lDE4rF8tWpKEF+65fZYbC1Klqbr1Ky9rL9xDCN4nk ZtZ0mOWK1ijZpJDuk8sWqiIFC4d8N8wOFX93ucFlJXYGZUuJlmktjaySGNZGa6UW6P58 bQSokYmV0NuYp2hnZ1WTzFiMJVRIZE6DUIzbxS/Y9DTUWWxvbhEhbS7cXFzbeT9l00Nf vCFuNRMshtp3QWUP2eVry5ti0HmrJbyWxRLW1sFcyRM3my+WgtRNEL1kMMf+uS3aRoFK 7Gn8tXKRl2Xaph408PTxMIU+Wqq8YxhWoVqydK3tHWw0KlSvh3769jOtSpKql7Sg5OnO cZq1nhqUqtWrThSUvYtS5VKc6zp04U4KbTdWtOvTpYdwSdSvJQot1ou3O3LTiwllsVS5 nSCf7OzyyC1kvIiYxBM8Yd41M6NHMyK5hIYFSy4pkt5HJKkNrdaex3MJBKxMiDYxzsDB 3JYKCq42gljwMHx7UP2pf2dtK/aD0v8AZUvfiHp9j8bNWtor6y8FRQzon2vU9IfxVZ6T c38cYtINe1nQmGv2OnyETX1jcxXBffcKj+33Onu2sWcUf2WK3l0/VJ5VayuXvHuLW50q K3mjvFZbOKCOO7uVuLe4U3dxLLbSWbeVbXmeirgK+DjRliMDWw8a9H6xhni41VUq4avH loVXy1FCcafJKcatL3JVOd1J1KSUFwKq62HcMJiJyrYWeGw2JWHqxxc6FXD1KUq1Kr9Y dWUlKNR08XUk/rMqDlKnVhiIwqRwbGwgkfUrmKWMQ29q8k5Se4gsFe1uJoxBp9qHYHUL nULowT/ZIGlkm2y6i0VpaTXFvj29tpU15f30Bna9R4LDUZbeWF5YpIIRc21nfNCrTpJD b6gLiG3nIdIr1ZlQR3IZ+kHgi2GlDS7y00nU7OXVtW1Ke2eyNpZKdQ1XUNXSX7HKb6Ca +8+6Rr+6Lwm+vZLzUtkTzfZaTVI20sC+nnuITdXmk6X5WmLq3iBvM1DVo9K06ZtN06wu Hs4hNqcMut6v9ljstJ0+OXUde1KDQ9Gl1C11q06OIxf1XL5V8bKrVlh8NNU5upiHGt7P CRo0adOpWrVK9H2EIUOWE1WqO75YNGq9tRo3lKPtKU6axNGlQ5KTlXcHVnQrYjFYZyw9 KVSeMr4n2VRqnRlhVhnipKSyZUTYzBzwCEkneRwGxhSU2oWAOPl3ru6bhmuE1nUJ9Nit Jb99LbS7LT7ifxBqhu7rS3jubaGF/tNjpgjvU+xTut1LcC51dJNPhjhVXvy0jp6L4gg1 uxvdJt9HspNc06/+zDVtX1Nv7Lg0IfaNKhuUs7XSp9Y1LVNRmuLyZdM82ytdEk0jT9W1 HXdW8NXK6XaXrNb0e6sMqlrJqMnmxxEWMsFyI4zemxu52lEzxFbUK98I4pnmurFFezju Jrm0hnzwvKvYqtCE8LWqVaiTjTpV8Q8Hz0q9DC4n2NevTrRjU540vZzo8ssNj6+Hq4NU qrzji6CryjV9pTqwo+0VOoq0HUoVVNqtTo7zfNhqsI3pyqxlTcVBwrQ9t51cR+ai/I5U k43nfjGeNxcseeOT+ua5+/it4rW5mnU+Tb27yXBw7FIMrG5KI+9wfMVcRBpPmyBwSO3u dCjG4R/akIkYFZN0QDY3twQAeWU5XIZmIzuBriJ9BeKFodQvZbyZr25mjmSE2uy3N5Pc WVmUiZwVtrXyLKadjvu/KMsiRmZo1UacZ1ZQjiIUXTqx0q0qk6kqcXOdS0KclFS9nTlD mdW0JzhNQrxjKD6KntXRdTCuFSonRlCLl8VOc05yUrxgnGkpO8ppqXK1CpZxfLSW8UEc Vra2/k29tbLa20QSYiKGBESFctKS3lrEihn3HaDnO45xFuXhijhuoleZVjja43wNJMyh Ved4V8qOMykeY6xqFUMQiAALWnDp0t0bq6g1uO/tDqs/lRWsVrNBYNp0aaVe6ObqBS0s thrlley3TysLu2vfO0+cIlsIVy9WsQk6RQp9rupDAU8pJromS5ii/cRoUDiWMv5MkaKV 85ZPLMgId+iVblTo1VzVFU55+0g06fsm1UpOtJxnHmnWqOtB8vvU4yjKbvKFTU5VotVo 1VUpqSdOU5ydWc7TjUVSjFc8LQcZU6lSNR1ppq8E3gRT3UcT/a5YYcy3oWF7s6iiRPeX LWcyXEyQzLI8LxTfZhC0Nk5FhG11a2sUkmFc7phuOoSFyq7oY4rUoZOMpv8AsKSOm7hX KpgYZoxytSXccuZS9vEux1RHdY18wFI3EsaKxcKGcx4kaF/Mjc+W0RRpOcv4NeWwu9Qh 026ubGzubOwuNRigl+wW19qUV9Pp1lcXcSSRw3d9Bpepz2NuzLcXMenX0kCstpcPFU5V J8rdpvWekXzxtaPJOco88lGMIuCcqkYxd4tN1EcNCOHw8Jum50Ypqjeb9lTqTjUk3Vp0 FyUadStiK1TnqU6NF4mo1O1SmqEitqkAlUIXMpSRig+zLIMMMSFBGiEHKqpkXlyAuw7Q KrReD/Eeqadez2WkatdWUR3SudOmkgVCsQ2AS26IYv4vnLAuXXLEBR7V4K/aHutJ1y30 Pwz+yx8Ohp1vbIZfFur/ABLtb/UYpYmf/SGt/EvhyFpLq5gH2iS2snSCGYmISk4p3ir4 o/tU+L9av4NMn+GWheCIoVZDbXUH9rxpGm5jqcsHhq0tiz7S5S0P2Tbyr7QoH1+X8O47 EKMq1bC+zrUaTlUni6bdOjTlRaurTqRdOlBWhFRajBQV4/u5fhvFfjEsmxeJwNDJcThc VhZVYYXEZnHEQpVsROnUp06lKlh1TjWi6koxjzVJQ56lOTTUZW8z1HwP8U9M0WPW0+IH j/SIp4LOwW10LxFoVja2MMJuZ7WC3iu9PuEViZp3mlm+aV2AmldLe3WPe0LwP4mTwvda v8R/i/8AEPUEminnsbkeK/DmoahagizKWlv/AGLpkC28eYYyI5vOkWWR5Y8JIVPQaxaf HLxJplxoUmpfCTxP5drG8Fp4l8Sa3oWniSGSD7TFPbaTon2iWQ2X2mPT95EMmofY47i5 tbR7i8iztE8AfES60m50TV/hd8MLJ7u0vo2vfAHiTxELq1bYtvbzu95sYXbswu7aXTzP 5UULvJc2Vz5MZ/S8Jy4bB4OjLMMLSp8sY4meFar1/q9Kp7L36c/Zvm9nD2vIpJyhyWlZ tn8x4/HPHYzEY+pGq/r1WtiHTp3lSw9atWq1KkeVNckYJvl55Ri4umrpzSOL0zxB4E8R Wej20HxqvdH19JZbe88O+IPFN3q+oA20kE6tdm08JXszyObmSyMIW3WNLCC5CeZdyGHu vEui+LtZ0G2SW58Xar4Te5Fm1x4W1KXSZrcKwJuZxay+GNR+z7sFdgbcHICNK+T1Wn+B VdNVl8SpoWjXLhUXTG0u18Nodiqigajp+oxXs4kZVe4mC/apjuZwzMc+d2P9jWms6x4b 8d6d4d8EeDrLSdN1OLx1oD3Fnpeppdz3tk1mviDxCLVpNZWbTZ7/AFGKyWeGwhuLGe7Z Bf2EV1tBwqSq1MF7ZwoSdeo40a9dqm6yX7qSSnRXNUhSoupWk3UlSoxnUrzpwnyQoOar zlVpzjQtNc8owdSNSvTpRUIr4nT9tGUoK81RhObc+Scnuad+zHpVzpGn3V54z8YaVfCS 523GuS6jrmryRxLBJGZ7vxJr+sG4sWknaC2jDRTxCzuTcpa25tJbmRPANn4C1iyuPEl3 fa7pdvdafNpd5q+kWFteTSW8tuWl1HUNM0y10JXad1FtLc6mFdR5pSF90SeK/ErSP2cL zUoRH8cNU8bpFCkkPh9fjr438LWjwS2sFzaGQeH/AA4um3YuISk0EsrkzCSG6SeSDaW0 tC1XwjdeHrLTv+ER0/WtB00sdl58WfEfj1NFiFnc6hHc6nY3cNlcXAkltrSCJY2uLkPe W0ogWzS4mi9KGGzmdKc39eqwwdRYvGKtl8KNTB4RYinh7V6jq0p0aaxWJwuFjLE05OVe eHw0ebE4iKqVhJ0MS58lOk70qdShXjX5aSUHGftIuXPTqxrU3NRUXGU6kqXsp2iqNT+9 ObW7/T18RXl7pM0umaNY2tzYQaR5mr+INY8u2nub022iWcbybXZYrPSYBLJfX13DfobS CGOzmveqRETdsRVLuXfaoBduF3tgZZtqqu45OFAzgCsCSLUVt9YudNstGOrvaeXpE1zJ NDFemGz83TYdbureykuoLVdTub0P9mjvjBaym5gRrmaa1TOvfES2fi/S/Dk+pafDcarp NxrmkaLAktxr2s2Gi6ja6J4svHhdEt7bR9AvvGHgK4kvreaW5DX1zDPbrA0UjfvNJ01Q pJKfOvedSrKEHJVqtCjClCMuSPNSnKVuWTnVpOLUZS5fafsVJP2cUlUqz9rVTeilyc+n uuNJKnSgnJTs3Okk06r9+p1MtnBKZJPLjjuZIzGLtI0FzH+7ljRkm27w0Szy+X83y+ZI BgOwNHSIBpFho2gzahqOrXdlo9vbtqmpB577UxpkNnZT6hqd7FClqdRvJZI7icEwvczS XEtvCY4ZvKzpfCsc/hnWvDEmveKfK1seJlk1uLXbq28Taavia/1K+ddF121EN3pZ0Iak bLwzJbFZtGsLHTYIJGazSRrc9rK3ifSr1dEsJ4YdB8QWsviOS92anpktzqHhqWDRLTTv sTm5sNdS1uL/AFC9GoW32G48O6ZAbK+/tAT6d0csW7815e/rypaRjHkd5SXxW5bbpRik pO0To56nLKjFxnT5lP3pRp39nGorqcoykuWEpONJNKtJxp6T5JR20QRrtBcjc7Zd3kbL uzkbnLNtBYhFztRAqIFRVAfXNWfhi1tPEF/4jF5qLXd698TZx3TWekqmoWPhazma70rT xa2OtajAPCdmdO17XoNU1/Sba+1TSdM1O00W9fThrabqVtqtvJdWqX0cUV/qumuuo6Xq ekXBudG1S80i8eO01a0srqaxlu7GeTTNUihfTNb017TWtFu9Q0e/sL+5T0fxKV0ndc2t 4xck+aMXeMm4yteN1dSaaZhGd9JR9nK8+WEpQcnCEuXnShKS5ZXjJa3jGcFNQm3Bfz// APB0TFqi/wDBDv8AbymnvbKXSJLX9lWPTtPj06aG/s76L9sb4HnVLq71VtSmgv7a+hl0 uOxsotJ0+TTZLG+lmvdTXUoYtMKh/wCDoiGM/wDBFj9sXSdP0/xLq3iXx9/woTSdMsdI sfE2u2Edr8Nfjz4K+NHiTVNQtrCO90Lwjpui/D/wL471zWPFWpx6Na6h/ZWk6Deare6p J4U0qQoaivgcpR0u5KzVRxjKpH456QlK0feTdPkk4U+bkj01YytTq8s/ZzhCEKjoRown KlTpwqxjyXhN05NKVS/tKl41qyjUqyR+/mi2OqafBewarrk3iBpdX1a9sbu6sbCxu7TT NRvpr6y0WYaZBaWV3FoUdwdH029FnBfXGj2WnHWZtV1xdS1zVKegeLvCXjCxsL7wn4n8 O+J9P1Xw9oHi7Sr7w7rWmazZ6j4U8UpdzeF/E+n3Wm3Nzb3nh7xHFp99LoOs27y6brEV ldvYXFylvMVta9rmmaHpEup6jruieH7aWXT9NstY165t4NITV9fv7TRPDttK099psd1L quu6lpumafp8V/bXWrX97aaZYyi8vLcF+pXFpLnw/wD2ymlazq+l6pLpi2k+nLrS29kL S1vtX0my1GG8huBo1xqumNLLPp99YW1zeafHfwSpdxwzQ5JKpaLqStKooRlFNucpSSXO 1GMZNThCPNTpx0UZRhDlJjBKjKUqVaSm5Ro1FK1Png4TrRlz05+1ap1I+5GpT9lz05Sb g1F/mn/wVHluNO/Y/wBXhS7vdUv9C8X/AA/sJ9X1rSdNlutSuIZYLiTUwj2uh6DdXF15 qtd3ejwWun2t6b23sraGexOnx/y/X4fw/PD4rl+H1143uxi+hvPtt2lzY3luVvYMaY1w 2j3sBkSIfZpEliKN86SjEb/0w/8ABXnwtbS/sQeLLGHVW0yGH4heEddl1HVtW1+dlnuf E9xql5Gt1b2+uamIWurqYafpVpBBpthb/Z9N06Kw021t7aH+bXwJ4V8PrpUtzYWniLxX Zvaw3Et7a32taEjauYLaOaNzqeu2TXVoslusEVzJbxySWMMAlghJNvH4mZxgqynU55Kp TgvYWg6LcZL2qk4qFlVjUa5W2uWEYqK/eTf84eLHN/rPGpCT5pYOhKNqdOne+Iqyi1CD tTaWr5JOMWkoKK1Pk3SV8A6/r2qT+I/2Q5vEC6jbhBFZzTadrQlZViMl5qEk1ncyP5WI kFncLNB8zwTRsm+u9sfBPwxh8PR2er/s02GleIZLTQ7XUIrXxT4ck0iDXxtk1SWz0q51 Gz1k6c94w+zwXlybmOC0hlk2zGQmK/t/2m9e8UT2Pgq18LaBokmrJYRXV1pOoeINR02I u0UhDW87w3EaRyebKEeSVzGqwyozMH6zwJ8BPiVpnia0134g6f8ACnUdb82P7c99oWq2 OopcyglLoHz3ErKzkhsBMgr9NMTWowpScquFpxqUIKNOnisRUqwqR2XKlN05VJpTqqnJ Np8t40pSpv4CeNcoxalQo1PY4emowli6k4PDxpUoNSrObhUk6Eaj9hV9nBVPZUo0aH+z w6uPQv2ePBk8GseK/hr4CF1/Zku3R9L8PWur3+mQo1tPNbWtnJ4qlsIJGnmupluE3XES xmKFN2pXU8aaV8TfgrbmfW9F0v4w2WkwK40zT9G+Dvw0lltHl3eRJZXdylxczeTOY54I Ly9eKRo0S8tLqFpEbsDrvj7wrd3d7pejaZ8QdQsLu6vNSv4fB3h630rRtNt7VvPJ1DUt W00rbWNtG7zXM4RmVDumCbmr064+IvixNN0e5vLPxvoWpSX9vdXmjWXwkTWPDF5ZRQXE d5p9/PBrgFpE9rc/b7TUbHV7ea31Ky0+VxqGmi/0XU/nHJqtGDre05+V3rYipVjSb5bS nR+rVasotxu1KNXmbakpK6Lw9OdR0atSlCnSnWlH65UoVFhlWpuNdwap0a7nKKqUoOlG lLlhOlzxjB8xyGo/F/8AaGmgspPgr4X8QHw3d6jdyR3HjTwFFJrkP9oXlrd3UMcd54h8 RtDbpNrcUFhCttpmjWenx3NtpbQaZoF3Fpvl3jz9tnxb4Wsrb/hL/hB8crPxBp2kRpP4 mtPgtY2tzHb65IqRLbnUNb0q80qw1LUNE2uPs7x3Mmmp50Za3jaPu7T9oPwT4lnkh8Qe IPGF3axawLQeGtX8Faa9jZXaO12yxS+F7PXL3TYV8loPtl7NPDHMIlJkeWOJ/WrrWPhb Z2dpe6zJoet7LaG6W1sPhpc+JZUilklESWdxdRKILxDG7PBMrXEagNNEIZFZuLF1MMq9 COOySpiotRxMqzVSrUxFdS56nNXlTclWU3SlL21Oq58k50510pul1xjalFz9pUpulCUF KccPHmnNt1qVKthadStRoKjVwteVOcoRxlHneIUJUaU/yD1T4n/G74u+Nri/8Maz8VtO nXZK2meINd8HeFWCjBki8qKBpraYQlpI0nupZAFDKSeag0vxF+1DrPh7UE0m6lsdI/te G31lPE/iC2v9Yg1S+tBLHpn9p7JY4NRdYTNPbpMCLaOYlQm1m/ai0vtE1CygvbT/AISH S7C7iSeWFfhFoWh3MdkxlXz2v7qxCTbBEVO6MPGWQj5ShPhvxAT4d6Bpmq6b4M0D4jeL 7vxVqw1/WhpN7Fb282vQ6TpOgrqlxb20baXaXTaVpOnWsw022thILYvIjTSzySenR4lp VFSwuDynBKMatOFqmGqypUoKajV9q4Rop1YpWTk4wUneUWouJhOpQmpTjCjOcOVQk5Jx ThOEasZJVLp8vNaSUnGpBRcLTk4/nx4c/Z5/bT1C4F/o14vh3RSum3b3+v8Aiqw1qVjE 9w87xWFpaXqGWOT+z5dPe3k2xmK4ZnkZrdl+mvBPgD9o22hu7rxN8TdX137NNqVnG0Xh +wsL23TSL97Z54b+80nUbkW9/FCLzSZoQs72s9vLPaxSGS2T1/wNpWoazpr2Gp6X8YdE VHQyafoviiW/vGVUIUMifYnsYR8rACWUq4CCL5jLH0sPwF+Da37XmrJ8cb3X3W1eCLxL 4113S7aK3uHmggZpxqjabOzzWkwntYJJ9Rto0imvLe3hvLCW55Mfn/JH6tiY4aEXopYP LJyXNGDjO0qbnGLmoe0lZc1opp2uKTr4qOJqUqFOFKjRVaboxqTjhaMfZUFUm1GSSlUl RhOrNL2lacLvmqKL+afFXxm+OhMfgfSfjdB8N4V03UdSbVPEOia/rGpPZ6RZm8vYVudS 0XSLUmOSVIpZIbJrSO5uots+yeGZvjqy/bA+KOiXi2ttquv/ABJ1pLZm/tzxDong2x06 6TTYhqJtIE0XR7+8u31WzgcNNNrdvcS20kht9QtdQ8tk/YjxB4B+Cdn8M/F2o3OnaXcW GjeFfGGnWup6i7apNpOu6bpGp2Utg+ttqt4q39hqNu1m8fltLb3UDwywfaIjAfwv+HGu eBfD51Txh46/t+78JWzXNlqNrp+j6pPrmsxwwzXUGm2lxPe31/Zadd3EFjaX2ua5LPcW Vnc/b7HwxrBs30OTxcw4hpUMNOGXZa0+ZucXhqdGWLlBctOcYzfK6mslJV6ns05NSkoK Un/QPgVwNw9xG8XWz+lUxcMuxODqUFWjTq4PE1ZVKko1MVgVRnSkpybliIzVWk1UrOVq Tnf5A/aV/wCCiH7Wlxfiy8JeL/DXwz0d7u10S9t/h14U8KaTq3iLX7p7lbiC48V29hd+ JtPg01Izp8kVr4htX+3hhIEtSsMGF8K9P+OGk/FjwR4R+LPjfw943s/FH9oeIvGWpa94 nTXbubSo4I7PSdASwubXRfEMWvR6j9ou5NRkvdb0rU7XxHo8Qhs7vSr0XVH9u3SbfVn8 O6l4D+Hvgz4eeA7a4s9cjdPs3gacX9vYatqkqyQ3erxWEN5qkUepXMkENnpup6tq02mr bi7v7iGA+Ca78PLXXviD8Jr7S/jBqniT4lfF7xfY6tdJqE0elHQfA2n3tpq2nC41XUdU SO5vUj0v/iSaPDJHZXt1YWVrYxyTywM/tQxNLMciwOHTw+AhisHj5YpYjBUKuMw9apTw 8ac5YmEJOioxwcqqTnyxtOEOVVa6n/R2X8P5Xw3mGIr5Tk0cLiMFicrVCeEqexwsqNRy o1qULXq4n26moRpyjJNTU6ijKMJx+rP+Cg3hXwb4u1j9mmTQrOe5g1b4i6h8PL2HT0vj Y3tprV94YFxFp1/dWlpBcalZzJNak2ULRwG4AM7osVfrl4V+G8nhBdGn8J+E/h38KDY+ GJfAtj4ou9LsY9ai8PNMvm6VAljHFdXscwe6kCSzzfaLm+uppN0sruPy9/aY07xy2hfA 3TrnxKuoeEfCnxm0bxlq+utdaHaw+CYvC7TqbtJoIybVr1b64lkjjmZpr6zs7e7hlkt7 cQdFrX7bPw11XxFqMFx4o1fWNLsYGa1uNLstW1zUdVnhZkdo2tmhlENyCqxxRtEoPmyf KAAfy/M8JnmO4eyTAcPfW8dRw2HzKOPqK1OLhisRFVKNWiqsoYv2tNzpqliLRqQ1dCKf Kfq2UPBYfiHiDF57XwWXuvXwcMJGNaU6tehDCXlKk/ZQdNqTSqxhKpFSXL7afM4r8zv2 lPi9458ZfHP4rya54puDHo/iHxD8PYdOtbm502xm8OeENaudGVEt7cpHF/ad3aPq0sIA c3ssSZIjRa6Dxn8ToPEP7NHiT4eQac2ieIfDXxa/4STxpbeFl0Kw+H8g8T614j1GOPwz p3h20e0ePSLrTLWKytLG8Gg6Zptu82kRxWdtbI258bdI8BeN9b1XxZ4I+GWveENV13U7 vXtX1vxX4oh0Sy1d7pYbiYWXhdfNudPjlAmuLrY7Xc8ss8zu0hUDkPD974s1/TU8A+CL v4c+H7eK1mfxVqNuLbw7p6rfWFxZytq/jHxCUvLtryxF7AEZ23KlygAKSFv2vALBf2Tl VallssJXwEKMKn1h06UsLH2Xsqyl7D6xze0i1u1fljzxbSt+W4jL8XRzfGOpmlCrTrUM eoOjCtVxFb6zUVSmqTxEsPCnCMeZYik6VSMoyg4TpqDU+88HftNIPjd4K/aG8QeH5NEv Ph+fhT8NWi0DXfCYjt/h7Z+AvF3g7xnbaZ8KNR0621LxFrfiWO7i8R6HrOj+JvDWheD9 S0Z9L1fUbTWvHXhbxd4T7/8Aawuk/aHsPhV8UfCulabY/EPV/hg+reMPCGi2Wpw2l7pV r4k1TwrZP4I8Rarp1pN4rvtM8RXfinTvENh4b1fWVvm0/VbnVIpbPwHqcll4xD+zKfCG jR+IfiH4o0o2FuGvprXSmlvbJtNt/Luhe2clsoS8jWxmaXTJYdPmN/cfZ4S0aXHmp6P8 RPG+nfCPTtK8K+Cdcn1Qa9ZW81xPpt7pll4dg/s23l0zUb6K98Jax4q03xLptjqNxr9h omt6VqU82rWxm1ELZpdS2ac1PL8LmOd5VnGUOdethKeYYWhToT58KqWHw0P9nx9KcZVf YVMdjsFOeMxFGFCoqf1fCr2uHxkn25bQxGV4bOcNn1TD+yzSGDzGeHeDhLH0sJRq0cJH GUcVRq1HSlDGYuNOSmpYSOGxksOsHTq4upjan0L+zX+zd8bdc8FaH4a0rxJ8Of2ZPAVz c2ut614x+IXiq2t/EHiFnjnaS8uLXR4f7Ta0MUG220y7lhit9tqUkt/3hlj/AGx/DPw+ +G/wmns/h5+27r/7R3xKn1KygvvD+hJdW/hLw74WjuG1TV7eCeG4uY7+0F3aW5s7O5uP 9Hks7Fba2jFtbLD8oW3xeS70COW604Jqj6arRxrq0GtlrVLifTmuTITJf2MtxNaySzWd 7FZ3Qs5bW4iie1uLe4l4HwY/irxV4jT+zdLvrwrHckwxWsk8C28ayXE26EK7vDDapNJJ JImI4VkZiEUsPBXC+Zf2rWzPOqlHCQw1aOLnhoYTCWxVSE416MquJryrV6kZNR1i4c0G kmon0lXNMuxGXYTCZbi8XWw86DoRm60qdHBKjq5OnRVGlGVCa9o5uHNGcVKTc4pn3joX /BM39qSbwXpnxZ8O6l4E8djxL4P034i6n4XsdeW41eOw1DRdN8fQ+GtS0a5jgh1jVvsF xbu2lKQj6nGlnlbpFRPmPwiNb8P6xI3idbhLfTtPmhsNNje90LU9L1X7Q1zBJg28U+63 u0ZZY54gXimme2aG4EE8H118CPiX49+HniPTPF3h/wAa6noWs+FLV2tbW91O8utGu7W4 2WFxYS6VdSS2t4Ldb2S6WCQRiBLNrmNy0SxP+hvx28aeF/Ef7Md/46+Pvw28Dp8VfFGu ajo/wfSztrTQvFGvQf2GJdX8cz6PdG3vbbQ7QWFysUkSwLqWpGwkaS2k1GCOT5mtxfnO AxuIy7GU8tzTDY3F1aFKrRoqjiY4Wo6blQq4avKrQrYehQjGssWpXjWpOvFU6lGnKHv5 fkuIy7DYGpXlTml7Rxqw/exknD2NN1sNiPb1Z8tDlo1Kkn+95alSMaMXGlH+c/4s6lqW oQX1hb2s2m2RhtoGtb1Vlmlhlktr5bqEtuZd9runJ2nzrN1cybG2NV+GekeN/DHxY0L4 feLNA8Q+CLq/0vTra60bxdoN3p+vWekeMdM0zXtG1tbPXNNiv7SHXNOuNH1jSNUtraFr vw7qdnLb3d1pt4J7j1jxDZz+IvHfh3Trx/CvgyxjmglkS6XULu3vbW4sJ9YsV1uGxUGz tNXs/IVbq1m1LfBcW86DBV38L8HXz+HvibqN1Y6pFrGk2N+dalj0iTV00x7uBfPsIpLb XbXSrtLjQEvrvSxcXdk0Vq8l2dOu7i1kEt3+o4XFUqfD+YYKnFYeusBVjyUKadVqrha1 J05TirqNVV+ScVU5Zwb54VVFcv55msJ1uIMFiY1qlRVsdQVOXtIujVowUpSdOFuaUZO0 1OMuSCVpqTlBx/uG1vwT8O/F3g3xfpNn4n8J6FZ3eo+HL0w+M9K07UdCtdUtfH9n4th0 EJf2stpe22r6LZzKV8iO5GgavHfWk/8AacsOtW/qPhfwb4S8HR6HrKnwDZ6jpOj3VrqG oaPrUfhjTNV1CX7IsVzaada2tzDbRxIL1Dp89rK8yXVsFvo1s3jvfO/gLrHgDxh4UXT/ ABN4JsNctfG/hLRo9V0S+1bSfD0l9G1pa2N9f3qXWo2x1u3WxuNP0q8Mct4jWVzp1jdb Y3toD9T6snwosYm0zS/AHw+1jUUheS6PiLW9P1YQRW4iDG9vpp9UmRz5imKGeXdMI5DG NsUpT+buFn9SyuNDCYbFJV6uNnWqYjB4SpKr9bgsDjnCtUp1VKl9ao4mjgppc+HdBV6U qGNhWdP+fPHXNsyjxxjKUM8q08JhsFQhTwqlWhQi62GoSnT9iq84SqKE4rnk07v29OFD 2ipx8gn8YahrUllpi+PvBet/6I5u/PnubnThc6dHbLMAmmWb3dhc3tzN5lrZedLIUSYR yS/ZXkDdR8TaB4Y0XT4prO/1W61fUJbO2tvCeiareq2qJYXmpOjyX8BljBstNu7jzL5o 0YwiIS+fLDHJ22jePPCOnxGLwlpnwN0bVYXkQ2+katodhNGzFGuFhJgtVLkouWcoWwN5 yFqPUNa8NeI4Xj8SfFrwl4UnumaKaCz8W6XbszS4RoZH02dWR/LMm2WOQyhgnI5NfSe2 lKaeKwmK+r3lKUKUIU5KUr/BHD0IxpwjNqUqUacE4qVKDo3jOH4K6CxEpV3W9rOopSUu b2Sg3Bcjk5uV1Gfv2aXNFuHNF2kcjoX7QF1ZyeGIdD8F+Pdct/EbCa4trPSvD1mlkHu7 vSY7nXb2/tvPQSwadaaiG0w6oTo1/p11H5knm2UPQ6H8Xvjn4p1JWH7L/wAY7HR8x/ud U8Q/DK106CImJZJ0Zku5pisBklWGUQrLLtR5YWc4623+F/wv8TXlpe2vxalvvs9pbwlN O8bkQIIEjilZQbkgx3DKzmLYEjWQxxhVVQOTk+DPhAa/rd1afEiO38tokNpL401Kzsrt GgVo2iFvrjac78PbSieC0kE0cheJoXilmx9pkMq0k6EFO6jCOIo4/nfK3eMHGvh6knNP VX50lJwcVe3RJZhSjKFPlnQpSm6dWnjcMpVIuVPlfLWjHmm5e+1TgnZybiowbj3WseMv iDYzQWGn/A3w7qJKieSDxn8T/Bnge8Ee0nZEdBsdburmRmOzc2nKj7gPMkzsb5l8f/tj +M/Bfie38M+LbL9lX4b2c8ZjGhax4x+Jfi/ULXykU+bfazpPw50bRtOmdiwknvcWiqFx Ih3O3rvh74N+FIL6Fb74daR4yddRvrq48Sm++HV1e20dxdz3VpbxqlupuU02CSGytZp2 +2y28CT3t1e35luZev17Q2Gp3unWvwr0TUfDtvFb+RrXiTT/AA65uIbyGQXlvZ2+i+EN c1SKexkjEc4ljS3mhltns7ycvdRWe2Hp5LRxNWMsDRxtOnFtVoVqlHmjeEFKjGvipzlJ 8ylGnPDwrWvKUYKEnHGVXMpUqsoVfYucFdyo0sQ0nOm1yS9lBc/Ny39nOpL2bnzR9k6l /hfV/wBtzwa83hLwZfH9m3xJ40vokk13x74c1qfTtDkia2uY43025fxMU0WeS9a2uYrH Utc1eVLGC4t23XFxFdQ/UXh7XPhFcaLpuqeI9e8B32uG/s71brSdfu9ZuJ5LWWK5RLa4 0i91ANbypGbeW3a6kWWF5I2C7ty+i6W3wnhltNCv/hv4Jur6aJprmOw8DyT3S3MMlp5N sn2rwjZy3lu8P2yC5up7Wwmht1XyUUzPJbes6Z4c8HmwS00v4VaTpVgRc/aFi8D2Nhlp Wtntru3v5RDPbi1WO5DILebzzcROHg8nbL05zmOAxFOjUwuUV8tlKWIc8XRnCFOu3UdS VJUcOvq9H2bnalTp0KfsqNWjFpYf2Cj208PicT7LEVKuBiqFOrhJVVhY4eniK6qVMVVl JYelGniq1P61Tp+0i/ZwofVaTcIRiz5i8WwfBzUtRub25+Cmv+MIfM014LyC31CbRYpb C61i4S604TyNPaPPca9fTXcu4RX6x6cs8brp1iLfvvCHh3wnfQR6jbeAP+EasLKeC7tL jUNPhnvI5rSVZ7ZhDcK4WKCaNGWSNWLMoDJg5HsOteL9M8JaY9hZa5oumeTGq2ovtZ05 JJmiOHVoJURxt2gkNG+F6AnGMDTv2g/hfYQCDxh8Q9NtNQkTa32D7ZdBA42g4s7E2/lH O0txlioyc4rxcRjsdXhz0qWY80eWFCM8TXq+zoQShSteMeb2VKMYxfu3jGKjYpxlia9O pmWZ08TiYUMNhvbujGL9lhMPRwuHpqTqS9lSo4ejSo0YJuFGjThCHuQR5xdXnhfwXLDb +E9e0Xwy8yFfsFhYWcFm3U5uLTUtEuLOJzjLtuwT/eOFbHl8N/Hu9261of7VuveGtDut Wi8+18MfC74Ua/LpVrcxkQk3L6BfTtpn2kJa3EsGi3NzG11BO8ENpDd39v8ARWn6l4K1 yzv73wt8QtU1SHVZFupWhh1+cWrLDaQEWMKxW32aNorfLQQhoXuri5vWiN1M8rcZrH9k W00esPp3izxJJ4ftdWtrRrKLUdM8RT6dqFvFeajplhqviKwtLNX17VdH8PWDabca9o+l 3Elpa6hf6xClrBbRzhcd77ozhOnOeGpxq/WcLg6spYh0aM50qdbFVKXJQnjObDfWZulV p4fnrypVIp4esSwVHDzpuWPqRpuLq05YJVFTVaNpRw1eEFOHs5+9CdVy9n7JOpCVPFew oHwp+0B4U+IOla94a17x58ZfEnxZv9bsb6ystf1vwh4R8HDT9O0e6SaLR7aLwx4e8PWO o2pl1ae/ed7a4vIrm4MJmgtFht68otDBDcRJLqRLyKsiqs8G1kURF2+XcMqZolkBUNG7 hHCPkD6v/a3n0ObQfBC6Z4X8Q6WthqGohNQ1NdSv7a6ivrSzLW3264Z7T7T5lksjRx/P kMwldea+QoLxvsaiw0a3W9gt5Vge4ae2gvLotPLAb2cm78hS0kdq0lrbAJbxo/2aW482 Sb8wzqMnnGLqV6bVOdJxjClLD4VRqOlyUJ3jGrT9lGpyTr0/ZKdeEZQjXoSm66/vDwgx rxPAeQznXdSGEw+YYOpSpxcp1KtDETjh63tZQdS9CMJRdOMeauq0nJqooTj6lpTgqmy4 WQ4OAWZs/MByV9M56fkK7FYZbi2eB1t2WaNo5A7XARkZdrg7CrZIJxtIIPQivPNNvx5j Qi0fz4rSO42oqLBI0pmQQRXTbYWl3xHehYNGksUkgWORSfQbBzKW/dSAQsgJZSIyXi8w bHHysBkoxB5dHXsa8Gft8LVpVY89GrBU8RRlCThUjaKrUqsJRfPD3eWpCorWteLvHT9Z hWpNJc+83TT1S9pFzvBSty88XTleN7ppJrWN+g0vTYbaIQx29v8APJNOUQy7GnurmS6n fMjMQXnmeQYGFdvlChVUWdR8G6f42srPw34wj1GXT7/XFnt4/DOqeIPD8gSzfUbmwW5v tDuYNQtf+JSyrqAnvk0m5u7cyRWsMlzDFRpE95PJdrNbLBBbyRLZXMd1HMb2BraCSSfy ggNsYrqSa2ETGUyLbi4Vgku1et0zVbez1GxtHuI1nlvLf9xmR5QJnndZpkgikNvbz/Zb lEubjyrZ5ENuXMjrE+1L2lKdLF1XKs3U9pUjRrpVqfNGlOhiKld0K9FRlWrRU4JzrRqU q1DERw1WVOcuXEexiquFg4Os8JimqM41uSnyxhGlKr+6VDkdS6lBYinX9nTnFRjCoqi/ lK/4JleOPiR8cP2ydE+Gnxc+KnxZ8Z+DLvwj8S7q68O6l8U/H9rYzapo2mhtLYy6fr9j fI1rNI0tsYrkSeZkuzReZG37QftjfsT+F/Hnwl+JknwB1/4/aD8c/hl4aTxdoHhLwn8d vjJaWnjjWY9Dk1zwtol1o/ibVvEfh3UJbq+gj1nQJ/Cem2+sXPiDSLfwjc+JtGuZrm50 j8Ef+CZeh67q37e+j6J4d8b6r8PdWks/ifDF4n0PQ/CPiLUbIWqAyx22l+OvDfizw83n NHGqSXuh3VxEYhNazRNGgH9If7Fnwv8AjB8Jfip+2J4f+K/jnxr8VU1f4p+GvEvgj4le MIJLZvEPhbxD4Uh1lbfTvIt7Pw7HLpNxqS6VrGk+D7TSvDena1aX8enWtlDJBa2371x/ VWR8Q087y7MY4HGZXkOXY6jlOHpSnh8dKpmGHp1ZYnCV1HB1aFRTlKP7ivWh7Pl5YUal WT/LuF0sfgnl+Ly7EYyhjcfjMPiMe50lSwvJg4yo0acqdVY+Feom3F0afsOWnOVSpCp7 Pn/QoWTalpXlajJMq6jYRR3Ucss9hdRLJaBbhY7uCW2u7O7DPvW4s5Le4hnj86zuFCIw 1dOt9SFlpcWrXFhf6pb2cEl9ewW0unpc3Edv9nu76DTWvb57W0nnkZkt5Lu9W13pGbie RFmP8zP/AAXB8beJvhl8V/gdf/D/AMYfFnwtd+LPDeqeJPGenaR8Z/iFYeDvEUuia5Z6 Xpdra+B49fk8N+FpkstMeC9fQobTT9SW6E9xpKX6Xl9qf3PrH7GP7UfiP9s/9n39oLwr +0VJZeE9O0PwTq/xi0WfxV4tRdWuy9zJ4p0jS/A32m68Mjwv4qt5v7H0O2gs7WDSra3j uL5Z9ZtBq15+b1ODcJDIMFmOLzzD5fRzzD4rHUo4nBqU44vLqbpywdKsqspwp15YmSTi k6k6eHlKjzU4xh9WuIqv9rYjLqeDxn/CbiY4GtRhi4QeIhiqiqU8byQg3OcKeGlNU1Wj ehVxNOvSle0P2IvtN02aM3moLaJbwxyW93PceQlo9pNHJDNZ3rXQMBs5i6vNC5VZpYYD JvEarUOnacqWDNbavdaja3t5qd7DqEtzHf8AF9qF1em3tbpQYmstPe4NjYwqXW1sYLe0 ywhBP8zfgT9sLx/+1F/wU2mtPF2gePfGPwR8I6r8SfDPw6+D/hLUL9NMk/4QmzubS21r W/DFtf2Nrr2v3K6rBrWq3WoO0dtOlnBCs8VrEI/uT4aeHP2x/h/+37r/AIq+GXwe8SeF P2MPizP4Rj8c+E/GNxpzSeGdR0X4fTWF94m8O6ddajf3vhySfxuZb7UbXSJobXWrW5D3 dqzw2zQvMuAsZlMI4XGZtSw2OeRRzunSxKVPCVZe0cY5ZSqVZczxnsqkp0akIexqSteU ajcaffh+KqOKpR+qYarWwdTMpYDEunGX1mi6DqQhiKkHBRVGFSpN80K0/dnFte0UqcP1 zWwf7Hc6jqYh05LR75bq7/tDESWFteSx6dqN1ftHZ29ql3aMl3NbSDZZT3MtmtxMIfPu Ktv4b8IahBqN9Zva+LLHWrGDw5qHiApZ3cfifRtMl1I22m6u2nz3Fnc2aHWtVln0YTXF nAdZ1KFYWiu5kl/mY+Jf7VHjz9on/grX4V+EHiPSvEnjP4J/C34p/EHwF4f+Bug6nBpF t4gvfB/gfxraDxTd/wBo3ulabd+JJ9c0+DxVb3+p3ccumQ6fa2ljIj2ltEftrW/gd+2h aft6eEfj1+z18JtR+DfwP8R6P4T8G/GzwpqHjX4c2f8AbtgqXmla74yn8J2Wq67oWq63 4fsLiz1/QLmWzub06loyW08b2d5d293q+B62TRwSxOdUcrx+MyunntGrWlUjhsLUoTi8 Pg44mNR4tYidSKqOrTpy5a1KnKLnO9s6PEOGxlfEVMLg688PHNKuWYrDUIS9nGnV9jKe YToWqKWH5lPnpJJ8spz5akqnu/nN/wAFD/CPhnwf/wAFev2fJvCvhzw14a0pPGv7Hd/L p2iaZpOhxS6ldfFG2u72+TS7JbN72W+nt521bUxBie7e2bUmaaa287+r59VaC1F34g1O C4uLe1DavqSWj6fpbXgJkvr6O2vLzU5dNS5uXkkitZtW1L7PAyxm7uZfNuZv5aP+CpWk ajD/AMFT/gF4hisNQuNJsNa/ZQttS1NLCQ2FjdXfxHhfTLK9uoIxZW1zqUOnag1hDNLE 959hvXtlkFrPs/TH/grh4O+H2ufCr4N2fjf9ofSPgN4O074uP4q1rwNF4duPFOsfGbUU l0ye1h8O+GNF0fX9R1/xBol3calcraax4b1nwfd6l4ki1HxQJpbe0evpc/yjB57hPC/B 18VToTxGWVcKsf8AUnjXTw06OGq4tRkn7d1qkqFGEYRjFVlZVqlKNNSqeDlOZVsuqcX4 3D4GhWr0sYqksLWq4anKnOpVknSp1oRrxw1qVWNSdKhWqQrzpQbnOPs/ZfqBbfE34eeI dTutP8M+KtEvbtpx9n0W18RaVNqkVvLchEADGze7eGPIZoYI3uTG6xQh2WGsvW/iB4H8 JXUNr4u8a+FfC16BFLd22v8AijStOklia3lz5Ud/eW06QvLi4jmMR3RxMmMM7r/NH/wV +1a60/4jfsY+PvDXwn1v4JalZvdyaDr81v4I8OeJ9Xgtde8Lajp15NZ+A799T0abTfNl L2Gv2mlT2r39xaR6fABNBH9c/wDBdvw1o1x+yl8MfF8+i+Hn1+X4weF7O68Q2+j2I12a 0l8C+KmisbnVjarqE+npOYm+xPdPbIAWWPeEz4OG8PMFLE8MU6uLxkcPxFUx2CbqctSr gq+DvBOtOLq0qsalOjKdGUnGvCfO5TnON16T4qryp5riY4WlUlktGlUnJTxCoY3D45Ye dJVoybXtsPOlJUakVBOFatzucXD2f7O+IPi18C9B0fQ/FHjD4j+AdG0fUYl1Twbq+q+M NFsbHVmnhn086hpslxdx/wBqWL6fd6lbefZpNAJZV3ONprq/Dfinwr420Wx8SeEte0vx J4bvrm/tbLWtEu4L/R7xtMvbrTb2S01CNzbXltDf2Vxai7tZJraWWPdDK8RElfz+3Xwu 0T/hx1q/jfWbHSfFOs3P7Pnwyv8AStS1ywhvr/w42m/Erw7a6dbaFJcq40e30rw7dWmj oumrbS3UlnJeXz3Esvy3f+CfHxD8a/DL/gkj8dfG3g/UpdX8UfCe/wDjCngmaylmu7DT jcXdi8ep2EVxErNaaHPqd94lto5beNYhakyRpGZYznjeAsPDBYmtgszq42thuJafDUKO KlKOEnKvFShWhNclTDxw868pVaKUqU8W6soScZtu1xJiY4mlCrgcPF4vKKOdN4edp+yp 1Kfto3nTmnNUIzpqLjd2UITptxqL91tc+Mfwk8K6tqfh7W/iL4L03xBo2mRaxq/hv+3d NuvEWmaVLPbQRajqeh2E91q2nWU0lzFJFc3tnBDJbLc3qO1naXc8HbeGPFfhbxdoeneK fCmsaJ4w0DWrW6m0rW/D2s2Gu+GNSs5YXt7TVNJ8QeHtVuLTUTDeG4wYZXs4ruyhgujf K91Yx/zif8EVNA1T42/Ar9tnT9a8Wa3p/jL4m6wvhzUviLBIt74v0+bxR4EvLT+3IdSu 1kvXu9PvtXvNRiRbiEO8swimgklWcfop+zp+z14s/wCCfP7G/wAbvB3h/wCNM3xr8UeC vD/xa+LvhGyutLt7DTfCWoweEby503RdB8GXWu+KJNO0WbxJoN3r2qwyXiWuueIb3xBc C0S4ublJfPzrhDKcrq5lkuGzfE/25TrZdg6VKvCSwuKWNhTnUrwr0+T+z6VKo9VXqV3N QTUIykqlPfCZ1j80w2HxksHCll9TDY3Ee2w9Sj7bDVYxq0VCjGtSrN4mUKvN7SlToyhL +JKdJ1aVX7t8X/GD4X+BNQttG8VeNtLsNfu4tQmg8O296dT8SfZtKttLutSu5tB0lbnW LaysrbXNGluby4tYbWGLVtPkkl23cG9ngn4lfCT4vaTYeIfh54w8LeP9G1Q6k9lqnhjx Dba7Y3Mmkz20GrRrPp97PDFLptzeW0N5A4SS3lmjidFbp/Nh/wAEP/EPx71/4rfta+Kv DVx4Q1zxt4n0n4T+KPGuufFvxF4y07VNXn1HWfiPfQanb6joXhfxLqGqT311ezy6jJqD 2irDHp7273OWFt+on7F/7C/xR/ZS/aJ+MvxG8R/GnwHqPhn9oNfFHiS5+E/hODW7SKDx MniW11uDXNKj1XT9OiuYPDdnrl/o13dxW8M0lvqenLPGEjgig7+I+Ccj4axGcZdjMzxV LNstwmBq4XD3o044+riMLOpjIzpyw7q4KOFrOhOFOSq/W6CqRdfCylTqxyyjP8fm9LL8 bDA0JYfFYjF0K1b2cmsLRhVi6cPrHtZRxFSdOEISdP2MVVUans2oqkfp5/Z9nbXtvqG2 e1W0tru2a1E6NZTfa57GRby4iZZJZbuzFkYrFllSNIr6+SSOUyxvD/OV/wAHDoSbTP2N Zo3LLDeftFwbhuZYhPa/AhgQJAQP+PNZsDBADI2c1/R/LpU/2iWRtQuVLQxwGJlTyYzG 8rmREKbhPKZVjlLOVKRxbUQqzN/OV/wcIWV3H4Y/ZUubmSCWKLxT8arey8tZPOWK40D4 UOwuwfkErXdpOUEX7swLEH/ebwcPCaqp8dcO05VYzVOOPpQjLkjzwngsXU9jJcqdTkni JTg6jk0tIy5IxiujjxKnwxmMo31qYObmla0pVqUk/edlZR0avGVuZJ3ufov+wf4s0HRP +CYXwX1DxHrPh/TdA0v9n/xQniCfWtRtLW3TRoZPF0t9b33nzoghaC4lhWCVSJDP5QjY yBH/AAZ/4IheBviiP2pl+LPh6y1/SvhF4J+HXjm1+JHimDSdRutI8QW15oM9tovg7TBZ 2d5L4g1s61/ZHiQeHNHh1K9T/hH4Z/IiupdLt7r9sP8AgmR8Gvg54r/Yj+AOu+Ivh/4T 1vxFfeD7mbVbvVtGOoNeI2v6rHG873QktJmdoMTW7DKmNJJIgpjLfp/Jpcmj6Gun+Bf+ Ef8ADl1ZyWraZEnh9p9LsViureSZE0rTNU8PM08lis0NjIupWa2t48F3Mbi2jms7j2Mx 4qpcOY3jjJKODrVavEOY4qjXr4mcadDCYSvPEU3Vowgp1JqdHFN0puC/d+ylFNcvNxYX IquZ0OGszqYmNL+xcDSVGGHlWqVMVUjTp3jKpywjGEVCMatO7TtOPkvjb4d/tz/sha58 Zb/4F+GfinqEfxWubnxNNr8HxP8ACHxQ8ByaCmlahrXiXV9N8UeJ/ix4X8NyeG9L0C+1 jVYNE8P6lqFjp2gQXMWg6HY2OmxW9jF2HwB/bc/Z5/aV8UeOPB/wo+IRl8T/AA4uFs/F HhTxT4J8XeAdYWK61WDRYNWh0vx1pWg6pdQprP8AxJZbZFg1HTNQuI7fWdKtJ73TDN/P 94N8OaJr/wDwXo8X6H4hs4tT0O9+OHxZ1C5026iE1hqMtv4a8R6rpcepWcsZttVhttXt tP1MWt3byQzajp+nSbFe1iz+tXxZ/Y/+C37NPwx/az+Jv7Nvw31Gw+I/xE+Fnia88Xwe HvHWsQeIYPCkmtadfeJ/D3w+W5TW4fBltr3hweNJrS8t9D1iPTtR0/TWtbeS30qy00Tm nCPC+Gr4XAqpiqOMznIstzDLsXXruvh8Dja2KxMMZ9ZqSdOEo1KdKlSwsan8TE1eRKFS dGpTwwOaZzjKePxuHhg4U8px2bSq4ODVCWJlTwWJrxSoQrUIYqtWr4mtWnTqTpxqYr2d d1Y1lGpH6h0T9sL4TfEfxn428A/Bi+8QfGjX/hmbWPx/N8LvCOp+JvDnhm6vXvI7TTbj xcCvhm91m5l03UIYtG0rU77UmmsrqH7P5sDquj8Ev2p/gz+0XaeIJfhP411DxRrHw8uo 4vGvg+TQr7RPGGhXz3GoaP8A2X4g8L6lZ2uoKyXlvcyywRJH5UltbTTPFDPbif8AJD/g gJEbTwT+0bpNrb6SLi0+KvhqO+mttWj1GZ9OTw0fsYh1DTzNY6s9vdOYYZ7ZbGynV7uV PnZY3+Sv2IE8Zz/8FoPivf8Agu2u9P8ADR+Jf7QVz8RrSzcyWNr4K1DU9altrO/Nq0lr LaQeLZPDL2I8yQmeAvAxRZjW+M4ByzDVuM8NRxywr4Vy7BYzD4mtWozq4xYnC4l4yOLo TbVKNRUJwo1KcVKgquHk2nVpNxR4mxlfBcNY6VSnVw+d4mtCth4wbhQoxTlTqUq8Grqh JU6td1OaMoQmopwlKa/SfxZ8Xf2FD/wUJ+G+o+Lvg/8AFXwt+2Xr+p+FtA0HVfFngPVN AsxNrfhqLw74T8U6rY3l1JYSahZ+FlXSrHW4w8sNnDBatELm0Zq+/P2g/wBqj4SfswWH h9vip4xuY9f8ZaxaaF4K8B+GNMs9c8beLtYvLuGyhtNG0me7s444/t99aWst9qt9p2nx tcKiXE0qSKn8+X7W1w1j/wAF0fh1P5zyRx+NP2b5LZmdz5KL8PfCkTMibipy8czlV2pv cvjfk1Q/4Kt+HvEb/wDBTf4Xah428SXHhDwfe6d8HLz4c+IPsL6iVh0HW9FttSt9FtWK Wcuop48mvru+F5PHBY2k7alcx3EUcFjd+niuEMozzMOC/aYrHU8HV4Ho5nWoVZfWKqnQ opzy3DctN1aOHlWk6q9j7StUpU7TlKtzyXmQzyvl1HPMZRhh5V6PEOIwvtqUE69SGNqu Uq0qsklN1vY4eahTbpJ0qFOMVShCC/eHxv8Atc+APht8SPhJ8O/2gdB8R/CTWPipe3T/ AAi8T+J7fw5rfg+48SR28egXWk3evaJeXNz4Y8TJH4qttJDX2lHRZF1wwya6ttJcEeof tI/tHfCD9lH4dXPxT+NPivTfDHh6OcabpllZ6W+teK/FerNH5o0nwlodveW82rX5gDzy zedaadplvsudX1DTLaRJa+RP2pf2Dfhn8cPDumeMP2m/jV8W/E/hj4VaB4j1PST9p8I6 E2nP4ottNiv2szpXhaOfUNX1BtM0Wy8O2EQlvrjWDZW2m+bqM9qtfmz/AMF3vC3jBdM+ BvxC1bR/GV/8M7L4Xa/4I8O6vYa3FpyeGPihrOpWGoz6l8QLYeHtZ+0x+JfAUS6OukW9 74eutW1CxWdNZji0G/0XVfAyfIMhzzNeFcFSzLFYabrY6nmKwTilg/Y4mU6X9jVM0q0f a14uo8XWwynUhCU6mIpL2lWrE9XNM7zbD5Zm8sZgni6Tp0cHltPFR9qqlPEKrKvUxlHC yrYWng5KVWUHWjH2/PGjWpOc6dOX6t+PP2+PDXwaf4Pan8b/AAX4t+HXhf8AaCV73wEL qTwT4k8U+EdIstI0/VNR8QfEXwn4S8S6rqHh3wzYafe2t5rF9pc3jVdBvJNRXVLtNOtp Bpnyv/wWo+InxL+Hf7Ovw/174aaj4+8GXKfF3wnbt8VPBnjay8L6XDZa34S+JD3HgbUN G0TxPYeMdVm1M6ZpXiFdRk8L33h2CGx+znXYNYuWsp/sT4ifAb9m/wCOfwQ+DPj/APaJ 8AeFPG2hfC7wLovi/RdX1HUtbtG062n0DSbq8t44fDurWLeKk1i807TbS38K6n/aVpqd 29vY2lk9xdy2t18k/wDBau5df2FNC1/TbV7Mj4z/AA5nFjqWnWck1hY6r4E+JukNDPp1 yL2GwuI7TVGgjLKtxp90YLi1ltr63iuIp4Xo5FS4m4WWGwVelOWYZlhc0jWqOrlzU6ta jSjhadXFTrzq/VuZV6decaM7x5YKnOJrnE80nkGb1quKw1SMcLQxGDs+XGKcownUjXSh JUqTqrnjKnGpKMVF+6173uv/AATj8b/EL4g/sgfBW88ZWPi1Ln/hC9PuIfiJ4h8V+HfF 934+L+I9YfUXmtrfVtR8VWVzBbRw27XXimKyumE8L2/2lbd0X7gvNKtL+K4USagC8U0T SRSi2nQRiXc8UjAbJYvndGAzkAru+UV+fP8AwTC8X+Erj9jP9mrwV/wkCy+KrnwH4i1E aVY3HnyWOn6B4jltrmTVTA8g01zLqcENoL8RPfMt0tqJTbXDD9BrhEuY7drW+uoDbXcw vY7q2icXUcLXMCpAztvSCVmt7mO5A3uItqjypa+U4rpcvEufKlGhgFRzLGVMPOEK31a1 KrKEVKMadWvV9rUoQ9lThUhhoVOeUoU4VKlSHq5Gv+E7I8ReGKq0qNCrFtRrVaWKhTdC OJw0qtWNLCunh6+IhWlCn7SvRrShGbXNSrcjL4f0kLLHZ2t3YozyStHHMFjkubiRp7y6 aPCq095eSTXc7EEvcTyOxLsSeC1XTRbmCCO+mZLi+MJRbCS482WC2vHEfm226G1lhaN2 +1X2LdRHLaAi7urYH0u8S+N8zyjT59K+z2/lBY501CK933n2uaV9zW8lsYTZR28KRRzJ N9qkkmeMxIvNa1Nm6jktrCGSOabF3tcWqW8AhkLTwQx27JLL5ywqYS1uGEsk5n3R+XL4 cJNV4S5cNi3Xw2Iq1HXlSVGnVnSk4q1WSX1ilzOtTlL2U6eKpQjRhVk6VR+9T5qUqcY0 +eiqc4upVqOpOLXJTprkmpzqOcZzmq0qinTlThJqbqKUPLU0S18+4eO4la4tJYxcJHFZ NNZXBiiuIo28pfPt3aCWC6jWTMpSVZVYQyR45XXfDaywmC3luoJ1utMmeWOKyjLWq3ll d3kHnTabqcDC4sPOtZ40gWf97LaR3mk3wF9ZeuXBikztAjOPvGHB4xyzrJnOAFzycALX Oaq0N8+YYYbQRW0COltJdhJnt4ooZbk/b7y6ke5vJFNzcRwOtus0sv2S1tbREghyqS9p VVSjTjH9zh6c4yUXVqSpUYKclOhSoxVNVVXqRjKLqRVZc1WtVVWtVyjGrhp06ntaUVGr WqVKk6SqJqVaUsLSTxNepFSjKrFctSjiMPU5Z0o0aEJ06a8l1DRLEkj94SpJTa6p5YDb lRBsXYkeAAqFeAGYsw3Vnw6v4h8PyZsryW5gkJM1rfypf29wgADRyQ3fmK0Zj/dumVVo yUbrXS6i8SllRmBB5LRM6/KQRuwQ204wdpBwTyDXm15HNNMlx9rmWSATRR5VQNkskZfC j5cSeTE43hnXaB8vzA9FGrXj7RxrOEZJzlOnBRfNLmbpqMZwfLeKTslCMZLljJrlOPG5 dlmPjDC4/A0sZTcXOM8RQWJUXT5fclVqRcoRs1yqVWM5yvOLnyzt6fqnxj1i4fRrfWfD OnTazbWdzF9qGrwaPbTWGqXFndI62qx3Jw0NvaOX3FleIeX5YeRW8k+JHw4+OfjTVjP4 Xt9Ng8NRWlrezPbfFLxNYyNvXUHnhgTT9M2yTRBNOm8hI2jiimc+bKzKsXtfg1/Edh4Z 00tdaf8A2PeXV5eSpf2SyY23BR280W7O/mOCViWTLMTgACvWPDvxM0vS7uPT9Ye8ykLe SLLS7PTbSZJWUBRJf61A6y4A8uRoV27nOBuwf17JMwr4PL8FiqNGnUxksOpc1SpKrGeH 9pKM1GnVjL2M3UU2lGXMndp+82/4S4ww2Ao8T8QYGFKlCnSzHF0KccNRjhqVKVKtBRlT g/bz5Gqc48kakZrmpt1JRjKE/hPwn8EfDfiO4hTXdPS51WGRUuLvWte+IOvWcN3FI/mG Atb2Ec0uEIcb13LuO4nr6fP8A/G3h6W8XwNB8G9QazjzfWNx4f1eHVTvs0vUtD/bPi9Y Iru8tri1liF3Jp8DQXMc8ssVtJ5tfTd/qVp4p1srpVpq2q6e0RZLW18YzG7jvCBuE8Fp 4rsIYlUsyh0Qr8wGao6zoviiHTdVjfSLDTtLuYLmw1q28Yw2XiO1v9NvLbyLy2nN/wCJ NaItLi1d7W4EtlMpjLhraaI7ZPY/1gxCnGdWfvS5JPD4hRrYdJVKbmuS8Ks4On7SCVKt Qqc0oyjWhyu/zWHwOHlVhFxk4+0pqc3NqKi5JO/PKkvvq01ZSbnGN5R+WtX8L/E+5vjP o3iKyi1rSLyOZ49B0rQNC0uxksjbSW88N1cfCzXrm8t75Jbm1hKa7qEtu9rMZDbwm2ku vJNY+GHxC8W2uqXfibxT4wh22s+6GO5Gv6e2xSFS2tPCPh3w49tt3hUWPTkZXVXK/KTX 2Z4g1/wTcrbXev8Axq8Q6ZeCxCWen6B8TNK0O1s2KhBbxaTY2sESSQjdEJYZZAsfyRy7 SWPz98Q/h/8ADHxB4cu9TTx38WdQit9HludV1s/H7xtp2lTLcrLeTrq0q6/9ktLmzS4+ wPHBBbWgS2jeGO4n33U/rZPiMXUVqtKk06tSaqrBUnOsqko81OnUp04N06dOH7ttzhSj FzlOVWrOdV16MacvZUYyqOnKpJ+zdKU+WlTnUqVLxm3Up04UpSlKm6kKcbzbUHKR/ffo F3eSWAmvlsYrRLfTZLCeG5leaXTzpFjPNPqUU9tAtjcx38t7GsEU13CbKK1u3uI7i4ns 7ae+1O0sNV0KC5hjH9sSX2m2F+SpZL/7MdTj02NFR5cahYadf3jS7o7VBpKpM5nmtEbh fBmjaVD4X0/xe0S3+oat4A8P2d3I+oXC2N/omn6fdahpltcW1/fvohuVi1Ke2utekhhu tRt/IXULn7BZ2dva9P4ctIL+5bxjd6HNoniLUtLs9BvreTV11JI9M0a+1W8063C2F5ca JuW41a/uPtdnELqaO5jguriWO1tooP3eE4SlTo1ZVY1ZwlXpqlT932dKpQahUqzoyo0r +0hek7Vp0/aLD2dOeIo/sbdOSpU1Ko/cw9WTUYwd01K0ZTp4ilOPtIRhNLlrKlJyhLD1 ZUqiuy+HtNh1nXfFGmWllF4w1nw3pPh241K6a6ljuNN8PXXiTUPDdpe2kdyifYrDVPFO v3Ba2WC6nXULiN7lhHbiDXtdQsbua+tLa+srq80meG01W2tbmGabTbyeyttQhtr6GOR5 bOeawvLS+hguVjlks7u2uVVoZ4nfgdS17VrCXxBqvg7RP+E/hWw8WXF5HaeL9Njay8Ve E9O06z0vwNp1pLBOlnPr+ow6jaX7S3MUeg6tbz3OoW0jaiVh6y0ZF+yasul3kN3r0dgu o28Pl7bKUWckgudRR3t9726pHpst3HFLdOqWUPlfZoQYbqv2fLVcnKMnCElapJpKU6a5 aUeaUZKrKEZTlHllSSq6UnGZ0xTquVSU3Um4qjCMq8FyqhGElL2c25unGhJUozio05Tj GlCblRlTWXb6vdWHhjxJq1nF4p8eXukXnjW5tdHTTdG0LxHq9zpuq6vLbeENAj1weCfD 8oheGPw14W1nWtR07S9Xs4dN1fV/Fd3Bd3XiO4uaB4T8P+HtS8X67o+mvYap8QdfsvFn i6WS7u7h9S16y8I+GPBFrdtDPd3NrYNB4X8H+HdLa10tLaxdtON68Ml/d3t3dams6vZa DpV/rWpzRW2maVbSX2p3tzdWNjaafptsPNv9Tvr3UrqysbTT9MtFmv7+5uLmNILO3nkG 91WN70E8F1BDdWs0VzbXMUc9vcQSJNBPBMgkimhljLRyxSxsrxyIzI6MGUlSDXVUr886 vLywlVlOU4QcIN05TjNQlRpKnSjSjUgpQUKNOnzxtFL2cYwcVXjS9pJ+7VvSnKnH2dOp OHs6s48ilLlipOnNQcpJWjZtxuvz5/4KwR3w/wCCYH/BTOV7q2bTW/4J6/teR21ktm6X cN9H+z58U2vrqbUDePFcW9zbyafFbWaafbyWctpdTyXl4t9FBYFVf+CsV+Yf+CYn/BSa xlNxcDUv+Cf37aNzp8lppN+9lZ2+n/s4+OEuotT1eL7Rp0N1cXF0ZLCO5fT5byETRWlt dHTry4orng4+8ou/LOXMnNzcZStUs25ScVyzjKMLpRhKKjGMbJTKalJ6wbioQfJFRUWq cGoyUYx9/lcXOTV5tublNy5n+iZVSoUqpUbSFKgqNpBXAIx8pAK+hAIwQKyk1K5l1q60 n+xNVSyttOtLweIpG0tdFubu5uLmKXRraL+0zrsmoWUEMF9dzvoseitb31vBa6tc6hFq FjZFtq1ruGnz39leaxZ/YLbVrfTEklNne3tqbiJ7myikvbnSbS7RJJ7RtRlCeQUBuZSV d70dpawTXVzBa28VzevFJeTxQRxz3kkEKW8D3UqKslw8MEccMTSs7RwokaEIqqKU5e5K FOnUhOU4SnKpOPs+TmUpUlCMo1asa0I0Z05zpxhGdSbm50o0qgp2vyxp1Yyc4ObnUXs3 FtOdJQaU6kZwVNwqe6oym5LnhGJ+eP8AwVA0m/1j9kzxjY2dzeW5uNY8Kru04ael6gGr HzmWfVZ4rNYmjZU2/JLHh3R3LhR/LvL8OF/s+/0rRfEWv6XqRkNvNqEer+FLpQ9tJi5s rtBFJNGcoS5huhKjqArFd8b/ANT/APwUml1b/hkf4gXeg28lxqNpNpF5BbH7fbzT/Zrv zBCos7a5uY3nZVhjMtv5CySo1y0duJJE/lFsvil8XpZJWi+EWuaellLtudaPxE8NadBL vUBhNZX9ojRMkikAIMTD5sq2UHh5lRxVSsnh0vcjGoqjqwglecYuPLKcXUbvG8ItPkUu aMlt/PvifR/4XudOPNDLaNRxqVFHmU8U6UoUoVE3Vq3rKSp0mnSpwqVeT2dNuPIa78Kv ibB4b1X/AIv5rWm7/tEGj6RpWrM19ty6wvKuj25nEcpSNmXzTMquVLRuoz4j4e/Zd8b6 pdeb4r+Ivxgkt5I1ke/u7+d7OR/MEwuBJf3UF5bNH5fli4SRSI5JI9pEjV7gnxH8Ral4 jtYNW8UWmi6imoefNp9xrPh3VLvyI922ACGRPPjfg4jCMxVcMAMN7xf/ABd0PV4bTSvG vhrxB4kTTWh1XRYoNB0yVVvrSCeBJI2juHjkZo7iZBJJK0YSX/V7hurCvjsyw9KNCjhM C1WqOrN0KMFUgpOCUOetKdSVOFlKCnVm1Jvmeun5xSrySlHnhhIxjJxsvaTm6loKnBTl NyVm5XnOKjCM7Sc3CE/mnwh8Jf8AhX93rYk+NOpWr6oYo1u7zxN4j1eWIM8BkuZ49O19 nuZpFikjlg1CO4t3E8pkjd9jJ9W6Z4D1TXH0PWLv4sDxHYWMK2jWsmkXVrOYiq+eiwiT E80hjLLJe2s8qjIVW+8vFaBc6j4qWTWvh98G7bQb26vjp+3xPL4Oguoks5ILq41KztNX hvLfy57dZbGS4t1W9gSefyGgYpPXqsfij4reCvtH2LSfg7pT3Us8s8WpX2o3lxbm6dpG ihmXWLqVkjD4gtrJooIVxHbwxrtWvHzCpjMTOn7Krh1iWlTlRhQoQq0vZxpRp1L0I8qc lzN2nzuonKpGLadTn5U6alPEVJ1J1bSpSo1uWnGnGEZTVNShTk68bKEqVSElUpVJVacm 6dSfFeMv2cPAN3rFp4qtfD3xe1eJ1k+1RaLfWGkaZtSaNHl/s+18FSS60qyrJKkNxdeT He29r9oiu4/NhrLg8O/ArwZjR734XfGGaHULoaiINT+H+oaxpaXcH2g2k91HpfhLT9OR 7Q3FwtvPJaPJHHPLhy8kjMur/tk3Hh3UJtO8V614fQs7bX8I/D3X7jTrbyYneWO71bXP ENhAqfIyKJ7nM0pSGJnkkRG5a2/4KTfCnR7GCx0nwp4q8Tx21oFSbSvhvfz6m96LhxIL xtW1bU1S3EW1kvp9WlnM26FrRY0WRvPoYbiSbnWnQzDE4icKNKUKWNcadLD/AO0/HBTq UqFWMajo1qlJT+uWlGpX9lhsNSh6lOTlQpqj7SjQUMSpV5qnCo6rhThUo0avsYVXTeGq xjVw7xNVwnOU0pQxTjT9k0q6fxNb/wDCP6Zdav4d+0PaW+nSaVoGo6XE1nbXKXMdlqX9 oaPFAkU+yS1u4EgCrDcXH2ZreZkmTkLv4BWXhbxDNfavrutSXWrTSTHTdN8Ya3ptjHuQ A/Z7GIJDAfcnGQCOlc/a/tf/ABA+JkkOn+Gfgj8RRY6jHKbO5iufCWmXUIjiMzyPbtcS SWgESO67o5CNp44GfmzxJ4o+PEfiMav4f0TxpfSqwaG21vWNO1M20TPhmkhitIIniQ5X erMhI27h0N4TLMzU6lGVWhgFOnKs6FWtGpUqe0m6ftJJ3k3UnRnBT05pQlbWLtwyiqEY 2vy1JSnGUYpc7lL95JNL3ryV2tVzN2ScpX++9K+FWgaPbfaLKw1yZ3BY/b/iDqkYYS/6 x5pFLSOwBO0BuByOma4nxXd6BqN5YeDZPC2mw3UMMcdldXljd+PxJAsTQNc3MGq6VfLd EOEuZ2juhdyyR/Ku1ip8Y034x/Huwitk1YaJN5yI0kM1jp9vd2vy4KqG1m2SR1z0Cx57 kHkZc+ufFb4oa1ZWnmpNaJcXKQWWn6l4R0vVZbi0EbMLVL/ULh5dpZmkMUdwigoc9zeE yDMvrEqtaVGvQo/7Q+SM6lOn7GEqnNViozjOPJCcpqqvZuPPGV4cyCnOrVbw8ZKPNeVp yhh4T9nTc+WpWqTpwpzk+enTUZw5pyhGPvy11L3UpfD/AMMPiGtz8MdKjv7XwL44vkks PhtpukxwSx+HdTe4nju5o3gG2aRJE1EWKtbSSq/lNIyo/wDOP8N9Q8AeIoj8SvG/iDxD e+I5rq40/TovE17/AG3fSu00q3D+E9D0ixlW1BaGKBdTs9Pj1ZwvlRXMOf3n9VNr4G+M 9t4duNFTWPGFnHqVnNa3Om3fivwXAq2ssTxS213/AGf4X1KV4JI9yTJNHIDGTGyOWKHy 74W/Ae1+EWqt4m01fC/gfXJLu8mfXdE1Lw6t3JLfIsTR3Fvpvw0aW5cMpkt5pB9ot5y8 0LW7naPPxMKNXBY2lh8Xh6OLh7SVoV4yrV2lUdCnUVOlKthMNVnFUpV44ecadqsqcako Kg/23wj8Uss8PYZhXzfLcRmDxivSoLmWDhiKauoUIzqSm4Lnppxq4ic40lzzq1JckJ/z ya1+xn+0z+1Pf63f/Db4Q+NtA+GuqNoq2eu/EWLXPBujW+paeRbPqGnW/jcpqNykhuBC rWVpcRXiSAsJJ5Mni/E37KGv/sH+O9Og+KfxR8DWvifW/Clvq2mzaJp1z4u1XRoUnvdP +y6VHf2luLK+HlSReYy5ige3ZUWIRu32l/wUZ/bg/ae+Hfxf8afC6y/aE8UQfD/To7Q2 Ft4e1TUtP1e4iubLzMXetSaRpuqXDzyMZswukPlMI2MMgKL+G/ibx5q3xH16O81bVvFO rXVtb3Mmpaje38ms3+pmZiRd41FIbq3CEwW873F9eF1DXKqnEB+pyXL8xxmAp4GNelhM DODpOtCMo16tOrTVGpCrWqOElGpTUo15L3akJu+jkf0PlmfZzjsZg+Mcdh8vorHyq4zC ZLg4VKsowrU1LDVY88YKl7GSm6UFzqrz0p0YqnF1Je5+KvidY3uoXM134Y8Q+O7/AEaS 20SLUfF19BZWFjJosFolssfh/SYo7GRobeO3a5kureae6LG4vLi4unkkfjbD4ha5Dpwu Xt9B8N6Yz6np2kx6JaW9vaTarF9kuJdOuZrVzqEO2wumeK8mjNvLOwtyxLOYfIdOS08O 63qOnRytqMTaeVguoPtMPmzTRh3LwTQrcvhvlIlWMjYWXKnnBiW4NkkIiP2aG7WUzbGb y3kclQxAO1pmyE3EZA6dq+owfD2HwtClhMPyWg8NOUowdNN8lONRUablagqiSjaUasoQ 9180+WovXr5ziKtaliasaLrQrVoYjDRi3TVOnUty06tOfW/M6lOco2fNG7dz27xZq11/ Zc11HcTRXyaZcMt4tzNHcK98Vs5PKLM0jpJavPazQqFjeGd94KEq2T8MtT8PTaX8R/B2 reG7DUX1rw39v0y9cytLouo+HPNuY7uyKXmnvJcpaahqUio9wn2mZBbzCSGeVJOf8X32 j6l4e03ULDXJ72//ALRtkvNJlgm0xbKEafDPcQQ2Qt5BeQW18DAurDUY1unIVdJg2tO7 dM03XtFTR/FOmavF4bfU/wC1oTqa6smj3dhbTWVxp90tzHciyu5Y9Tsp7mIPp9xdW9za ztbSqjGRW6aWGp0svUJxcKlbEQdGlKVaipyoqdalGdSFKVWhTnKm1Oo4c3K7csnJQlx4 7NJY7HvGYChTrQoUHSq+3qezU/awjQnV55Qc9ZzUOelGTjC84xkou1S48Q+I10KXQbjV NYl8PXUEK6Zo10qy6YIIboPM+nSXFwjWgtmtoI/7PgS4j3ZBWBo0eXqtE1LS9E1nwHLq VvPqmnRaPeSz2F5czXFhDLqcupRt5c1y5iijJktZLhLd0+zJElvHM0MMLnzyPxX4ffR4 bDVn1O51Gwu53sbnTY42hgRjyFWV0SfzVAK+bLJztZZIwtbGv+M5dU0TQ7QeHLix0jTI 5rTSbu+aJszllEzqtvFDFcsWH+kKr3cKO5jYAqpHoN0OSdKlg3CjCc6mNxOGhKnUeGrO NNYio4vli3WrUqKlywi5KjGyqTlKpnSquNOnWeMhXqqhRnhaOJc8QqlSjOVSdB+9JqKj DSKio8sVNre/pXga50648Z6nqOm+FLeHw1Fo+o6TZx6XPeQ2dxILMW9pq0d7qX9qv5km oQR6lexCKG1mZ7mytINKtrmMQdDbfEnx34fF9J4MtYdI1ixiuLS41K2Qf2hJaT209pex QR2jCOKO8s5J7acIr+ZazzQSLtkIPlei6h4kvNEa2s9XvltNKVki0SS6eO2WW9uGnmks YxKBFHJO0lxLbW2E8xjLKCSSeT8Qa/4w02VPsGpXtrItvc/af7NgjjlEEbBpWnmhhkmC KSDJcO6EcbmXNfNYyNDG4idL9zWhCMFCni5NSfLCD/erWCV2rO2sbNxTbR9XTxay7KVO vDF04VPazxNTARoKlzYtfwFTnKNNRamk4tL4rWs2fup4a0T4I/s1fAr4ZftEePte0T41 /tCeJ/DsOseEvgrZasYvCGm65qOq3l3aeJ/G4vnt1tJdA02eztJdE3nTrh7P7Sp+03ci RfH3xO/agu/j34vvfE37UGvfDiFG8PRaRZ2vgxL/AFfX9Nt4ZrmaCy0qz05bbR7KNFuX jeCe6mhkVLczpMYI8fljPea9fRrNqF7qlzAyzSQz6lJdSxTLGQLiOAzMY2COdjKhwrYD AE8xwzKkgnuJWQlfNXbCybs9lZB5YH94Z4wR7D5XB8D4anUxOOxmOeJx9epi1DH06DjW w1DE1Z1fquFqOdqNOgpzgpQg/wB2lCKhCFOCmfGdVVlDB4DHToUqdDnoY/F1MUq1VVI1 ZVq8HRcnTlVtKNONW1ONOnFScVdfVZ+M9l4Cvb7UPgkt5Fsnkt4tS8YaXoLfY7S7sdS0 20Gm6ZP9uvbqWOC5nkknik+wxXS2M13bCSK0Ycd8MfCuuyWmvarDZXkp8U219oVreQW0 135uolVku7aS5trO9hsJsSpcSQXMkTpaXEV15SwPBLX21+xh+xH4h/amk0278IWF34ks LG4js/FdxJpN1p/hjwxcyENaW1xq8cdxc6ne3lj/AKdPb2GmC8QZXEy/6Qf6Uv2f/wDg nB+yZ8ILWCHxd8SfCPiPxbpk0QvfCFhr3gnwvolpfqySG01HTtf1iPxNqUwdVaSPVPsU UyAxy6Y0bMp8LN+LsHk9CtgMLh8biq9NvD1MVVtZQpSs3XnKHPKDtOpTqQjGM1KM4ylC Sk+vHZnlOXqGdZ7nMMRj6NCvHLOGsoy7Fzx9FTnUhyLCSSWHoTxMqkoV5Nwr0qiq4dTh UhVn2f7CvxT+Hfxm+GUOiXXw98QjR/DeleFoPtXxA8C2yWF1r8NvJDq8uganqNrLZ6yl t5UYikedJIgFQyQglT9qnwV4FvriK5ufh74fkgs7hb6wurHT9KSFpUt7q23XKWGnQC7Q xXMoNteTTWaSBZjC8sMMkW7p3ir4S+FkttIt/F/h7T9PsRCtlpI8ZfD57LSrOC2WGS10 +y0kB47S4Ki6cGaaQSnMUscR8itDU/ih8G9V0uOGbxh4bitpgy3MY1vSS8cTlkdJnjZ4 pDIo2lVLIVbbknIr8Sw+bZZlixEMDilRVWvUrSnLMYezi8TCrHEUnTac1Ko6kfZzjKKp 8srKUpwlT/mfjjJeKuNM5x+dw4Tz3DLEPC08NS/s3HU5wo0FJQ9rGOF5qiruFNylRqSp wpc1KtGo68FHj7j4VeFdbvLe4s/Clnp8Kq8TWCeEvDbxYkIzdLOYY8M2xOdm4qq5zgY6 CD9n7wwbKezvvCvhC/guYruAHUvDehJPIl0XQW0nlwlWjS2cwtIEErnMhYZxXn9x+0N8 EvDel2llrfju80Gea2lhufJ16yhTS45RLFBNHcWH9o2KyCEJNDsnmWMlC6blaMe+eHPH Phfxd4L/AOEk8C+ILDXrCK3ksLLXri8bUNPbVY7Y+QdRuIBHJIWk2NdLCIZWUyGLaxUV pDN6tSnS9hjYQlUqcrhUrXVKNSK/ezqQqzhLknLXldTWDmuaNr/K1uB86y+jVqZrw9jq WF5oQliZYDEUqLnTly8tPE18NTkoNXfJdKrBqM43jGMcyP4fR2GjhJ5/B2hW+0RxXula dYptgRdiRqLOJASFUANz+J5Hilx8DdN1O7GsS+NbzT5bshb0aZb+Kb2xdxuJVo7TUtOt 5x/01+yoW6sMLtr2HRfjT4a0zwtZP45TRYr2LTEuNcljt4bHSLO8a5ktDbx2097f3tsL iVPMtYboySSwOhMhcsi+ReJP23vgp4bW6SS+SS3gkLfZ9J0O4vXeRiwZ0aW40u2Ibbgs sxBJHOCWChnmLwNXFYf65T5o3o1alKVH2dWn7VuSc2uapTm4RmmlKbioNqCtzdMeBs6z KnbAcP5tXoSjFKeGyvH4nmhOpCUIVZYdVKTi5KnKeicVGLsops7Wx+HcWl28Gnp4hu9f tZJVd20/Sr2KdoQkkRtJ5W1TdZxhpElZo3huleFE88I8iP0mm/DC30a0g0/R9PutNto4 lWxjnGo3sEShQIxDGniCEhI+AtvJN5QVSAoOBXBaX8U734o+EdH8efCeOwfwzrc93ax3 N3ps2ganb31oFDwzW0mqyjeJNwY26XqSJhobkciui0i1+LVtC9xr9xNJHcHzI49L1bU9 QbDc5W0u7mfyhyAIoEjRcHYB0rthVxeMoYXEf2hgbVY1Ix5eRtcs5NRmoUuapPyqVG1C SgpJNRXy+YYTEZLicTkeY5bicNVy+pTWIowpLDxqzUZ1KVWpFe0nVrUliK8KNTFN1aFO VSlTnGElF6snhPxbo122o6j/AGNqURATzZYr7T5IkYHJWyN7qhUheMxycnGABzWD41vr PRtAubzTtNvrjULi0uUjuNNfxHM0EsinbM2mWpgW52S4dotqmYAqWXcSOihXxCkiw2ur 6zJNMzXJsr2O9s5Xu5DuMEMt5Lcxi3ZsLHtEduinKQxqK4L4iaX+0lay21z4cvIbbScL LMF1W2eRGGMxytJprYUZ5ZSRxkHABrrwUYTxVNzqUIOjKMk8XGpgo1XDkk4exnGcZX+H lalF/DK+qPIqKnGnXeFoYmdN1ORpUaMqsdIScpJyT93m+K7SkmuZOLR8leH/AB74UTxZ Lcan8JdS1jUreffNNqy6pbxzt0eSG31exne3LAZMQkl4Aw3O2vqi08c/C/xgllJB8JtJ uZ5Io7hbQ6baX2YNxiVop/Kto9rOjosrqY96MAdy4Hf+HvFPiRdEhuNRuPDer+IYRDGE 1NR5bZuYjdi+WyIuJZUgEy2rIFPm+TvUxl663WviN8JdDtft+s2sdhNaMpgjtrF45Imj bzI9g0+HzNqyfOFAxnnAOc9eLzBVko0cDXhX9tOm5YfMJTp+yhKUedRioRXtU6VSnFaK 9SDimlZ4DCR+qSxM8zpOE1B0aVfCUoz1jGTVSLjOcovmUY2fvWk+xjaP4ysbWAW/g74d w6OjptQxahpllFnGBg6f9rlIDZyUwy4IGM8dppp8ZagwZtMS2izE5ebxRrN4Ccq7IIm0 m3hZJFzE22VmQMSJEkUEfN0vxN+GF5fwalp13iaMTQzajf6B8QFE9rc3Jnlt3isIrXT5 Y4WLvaho5I7aV3kiTMjht3Q9R0HVJnuNK8ffDyIyylVhHhT4kC6j+c4WUt4iskeVFKqw WOJS4LFAGC1xYzC0eRuNOs6boKpOrjVCFanUno6PNTr13NxVuWadPmk+ZQg01Lqw1bni qXtnWi1yyhh4vCaOK52lFtwurpKnVlKMn7s3bmfE/tsXc0Xg3wlb38VvZqPEjE759SdS 39mxPEIpLy0iSZQt0IyY5pkgnZreZ4p0kjX89NOlt7W98qXU2luNULS2OnXDW2Io7K3g S5TT0jginaIFlubhp5bl0muDseOBo4U+1v2v5CdD8Bxya1pmqg6xqRLWPh+/0tBixhXc smpanf3EyEoDtZmxgf7WfjaxgjCIVkZgTyVAQt9QiqBj0AGBzX5zmnIsVWpU4qpXrWpz cVzOpTnOhLDwo06lKfsalGrRcqlalW9pXhXVGKhH2ql/dvgwrcB5bU9nUpxdXMIOLcFF zWKlL2sPcnOPvS9+M5XcYKMXG7qz7uxuNsaAWyllYMzhgkjKxRNpd32eXEAZFXAYlnAL FlUdlYXiOjukhEGFKPvGyVQvzOV4K7DvXL4IILcDJrgbZba1NubiUqtzKkMIkkkIkmkz 5cSA5GTj5QQOR1zzXe6cwZcPFsXLKolKyb0HAcgE4Vx/A4zjOQCcV4MnRp05x9nOdb2k pRqxlKLdOcYvlUKkopttNU2/ZwjGdRT9opUpUP1KjzyV3GMFLl92coyVGcZybn+6jJym 3yuT55KKg+Wn7TVdLbYk8ggTBI5FmXyJGiWTCMoWTYcPCQ5byz8pdUc5KitfU/EGqaFp 76roXg268X6pbPbLHollqGnaPc3iZLsVvtSIhRYDl9kmQ28uiFwFNSwMkrRQLJbQA5Al uGKQJsViA7Ro7Kvy7V2qw3Fc4HI6Gwmuy4Mi24DDIIYs2OgxxgHHYnj8szGbi6c5RjVp wl/DqScYSjGUZzhNxalGMnJXldb6PR2moud1oc01VnG85wV5p1OaMZxc4yg5Xi7JqWqX Mmmr/gB+yd+w7+1j8A/2jdB+Mdz8I/Cuv6Ro+o/EK/13RoPid4Qh1y+k8btJHp0UGonw xbXVjp9jo8dgkml6hquq2I1D+0tSsRZ/2lNBX9Emman4ou9A068n8NWeka1NBayX2g3n iBbpNKmkeP7bZNq2nWMkdzLZwea0Ettam3vJ1jBeDzjcRQ6bdx38Md5YXdnd20nmBZLO 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 n6cX0b/R510u+UXEl+BqEKqbwyGeC2LcQD7CJrcD7TJVyKERPcOJJnNxMJ2EsskqREQw weXbo5KwQ7YVkMMQVDM80xHmTSM2ZPo1pc6/pviF0H2/SNK1vRraQoci01+60C9vUV9w wrzeHtPLrtbc0a/Mpjw16zgtLeKSOziWGJru9nkREZAbu6vJ7m9lIYAlp7yWed3HyyPI 0ikqwJ1i+Xlg5cz5XrJx56nLyXlyxjGO797lUYxbVopSSW0UoQpw9pOpP2aU5VIwjKUo tpyfIowbklCcnCnTipTcYwjGKu9baIfag3mSreOXmjnllni5gitmiiild44IGjhUtbwr HC0rzTshmnmd+UtNJsfCGhvFoHgbTIrLwT4fbQ/Anhzwgui2d4/hjTdG0o2fhbRINUXw zoHhkTXmmQ6NpujPrUHhyO20zRL291fT4mkt9J6K7t9Qul1C3i1E6dDc6d9msryxtoH1 bTdQkF2k2oxSaimoaVOYUkspbG2u9IuLdLm3ma9S/trhbaKlf6PbajJqltrUsut6D4h0 iHw/d+E9S03Sr/w4YdmtHVp7iI6S17cDxFYX8emaza61qV7oUlrpWm2+nabYXd7qsms7 4WpG16sZU6ft5KdCopuU40qyh7WMKFaEJKvSlUlSUsRSqOjKam8PWlFFRlNfvFUcHTbf spylGOJVnR9hOUIzlGnONTmbjOlPkg48+vsqnxH/AMFSPA8/xd/4Jv8A/BQf4VeHPB83 xP8AHfiL9in9o6Dwf8N9E8PSeNPFmu+NdS+EHj5PhpB4a8IWNnqesap4pvvG+lWi+Bot L06fV7nxTp1sNBV9WtIvLK+29P07WkGh3Wsa+bu/0/Q7iw1q10fTLbR/DWu6vd/2S8uu Jpl9Jr+u6UbGXTr2PRdOh8WXNtbWWt6hDq769dw6Zf2BWUJ1ZU4xqOSSlOcab0UPaW05 VUqR9ooRpwqzjK1SVPmVocsVN1J8ypzp+7TT55QnJtQi5PmgkuX2kp8sXdw1XNUVqk+b n1HSbnW4NN1LTfE/huTwb4ktpPC0dtqbWVj43guPDGn6Vc6ppvh/whrt3f8AiLwRoM/j 3+xNXsfGuh2Wm6J4q0aLxPJpMVpovhfxZJ0P/CX+E/8AhKn8CDxP4fPjePQIPFcng4az px8VR+F7m/u9KtvEj+H/ALR/aqaFcapY32mwau1oNPmv7O6s47hri3mjR+oahoSHw5ca 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 imlUUFmNTWcZJS5IUXJp7WtUhbX7Uf5knwuszar4esFsY/F9/pl1HMbyUaJoj3FxJctG sSwf2g0r3Ys1RFZbUy+Ss7yz7Szgr4//AMJjZ6vNJpfiaP4q3EWn3Iit7jw5oOsXiz2K WQ8p3itYrWKwnF++xbdJNQWS0t8xypNdbbP2zVPgjrdrD5ureO/HPi+8UPstdMOn2gCg vIPJeSOaNFLlmxlQWZicEk15g0/iLwmtzbW3wx+J2vtOUUXF34n0eMxtEXLLFHbhUAnJ QO8kckkYUCB4y8m77vCYnC1klOVLF1PZKjHk9hhlGPJGEXFVI8jUVa/NGTa5nG1Vwkvh aNOOHqKap0uZe219lSqNvEcsqt/axa5ZTjCckmm/Z05Jc0IJXdO+MvgzwtcnS9K8D/tA eJobPTZr7WLW48O6tNLBbSXUNnZ6hMLqe1TTtNS5Z7SWW4tZo7i4nt0S4heJ47no5vi5 4W1+xiaL4f8AjHRhBBcxhrzw/plvdlJ/tMmDdgStJeRXV2s8V1qEV7tt4RYrEYVt0hxN P8SeLptn2z9n3WizbW36jrelX8qJuOCDe3CIkh52t5TbD8wU4FW9Q1LxVp092+nfDDw3 brcR+VMNa1HRgs0W5Ji0P+jmW3m8yNF89RDMEEkWfLmfdh9Toe293BKrODdTD+0xS5KM vZRozm6seZOqlUqSpKMKSlFulONSDqzl1KtBypR9nFOEHKL9nGdpJ2lNzVGnDmbrNQVW dSo6fNBOpSp8sf7fP2F9Yudf/ZB/Za1SGFVsLr4G+BHmF5LL/aNu8Ph7SrewgSIQeRJG sSTpcNJLC0Bht1gikV38n6V0rxTpmrabo+qiPUdMTW5ltLSw1rTbzTNVhvsXEj2F/p1z EtxY3cS2lx5sVyqBDEVLbmUN8RfsL+L9V8P/ALAf7NGualodxqesXXw38KaVb6R4J0DW NdtbK61C6l07SoprfRk1e+TQ9KVrVNc14R/ZbW1gudUlitIP9Hi+6L+71e1Gj/ZdIXVJ LvULO01doL+C0i0iylhuJLrVU+2BZL+G2uIobdbOBVu5hdLKqqsUoH7FQlbL8NywUKqp 4VRqcsqiUYxvWhKjCScpzU6ahUU4xoqCcoVE5I/f8vU6+CwNOn7OFWWCw01VquMKTiqf PU5pVKtGn7SUVKEF7SHvKCUKknyT5ZYpNK8cwT6HB4dt9H8Wr4h1Hxzc3t9fR+I73xLo dn4Q8PeGpNEsZp/sclhHpVpeWWuPHAoje30OSHMl3cyzeiVz9vcWt6DrMQfVraRUbSym nxLNaQyPDbXcUEkwiuWEtxALq4Emwqka4DiOMVb0ZbeGzNlZ6ZcaVaabPPp9rbTxxxI8 Fq5jS5tBFPPmynHz2zyGOVo+ZIYz8tVBuEqlKtzxrKbtSdFRUYLmhNylFvlcqsJVIwqS nVtUam6bhGmrw8qVSnKrSnUkqsva2k6EqKjNyhCeGnQbToYiNOOKjzzq1ZTr1JTlTThR hasissIu/sctjNeCOe4t7hYBdJL5SRBbo201xA00ccccRaOeZNsaqsjKq1gzXuvWGsaB pVloEepaDPDqMWs6y3iMHVdDeFY20GdtM1C183W9P1JINRg1e+GsRappWonR47XS/EFn f6xqnh274g8MeHPFdkum+J9C0nxBp6PPKtjrOn2upWgkubC90q4b7PdxSxZn0zUtQ0+b 5P3lne3Vs+YZ5EbnE1rTLQT6to2geMr+DTLyXwdqVnZ6ZrOm2uj2Xh1dQuJ9W0/wtr82 jJremxSAWNpq/gXR/EGp+I1n0230ZdZ060V7HqjGNPDqretXdNSjifaUeTD0+aDhRrut RqpuqpOVSMJUqNKMo2ftqfPTNOWTnTpUUl7Sd/ZwXvSqSqScowpqM3Ny5k3K6k5Vaisp JVJd8eh+h/lRWbbXCLbRTGXUbpb+cyRfabJ47i1W7DXEVtcW8dnay2UNpGRBjUIUuYdq RXsz3JLMVlddGntqtrNXT+a1XdaltNNpppptNNNNNaNNPZp7oTVNOstStI7K8lureH7T ZyxNYalfaPciezuYbu3jhvNMubO8RXe3EVxbxTrFe2T3Nhdxz2Nzc28sn2y6OqPp40m/ FqunpeLrjS6X/ZUl09xLAdJWFdRbWxfxRxpeSyvo6aWbaeJYdRluxNaw4mtpP4r8Paxp /hTxfN4c1fcLSHxFo9roer32ganA1tdmC50vXrDVdN85oWjgv9P1GwW7SyvHMD2F41te QXdIutci8P2934ss9Ottct7SaXVrXwzNqWtWDSW5l+fSvP02y1S4N3BHHcJp/wBhlube eY6dFPqRhS9uqpTdWjGdOpTr0ZSfslCpzcsqsYWq04xqfvfbKnyqpTjOEfZqNbkc8P7R 30ivicue0Pf9y3s7S2Ub1Oa0EpSb9nNyjFKDl4V+1s0UH7Nvxpu5F2GLwDrTSTRMIpfL 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 O9pqnxAtvEuoWmsw+FZtU8R61odlPN4k1K6V9A8LXcenQWenWmuTw6xpGmWlpFpw1rVo pdNurqHUtRvPtF13Fo1y1rbNeQQW141vC11bWtw93bW9yY1M8FvdyW1lJdQRS7o4rh7O 0eaNVka2gZjEmqoyoJRqRqSj7SrGFVOryVYRldShOvSU23CdOb50pRjOKcIpqzau3KEq bguWEkpxlJ1Layiv3c/ZNxnyt0Vy3jGcufR1YdKtLa0tLON79obGUTwNPquqXVyzq0jj 7Ve3N5NeX0eZXzDez3EJUIhjKRRKhWUNKvLufxJa6vNHJp+qxwR2Mml6nrmmahFZeTLF NbOkF6P7OuraRt8etaJe2c999oVZrWzl0+Ga6Kxjfljy0nT0S5JumpRS0S/cyrU+W2sU p8yi0pwpz5qcfMzLEZ7GrFZbg8qzGm1OVWrj85x+XTVWU22oU4ZBmLqKS96dSU6V6nMo qpDlrT3ZI7gGT7M9rCrwzEeZbPIftrbfKnkMdzAJIUAImhASWbK7bqEL81WWHWms9PSK /wBMiv459ObVbh9JuprO8t4njOrQ2FmNZgm06W9jEyafcXF9qi6Y7xyXFtqoiaObP8JT 3NxoVu95qt5rV4l3q9veaje6LL4eeW7tNYv7W6gttKnsbCWLS7GeGSx0a5kiuG1LSLax 1L+09Z+1/wBr3s2nab4Y8G6XFp2lWGieFtGbVLh4LKwtrHRtNbWfFGuTXt08dvbpb2x1 LxB4j1e4up2VPtOqazqUs0hnvbx2kKVakqSxEKlN0ZKOIjUl7OdJ03DmU1OfNBUnG0rf w3dz836f1dzfLUp4uljLxofU3GcJRcnJ1oVY063u4ulVjTpRUadST5qsVWgoKNbwv9qL w5Pe/Af40XHhx4tE8Tah4F1OVtWtLLTTcam+kadeNYWOsS3FjcvfaaolnhaFys8EE8y2 VxaNIzn+L/w/D8a7TTbW58TfHbwhoSR21v5kcdlotlsAiQ5LkedgY/Qiv7cvjxZQ6j8G Pinp1zBNeQ3fgLxTBLa28hjnuY5NGu90EDgq6u6jCujBgxJBGM1/Ejo37PngDXdOis77 4O6zFuihtzca9rtzLNOI4z5rsTcMskhjRnDIWSQYbfsy4+a4lrq2F+sVLRSjBNxp1Zcq ioxipVJxTjGnCNOEZP3UlGCSWn5X4hYZ4jG5fWc5ynKjKg+f2s4xhSVNU9W3CnGEE43i o+5GN7qEbO/4Wl4j0ze9x+0N4ZvLURTTCaz1Tz5JPssjxyKtvBGqhQ8Uys4YKrxOMcHH A67+1ZrGk6Tqd/pnjLXfGN/BNDbWmiaVALa71FJluC08FzdRPbLZp5BjnuGlLJNLCiRO pkeP0HR/2P8A4VeHpzfxfDyK/druFnsri9uZoobEzIbtU+zs+J2t3uPs8ZHl+eB52I2L H3PQvhF8Mbm6ttPh+G9rpR+zTSW8IYG6eCCWOO4ligIEnkwTXkCyyqCkMtzDvYNNHu+V njeG/rEqkMDicVGEqlWlSk6EXGKjNL206KoKt7KnJzlJQpU3OEanJBWUPzdYOvCpWnRm 1SruUKdGpVdadGEalCrC9RUac4TvCH7+gqFSqva09KNSpTfxtpv7WVy5i/tnwh8TZwdq xx3fiTRtKtJAOFWQHL7AOh5bHWvRrD9paSWGSex+G9ja2bSxW7ajqPiez1CaC5mSR4oW uIbedVnlSKSRIGbzCkLsqYRyPtA/s7/Cq5itU1H4bxailhbQRQG7uIYnuBHhN80swaW4 nbLNLLINzgMSxbAPRW/hKXwlF/Zfw9+EvhDSbYRKo1X7Xp41CzkVo1DQQyaNfRTyrE0z R3N2bhYplj8yyuomeOvKr59k1SLlSyicpe05eSOJ5YWc4qE7xldc0HGc5JNU7yUpNQkx f2bVq1JqWJVTlledSrSknzOnCpOT9o5upbmfwOcpyVorn9xfBUniHVvGUd7FJq3iSz1m 78u90ePTp/F0+iW9rbyrFfWVylrocem3WoXTT2w09Rr2jtEkVzObS/hWV7X2bwx4a+KF lps50TXblo57dra4aXwx4lmlKFSNqz6pexywsGAdXjMZVhlArAOPucatqeo6Q9vrVnp3 hq+mhHkx6NqlyLS3uSF3h5f7Gaaa3wZFQwrZzLKYrhg8aSWkvHaH8IdO1hbe/wBf8a+I P7Qu7O3k1TSrbxVql9pcF+8SG7t7O6lsdJnvbOKcyR291Pp2ny3MCrNLZWruYE4cRxFh XCjBYaGGtD98oP67eoqjVozWHw6hTlBQvTUq6kpS5q0ozdKnSyNyj9YwuIdR+1pyqXrT hVVf3HS9nSnOEqdGEcMpT+r05UVUq3rVPaVnB/Aes+K7zSbqKz8ffGXxn4TNmUskXTdN 8iWKKJVjjZp3vJ7t5CoG+e4ked2DPJI7ksZoLr4LafBGdH+KHxV8Vtbx3F5LZaLY6g8M eXmvby4+yabDHbW0TO0txcyHIDGW4kkJZjX6OP8As+fBK5uEN7o9hc3q274a5ijmL7Xj 3z7XXdKYy4Tfnau8Bsl0J7Oy8N+CPA9t5WgaLZ2e62ubWWWwsbSyuLiyu4fs09tc3KAS XFu8DSxNbsTG0c9wrBlmcHH/AFmy9KEKeGxNSXPGU6NL6vGjLlUuVzh7Nuo0pz5VJvk9 pJppttuOT4qKq+2r0oe2kpVnPnnPmvzt3mlLmd221JOSk05atP8AOSy+LPlaOP8AhCNC +Lmo3TwqbeS7s7uGGRZWQI0Ms7skq7WEhbhfLDMCcAHzfXI/2k/Fdu8mi+DvG2sXd7cX 1vqOn6nrk+l6XZW9k0Q0y5tbqG8KXQ1ES3TzItpbm3FtCS8/njyf1Mg8W+BtLW7jvY44 d+1UM8MbGzRTCdtuIP4iYpBl1P7ud0AG1SOc1L40/CbTcs2qz3cJ3ho9Lt53ctGzRyJt t4WO+KRXilQ4KSKyNhlIF4XiCdGdf2PDqqxVek4SxCdSM3yUqsZ6QgoP2qqQ5J6ylRlO PuuLXGsphClOUsz/AHdeKp16UW1TpSVZShDSUoOUvq8cRBttpS1tOnJU/wAUJP2ef2r7 7xNaarcfDjwRY+U7SCDxHct4nsZS4Kn7ZZapJd2NwoVs+XPayxhwrhd6qw+s/hL+zH8Z rHThZ6z4a+AaHePLlTw/cx6otuNu3z7vzJHkufMLt5/7lGjZI9qmPc3qX7QP7enwr+Cv haLxNH8KfGXjQXd/NpqGd/8AhHLC3ljtpLpZLjV9R0/VtizpFIsIS2Z3eN0KLjNfk18R /wDguJ4+0vRbLVfAvwp+HHhKz1vxBP4ct21DVtV8Y6vYXUZsAl5PpiavpKGySLUPOE1x oUdpdLBcpYS3k2n6hFaerX4m4gx8IYOjk2DoSWkX7O0nypytdzTk0lKW7srt9Wv0Hhjw Z4j4tyyOcZfHBVsoqzrUlj8fiKGHVOtScJVfZ1HGdSnPlspukoyqU04Tcqbkj9kv+FS6 ho+YvGGt+CdNtIo2t5LTTr7XrVUaRNsbxRwTxussRO+JGaSIsAJI5U3KfkP9pP45fs2/ s2w6Taahb658QvFWvadq2s2mg+GNVmgNvY6Mswkmv7jWb62WGXUbqCay0uyhSW51C6hl it4XKMK/Hr4kf8FAf2yfG9rc+LtS+I/i/TPBPh+PSn8Uaj4P8HaR4T0iwk1W9ligt9Ij 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 29hompz+HLrT9Ek0vRLq01XU00NvDmj3unXGreHp9C01vEFl4m1m3t9Rm0i0l0XQvELJ 1TXQ07TPtetXtjCLKyE+q6iR/Z2mxmCEPeXm26urn7DZArJKFuL2c20OFlupSjStS/te SbVbTS4tD1m4sbzT9fubjXzDY2+j6fd6JqWlaYmi3sN9f2uuvqGvf2he32h3Fhot9olz pugatcXmsWDT6DFra6ZZ2zwaLqCafqGiPbaILK30KS8MFvpdtepps8mn3uk6TqF14duN Q006fb2dveQnUP7ORb+20bUFsdSvvtpzTlWTqudSK9r7ScptVXUnONSMeT2ahU0k4uvO UqlNRjFqq5T5XKU5U7QVFRXKk7Q5lL3uV6fvZxfvynaajdU4NxXsuSW8tbJru0uZpbe1 1Jna0sLtIrNNQltt0WpXmkRT3MU8r214mmedfQW/lu8FsJ18qW1juIyuI8V6frOqpZa5 oPxK1XwNFe2Oi6R/Zup6Dolxpfla/wCJ/D8suoLpet6bpviPTfiBd6XBf+E/CUmpaxN4 f0XV9fN7r3w/8XXdhDpDlDSi370ZTulKknJThDlg41JRlaKjOcqtOLi+ZyoVOaKgqU6n nYnGYmlTw9TD5bjMxpV1UlGeErZdGNJRqWgpTxmPw0airU3HE0vq7qxjRq041PZVXKms f4E/F34dfHn4faL8Y/hNrNj4k+HHxQ0TwN8SPA3ia00250WfxR4N+Ivwy8DePfB/iLUd E1aSDxTo97q3hTxNol2ul+MtA8I+J7Gwksbe/wDDdvAlnf6l6TrviTRPCuh+IvFHivU9 P8LeF/CmmajrniDxL4h1HT9K0HSfD+jaadW1jxBqWqXV0lppei6VZRXc2o3+qSWUdnDY 3d1Pss0S5k+Fv+CUKP8A8OsP+Capt/Jilf8AYF/Yyd3khMgdV/Z3+GizAhJIWMr2yGGK UuwhbynaOaOLyH/QWsqUJxSU6k5Wq1ajd2+eFSpVlCi3VlWmlShOCXK4RThBU4wor2C7 qcaNOUYwpOFFSU5wp+zp88qknOvaSptRnUqSnU53Sk+aalN1Zc7l5N8X9NubvwJ40vYL qzthZeAPHH2V7i0llmtdTudEdLXVYLg3q2sK2lqmowXEb2FxczxXw8m+soEu7fUv4vIP EPiSK2s5NT+Mvhye9hWOSLfp0txCJGt3iZgAMxOUkkiJUqdsjoflZgf7V/irIsXww+I8 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 G5mjUPJbhoPOe4nto2khiuCss5l9d+Pvhm88N/Eq+0S91fVtXnsLDTUF/qs1pcXdwkkU himiexubq1itJ4pY7mzSRorqO3eIXVta3Ikgj8hWGaLdJGtzcf6ZaL5TG2OYXSGKY27t LAqRQszXU3nF7hxHPHCku+3WvwXO8bUxOeZlWqYiKjXq41KdOapyXNh5040lWp0qk3Sq cypTppKjUhLlqTowcq1P/SXwwwccB4fcM4NwpUeXJ8BUd6cZynVlCNS1KcY1KnWdRRVT kbhzXnUjBPoLGG1s4EgtUkQeZd3ExuL2a7Mlze311ezPG1wXlhhDXIjitfMkht1QR2og tBDawaOk6qJNMtJb6zFhfXVvaXF5ZSSQ3M9jcNATPYfaraSS1nWGWVopZYGeGZ4Fkicp 96hHFFHd7o7hyv2J4JbYRwNA4uJrS4WVlmt2uI7m1ksjBBPbywqYri9ibz45ht1IlXAP kAfXGP8A9fX8K8FyhUpQlU/eVcQqeIqVKkMRSr0ZRnWSpPmlGNT6xB0cTVqTpOfN7OKn B/WFV+55Wrp7c/PF+0nKXxKerla3v3tCMpwVNQSai3TjtpfLoktpCbQRmK3068t7byoZ rY2d1aW19YgwxF4fJktJYGa3YAojGCWNHV418N+PV59v0nwypQQIus3CmaTdsQPp5Bdh GjvtXktsVmwDtVm+WvbrWJ7iSGMfZbZZZYolmlUiGISuqebKyI7iKIN5krIjuEVyqOw2 nnPEvgi08Y6NbWviDUiLrTtX1K6jh0u0nijTTdqJp03ntcSPcXksLTQ3MMcSKktsLiNW juVt4inRqVaLcqkJVIpe0nG8HKpPljOpSpVJ1Zv35Rfs3KrJJpe+oza/R/B3izKuAPEX h3i3iCvUo5flVWrVx1fD4WpVqRpVcuxseehRc1Tp0KVWdWV61X2cOaEZSlzRUqfwf1PU Yfh54PsYI96zweI7m3KpJLbCK38T39rcC5mjR7e0uJGlj8q1u5ILu7hV7i2hmtoJZE+d /iX4Bg8F+M4LfUTcWXhfWb1buO60i1ttVfTrT7YE1i10q2e/sLPUrjRvOWW1hbU7O2vY JNLja/t4pDcJ9L+HtKm0O2l8K6FBJeaLoVpq0bzXc+p6VrEOt6jHFqlrDpF+1gLW+tdQ tdauo5tY03UIm0G8tjak3l3Ncw6T2niLwnofjnSU0rXlupLe3vkuYJUD2t7a3lms1sxt 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 ycfaKc5JKFbnnqp+/PlqOClyylH+93/gi3quh+JP+Cev7Ps8lloX2zStd+Or+H3tzpVw yxH40fEaHUdQ0ERPJc2kS/2rPo99KEtZnY3Ecoe2u4pLj9Q7vTZLrxlomtwxaZLBo/h7 xZot7ctqGpLqtnc67e+C9RtbO302B/7GntLyDRJLnULrU0/tSxe30lNHZbPU9YEn5F/8 EJ/DGiWf/BOP4HXEOgWNjrnh3U/jn4b0bV7/AELSo/EOmaPqvxl8Wazc2DX1tbw3f2S9 vTZ31/bm5H9o3Nrb3F40k8Mckf7JWgsn+0z2yQeZLcOL2aGJUee7tkSxd7hlUGWWKO1j tg7lykUEcSt5caAfV04uiqcYxjSqJShiFGTTvCLpOz5Yym3TjShV54xSi5wTcYxv+5ZV UqvKsohGq7RwdCPM6jT9gqcpShRSvpOckqsLRg4Vqru5PXCi8b+F7mbxfb2msWd3ceAN VstF8awxTRofDF/e6DoXiuOPWJLl4ILRIvC3iXRfEdzI8uyHSL2O5JJ/d1o6EmuJpOjD XptGm1f+y4Dr8uiW17baVc648Vu95c6LFe3l5dWulSXRvZLe2vJ726WGW2El28kUrz4W saJDql3rvh2+0exk8N+NdDng1q4tdOHn31yIBo+sW/iG7LrFNFqXh2TTNL0o+TLeLDZa hG88cNtYom3qGlaNd2WqaTrIjvtN8TpNpd7peqz+fY3tvd6X/Z91pVvaXDeULa8sLeZr ixt1CTM95ctGXlnc7SlQ5+XnnGMJUo1ppxcYudOlUtBP2XPNOavByUPfjS9o5RqM9GSn 7Rt8kaEoUOX3r1oVYOr7aXN7KmvZVm6PLT53rFwndQVStoWVvcWsMkdzf3GpSPeX9wlx dRWcUsVvd31xdWtgq2NraQtb6XbTRabZyyRPeTWlpBLqN1e373N7cY1jZWGl63cPdeIN Qv8AXtcsrhobPVNawh0XR9a1LUIxpHhi2az0S2TQj4vt9Fv/ABBYaMmvappsfha18Ya1 rdzp2k3CT+HW1a90HQ7nxLoenaDrwsrafUNE07Vm8Q6fouom3MU9pp+uS6XosmpQ26yS 28V+dJ017iJmJtIQ5jrRfTdOe5urx7Cze7vbKHTby6e1ha4u9Ot5LuWCwuZmQyT2cMt/ fSRWsrNBG95dMqBp5SzlKb5orkSlUhKT9nFvli3zKHLyuN1KSUIzVPm5JSUvZxitZzq8 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 P8RtK/b/AD+1l8PNX8A674Us/wBku0tNHPjrSGfwqdTnh865fxIuoRanat41k128h+zj wzP4cuINFgkUnU3gXzi/2p/a+rPei2tri8miVIWF0IJY7ctLBFLJFm4jgkU20rS2k2+N UMtvK8DS2xhnl0x2T/2fDAueKwGKqZjhaOOlToqvWq4aPu+zw+Lm4J0q/JWVWjS51SnG pKpBS95nPh8RSxFaq1Qr0p4fFVcFGvPDtUsS8NzylP2qvTUY1PaUozqyivbXopupLlft cM3mSCOOG6kCxh3kjidoRghWRnVdokGd+zOdgLAYyTYeXDRJCY97yLuEjNzGCfNCbSpM oAJAbIAG5uK/Cv8A4LB3GreFfgBpHxF8K+JPGfhrxlcePfDnhq413wv438XaNDPo72eo STWQsNK1u30cv5xHnzLYpcPhDJM6LHX17/wT017VPEP7GH7Omo6lqeq6rrNz4L1WS61f WNSur+5u5rfxt4qtDPc6heSy3Vy7xwJCXmledkiChiE2161Xhj6pw3g+JXjJVPrOMrZc 8LKgl7N0oq85rnd1zOMedpc3N0tZ8VHMatfOK2TRpRU6MKWKjXc3Dno1pwVRQabfPGHO ovZTspaJn6PGcFTnapzgbmX5voRnII7E1XsrrUdlytzPFsknbyIot0RSyQqbeK4DTzrJ Mr73MkRiiKvHthRlYnxW51SeDVksb3U4xdyFFt9LS+h+0zbA7ebb6aZRM5YOA7oh8w+W oztGKepeIJLd1Q3EpRJlMg8u5tJIhG25Y5fmQ4b7rRvw4BDAqTXzkMFioRcVSleqko3i 1KcdPhm480OZc0ZKN+aDad4yR71SnR96UqtN06NpzbnFwg1ySUqj1UPZzi+WTaSt7TS0 eX2+fUYZ7x9DW4vbS+uNLuL6O+ttNupLW2iWWOzMq6pcWNxoK6lFPcRy2+mXcst3PGkl yNPuLKC5Za1lpmn6OkVu+sahfXc8UEMt1quqPcXepTWkLmS4MRMVpFPIpknuU06ysrZQ dqQRW8MEUPiul+NPD2py6haW2vQrNYnF60N8t41ncArFHaXEFhJeSwXFzcvHaW6yxopn kjEkkce6VdGXxJaPFeafpOqavd/bLiCw1yzf+0tNt7u1gNpemQR3FvHFq9rCZoJYZoBc WDXsbwfao7i3nEOv9n1oVY062HxdOEqXt5NUai5qUbr2qlKMITp05RvOLmorlfM4tqSy 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 e0HadUuXsYKGIdCdfF070oxp08OqlOhXq4f2kqdeviKXuN041cRR9zmjhoSh7atGnSN6 PTBY2VsAqu0yNIttHOsyq6StGVlXH7uRvLMoTGDDLG44cViyadfGG5Edg1lLOPLM7JHM xVXSQvHu2iKc7F3Ovz+XJInCynGDqPjbRo7nERupTG53NCSI1boQp3Y5wACBzgc4FSWn xRtBGYbuGRgJ5vLlQM22AyN5AkDvuM4i2+eQdhkDbAEwKjDYDNIQniI0akvenGnaEHKS q3lyqDUrqlSmoOek+blqK0r8t1KlN8ictHOScrSsnBwbi3HZ+9C104yXMtdSvfsdOtl0 nX5JNX0bxAZPDt1pl9Bay2t+uq204e2mtG/eXMMlrHcQzwQJOfs7zz3EQs4J54NWXUNZ jifyfDrpItzdJanT9QmnijtYp5orG6eWa0tjBcXNl5MtxapFItnNLLax3V7FELmWvD4p 0q91CGe8ubPyUcS2yXMEsM0DtG0azxyGOdd5imkQSKU3RyOgfbIQd68vrO9V5bTUdPEy Wl3bWuoQJaPqWnpfLGJZLJruC4txKHht5fKubWe2mktoBc200abK1m4z/s+FXCQwrp+0 hXxVWM5UX7SrOUKkqVCm6snFTUcRWtiK06UKcKNG2HjCrFL2lSdWUZ0fZOVNUoRlUu4c tJVKlaU3USlG0lRo4eFGlZOVXmq1Z1Icnpiav4murqO9u/s8OnGSK6gh1O2a9ivzZLPY JcEQ3LRBGuLK9nt5LaOa7smCRvam6iu4tpptet7YWcaIFhjgjjvENzfGcQNH5sc8Uxjc SS2yyQidpZHjllW4dZijRyMn1PSNOulvIri/u5vstvbtapbWz26TCZ2n1BpI4bR1uphI v2lTctbLFbp9js4pnm+0XYtfvL+Z/sU9s8e0hVEbI4Hdg0jR5c88kZPPUg5qrUxcPZTo UcI8MpxqNuPNGdajCk4ynhqtKLq017WfI8RSVOUZVadNVU69hRhzzhNpTlTlGXs6+Iko 0udqm4TlQw8Y1ZxfPXVLWhNwpKtiYQo4iXAXNlNfSysdI062mBYiV5ZxIJscSEfICA+D g7c9OBXWafNZC8fTG1KKXUYbK21C7srWVty2ly01pbTzNtIk3GyliUtIZQkSllSIxFp7 h4rudI7hXgmZyHZTEX5wTuDllz68/rTVudH0qVoDNcfaZnjO2KGLDIV2N5kqx/eCJCiE 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 09ll3AQ204Aikki2nzYkGYlKbgNwr964Yx88w4cynFSqQqLF0VXUnQ9liYyd4OnWlOHt UuWn7SnRjWq0qcKkX7td1ox/G829gsY50HFRxUYV5QjVqVVBz9pOjGLqYXC2f1eVOUrR nfmTnOM/3FFjyLeyXNvZarEk1nFLaXcMAtbmazvLq3trmymuY38xoJoIHW6htplVLiG6 jlkR4zETV0Xw9oOh6edM0fTrK0sDFb2sttBGDBJHY6fa6PBDIjFwyw6dY2tiI3ziC3SJ s7avWumafZXep31pZ29vd6xcW91qlzDGEmv7m1srfTree6ccyyw2Npa2kbtllt4Io87U UCxE0xluFeBIoldPIkWUO1wGjVpHeMRr5LJKXjALybwok3Lu2L7+i5vZykoOMHJSlu0o JpLms4qavGKTdvfavzM86EqkY1I8zSqO9SMZy5ZxjKPs04t2aShCXIlyqpzTSu5SePrd 9q+l/ZL3T9MuNbsllt7O90fS4LE61JJqWq6TYQana3era7omlW+l6BZz6nq+v28n2rUb vTrY/wBiQ3OpwQ6Vqufq+uzW2peC49O0zUtTbX9TubO8jt5NLs5NI0EaNfahdeINU0vX /Evhq9axstUtdC0meTR9I8WeIrK81yztx4cg0y91jXdF29E1mx8QaVZa1phuzYahD59s b/TdS0e8Me5k/f6ZrFpYanZvuRv3V5ZwS4w2zayk1Ib6dPEt7pKeF9Wgs30iz1iTxju8 ProF/qEtzcac2gLFHrbeKW12wsrG1vrme68Nw6EdNvLCGz127v4rzT7GmpU+am4ezqwq VPaup7RVNVTpSoyhKpGNP2ahUsoQU/aVZuqqiSjGW41KaaktfZSpyjGnODiqntHe8Xdz i/cq8z9naLir8so2ILic3upT3Sz2ljDJZWVg0txp8ljfrJFFM2oWog3XsEsl5etpMkN9 Ku99OiltLdY7jz7krO8E+Grfwb4T0DwtaWXhjTrbQtNt9OgsfBfhmPwb4UtIrcFUg0Dw tDqGqxaFpsa4W306PUbxYFGBO+aKznHlnJQnGUE7RfLP3rN3mueXMlNWag4x5HfRK0Y7 VXFzlyawVoQfIqblGCUIzlBSmozmoqc1zy99ytJo/Br/AINhL3TtO/4IPfsN32q39rpt lby/tJiS7vbyOxtEkuP2yfj/AGlvFPPNLFARcXFxFbxRSsRNcSwoitMYxX73WVpdadp2 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 60CGC90e1hjjgn1W1ns0sGkhjeyWJlnH53/8FhNf8K2Pwp+C/hiO40wXGj+NrxbvwtBr Oj3WtWfhefww9rBNa2d2NQu9KEkVj9l07V5NPkjjuF/dmcq0bfpd+zrouhfFL9k/4e+F tW0mTVfhp42+EttoSR3dxpeuyy6LPHc6fdQzX1nFDbX13YSoiSTw6fZiPVLJi1tbkLbx /O5nh8mw/CnCmdYzBwnRlnVfBYrBVMZmNsZgeWrWU8PTqYt0KOIhh6cYr6p9XjHD4OE3 QnJVak/UpZpmlbiPN8qoYt08Q8tpLBY2lRwbqSxMaak4V41LV60YqE6cacKdRQp2nKMY QqVFg/Bj9qa1+On7POvfHHwd4It20S1m1O1uPCXiXx6smrxWmgxyXetQa9quneHBHo91 ui22ukRx6laa3DPvOpBZHieH4v8Ax41fQ/2Z/F3xS+JnwH0V/DOn+CI/EF/8Om8WWeqP faJdSabDpFlqsNx4dXShDMLkSXEcK3K2Sw2rRebMTHb/AJsfsffAP41fCD9of46fsov/ AGzN8H01Xw/408WateaZdLoGpeDNJvTqfgq/0/Vxc28g1fxZJZW/h+7sP7N8mS20vUro 3BjSSGT7q/b11bQ4/wBlz446BeeKln8TeKvCWqWPh7TLq007TJb+6gkt9UHh7R/Jt4Jb 1Y1tZJ7eyzNcNK2S8jPHjrq8P5JgOIcLllKgquCzPEYPNcqlCrjac6GAxU8LJVqVWOKd L2s1SqKtXrQlP2N4xbrckqeWHzbNsXkeYV6r+qPLoYmhi7LDNYjM6Tftqs6CoKK92UY0 2pzU5S5rNX5cn9mb4y3Xxf8A2V9Y+MPwp+F/hH4a2Pgm/wDGENt8OJtUuYfDy6H4Wsrr Ubu40250zSLZRql4bdxGjWP2drhnMs5IZq5r9jH/AIKA/EX9p6Lx3pnhH4a6VpHiLw2u myWMd1rl1PoKWd+uxb3xFc/Z0kiQ3WLO2tLEG6uX3EMiIWPkH/BMzx34X8OfsSfFnwj4 31qPRdaFz8R49P0XWl1S31EWmuaDPb6abOwa0eT7PealePFbrCojku5n6OzMeW/4Ir2l j4I0n44T+MrDxR4Ovo7Hw9q2ry+KdEvdJ02fTbS7iht5NEMtkt7evbh5G1O3ZJJVYxNb xNGHZfSzDJcojR40q1ssw+Mnl2aYGnljq1cRKtOliLfWJTlKo1WXux5pJytrzSTlpxYP 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 2BtrZYLa71G6KarBYJPFBZtNMzTTmAyXEaLmOC1c3dzLGLeFJ2IjaBdI0uZDcrG8tyrA JEjLHG1uYpjIWClXa4ExhMI3CMqHWQElSI4Zr9NPtbiPTZrSG7trW7fT7qLZeWZmiaR7 K+WKS5RbuMvCJTDcNFFIJ48zYWWsY4iEqNKnSjDlpYmrLlSlTxEZVIUnLnfJKlJVeSCh KPPKm6MoyUFKnz25VVPEOEZU58ioxliKUK2HknFrnp0lVjJqmqjvLmpS9paVOTnTi429 J8Pw2IM51RTPJFLFNbW9xctNaqQFSaQTRSQL5+W+zSrl1eCRmWMqjNr2U6Fns4tS1WS7 SSNbaSQWN1bbSriR5LlWtJIXVzGoQoY2RneSeLywsnKW+pHVXuYb/NjHDtiW2S3uD9sf MA8uK5UAM4in84yuY4Qsc0Kym4QQtoSeH9NgSG4MOswwzzvCot76B2MsMaSNvheZ9QWN kkDRybRBKI5ljZzbzrHo6c0+erTTk8MqnLDmcowiuR1qrpPmptTvOPttEpwk4SpThzaW hTUWqr/eT92dR0VJylOVqHuQguWMr0qUXH27pxg5zqVXKrPodTtL1JJopL+Z5IXaCQWy W9yjlGKuYrqKaeKSNiCUmhnlikQh4nZGUnOhnsbe48mY3YlkRPmlJfAhBK7FDlEOWbJj VS2RvLbQRquxFxLewfbbvdZafb3Lahe/aPs9vZRrZQtNKjQRWwYzRQKUh3tELO3mkmki DsyW0up5rhTJo9zE1nZPDNCyX8VoZ1tbtfKns7oA3ixn7LeRyLIbWQ3VpPFFeQsY8YNc tacKlWNGq/ZyhOVNSdNONdUsS4VeSUoyhRqQhyyhVcY1Ics4RguLC4qriKcHUwkaWKpy pqvhlXoVqmGr1I0HJOdNypc9KhiY1KyjU9pGEkqarU61GrVzG13T21CxtoYZ7x5WdpC1 +LLyvIR3TzNx3EzSRrGiKGYs65G3OHasNY+S0lhOoQ31ubi6t90wZWeeQvCJd6hwqokv mRBEPmlB9yoE8I6VcqJpzd29wl/5/nxLJa3EjWl0pEMiSeYrWMzQPhAqme0uXIlAkQp2 FrDFZ2kfn3aylYwHupVMTu65VgsWT5Stjd5asyjOc811Tq0nToU6FNR+qvmrRhze0qVJ 1Evb1ZTk481Fyp0acaM6KioQkqfPPFVqnTUoxo46FWdKUcU6UsK6srqUPYSlVdL45crq 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 cMPOMMVhJ1IxeIjSl+g/xZi1jTfiZ40s/EVh9l1ZNaZ7+MfYvnmmt4JheFtNLWUjX6SL fedEVaU3HmTRxTtLEnlF34j0WwmngluCsiQG48p2LyOFcKViDknJLrkgcblU9a808N/H vwX458K6T468O6zqD+FfEENpHpdx4ntLuO8to1ni0az0qa61Bba7uTaXKQ6Pp9xdw295 fxxWxktoppzAOsu5PC3iifTbu8nh1HUdMsLjSdJuLqdw2k6dfXi6jeaZpYupWks7C71L /iYXdlaeTb3OoZvJY5J282vhamU18DisRQzGhiYLDYjEYedSnCVWlOvQnFVIwq1JXlBS lF83tKs+SdObcnNM+4q4pYiSqYWvQrzqyVWq1VlKChVqSftKVRuvVrxko81OpVcHVlzx c3y88pRqVrrs1+924h8y8K2ZE0011NAba0kma9SaGEW92t7NcxtDFJcxm1W2upLhZp5r e3g0+O1tb2G1hvorP7SsEzXN+8cKWvntsgS5iD/aIw371pNy5jEEgbaTHmPUfDM93NPe TahNNNcTS3FxceX59zcTTu0s8091cXMk080srO0k0jM8jlmJJNZDaVpsJAnvblZMqNpt g/KgKu4AkjjBBwOueeS3ap5dKrKopV5QSpxp0+aUYylD2UZVK3N7Sc51VGpOcI1Ir29R TT9lB0qmFsT7Op7SovrNRVHGtCN4Up1JSkm4zu6/soyjHV0/ayhzyjFSdI9Ljm8qESWy tfjGWKMqoBk/PkZbB+8MjvjpWzA+p6jpV9fWT28dpZXVpb3c0tzpYkiuLix1e9gjigvb yC7uomttG1AzSW0EsEVzHZ2k7pd32mQXXL6WYrCNWOoQrCIsAbEhPructyQMgYx0qafx L4aDBZHPmkgPJbqNjHj5iejbuCcev5+HLD1Kk37CMa3JK6U4tvmhKEotqM46pptrmWtn d2d+qcY1adpVI83PTqQUo88IypyVSLceaLcoVIwlG0lZx1vpbOvdNurt0nudV0+PepEX n2drEvUgHekkiE9d2E6nBGQc6GnanqOl2U2mG40PU7C5vLC+ljik0W0vBcacmoW9sY9Q +zwanBbbNTuzc2UdwLK+kFpPeW1zLp+nyWsF/caTrNuun2FzI1xdTmCBo9Nu54Fk+zzX AS7mt0EdkjR28mLm5dYDKYofMFxcQwyYI8Fa/pGmaNpkejaJc6RZTzX1nBpyaVBKkLpY 6dJp+oXlg9lriabFFokEen6Pd3UUGmRy3V7o0No2s3l7f+vhKNOtTlDG1qOHko81Oi8M 58yjUjC85v2VlGXu8/M06iUL3ldcuLjKPsrYWniIyqRmlUcYubpKdanUoRnFwnWhXo05 U1KVKNO0q3toyoxjPSutU07WbiS2124urdFmAgjtr+ynskkRhJGZWSCJFZHAdXUyMrrk tvBx2GiCKxs7nyL+zgtYYxJGHuTeyXLfaIo2hhMMCrFII5JbotciKHZbyRrI8rQpL5xq PgnWtPnFhd/2ekly17aw3Wj61pGswrNZyy2k+290y51K1WWN0W4hVpJY7m0ls9QiWawv LaWazZ6He2C3Egh0+4t4xc2kkd80yxLPqdreJHOmZYpnuLWQy3loyStbwXdtbi4ieAi2 k6XhsNXw+Ehh8w9pSqzjKnRoKU48tSFCSqUUvaQlHEx5KcPZSnUlGnduNqMpYf2kpYap iKdSjXoYetiado4mn7GOKpVfq1al7SU1h6db6xS+q1eaalCtS9nW5XCy7628ZadJNc28 0rwrbSFPPmICSnZHNugwpEifvPLLrkCWOSMnfGwG6utabeRQi11LT/Oe4gUx3DuV+zrN Abo7QEAlktmmFod5UXKr5qeUCG8lg8GazLG8ixw42osbpPGELvlkDguSqmNJSuM5ZQMA Hixp3w91SaS6+1aokTyAxbY5ARGnmzyxtHGgykyxzrC06tukWGFiAy8zXwWVRdOdLGzw 8IqguSfPVlLliqdeokoRi06sJzdPmvHmjSi52nNawr4mUatqUatSFRwcVJ02nOl7eHLL llFpJ0qMm3GX71VVH3ZJety2M8F695Z3C2NhNcvK9vDZfa5oLZ5N+y3VpUa5kjhI8lZJ ozOQu+VPMZwSa+lr5UdxM8kiyO10ps5yjQBY3CxsUQpIirO8sjeYgRkAjUROZamm6beQ aXNYXl5JcmJka3nXz4mtxC6zqrMkyTtG0iDzkLhJYC8LfunK1Z0y6exe6ga8m1SOdNkE cypPJp5+0QTtPAXMZkcxRSWjC5W7t1t7qVlhFyltPB4idKn7Kb5q0KVWEYqTUpThGdOM ZTdfmhNO7cvae0lLlleNSTjGXTSp1oJRw8ql6dCjGlGt/tNOLpKfv1HUf1ivK3I8RKvX n7SFOLXLN1p1HWWteGb+9tZrq7e2nWWHSY/sNn4kv7RItavtLge/vdH0a31AzLZXCRS3 Gorp+oXGi6auoXKz2dld6mj9Lb2cqtLcWTGB57W8tN95pllcqIb6zls5zFaalvMVwsNx Iba6SCO6srgRX1jNBdQ29zH8t/tnXnjnUP2c9btPhz8U/APwP1/Qteg1xfiR4pv7LwTP pul6jarpWs6XZfELT9LuvFOg6vqkEMFtoL6VDdajCZNb0nQFspvFuoz3X5a/tS+IR4U/ ZT/Z78feFrz4lad460/xJ4J0XxH8ZfCC/FH4cWfxU0uPwVqr6t4g0nxb4s0vTdR18eK9 V02PW9E1nWNI1hryyll14W0I1O80W2+6yDgtcU4LAVIZisN9ZxlXJ4YWvUhUw1CnJVsT GvSwlVKtOFeaxLxbw1WvCFWtGX1XC3lPFfMZzxF/ZVTGwqYWWMVDA0q88PClGFGcp4mv TkqdWVWTqYiph/q8ant3ShRnTaUY0qsJS/cGbwFbXDvKniG5kupAzypqCwSW3mp+7C2i wJC9tbLDHFuhuHvJmuzdTrdLbzQWdpnXfgOWTRrmOSXTrpV1fSdQtb9b1II4BphvZnj+ 2faoDGGv205mtTFJHdG2ZZnRImhuvgH9s24uNW/4J9+F/i6up6tY/EWbwT8FdSl8TaDr Ws+Hr03PiGXQbjX52i0W/wBOsJZNSnu7ppZZLJmEUgt4WiRFROB/ZytI/E3/AATM8Y+L /F3iPXNY8QaT8PP2jbbwTLfeItZefRdQtIfiDJJdGb7TG+o61f6hHqt5b3mqG6/s3R7X SrTTUtrzTWv7v0MBw/iVlVLNXmcIwWfrII0Vg5+0pY6pJKFf2sa0W1CaTpqEXCKjbSPL B8uO4gjPHTwX9nVHyZOs4jVliowhONKVF06MoqErKXKoS0lzJyU229f2Z0Kd7GxsLOeZ Zme0tZIpo9/kymSISTIrnMcggkb7OskbFZmikkT92VrmPG/jnQoraTwxrWn2E8Gv2c+n Ppuv3EEcWuWl+stvPBb2U00cl8ksTPbSRRAxyRsUcCTfX5Hf8ExfjR4r0n9k74/a1rl9 qvi+T4Wa14v8SeHLLV7671KcRWHw007xL/Y0dzdSzTx2Fzq+nzyLCr/u3vbgW6jcFry/ /gmpq91+0b8SP2jPGPxlv28ceKLuD4f3wu/ERk1CCC21i48d2+oadpemjfBYWEy2+nQG 2tljt40sNPCrutIzSfAf9nV+KMbjsevqnDc8M1VoYd/WMTWxMoyoKlH2kFRivawp1JSn K0ZPlvG8XNPiqniqGQYahh61bEZrRnBxxNSlBUoYamoVpTlQw9OlUrVpU/atQp04c0rw hBcsV538FvEl3of/AAVVvdK8Oy3GleGH8YfE2fTvDFqt7ZaNaCP4GeOzZeVocihbc2cO o34tkktobi3N1eQSqhuJg/8AQP4V8R65r2oW5mu0ezKCTDBZBJEw3I8ZVskOpVlYEq2c xkxkE/gv8NG0/R/+CsXh/wAK2enxxNofxK+MK2viu7/tSPxHqegax8HPEjaP4f1tZrlb S7j8MyfbotK1WfTR4iuYNUfTtZ1fU7HS9Bt9M/od0uadZ7l5kvIooZI4VmuJomt7xZbe GczWwiu5HWJZJHt3W7t7Sbz7ebbC8Hk3E3o+KdWhUrZH7PCQUVwlgZ0quKrUvaQwssZi qVOFOk/ZKriZTr03KNJSmpSrVJQcIVKkeXgqtOGHzT2+NlQoUs/xuGp0XKrWjGpVjhp0 qEK82qdGPO6kFGUYxq16tNU5KpUjCp0Ws+J9KtntIvEWs28H9nW9vJp/9s6mtvFaW6WA 0iAWb38xt4BBpdnHpqRWsweDTIbW2ZIrUwxjF1Dxb8MbS5TWNT8W+E9D0X+wra80e91q 2tLS08Tvql/BaaP/AGN4g8w6M97a6dp2sX+p2SS3TPFJa3E97FPNZRat+TH/AAWx8O+B p/gX8P8AxBo1joeq6/a/Fjwtpd34pn8O6bZ6/Pp48C+O5rrRLbUVefWX8MWXiGWa60yG 8ubUXJ8vWbrRdIv7p7Gz81+JPw08GXH/AAR10Xxjqug6T4h8cWfwq+DN9pfi3WtKs7zx JoFnH498H6fY6F4f1OWBrrRNC0rQL+70ZdO017ezvfP1PVdQW71zVdUvLnyMg4XweJyb K8zrZjjnLiXOoZQqNTC03yYzFyqQeY1PbVqkMVOFHEV6cak40sVSxb+s0qsJU+Wtvjs3 eDzDM8LhsvwlF5blGJzehXw8oUK0oSrYWvKjXpww7qUp1nhKUMTByh7enyynG3sXH9t9 d8Z/DTwvo/hjU/F/jTwjpVnBKsGh+I/FGueHrZ9Q1gaRfb7rRrl/ssMmqXHh6W/e7XR4 9509tTl2RWEtxGksXjLQNes9H1zw9400i/0SK6ku/tuiajZ6jZaxA9heWgtJ57eSZVW2 mu7e/YIyzxzWlsrgJIwP4b/sy/CrT/Ev/BNj4i674n/sHxTPZ/Cj44S+Gzey6f4gg8L2 uk+GPEs+k6bpBc3iaLq1lcRwXF60T22o6dqcZ0hnhs9K02w0/lP+CU1z4jtv2fP2l9Q8 PQjVNQ8HXes+IfDmg3E0rW8uvWvw5n1SysbKxDMoOpalYWsUsNvGrXczIsiuTiu7GcA4 GnR4gxizypisTk+ZxymLeW4enRqfWKvsJzhF1Ixw6TqVJ3jRclV/eU+WbUomH4ujj8Rl cXgYrCZvgKGZ0qlCrP36mDjh8XGpzQ5Juk6tNWUtK1KPsqtOVOc4P91/EXxi+GXh+VdO 13xfoEettaG/t/DiXS6n4knthsxPH4e05LzVo4n8yMLcSWUdufNQmYK2at+EPiZ8OvHu mf2x4U8U+Gtbs4LqWzu20zVLS5k02+ilkiay1SGKR7rTL3dC5ax1KC0uogrJJCjqUH4E f8EoJLr4u/E39p7VvizPqPjLxFffD7wP4ZvtS8STNfasNFupfEuhalpJlvhLPHa/2ZpG l6bJajCx21nb28i4jWNuRs/FOrfDT/grF4g0XwLZ6o2l+Lfivf6T418N2c7TaNrvhXV/ DVtqWpi60+2gDxXGjamNU8UPqT3DRw3Nlaugsfs1xLc9Vbw2y+GY53kWHzPFVsZlGWxz P2lShRpYbFU1h6WIhGnBVajp1Z8zhFKU4pxs5zi4tZw43rTwWW5xPCUZYLMcfWy+lDmq RxNOUJumq0koOLjL3ZThJpR1UG7a/vb4h/aa+COj+JYvAjfHD4QWnjm81KDw7ong7UvE mn/25qHi7UdQbSdH0CS1sBqmoW8l/rLx6aX/ALLnuLaUyotnPLbSw13Hh79oP4FeKfiJ rHwj0j4s/DnxF8WdI/tBtV8E+H/EujvrltPpoeXV7W30qwnkhe70YJJ/bOk6e811oIhn XU7TT1gkWP8Anp/4KQeLobP9sf4O6TpdvpPhrQr/AMPfCuLUtdfQfDMvi3SGufi5Zaje 6xpPji40qXxRod9ps3hXRp9Jv9P1i0vNHhl8S2VjJY2XjLxjFrf6s6p+zN8BtP8AjNqX 7RngvStRX4xaRoGlR+C7d7/VNN8J+F7jwf8ADDXvhrpGj+H/AAxa3FrYWun6v4YvdM0a 8sLoajDE+iaW3h4aLv1oa7lj+CMioZVlmKxWLzCliMyyrE46hUhGHJ9fi8LhqGEqv2/7 yk5z526NP28FVq1JKdGmpU8Mvz/O6+ZY/CywuDxCy7NHg+eVRylHK6tavjarpuGBoKjU jShRw6pVpzpypYbCyqV6mLnOpX+vvEnxn+G3g7xGvhObxRZ6h4+k0+51WH4e6Q39ueOp bO2hgmaZdD017y+trU/a7NTe3cNvYwm7tRNcIJ42bq/ht8Tfhz8WdK1i48H+OPD/AI1j 0jV73SdWm0WeD+0/Dep207JLoWt2DE3em6rY5FrPb38UUxlhcmOI7oY/5nv+CY/i/wCN nif9oT4xXUfjueDxVq/h7VPEXiK48YeHdS8Zte6tq3ijQzr93FpJ8SeGRY6petpGhxXt 6Jmkms9I0nSpLURWFkLb9VvgT+ydP8Gv2ovHHx6v/jrqlz4p+PB8baz4m+Hsfgy30HQ9 ZmvtesPE9/qEMf8AwlGtXUkXhu8uTFZSzpK1tFq1xarKv22fzOXPuA8BkssThq+ZyWY0 MMsXgamFVWdKvz+9OhKl7Kc6MFQVOEJ1akpqaqc9acXzHblXFOJzT6lj6eWqjQhiMRhs X7fFO1Kn+4isTOUlQw1apKpQlWUHhefCRr1cPGtVg5zqfpzB4c0eGLykkWRIkRVW5tYp pEEACxjfKHd3XYAZGdnJXeW3c1VtNAhvtQtYl0+K5jaeBdMtLRJI729vbg6haNDcQwOf t0FzDc6dLY2aW4liv0dpPNkjt9sK6ZqWuXCwWvinTLRnG6GJbSZVlJz5iy3MuxVYuflI U5DEluAWtaZ4RXSFvtXubPxE1zeaibLULzRGuvJuZNN1Cz0+W4VS0DBbOfSbVxNDsjdL Jbq2edWR5fhKdCqqOIqzq4ipzVKSlVl7Vum6qquVOTclCE8RGEpc7U5/uZRirSmz7DEO inCFWcGlGeLhCHPPnlhKlP3v3bS5ablGtyKnOVSf1dw5UpXqDw3oMd3Ldf2dE1w0c8Aj KmRvLnhmhJUTzJEJIlnkktZRh7acpcQmOZFkqvLo2tJZ3EHg7QxperSy2b2uv+INEvfF mjxRx3tu1+tzo+jeJtA1CWSbT1u7Szl/tuzSyu5La/livra2fT7r03S/Dc15IDptpqUN iI0WO51CX94GDOcqjPc/Mc8hgGAABJAAHpGnaXr9qx03S9QMV8p0q7ml1Tw/c3+nf2c+ ohb+3hktLnSInvriws7+2tpI9QlfSbmay1K+069tdljfc+JqYnAzgoVIY54KpRqyo1uT E0aVRSoRq+1w8qlbD1aFOty05qop0sRCKTpzVRUnVajTo1J1VSdStW9lhpKlKlCtVUZV WoQqTq0oyVBVcTWXLU5lBVZ0+aVovx/WBaaTIAJb2x0rT7lYNM1XU5LayuMXMx0zT5p4 b2fU2j1W+S6jhlii1PVXNzeS2f2q6Lky8VqUfhq9vbpLi21LUzEqul9FNIbeSWaW4EsK JcTLPF5X2eGVvMs4IXiuIBCXeKdYPuUeGZp7c3BEMjljlpriKBwokZ/KUOkiGML+6AcN Ls5MpfL14P4o8FG5utRuLa8S3tJZreaewEUqRGeCOWKKcSRE28zp590I3DFl8+YHYzOt d2UYnCVViaWLqVMTiq9aovrf13GcsalKpTq08VTw86FGM3iHVx0Kkq8qlVrEOp7HDTpX xXHjMPVoUsFLA4SFD2EMNQp4Oo8HhKCw9aphYYik50MJjqqrYDA4aVTC4XC1MPhcRXpU KNTExoL2+H8CtClnlbaxtljAxEtwiOUAwMnGwlmYFyCxAJwuFAA1bfUtUjMzh08yWMLE qIAsMiuj+YkXzLJvhimhEefvSNLnei16HaeBrOIXE3mzXDGJ7t7a0D3d1cG3tlDR2Vmj ySPM8cCxxW0CqZpzlVMsrM3lX7T37OP7R3i/wtp0H7N/xK8P+CNWt4rg67Y6tALTU9Y+ 0yQjTxp3iF0uE0VoFFyk0VxaGOUlmEgZvl+ihg8udajh5uMYYidKEcTjf3NCNRugpude dT2VOjGrVgpV61SnTdOcZ1vZqcoRISmoLljJNyjFc9aFOLktUuapJRtaEm7u3LGUpPlT ZuXPjifwfZRXmseIdJ0e0giCy6h4ludK06GRoty+Z9pvGs4Hd4lR3A+dpC5VQpVR+YH7 b/7ZF3408Pw/CnwHqlrqvgPxFbatb+J/iFpFjqUemah4p0OXSNWtfA2kajBLpOn6qLW3 uNMHi+3muNQt7bT/ABZo94LCeW20/wC1fF3xy/ZT/as+H8V94n+O+h+NNY0q3e5a98TR +IpPFGhwwJLp0L3dyLOeT+z7CSbVbKCC9vdPtLaWZ5YYpS1tPs8U07w/oN1pkiwS3kWn W2o7raJ9TWR4P7QiBWdLFiiyzSxadbJLfWcKIv2aKO7wHsVHvUMoyVVY5jOFDGSvGdKN GlNUvaxlGTnFUXFcjSlKUYunDlTV1pF+FicfjYw+pqrPDxknSjVlKnOdFVFy05c9f2kX VvKnGl7SFTmm4XhK7ZqaJ4b/ALd0abVrzUrK2lstT0OKHT4NRu49S1M3S6lfi/gtYoJb K40rTZNHgstaivL6KSdtX060Wyv7O51EWns2m/DC4sRbTRXUet2kvh3S/ElxqGhXi3lp psF9eDSrmw1y22Qaro+paNrbJot4uuadYQXlxcabfaDdavomsaNql95To1rZWkiqt1I9 sG3BriEK5yc4DKYiO/y4G3OAABivdtFutGitjBpmr6zYf2rpsdr4hiaSWw02/hXWUv4t Hke01Z59X08S6VouryC9tbKOHUo7f7PDLNpkN8enGYvGxoyy9SjGjUxlKpTeLWIpwy/m rYeGOr0oUPaSjVqYamo1YyoVvaqjh4Sp+0o0qsOCEZwrQqe1lUeIxKU1HCKvz0qWCrSh QjiKSpfVaf1iMsQsTi6k6TqVZ4TWeIwipbWi6RYpbT3zS3ENvaPextNfrf2bQvp11NBc zjz2ikjt1e2llt7xEMF5arb3EDzWb20o+ufB+qeJNY0I22qw6d4hmTUdI0jRpU12yttW aO9uALma8s9Ru4bm8g0uwS4vWv1Qm5FounIZ9VubVLr518NaHb3cq28XisafHdG3tpJ5 4TdwQo9xbl5p/JikvoIIsPO8thBd3ZSM2qQyec4Pvek/DL4iw36X0+pWccVnFaWaXts1 mbS6h0q3hsbOSyXTVWC83QWsbjUVBkvpS1/c3NxdTyzv89m9XKXibYe8FTrYmtCGOxNa tGpg44qk8Lh6lSjg8DLEVlSVSli8XSeBk1Uw8oZdhpc06vrYOWK9q217Ok6sJKnUtVq+ xeFpqVP3IU6dKUcTJyfLUxsWoytWXtlSw3rMVrqmn6VpiS3C3uqIt1YajFJbSWVmz2EV ii6kufNhhh1a4mvGtbaO4uJYY7QvI5jmgd+N1bS/El4JQy2cUbHaIkkjkcowXG0HLdwV xgtkZ7iu1n1DVIoIzqE1hLO03kstxE4l/dQQfvSiptSOXdlCWOZUlxgAVwWs6cdWh2f2 rdaZePeW9wt3ZeU+20hv4rmawNrMrQ7biyjk06Sc/vo0la6hKXKRsvg0qlSliFiK0sJh ZSr0qsU8N7eFSjiJSqwrxp08POh7BUvZuVKUU+WcYxw9T95Cn7NRe6owU6ko04zg50+T mqRjGShyVnByXP7sZSvSqpc3tHCUZyybzw1Glq+prHJDBFDY28/lxvcW63MVp5W6aaYy mOXUZLK7vRDvEasZ1tYkt4Aifn1+1hD+zJqdnqtv8XPDGixa6dE0KLw148PiiLTtb0zW NXuPE8OlQ2nhP7Y11r+k26+FdWbW9Rh0a80vRprzSLXVtT0m517R4tV++NS0KGOEp/be p28O4LIq+ZOJJDI6xM0UKt0E4QvjbGhZ3IUyNX5y/tc/sl/ED46ap8PZvhlrGkNq+hrq Hh7+ytc1b+x9S12bWtS0pdLh0m3kle51meK589ruO3gmmtkmS4lV0dcfX8GRy2pn2XVM wzPE4KOInJU8dh41cDGEnGvKVKnUpwpSlBTVGg6MY1I+152puEYQn83xTCt/YuLhhaWG xMqLpV5OoqldQhGVFzjKlKpSUXyKvGMuZQg3GSU4xfPw3hDxH8Gvgd4avvHngj4D/EPx jp9npVr/AMJJKfjXp/jLwxfaJeW32m31K48DaUuv6ZYfbVubfVLK71bRrCxgiZHijkjb zpfJ/HP7Xv7B/jfRpZX/AGE9W0rxQEFudV8M/EweDtBvbjyET7bqGl+F57DTVkcqslw9 ppKmaTzG2xmQxjzDxf8AB/8Aaq+F9tpeo6v8Rtcmn0gEWdhoN7ePcaRJpE0hgm0zU9Ys I5YjYNFBdQ6nYQiWyuEDQ3OYEuH+cl1LwB4d0Kew174bajP4rlEyafrLeJ7C6gtkXDO8 +g2Oh6TFcRM7BI5X1H5ZI51kWQqK/b8t4eynMKtXMHjsXm9T2sPYYzLs8x9KvBRlJOli 6VTEUKbpwh7O0qSlzuUk6UFFc/5TjcyxVL9z9Xp4GDTc6eKy+k4TlezVOPsZTXM17s+e V0+aLaab/sY/4NGfH3gm88Uf8FC7rQvDWq+AtLl1v9iaeez0/WLzxL4ftbO0g/a8uDN4 h1XU9Ijk0HRrW3tJJrrVbi7tbSfWP7EsVvUN09ne/wB2Vvc2uqrb3Vlfs8dje30cgtJV 8m4ntHv9HurS7BVzJFbXazEorRst/ZRMXIieN/4Vf+DTa20nXr39vzwrDp3h2/0fWvhf +yRbarqMvgW7tdB1m41LVvjzNq+g+INM1xorbxPJ4cHiL/hGNbjt7aHw/q0Fm6WN1qlj e/2pe/3QXeh6Tr+nwWeoRRXth9r0PUrf7LLNZqZ/D2p2Wu6PItzYXEUskNrq+n294tuJ TaToGtLmK4tJZ45/0fCwws+XD1PaqlSq0H7SjOFf2FKnX55L+PCeLxCqU/a2lXpU2rUq k5c83T+CxcoYjETnKUuWpOhV5VQqUXTiqdGcYKnV9hV56M1LmjUp04y92CfKrytahqsu n3+g2aaRqeoQa3qNzps19p8Uc1tobQ6VqOqxX2teZLFJb6VcHTZNLS8hW4ddYvtItGt/ KvXubW62nWLTpctaxNcRXjX8cpXLpetYNpbXKntMdPd7PcOfIZk6E1kaPot1YyxTX2sX OtPaWtxZWM15bwxXcMFxfy3Mnn3EBX7ZM9rHpVnLNLGDK2mC7ASW8uVOnLFp+u6VNb3E CX2lavYzW1zbXUDiK7sb2FoZ4Li3nRH8ueCR45YpUUlGZWUZIraNeMqeHi4+wxFXDOpU w9SpB1G4VIynf2dSpGcaLqYeFSdO9OM3B6uUZT4aanVg6lWhKHLVThGp7Ofs2o2i+anz wi5uNSdP35T5G2+R81KnX8QW2qX2i6lY6Nfz6Rqd/bPY2us2h08XuiNekWsmuafHq2k6 7pNzqOjQyyapp1jqukX+l397aQWWowGzuJmWzd6baX1xpd1cLOZtGvpNRsDFd3dtGt1L pmoaQ5uYbaeKHUIfsOqXiraX8dzaJcm3vkgW+srK5t7ygKAqjCqAoA7ADAH4CuU8zX9V 8QTW/kax4a0Xw3qVhPDqEdz4buIfH63Oh3ovtOksJrDWr/T/AA1pt1qenyrfRXvhfxRd +JtBnt0iTwpF53ixqnSnP941HmSs6irVKSlQVSvS/dwhVjTqOouWFb2cL1fYqrVjGFOU CtPlVOMoTrRnVpxhThQhNQqX53WnU5FKEIKnGfNXreyhKlFYeKxNblrvi0KGbxU3iV38 SWlxplprGiwWkmv3MnhrWLfX4vBl7casPD8epXNkLrTJfDFvpmk3N3ZafeaZJP4tksbb 7P4ovr7UyrOqw3er+HtfsX1DVfB095Za5psGv6ZNor6vosbx3VnaeJtJk1G01zREvbaM x6xpqazpeoWkMywx6tpVxGlxZuVl7XFyp0vZ4fHY+CjNwk1RpyoU6lapWjQdKq8NKnGm 60lGLpe0trWlOvKc59CeBjd18XgsBKXK7VYzhOu1GMHVm6dKcqk7RjFzqSclCMKcbU6d OEf5Gv8Agy1hluf+CU/7Q1vBd3GnzT/t7/FmGG/tUtZLqyll/Zx/ZXSO7tkvra8snuLZ 2E0KXlpdWrSIouLaeIvE39Zs1r4g1fU7h9R0WKzg8KeLNKvPBt5ZePPEFgnifTbnwzb6 frmp+KdI0bTLG0K6bN4g8U2emeDNaPizQdT1DQ/DvimS40XVjplx4Z/kz/4MrZm/4dZf tBxQJ5lzF+3x8UZkjlEsMEjS/s6/suLChuhDLGN0kDiXylnlt0KSSQ7ZYRL/AGAoxZVL BQ2AHVG3qrj76B9q7trZGSqk4yVU8DZVWpqEJVISipSbjBxjOFSMqUqcq3JZpq/NSjUU 0t0oVJKcSTn7FNrkpVnVlT5KTVf3OX2Vabg63slLkrQ9lVpThVpxcKijOtCryGq6rb3k t1Yxwams2k63p1nO9zpOp2llcXFxpsOpxvp99d2sFnq1kttdxw3F9pk15ZW+pR3GlT3E epWd3aQfwF/t2fFm88Fftv8A7WEOm6Lql3eaN8efGU9vY+H/AA/Y6ldak82u3k73c01z ZTQ2rStLFFJc3UsStvDhyEr++n4h3mnadoBvNU14eGbNNW0JZdY8+wtRHLNqtnbW1pJP qVreWiLq1zLBo7b7dppEvvIs5be8e3ni/iL/AG+PGXj/AMAfti/tG6vp/gvwv4r0E/FX XUktL+wW31CaCa8Ro0/tO+updORzcTR4NwsJJdXIUcD8i8Xm3w5DDzwdPHuvmmDpqjOX slWUliKtOManvyo1KfJThKpCVKVSEpQX7qrVpv8AWPCifs82zOtKt9Sw9HLPaSxVXkUI 8koRrtzcoxtT/itziowhUgm5uEqi+PLb9tv9p3w7d2Wl3n7JvjHxv4X1CG0vbBfD174d 1RZ54Hje3k1JtMvlh0ea3uUtJWt9yEMPKlHLI/198LNO0X9qTwjLL+0R+ylp3g3zbtra y0fxdoWla7qd5BcPIkHmXSyJLGmd0ku25d7e3DzhJBCEb4Vvv+CiPw9OmTRaZ4J0m68V x3v2FPDGjajaatLLcLKY2gzprLb5jcFJTHJncgZF5zX058P/ANsfRdes9LtvFnww+IPw 0ZIradvEWs6Ve2vhi3uWiTd5zPdz3cUSSSSRLNFGvmgeaFjjYhf5T4hyPPMHhXPB8KQ4 dnRrzlDGYXPKtGvOMVGM6lGFXGezruoqSvWp0XKo40lGMvcgfvOCx+BxGPUMRm9PO8NX nOTisPSqxoxcoexpVMRQpVJT9rzzcayhClCG65WpGT8W/wDgll+z/rTy6t4I0PxV4QvP JTTn0bwx478ReFdOdFu7a5hFolrePp0duk0UU4E1lIPtVtASAYMp8S/HT/gmT4XistKv 73xT+2r8QdNhSW41TwXoOj6B4xstI1fz5YX0zwx5NpqwvdPf5xa6tHY2iwW4jVYGjlV0 /YrUPCOufEvTV8ReDte0zxBp5t2hkuNG1uXyEnkXcsRuJQvlM8ThTDImQSxYOSK+fNQ+ GXj3wTqsuppf20Zvre4s7q0vrWfWvJtpZrS7/wBHmkvZbC0vw9nDG2pW8dvdxW5uLS3k jt7q4hl8vh3xE4uy6MYyz2pUxFCrT5KGNdWVeMIyUa1JVZUp6qFuWpJKsnGMee8nUp74 7hvKsTSgvZYaN5N1HThSVKq0uWEpx5+ZKCnNwjT5U20rqCal+Ndn+zt8Dfhx4k0xpf2M P2sdA1m98Q6RaW/iT4yaZ8R9L0Pw/p+pPdR3HiOSy8E+HvGHiTU/D+hCO3uNVbSvCmqe JbmKb7PofhjV5nkhtZH+N2tT3I0XUPgZ+1F8HdGt5BGdb8LfD+bxW1jp63CF7+XSvEtj 4Yu7spBHEIQxgdD5gkQSrG0f7p+Bf2jNW8GSHQPEngrR/GOnXZ8u5h1h9WuVCWEbOJoo tTurvTw8YY3Bge3htoYiWVo8M1ew2HxT/Zq8Zafqd5caVafDfXVli86zhjspdL1SGJ3+ xXMZsLnSrS4a1Es8s1rOyvbCd47R50LO32FbxMzHE0o43M+DsZm8KeIp04VKud4+usQ/ aKVb2eEnOtCm4UnadPCUoQgvZKp7KVT2s/Inw59XlPCYLOKOB+sUaiX9nZPgKKh+8nNY irUoUYWrc1VQofW6k4ONGMKVOSpVE/yr+GUv7POu2Om22mftIat4y8TXqpAfDnj3wHff DbxFCLOSO+0+PULDVfDdnYzvG16yQx6bqV8mJ8yAbSB8Q/tC/s0fCL4cQ6/qKw6d4o1X xFrcuuXtlrWrR6tqutSWL3sMFzC7vb3tt5Uus3IMKSxWhjESXEUpit2j/Wf42afqHhuS 81j4S/tAfDjTxq1yqSaVDqGhWviOFisjySiLxV/bEMNu0VpCglgmRUd4rdWT5N3wl4b0 X4Q/EDx1ceIv2gfANv4s1kyukvjyTx1a3E2pXAvHmP8AaXhyzFhDLNdknbc20O2ZmImd gS1dvCuY4nDYvEcRYavm1LA16TqYnL4eyjjnUU1KGEgqWDy+jHCUJN04yipVnGEbznOU qi2zTD050KWCnh8FWxE+bDwxuIfsqVOpXXLW5Kf1mtUnPEUpVfaKom5c0lKM4uXN+Suh iw1vxx/YehfDv4O6PbaxImm6XY61Ffa3fW811bxxB5pbVpBG63AkmVZP3dvJNMiny1GP 1N+EngH4o/CvRLO60uDwBoUOnx28c3iLwqdfi1DS7WO5zdvDJbzW+n+cNkZVr+2mW3Zn kDiOaVH+6vCcn7O9pd22l6X4b8DW+mJararaXuk6BDPBaRFYEt2uGYTEGFUQSG4eUFml 35zXZ22kfs+udU0PSLTw3Z2utyx3d5YtrtutpDNZpbpbyWOzW4Eh2NbJPJHtZTc7pyjy M2fR4l8SJ8Q1FgauR5rhcJCVOpVVXL6uOqVaLqwjXnClLGUqNOpTw061aFF1I06tSnGg pQU1Vjw5FwxHLnLGyzHDYmpiYc9F4WrQpYR06sPawdJ0aCjKjNuLpuKsqbUoqyUX8peP fhH4n/aStBPrXwv8L/GPRbO5v9Psfidqfg7wnZeM77Q442tibXV7U6lewTxWkqyRqLm4 Ng+zhmVA/HXv7Pmk/CK10HXL3wR4m03W4bXSvBqalrVhp9sgWwj1UaTo/hWXZLriWNpp Rs7S1tIb2aBJ0vrhUEV79ntvs34efDvxB8OtY8Q+JfAn7RHhvwn4Tu7bUX0nwWniWLUF +0TxywXs8dxqFrp0NvFcW8k8FzY21xeW7tJJAzGFjCfnz9pb4kfG8aPa6FP4c1Xxx4Vs hb6lbf8ACIeFdE8QXhuYLTZPdxeKrPxTPDAJizzpZS2Uc8ULYYMqtIfDy7F8SZi6GS5d XxWJyanN1pYL2mOwTf1ihSjXVFVaP1R1ZUowdelKlCleGEqwpVXTh7H6TL6WV5bm+WZl mMVz4SftKOPqqlOnTxUabp/WK9GlLDzlKtGrzQdOEoyabkqHs6Ln4hZ3V5cNbm4uWjlE GGunguo4JJreEGQRqW1GSD7RMvlwQSXU3lPIFaXyY5JV6S7vPIaGUXjNK1vD+7YwmJNm 5mYL5fmGSbzAkm9tgSKPYoIYt514Xt/Ffj/w/BrNveyeG4JPOiGna/r3hddRR4VCStKt hq99a26+bmOESzpMcf6RDbvuQdJH4J17RobR9f1nwfp8d5OLOwv9b8b+HLRNRuuD5MU8 uoi0MirjfGs3mJuQCNlLMOjF5FjKFSpQqU6Ua7ozVfDJUaqhGNWVa1OrRpqhTqclKn+6 w85SXN7CMourPDR/caHGWQu1f+1VOnGVOFNThOlDnjenKrZ01XrKq6qcqk51MOqdOnUg ouNWtU8a+O/w08YfFvWfBs+k+NLHw5F4Qn1TVJLfUdIOqy3Op6tYy6TLqkYdhGbm30+7 mjiiuVKfalWdtw4rjtYuJvhJo/w6ufgrrHhrXbz4e2OsfCe7sfEmpPYaffat4vXSdZtv st+IvKbVbHxBb+dc2sW5JLprm3DN5Oa+sr/4f/ED+05nkn8ESb7ZpkuZPiB4bZrwMo3t vOpM05cMhypMnzBgcc1+c3xA/Zc/aLiuNOtE1rwtZ6F4U8Ya14h8PSr468LyWVyL9pNU 0vUZgNW3trWh39zI4eXnyhD5SAbi32/CmEq4/D0sFmWLoYTLcqj9ZwGDxGGqKhiKeIVb DYuLjCk3Wrc9SSUpygqcXWjGpzxhTf5Rxtm+U5ZiHmmQ0o43HZrSdPEVsNiJtYWWBng4 YJYb3fZYDC06eGVObpwlGr7OmpQjyJS7608J+NdB8OfAHwrpWmeBfiCnh6fx94w8XJf6 mklpqeveI47iPXby2sgko1a10WHUtQu7gI0ZZBsM9v8AM6+W2Hws1GT4h/DS68Da/wDD DVviTY6vqniTxneeINa1WPSbKLW5LuLTbfdoMGravJo+lm/vDCIILq+SCytHSKeTELeU XWh/Fnwa3hDTtI1jR5LXwJc+LraK6h8VeHJ5LrTfFFzLLfW95L/axYZgWNYo40kdpHbL KFKv4H4d8aeNfh7JrFjpHin+x55EspLe9trm1vbjTNWF1F9turLzpYgstxaWxt7uaIXU DwxWsc8TMtvLb/qWW8N42tg8Zh6ObU40sTTx1WMYYTESpY/E1a2OWGePoe19nGjSjj8S 8NOjQlVpvFVIVVUguWP5ZjuNsplXwPtcqx6pyeEoYjGLEqeIwE8DluE9jVy+MqbpYlRx uEoUI1MSrQpyr1JTfLKi/wBojpnxR8VfD3xvomv6X4MsvGmp6ZqPhW3/AOEd1y81Pw5/ ZmsNHZ6hdX1lr1jD9lvodNnvGtUlgkvLdvs91bzw3ixGP1zU/AupXfjf4Ra0saTaZ4Hs vEx1EMrytNqWq6XpWkW8cdvNhJ7SS1bU/lZIVdeXQMsKt8Nfsa/FrStY8SeJ7/xB4m0K 1E3hbw2uu7bqHTpdb8Y6bbuLzXLXTZJ7Ryo06OC1vm07Tz9tvY43LgRtFc/p9Y+INAub R7zSdb0i5jmhGLxL+0mtkDBT8nlnaqnCt8jQynBUup6fzjxdg874bzb6jHDqnQhVqezx LwmNhgJ1sdgqMMZSp1U5yqOhGqrQu6kHNShCPNG/9IcGYvJOJcspZpTxMcRVnSw0HCti sLHGYqhlePq1sFPFxSp2nOtKs1TS9mv3ijUtzyPKPgD8N/Fvw8+KXxRvNWZbvwXF4f8A Cvh74XajIym4t/DUOqeIvEF7ok6xzvIraHf69Jp9pIwKyWsMW4O485v0C8PeL0imSwa8 j+2W9rbahcQq7K6WVwZreJ2GQNks1tOkbAlyY23L3Pz/AOHL6ylV5p7yEtFHiKVZLVLV 5F2lTs+0Cb7MMMDJskLHlUkVt9dpp2rWszhPtELL58QlmLobdASqecscbCScIuDtALFV CjsK/IuMaWKzzGV8XmOGjVrexwWFiqUo0pUqlCjh6EqmIpyjPWrSjLmpWotVJc8ZR5Ks JfqHDtPDZHlccDgpYj6t7bMcUpVISlUmq+JqV5UqMYKdWccLNunQ5HN1afI4SqxlC/1B ZeIjdzJOmBDGNqNMz4IIGSd7YBznH97qfWuxPi5YYtrXYyxVm8t0booG1myxIIGc4zjg mvlm31cSmVWvDKI8hVDiKGRlOAPmYGMFQGGRznB56Xk1i4cfupWjgLJiK2ALyuuQvmOD khSzAZ6AnsK/Kq3C041OVU6tNUHKKj7OUkkpXa91OM1q3pdO6W1rfVfX51lSkqfvx9nH 3608NFUqk4e3btTlLnjSc6kaM4RVSrGnTnOj/Gp/TI8ZabNbsZLvzSjAbFmZWYrkBMZw RjdudyVAO3bkCsHVvH+m6dp+qareaqulaZoOm3uua7q0sU7w6DodrA0l5qlzKkM0LCNY fLiikKzXFzPD5fmRi6ltfFbfUpHudO0zTbK+utU1nVf7M0zTzmCa7v7qVmRRbwJ+/wB0 pN0wDvM0YYmNm+Q+Q/Fb9vv4jfs4eOL74X/BT9k/x38V9X0S2afxZ4w17w54+0zSvEmq XCQw3+naJbQ+HZptTsIXma1jsrCaR7qGOS5hi2Cd6+l4P8OMZxDnH1TAYeWKVOMqs1ic SsthSw7nTUqqqrERjCrPll7KM516SqPlcJ6NfGeI3H2C4SyFyVaqswxVeksLTo0o1puU Je0TqpwrSUKi9yaSjNRk3TnSnacfiXxb/wAFw9W07xvcxfD34LeF/EXgbQIrjQdA1LXd TsR4j1bRHuLefU75528F6lJaxeIbi0ttSubCGZIpXg05281LSED62+B3/BW/9k74xwy6 X8Zfhv4Z+EN9A0hvb6/8OeHtYsNTg8iUu9vrNpYadOpkJjYwSxw3LMF2RIxbP5qfFXUP id8ZPEuo/Ffxd/wSm8EeC7K6Zmjj8C/DX4v+C7fWtYSaEOdeTRPHPhG3nlvVea41HVLb w7dXhu0SKewmMs00Pr3gaH426vpsHh7wx+xV8IPg9PHZRpFHrnwJtPECairpvtzdanqz x63LNdRwKi32pCWW4mLvc3MrM7j+3c04M4Oq5FltGnk1TA1adGGHrYihxlQ58JOnNTab qOpSkp1nUqVW+SMZzlU5Zc0pL+CcNmvFGLzPEYqtW9tLFYirUlCOWYjmm3aC5OWMVSVK EIQ/eTUuRU1FSivc/QP4g/8ABUL9hnw1b2fgvwr4503XfDd3b3Mi6bo3gzxb/YlhNPdI 8qTxRJa2SyXcrTuTbJPEjB2mMc3lPNy3wU/4KJfs76f8QNPsvhNpGuS+LvFmp2ujW9z4 T0zxPeaDDaT7YhPrNjeme3tUiBZ7qeWALGIxtO58180SfDP4z6jYpD4x/Za+B/ivytPl hgstH+HiaFHHBJNJcSG1XTVgntW82WQT+VKI2upJHwXMjye7fs8a74x+C8kVxY/s2Wvg N3eKMDSdNhmtraJpBGQbu7sZNQbbsaRvMuJlKdsGvz3G8NcGYHLMRLA4THYzHzhPljLP cDXo1ZOK5m3GhSnNc6vKF056q6Tsvcw2J4gqYqH1huNFyU3zZfW9pyxSStJzk4tJPdXT duyX1d44m+M+m6vc67qfi/4fQaZqGoyXaatfXt9LPFDfObiK32GwaCytIndQkLkeVEyp IziuO8U/Cb4nfEuC5tNW/aDh8J6LPBJdRQ6RaareaZcqFiYzLf8AhiKWbyo7VWC/ah5m yWQOjOgNdf43/akTUvD11o3jf4Ia7fx6nbeZNdWuhXeowRWzTGCVpzbvpqpOVDTWmJ0j XbC0rKm5K+MPiH4t0m38ISeD/gv4e+DXw/tr6Ym30/476P48v5r7WLvzJvm1aDW9c0LT 7mdjI0bXliYmllEZYDGPmsowWbZlXw1TEUKFDEJ/V6eJ+o4KpCOGi9JV5U6VWu6kYzUK VStSqqjTpxpU5Ro0qcYezjvZYWFWt7OrKrWmvaKE6in7rhVvKC9moRqTqynaDSnP2zq6 yk5+Z/GPxr8Bvg7o9vp+ufGXx/rPiHwvqMGoW1z4A0n4l6He+Ro9yl6L+Wa88LWenX8V sAm9NZ1ZtGltrcJfW7WlzKJPQf2d/wBu79nzx42uWfg/xV8Ym1+OO71ox+LLOy1u4SOy i+26vFpE2jXE1hqVxNvMkunzzXV7ZWs1ubcYjnu2+H/EPxS/bu+Hqapovg/4zfBzwzbx RXNlqU/w68Y6M66rEk5u7e1tdO8QaTDdDYlydLtVstMsoZYLQ/bX87zLyf5+/wCFp/tb XNrfazq8fxS+IkDC5j1bXdW0PQNb8D6QWExuA7xaH4ktYZokY3FvE+paPNIyI8Ol3uYi P3fA+HeAzDIq2GxGYYatWq1HL608wwcJU7ToSpSpweVqcFXre0o1VT9hBL6vCpiKkKzp x+MrcSYrD4qMUqlPC/u1ivaZTRq1FQ5oKDw1eWOVRSjKTVSXLSjJxUZSamnD+j/4V/tZ Tazo8virRvH/AIT8L6P4jurXb/ws6Oy8PxzxtdmC5uJdLu/FUmqW7afYI8kNv9g0+2ur mMfaZoIXZoPWbD9sb4MyazbWWl/Grwr4y8XCVtlp8LPD+sztHeSpAk8ZbTbjXbY2ccyA 27vNAxWUiXduRk/mJP7avh6+0RtG8UfC648SautvDFC8y/DzQfD89zZBlhutZ0WbwPrd 1PMsUt9aQy211YXUUV1IF+zSTSRja0n9rvxrqdvqMPh34beONL8O63eT22n2fhXWJ9G8 O6BdTyiaLTtGOmaFp9t/Z+niSGaOPUGmuESJJLi5dWJPyOJ8EeajOtUptXr1JUpyxGCo 8kVZJyxKq1IVYJcsnBUKFXmneM5R0NafG9L2rhKUKlPkhy2pVn76a9pGUORclRJ/Y54c kYv2t5tR/qGn8P8AjL4g2mpa3pXgzw5Bc6vGJob3UdWu4NWadnys2pWoj+2pMpiNzH5q hNrtbuoZttfnT8WP2X9IPiefVPj3q/xNv5jqcd5ZJ4An1HSdP0+OK/DR2jQXKGS/sLYp EC7TtHgESNtIFfjNY/tUfE74faodadvjjp8v9oSajPqF215ELm7ORJKtzJcRWMsjxnMS CERh/n2ZwR6/a/8ABVTxzJaW+m638UPiw0EUpnWDUZdF1S6gaSEwyo81utve/wBn7vIk FqLsqskbOmHd3bmwXhZxdkmJl/YmOwlSPJzVZUm3iVTav7OnVtXo83TTkeqdjslxTk2L cYYxuF6ijFVYulGPLyWqSTu1Bcye8n7srXcdfoP4zfsN/s/fFTxZf6s/xe+JHgy7vrrT NLktNa8HT+LYfDUEWxp5U0DRorPV5fPCyPdW2LvyJDzHEpeRqWv/APBCr9oK38GHV/hZ 8ZdP+LvgXX57PUls/Cnh2TRdTu49M/tBdNudS8DeLvFXhu/bU7KPVtTS3gSeS7ha/vFi iLTSb18EftZ/s3+I5bPUfEXxy8SaFret3Et3Dqmt2+v3EmoXltK0U91f6do732p2LTXU bKVdXZolElr50TiRvvHwt+2d8TPgxAkNv4l8KfGnwJaSbdV0bxje6v8ADzxNZQsPNkis PEuv6PpH2S6tUUPFpnifSZFRBEIp0Rs17+L4o8UMhw+GwGAq0qVTBc2Chg5YZ/v8PGpW rVE8bSoSp42rKdd0KVaeLqYiNGhHDzhKjCi6fHUyHhvM51sZUksXRq1KdRSvT9nhpJwq U4J8kanMqlL6xGVdTmqmtOcIU4wh81fB34D638G/h/4c+H3iyHWtN1rwvbXWm6hZ+JLe 28MajDOb65vCl1o0eoaulpNi5wRHK8skfl72K7FX2DTNGvdQ1Wy0fwt4c0Rbi/1OwtNJ 0azj1qWyX7XfwwpZafJJHfTtKkTmLTrbZK09yILaa4WOR7lO51v48eBfizqMnxM8LpfQ aD4llju7bTdQv7PXJ1Fqfs11ay6voFybC8iW4hmtjNp9xH8qMFMMoITDHjLSHlg36mun wTz/AGSK3uoWWS4u5xm1t7aV59y4CTFYmSeSZQMMnlsX/PsTmPEWMzaWJzHBYj+03jY1 a2BnPFSqvE0+SaoweF5asW5r2dBUpqpSfKlKEU5H2GW8saOGp4aviKcKNGlLC4iUalKU KWHVsNS9lWc68atOlCMFOVGnGMZ81KVBN8naRabPBcSW0lii3ELSxSQtDteN4cibcgUO rRlWZg2Nm07hgGnC+tTPDasYn8tHRwpj8qGPzGkbzZWBBO52ILEkAgZChQKHmXd3DKlj rr2Pnw3EC3dg3kXqpNE8MvlSsG8sskjRnAKsrFZAyls59p4RVxHbvcXFxDGju8k90uxg FLSNPKgQOzuD8pzl2VQAOB8s4UaNGs51mq0alanVpU37SDo0vYzVRVKc+WpBy9q+ZKUZ ezpyhzJtx3xFSnRk8VVjSVKhCNSriK05KNGMI4qLlSi4zj7VObpyUXCcqdWcZSly06VT Tn1DQiSklxp52ZX5lSQkZJHIU5HPGDgfU1C+l6TdCQ6ULZXmtQouTaxy/ZrlWgd5k2tD gvtlihTy5k8p3Z/3yJINCDQ9Fi2IljaRbVXhoyZC31Ziu0jBHfOcjpVp7RIg3kBEJ5yi qo9Qdo4Hr9f0PaU8LKFSlUhUnKFlTjecEq1KXNOrdpKtRlyOK5Z2lzvmjyrn7KUVVUnU pVI8k6kFCTnSjJ2aVZOnNOSU+WpDeNRc0ai5JSjPK0fSItJWWaTXIkuDIjFHCJHKG3mV i28eUVIQIgjbfucs0ZXD9IDZ6hxcSJewPGsJt4DC8QKs7GZCrx3SySbgjliYwsamNFO9 m5y5lZ94ksbK9fBJFxDG5YKAoyfXAwD124GcDFZsccTTLJL4WsbKPGDcW+rGwdiOM/uY XJH+zuB55qLTqOVWVdc8kuVShCTgkqatBuN1Zxvzc3Pq0pKD5VcW6SlBKNpLld4Rn7qc WnFyi3Tloveg4ySco83LKScWoTeGdP1Gb7NHq1vciRzJDaTtHaSGUhioRFITyz8qRxMk cYLLsKhQmjaeIy8kNnZQxwRtgsb2UtI7YUna5fgKd/BBLBlB24IOqiNJKiWgtFtwo2G5 1CS9mZiTlRDJbsETZglxOxLcBQME2k0zy5455ILASK4kR47dbjDIwdS6SRCM8gblbcjf dZSMg7VcTCdGKr+9WUbRl7dSnK8vaXnBLmc25O/tLziuWHwwgkpYfmjSjKdo/u6qjRqT pzp8laNWEakqUqbd3Fe0oubjOm3QrxdOU6Z1wEYtwCiPOqK8ZiKoksgjyEV8lQGf5A5+ Uj5jwaLizEYylxDHM8SyFgysYzNGGKEjAaSIPskU5AYMoJXmsqCL5SqXgCkq5RI1UJjJ IC7sDB6Ko2jjbgcVmXOmyXDeZFqVzO6Z/dhkjJ55JIAJ/P1ripVZL2UoRhGrRr+2jVtJ 1G0qfs4yTk6HJSlBzSVFSlKpJTlKChCN2nL7bScbdacr6LmTXLUhLXeLTTs4uLSb2b26 u5o7eKNGElnE/wC+jCWrXEbSOzG6kBBvWBnKRKVZ1jSJFykKiuMu/Fmq6aBCJDe3G63j EUpNuywApGYzcPbu37i2B8mMR4by44N6KwkXsbK/kiCxXiNiNFCsVkZxtBXO4qc9e3r0 q3OBMY5IJYZV3Avb3KRlXz15dMrntnnBwBziuvDYilRqU5YihCtTjKDcJuXsqsYyVoSV F06kYSj7suScZpNunODtbCrRcVUdPSo1K0qag6ik4qLcZVHKEpSkotcyUHaKmpLf4a/b P+Ck37Uvwo0HwVouq2PhLX9C8UxeK4tU1y01RtJu/wDQdV0i50S6hsL24V4ZrS6s9Th1 r+xLrUdOvbZ7Kyg+yXt/Jd+O/EP9mz4w/Gn9nTwh8D/ib8WvBCX/AMPJtIl8L6l4T8J6 vBo982k2F1o1tL4yvr6+W/1CaPSrsWlnP4f8M+H4rELcTXNrrE14DYfpjeeF9MvmJks3 06WU/wDHzp8q4BI+8bVxcRzL7bIsDoT1rhdW8I6rp0iCF11C3kYCF4AkcylccvayM8u8 HoQPKXBKjaK+6yni+rg8Jg8Hh50cNHLMVLE5e5YWEqmGxVeLVSrTqzu3GspS9pBppp8t kuVR+axvDuFxFfH4mupVpZnQpYbEr29TkqKmoezpum01SVJRVnScIOac5KU25P578Q/s 2fFP4l/srwfs/a38S/ADi+g0m11HX9G8MeIYrbSrDw9fafqGl6do1rrF9qdxOPO0/Mtw P+EesbaOcafo2iafpkH2WRfhb+yH48+Hf7NWv/s+xfEHQbmx1jT/ABZpSas+l6ijC08a Sa++stcWSSNA93bjWjFphVjHtE3nGMykH6t8K22u6OzJPYsY5DyJZoYpPctgs5POW+TH OPr0WoN4hucx2s2l2gDB0YtPJIGxt+YmOIfxHgjZnBwSBXLi+MeIIzq4Ori8JVoTzOea JvCUtMydb20q0ISjL2T9tKU3bl9+U01dyKXDeUp+0hha6rUsFDKpUqmLlGMMHFwjOnJw p1Jx5Yx5oJUry5VFcq95fDP7MH7Kvib9mWz8W+H9Q8Rf8J14a8Z6pLrGr2cmifYWu719 Ns9IMREJ+zGxls7dxPazR4kEjKo2s2em+B/7LJ+AvxY+JnxJ+GWraF4e8HfFNhFqPw81 bQLmf/hGZtO/tLUNMfwvNaXOm21npFte61NBb2moPqKG3hkgkgXy4Ja+mZNE8YyXCvFf tPLwy/ZrknkHCqIwNxJwPlC/jmtF7P4pXMZtV0HxDcoBtMg0yTbt/vea0QQjj7xOfXk1 rW4kzrF/WubH4NyzWFCOa07UI0q1Ggn7Bzw9SM6UqtKUI+zlCEZxSNKXDuXUIYGksLXh Ty+U6mBlTqTVWEqt+blqxmpxi02nFvle1rPT4dtf2NPDPh39pl/2n9J+Mnib/hORrmp+ Jjper+HtF17TZdW13QdR0LWmuTBLp8jwXEOq3s1ra27Wlvp+YY4lMMQir9Arv4g2d6jW 8dpdgF7eU3EV21ixe3kilG37FIjRQPJGqyW4cxzQF7W5WaCSWN8Cy8DfE2aRQlp/ZjsV Ba9uoLXbu4VnEAkK9erKMdT6j0Oy+Hfi6C6kW48VWNxalyF+1aQl/JKuFU5Sa5QQnO4b VnmUDBDnPGWZVsfncsFPH1YYzEYPBqhhK8bU/q9CjUpzpU4VqNClTVSnOtzQTnGbtOUU 1Tm43gqeAy3EV6GFTw9bEOpj6tCCfOpuUaMq6oxqy5ITdoQfs4KTi4w1hJL5M/aZ+BHh /wDac8N+H/D3iTxPrtt4X0TxFoniOfw14c0nRb681DV7aa7sJLi81jUdc0h7PSRpWr3S 6lYWZt7yW2gllsLs6g9tA0CfsoeH779n+6/Zluviv4qvfA2radoPhiS4Ogwz6laeHfDN xoOraBYWa/2lLpekyWN/4aElxqy2a/2gNTube8gaX7FLD+k3hX4b6brV3Z2+s6ZdXKJH BB5ug6fYaRaMsCCNXubSCxlF1MVG6e5lujcTPmSaVnJavqLRPgd4DQRyL4UtJbmMDbJd C4eXttJVpDErAdlXaOgHp5VbijOMsw+Cy9V6lHDYPEQxWFoRp4b91i6VSNelWVaUfejC rBTT5Iym7xqOS5FHWXDGWZhiKuPxNCnWxWIw8MNUnN13yr97TnWp25XTq1KVadKpKPKv ZNwSjGU+f8Uvgx+ySvwv+Cvin4E23ivxZffDjxBZeLNNi057bSv+Emjs/F1nr1j4hVdY s2v7AjVZdXS9tRNbP9jS1ggmiMjyumn+zB+w3Yfs1/2zZ/DTWfHsul+IbuPUNasPEK2E tndXlrZpZw3H2lkheFYLZNgSIYd8sw7V+5Y+HMmlI02j2EUcIKK1rHbxAqwOQwdFV9q9 0bPt1FeZeOfBeoyX4mubq5G6GMx2kdtNJGNx2zH90CiFRhgsn392F6ZK/wBa87zN5lQl iqWGpZriI4nGUqdCMo1a9SUUmoxVarCUW1KVSVX2kW5znUSi3Havw/lOFlSrxwcqk8JB UsvkqmLlDDKb5VS5ZVKk3RipqLbTjGmk5ztGUl+YHhL/AIJ+/wDCM/EzxN8X/g/rd58M vEnj6ylt/G6aTd6fqukeJJZr6XUHuLjQNVsr+wttQS+kluzfQBXkmuJyRmWXd1Pgj9gC Lwh4q1L4g3l5rHjLx3fvqkc/izxBqFte6tYWWv67da9q+l6BBMo0vw9pV1q9/dahd2Wj 2FrFO7EvFM4RK/TLwZa2mjwtYfYNdvipjdoxpzZi8z5g0WIV3RseMhiAcqfmGB6npsWk hpZn03U7bylJME+mymeSRuSAsKyYBPQuEA9T1qsRxLxJh6k6bxFSvS5aVFub5KtbDUof uacqsXDEXdKbh7RVlJU5y5ZJSTNVw/lE4wcsFSoJSlXVKNStGPt61OSeKpRVVRpVpRrT calJQnGNSThJKR+Mvjz/AIJQ/B/4xeO9M+JnxO1H4iXPibS5bOPRr/TfFi2Nr4fttKvL rW9O8mKCGxVbDT9QZ5IUk/tC6ae4RJRJbLIU+zvAf7N2n22iLpHh/wASx+LJrGTMmteK AkvieLEsxMc11plra6ZcQlHjQyNpzTqlvbpGYily939uWVqt3cyTNp2qWtlKASIpNLuI kVUCOslk80E5845dxKZWViVUoNq1taZ4f0bT3lm0vyYXlOBA9jaW0kb7mdpWRUjuGZ9w Uqbp4gqJ5SA73bkrcU8Q4mjRpY7MMRGlQhP6ngrYWVGmqcpUYRbp88oxnFOrGNScZJON S0anIjGHD2U0K9XEU6VSnUli6FetWoVMZQlUqxp0ppv2TpTxNBuSVelN4ihObnTlGdKD hD8sdU/4J56CPippfxV0c+KvDPxSbw3J4V1/4oeE9c8NaHdeKNGt5bOSC28YaNP4bu9B 1aecRwxwXdv4WjuILTSrKxE9ra2lgi+uaD+ygngy7m1afxFc+LvFWo2EdlqfijxFfR3m uXFjA282Vpb2llY6RpmniaQSS2ekaZYw3EixSXbXUqxuv3Rdvp4juYLvxJpiEyPiPY5n hugCQjKbmTcsbbS0O5CeRkZBpn2vScwW/wBonunnjO2eK3CRI8QUneyELErHHleZy5BA LYzXVV4n4lzCgoVZ06mlSdeX1ZupUp0/bVnL3040adOlUlB0cM6FCdOlTc6MqkFUOh5T lMarrxw0IqtKoqsZTlavPEzh7SVSLm6c5znZqc6TmlOcVK1SZ8u2Xw88O2bq19FrFxcp EsJFva3BjBjLFQhKhACWJHoMBj8ox6HoNjqdqdmm6Dqt3bKvyRX1zGkRB7lGbcME/KAe g57Z9ztbGDUFuoFlvI/J8vEkkO2OTem/9w2dku3O2QgDa+VJyMnK1fQdVsdLu7zRTNqu pwpF9m0yW/TSIbmTz4xIHvjaXn2fy4Wkm3fZptxQRBQW3L5v1x46vSoVUp1a7w9CisXj IUMPGFVU40eetVrUMPhaEYyhepXq0aFCmr1Jwpxk12U1F03VhKdalTU6fuKpUklhb0ZU 4U1F1Z+zlSlShCnGTfKo04tON+CWDxY2pW76hpv9k6PZw6hJeQNDaJaXXmm3ktbi6vFX 7VF/ZcUE8cPkXUEMqXUz3yTvFbtDtyeILywJki0PTLy3OC2yZy7p/CVcuzMG6BgCMcgt 3722luNzWTX+qWxe2DPPPHa32nsz/u5LZhkTb8ZZsxLGYzndubYGX+ha48ED2tvoepEX KLcFZ1tNljtctNHALSWSa5jYRhbRnt45Azt9rjKKr8EJ4arOCnh8NTldrScKUeVLmvKr Vmk5Xuved/hSnJtRW06eJo1qk3OisLUpQnFRlVqV/buXLJKjCMqdOiqcaTSg0+d1XKC1 nLymy8S+AUFzZL4SuPDN5JqF7qV3BpVpp9ws93fXc1zeanc28MiyNJqd3JNezXE0QuLm aWSWcGZnNX7W60W6uH8zw4upaUVd5btvDt1bTp9zYHFqGLs2WwykBRGd33xXR2OpeEYb vWItS+zaff8Ah6JJ9fkS7McOlQTWzXsc2rWrMxsYpbJHu0kumhSS2Vp0LRfPW7NdaM0M OsadqURs2t4ri3urWZpIZrWRRPDLaxK5SZJo3DrKiEyoybWZdldOPxlBupjJQx9NSaqV sTPFqop1Y8lWtKVestKc4c85c9SpVjSvepKVqhEaFanhXUqVYexpzajKFJYalTpQkpKn J1JSp3p01arJSpqSUpQpU3ypYui2/wAM7258uw0yXTL8krGbiG6iAb1RpnYr67d2exCg 4rqH8ObcT2UsM8bqVVwYyzou4YLkkso3Er8xCtkjHNYzeJ4dXt5baDU9OhuCVWK8uobd pot3GVDKH3j0JAXGABXPXmmtpqRXDazJrAQrstLS9jsYE2nIEcEAAUA4YgDB5OK5505V ZxlOtXpLmjanWdSu2tm4S5eSDStyq6Vm76WvvGap05KlCFVtO13yQlK2icuWTUXp7yjO y1UXoj40/b/m/wCEd/Z3+L986QKZ/C0Onx+bPEImvdc1vS9BTPmOIkZodSmRC+F3y54b FfzA6Z4eUXbadaXtlNLC7wtcWsks1lMYgS8kE7xQl0O0mNiVLcADkA/1Bft9aN4av/2T PigRppS/e00u9c3F1LdYt7HVLe8uvLd3jjWZREJI9+fnQBUaQxg/zYaRB4YkSMLNd2rE crgkKR90DymJ56kEAjp2r9CyGpN5ZUp0oWlT5WnNNzjytU7tc8fbOXNB8lNOfLCUuZRU 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 mGTJ2kZrCmk1LR9B1G/1K9S51ZLa5ZrnSfD3iDVLNJBJMmmva+ErHUtV1e7+zxy2w1C2 069SfUpIZ51ksUkRbW/oslxJYwpqN3pN9r1rb2Vn4in0aOS3sBrUdjbT3iW9nPeX95p9 u7XIurOxvb26u4LK5tvOuLguJ5btm97JBuv7e3tbnzrpfJtbuS+h+zpczJZy/aJbOxfz rizWC4uYPs+y0uJZbSO4vI4VvJ94TUGoe5UpRqwk+VQvJU3JWpzqU5uEJpyvFwcJPkdW lNwildOUIVIOcHOCnCc4pQjOUYtXjGc6daMXKMmoucKkHpKVKajymLLZ6lBDaXhd7/xG +m2+jXN7ZfarXQ4Zptr3Otf8Ive+IvsotYL1Tc+Ql9e66tif7Nh1O5BeRynappeqSvan R9WbTkGqf2lq1vKsl3LqsEdsUTS7W8u5bqPQrOe4jtTfPaabdM1mLuGwj0+/u11S3K5K 1aLknXjX5ndr6tTxE6aTm9LUIwhC26hyxUU+WN4p2mFTE+0qziqMlNxfJWjg1Tg9W/YL 6u5xjK/vRk1CLSVKMY3v/IR/wZUz3sX/AATW+P1uYdYn028/bj+KM63Pl6Ivh7S73Tfg J+ywkkJlE0XiN9Y12DVYpBG9ve6JDZeHGZJtLvp5E1j+vR9O1+Xxbp+uQeKAnhGHw1qu nXfg5dHsJV1LX77U9Fu9K8UjxEX/ALSthpGmWOr6WmjwIbDUBrpvrl/P02zB/kJ/4My/ EXh/wt/wSj+P2s+J/Emj+GNHsv2+vjHeXmoa7qem6RpotNM/Zf8A2ZdX1KW6vtUkhggt tM0nT9Q1u+mE0ItdP0u7vbmVLG1u2H9gGu6xLo0GnvbaPqGu3Oo63oujRadpd1oNpeJF qeoQW+o6wT4i1rQrS40/wxpJ1DxRrdpY3V3r0+haNqS+HtF17WhZaPe9cnOpyy9hyJR9 mpxhaNb2MIudRWbXNGLSqtKErxdSabm6lSvbOF6n7tpwdJ/uac0vcULKLpte25HGUZwX tuecakZe1lzEPiHZDp1xJh2/eQysqiSZ8rJGD5UQLMW2qCsUS/MxOELMSf4NP+CjH/BO jwt+0j/wUV/aW/aIf4yP4b1iP4hfDizvPBb+G7Sw1PQtGT4X/D66F/qNtqenXklvq76R fTTW+matoMc0moW5j1O7gkeZ0/vL8S7BpkpcPt86zXcglYgvdwoGIgV3VULKzyEbIk3S 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 GxRNQ/aH8VfYja+H9ZT+0Z7No4G1TSjfwWeqNLcRw4tbLU4JdVtRGLSUotxpNxJI89qo jVI7yX88pPiZDqBmvHmsfs6XL6fNIuo3WoO1xZG4trqJPJuJEX+zbi0Fne2884ure4ZI RG5jnFtix/EfXpruKK3NqLF51SS60/Q/td3Fb+Ygmkjj1K6tTNOkR3xQvcW9vM4CC6jJ mkj1thX7Kcsvw06lJRqRVaNKWFoSp1o4ZTr4WDWHUXOnGnWpY2nKFbn56sZSqU6jxjWx XLGONxKh7ScYww1CVSPN7TA069Whh69SEauLn7tbEUsVg6OGm6VKCdFOhX5/0e/4aS8W SssLi2ukkKReX5LjeZGCIMDcMu3yqdpOSo4xXe2XxQEdlbz61aWuj3F3G1xDHIyKLi1E slv9pRjt+U3MFzAQAGDwMGJ4A/Jr/hMfiYeIJry4e5+TZHaK2N0soihSK3ijg8xQ4CFI 5ZHjMImd5VOMGLUvFOozRLrWp6pJpT3kX29knjkvEhiee3mazjeSFRcQJPcG2haWC1ku Fj88EJuXzsXhcFifaVqdLDYKL5ZTxFDl9nCrWUayhTw+G/cU2pQrwhBScHTTcMPSlT5Y 97q1KWIjGdSlOMo058kUm3Fxi6klyTn7sVUpXhGnGdKS9nVUZS5KX6q+J/iZ4Qvwjajd W8ghSRI1F2oUMzRt5qkcmSIxlYju+VHlAyWyPPT8bbUMljaPHPF5yW9rcSXOYkVzGge5 dmURojsxd8lQgDHoa/Pu20fXpDGupaiGBt7eWOOSRt4hnt457dgWOCHt5InQ8/Kw3fNk Vq2ek31gH8q8laLcSFMoZACAM5UBgSc8c4A49K8mbwdO6hjHjKUfdp1XBJzho41OSEpQ 5pJ8zUJyjeTSm01J6QqyqRU/Yqm5pOXK+ZL4bqMmo32snyxutbLY+q2+OVzbFYtP0mdI RJO3lmaSKNZbmaW4uZFhVpAWmkmd3bklnOfSqd18Xr/UIgNNub/SLiJH3fZo4Lp8nlWK TW8dwUVs8LLt67RnJPzG19qUNz5l7chLSKO5iSKOeL9+0sUDW91LI9u00T206yxi3ikK TwSSM7iWSFrWZdU0SbR7salezw6gdS04WDgzLZpprWmstqU0t3b+bfrqP9ox+HbXTLZb dtNa2u9WvNQvLIWUIu9IrGYqpSp0FhpS9jVqQdeuouCpqriZ0nPFOlQ9vUUZzpUKdScq 9etCjSU8XV9iZOVHDvE1ZUnB1a1KriKtOlByr1Jxo4b29X2bdSbpUadKNWrVXNDD0Y6u nTSj6L4g+JPxBuJkmj8Q5d2EZUNc28aiOKKMSusst7me5cSTXMLokcTiPyCImEMPm9pY 6QdXk1G88L/D+61nULnzri+i8I6TcapqN9Iw/e3d5JpzXF3dSuV3TSO8ryHduLEiugtd X0ptJubNLj7beXq2kP2mY6fMtpaQTy3NzDEJdPnvGvLiaDSZIdXtL3Sbi3to9W0m4t9R s9S82LAuY0EN1PBKss0drvCXLstshDmOOSSSKCSSGKaaaKKSTEuMpsi3FhJCxeLxFV0J /VaE5OnGjyKFGMlNUlzVZRUKdBqU5yqJ1I0aVKL5p02/ZQnCYWjCm71alaEKk6cZYqU4 1XbEOlGk6lWnTclC/JRxFb2jxFCEK88RialV1avWHxdtknnt7LTN9ys32mSGxt4nW5ku Ibg3OY4oi80pSSOSWZpMpNJlXdkki5o61Pey3ex7q1kku2eZneZre4n+z248y3WSVwkB iEcf7gRw+ckpEfm+Yz8oL23klu9l1pzQwraxRRqbz7bO8q37X0kmITaxWtosWnLHm4Nx PLezEQrHblzn61G8Vx5SXdvqAaG1vVlsLj7RB5OpWsN/Bag2zMsd5YxXKWeo2rOXtNQt 7q1l/eQsK2pUnCjJVKkovEQptxpV1KChz05xqVOSpJSnH2cqU8PWhRlSbo1oRqX92YTp Uq+JpwopqXsasZuVaVq/sqCqxjCpS9kqcMM8PBOhVlCVeeKhUhTxGHq+00NV1e008T30 947XsZZ9yF76WO3IhE1vaJEpmjR/s4lW3BdTcHzCkhOK4LVLKbWNRa9S3ukt7ry1uEeK FQJUXBkPILb12EgHJIPTit1NBDxmWe6nhUfOYYo1UspH3fMGX3HJB5z0471cGh6E9lKz ahqkV0JrY21gdz2ckJiuzd3M1yZ1kgufNhsYooUgkW6iMzGa3a0RLrvw+Iw9LktiKjnT ulKcml7NRpuNOKtZcvLNqLnabnaEfaP95lVg5U+T2EYrnunCKcnKpKKbnJPm5dN7NQ1b SheUdLw/ozxaebIaRYSyJcLc2l1LBeWd3HuMXnwtcWUirNDOsKIqXq3L2/71rFrSS4me TtdO1rSvCEEz614ntLMuoS6sjqMd28qI8U8cNzZWkD3bBZ4o5VhkiIEkUcgw4Ur8t6vr 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 VCpJpSg9fsJPGYrBOf8AZ+W5bjqVKosFUxtR16FL2tKNT2dR0Z0ajoylGhVqYd1KSrzh SalCpGlUhwh1/wD4J46tfzaTo3wY+HmuQR2At7i48K6NNe2E+parcW+UhuxM32Weeytv KsJZJmME5nYqHmIaI+HP2D/Dvhqz0Pxb8OdQutMjsYppLe98HafcBoxHaiK2+0z3CgyX EnnfZZ7i485SsIMn2orK/cfE/wDat/4Jf/C7w7YaDZeIvh5NAkl1d6dpXwXt5LjU7uS1 WOwm+22Vtb/YbS8ubmGKa3i1C6tLy5MNte2sc8EAmT4A8XftVS/EPQtc1v4T/DHxVB4L tNWt7ew1fxt4Mu9evdZh/fpNLbLY6lpflSbYo4X8uC7RWuIGgdiHaP1MuyviPPcSp0qP GGAwCnRVLE5tjnh7/V6MaNL2MqkpKHJCMYLldnyp86lFMxxWbYHC0fq+JxGAxFWpTlGr SwanV5KkXT9nFx9lNOlZSlJynTmlFQjzKq5U/pjw5Y/8E6pfE9lcfD3wr4O0TU49e03X INL8aaDONKvo9ORPKt5mt7uPVNPkeUOhl0bUrHWLQyLcRyLIYnj8q8T/ALGPgLxfNYnR dR+Gfw9s7Sa3tZ4vBPw50DWLiSeTS7Oe3sbqK+aHfrF7BeR6ja2mILeFLdFELSzveXPB eBPEHw78XaZq2p3X7OsfiXWlmSQ+H28J3H70i4fU/MtNO8W+I7Gci5jwmZLXUD5kSyyw 3MkszXP3v8KP2tP2Q72TSPC3xh8Bar8G9e1C4bR11PUvBuqX9pp728bee82p6DLqGoR+ ReWNrbQz6XBM1vKLN/sM0FrJcW3RmdbP+H8Q8XllXPMViI4WlhsTKpjMPiI0fY0oT5HC nUUa1k6lLEVUpTq15Osq+K3r50K+X5nQjLFwwuHnWo4elBxoexnCnSkvZ0ZugqtLnpuV SXNCrJOpKVVzvKU38s2P7JX7PfhHRYP+EitNP8a3lsiJFqmraVYaDtmid4JkGm+HGitY 3N9d2zyy6ot957yySSukS7U7z4YQ+APD0en3fhDw34D8MajFHJJHqWnxp4fvbdxNctCk +oaXq8H2kpFavO7BxZTLdxC5ZbiO4gg+9/jB8NvAfjjQIdW8Nw6N4+0SARau/iD4feMb CaS6khy6Tamto73IDExSyWuowrI0RSWZBIJfN/D34ma14d+A3ilhpHw4+JuoaZbXFw0U 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 xanNbHVNPn2U8Z+GY7hU0yTT4ZtIvEmaGwuDatBcS2LiOK9SzuVFwklpemdba/EsDb7e 8EBlhtpo/Kq18FKbdbBR55wqrnV4t1+X91JwnKF6batJRaaTVWMpcjpVM61HMK0sM8Fm EMLhqVT/AGqnPCSqVatKNeh7tKrNwWHn+7nD2jpYqlVpYhqPLUlSrUu9tfGnibxVHcaj YltOhttW1vQLh4dCu4J/tvhrWdR0O/QNqUcMs9tDqVne/YrxEa0vLdkvrKSW2uYpZOj0 nUPswYa5qN1ch2jmxKijEsLRyRPs3EJ5bxJIoTaokUyY3MSfGV+IMU1sszXV032l5bpW vFFvcRJPK0iW7QeRbPElsjCGJJ4vP8tE8+SWbfK3Ev4/8szwqAtjaGKK0mkuknN5AbaN y6fO8yCKRngIuT5kjRNKCY3RjzVfaRnWSjUoVcNVhBRbXNTVOXLyus/Y1PbUpwpqFOFH mcVUqWpRotS9DEVaEqkcPKlGrh8XCvB0qrliOaHKn7OrBUHSnh50ZVIVq1V0aXO6FDkn PFQjH64n8U29vY3d4JpL028d5cRWlgokubmKHzJLe3t0neJXvZoVSMI0scLXLFQ6IQwz dN8QAackkmrT6gbm9u9Qt7qe1trOaOwvNQlv7PTGt0t41WOwsJotIWaaH7dNDbi5u5JL +SW4PyPP8SoIk2pMo24PLYVRnkYHOcZx0AOM8Vx+u/GdtL0bWrhBb3Fz9hnTT3uJbho7 O8EiSWt40NrcWxnVfLaKW3kco0E8hUrOsE0XOqTnFU4xpqVWu6j5ZPRWShS9m/hjFqbg 1uqlqjaUWtG6c3BzVq0b0frEpyThSrOkpubh70Yp0oVHOCc7RvFSlyo+1Lv4l+H7S7Fl cagkd6fL8u3jhnuJpnuHaGGOCCNCJpZZEKLGhaTOwbRvj3cHe/tCeANOurGyv/EFvZz6 penTdK+2rHbHUr9bS91E6dYrcMklzeLp+najqDWlsJZksrK8ujGIbed0/KHWvjY9zqU0 9/qaPczXS2+5y9ulxcPEZ0isWuEUzb4EeRFiEjLskDjfFIq87cfFSI/akubqe3mSE/ZU WFJFmuhNEv2e5MlzbNaxeQZ5Dcxx3koljig+y7JnuLf6qHDFCgofXo1YynTquMI1Y0+d +zcKVSlUlSrQq0addwlVdNyjXgnTp1aLnGtHx3m6c041qc4zhSlTpRoVp4nWpCNScqKk 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 jmRlYwzASRSYPGHVgykcEHPTmrdN+0p1aXssTD2Tpcloxj7SlhVTq1oUYVnJ8jvXp12/ Z1aqUqkP4uHOOOIjUjKlXi6D5oTpuaqx56c60fZ8tSCpuNVXUKlJS9pSclzKVOUJ1OUG nXX2Czt5ZBBNDHZGT7BNKIg1s8MzwxTzx/aJLV2jMUnnKJJreR0kKu5atETm3DbnYxeS JJGK4VdsYaVQGYnKOxTd0cLuA5wOlWwjmwCrmESBneDBm8s7VdF3HaSFUlNwwGbJ4JrL 1LRZJNOuY3ubmzlcRrBHHbFZrmxu4547ljOWAiHlhVAKOLhJ2Ksuw7q+sTxSaqRTisXX xc5KNSUlLFPDxm5OUpe5zU4RjKV5c0pc8pc0bODlS5Kc3OnPlVChRlKi1WVKcowqx5Ka qe0nTSnVivcpU3zyhFKcjwy71WK/u/Ikup7HTES9jtFtLb7a6zW9nO9jbyJ59ukUNxdQ w2087yj7HBK9wkVzJElrPAmpX0VkLJrz7XYXsX2i50oz3q2i6hBHqlhp95dQQSWiSahp 0V7Nd6eyzXUCLdeXOZIrm+sD6NZeF9FsGSZprz7THP50csx8tonVg8XliBYlHlbV2ucy blLM5JzUWp2vhe2+1wQBWzE/kXo06089DJ5qJIkc73UK3EJCy7J4bi3y0Ybzl3oPoKGM o+2w8MPhZ4mpGpSlCnGksR7afNypTpeyqSqJzqU5cr5+aVNe7yqfPyVcJJuq5Vfq1BUn am69KiqMKUKnMnVj7KFJqny8slXSThH2ShKPNPhdF1ifStwW2iuGBG3dKIOPlDKBsnbP HHHJIB747+HWoNftrwwQf8TZoJ3ggvXuhZTXhiZoRdahDZzyQwyzlRNKlrcSxoXlWCZs I+Sj6VLMsiaNPJsjjMaLaWcMIkjE6NcForXzZpJknxJDPJJZgwwSw2sM6GV+gsoX1Bre 3sFvLZpN3nJi2t4UIZvLVWjtmaVWTaZGZEZdzoqMFDty42EJylWWF9k24c3NJRgp6Ozu oSV78s5NqKcVytXcpb0+aDtzOUXBr3YzclJWu1yqSkpLppZx05r2WTcaLPp8wn0yKynd xeQvDfOIIleeGS2aYLI1vJK0BYXFnKf3ZkjicrJGDGcvT9H8S2V2LqKyheNWg8xRJG8L BvLhkdNzSbSwXzX2fKzlyAu7j19vBjxw2tzdwXOy6RniMrriURyNBJsIQqxSWN1ZlP3g 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 tZ7Iatbwadc6vp6S2p1awjvoZW03+1rWGR7i2M8cNwtqbgBJRBOLdnWJyPq1C0ZR5NYS dSo4OM6al+6pc94px+zGn7XmamvZRTslf56dGnCvO8Y+2gpwcqbpVYyUakEn7enGSqRi 1JQlTqunPmUo8yUWJBPplzq9+ttqaXGp6dbWlpqWmQ6mZhpy3PmXtnJeaSk7JZXV3E7S Q3M1vFcXVqqBXkgjXa+ze8nj8/7dpl3FJezPDNZ2kojOmbnWG28z+0bhZL2IgCa+Qrby MrhNPhJ+XAu20671/UfDFzqGvreaxpFvrkcWn2GraVa2Nhpl5b2Mpg8ZaTYWkCX91dzQ l9Ju9ffVZbMTyWliNLS8YdDaSam+n+Zd2Nja6ntuSLG31Ga6sQ6ySi1U6i2mWswWeMQy TuNMJtnkkjRLoRLJNM4KLp3m5ScZytGFWNPkapON5OylOLlKnKMoWcoSnRlOF2pUU3DW UZOVbmgoyhG3NS9nN1Y1ORuV580KkU7Wkn/EjGK8N65nkstKtZb6zaFLC41O4jtraeK6 aA35gubSHUr628qFWVklsovtVzDFFkW7faoyvOQfHXj34eXmn3N1P8KPiQyHRdV1Twf9 v8VaX4U1zFpNfXvhDVPiL4I8E2fj3R4beUQ2HiG78EQ6bdTtceTpz3FnPbqVnWhWVScX PSlOVGP1avh69Nqm1zTVTlnSkpVXUUXQq1aU4xVSM7VGl3YXBUKtJzq5phsJN1J3pYuh jvbcr5Zwl/smXV6fs1CapQ55xr2ov2sW+WrV/hf/AODGP/nKL/3ZN/79xX9+M97Db3Nl aSJdtLfvOkDQWF/c2yNbwNcSG9vba2ls9NRo0KwSajPax3M5W2tmluXSJv4Av+DG+S+j T/gp8bC1t7uRrz9huO4S5vHslhsZJ/2tVvbqJ47O9M9za2xkmt7NkgS8mRLd7yzVzcR/ 34a3c6zaWSzaHpVtrF0t3ZrcWVxqn9kSf2a1wi6lPp872F9b3Oq29mZZtN069bTbDULx YrW81rSLeR76HRXk+VaO8dZK0dX/ADScY7Xu+a0NHLTR8MuZ6QkoyUoNudOU48nOnUir Sp3nKmpRjJSl7ObjOUKiXs50NQvCunRwXdrqcc94t6i+bAJzALcyS77670pZ9MtI5YYw bVp5ozLvig/4+zJHX+eZ/wAHSWq2/h79uvw5peoa3eaYnjf4N+B9VsrTTfB2hajJP/Yh 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 wP7WWiNompePvG1t8R/BOpXjaN4u8PT+HLTSr/QL2WaKe0vtH1eykM13c32mWt5DFE3n wQxwzxXVut1PZ3FeD/C7/glh+1143vmvNR+Fninwh4XtbUTN4k8S2FnoD2Wsz6TJeWED aB4ou9L1a90+21SN7PVbyw06+jigs5/sv2m4vdKgv/WPi9+xDqP7M1lofxG13xPPqnjb UfEVjbQpYW+h2cDeNdXvpHWHS4rsW+n83TrNFFPbwWVrGGeQRW8K4+ezWl4Oc+LyWGB4 fxuY4mjOjQjhoqrJ1ORtxePoRqrDwjyxc68va+zpvnipR5VKKGI4vVOjnLxePwuAwT+s 4iePqewp1qXsnJ0sRSxdD2tGFONT287Tw1elOhSp1F7H21OX7dWXwk0T9q3wRZ+KdF+P Pxk8DnxHp8U9nb6N4zl0a9t4brGYIoNTgu7KGKORmikVocFkcLjAx8JeNv8Aglx8A/BP iHUL74u/GD41+NNVLLfRN4i8Y+Ck0q409nuBLDc3NnaWV6fMZSZAt1B5SoJDAizJLX4e 6z+0z8Sprj7L4f8AGninQ/C8TS/2do1rqs9s0dp8+be4e0ljkSTmXZIpVow4ZSTtNYXi L9o74l6/olhoL+JL2x0iy0ZNMvJpLu/1LUr+Y6hdXz6kbvU7i8u9PvJ4bmLTWXTDb2/k 26zeR9pu7uaXxsq8I+L8q53lvFtLLsHVr/u8Hh8DhvrVDDONJxVbEPDJyXJOUU4TlU56 bVRQXLKftYri/KsT7P6zltatWp/FWVWTw02ov4qcsVGcUuVJuNGonJxSjyylOl/Sz8Hv CX7Jvh7VJPCHwd8aR+EdcttLKW6afqMWoWk9/PbzYgN0PEmoCa7iaOKW3fWrSGyivZFS 5vZIPOghtfF79mD9qz4h6bH/AMIl8FNT8b3C30Nvo3xLg+KvwmfT/D6y3EMM2ueIPDVp qF34hMGnRTm9v7bRbSS9uYofsljBLcoQ38smra54qjvE1Wezv/Cv2y3TTreZNHfwlo+p TeFLG00lrePTtJ06z0691m3ntLcaxc/Z5rq61+4k1fX5Hvry/nl9A8CftL/tVeHdZ0u0 +G/x0+OGj61vSHS9M8GeNfFsbzKAscNlp+laNeFXmzkW4js5oW6PE6LLu0x3hDnEa9HN 8t4iy3E+zThVlmdLEVaeJnCh7KdXnpYh2lLEOc8RJp06qdTDezjTjThQxjxVQdONKvhK 1GniamHq06NGdPkpwpWxFGeHoSjCpS9oq1CrTru/to04Tpyc71F/YH8PfgR8U/hx8Oh8 P/HvxQuPGTXMSxanY+Kfh9o3ijwfeBVmUfY9D1XVNahtRDDJEsltdajfSx5fybl0WKvE 9S/Y4+EX/CS3vjPUfDfhXRdSup4Tql34Rh8WeG7OOSwkkj+2WfhlZ9T0qymljeEXvkut iYkgiWKIBkfgP2A/24P2ufF1ivwt/ac0jRfEE1vYSXmg+P8Axm+heG/F89p5AMlj4r0W bUdA8TXeoR3E3kS6iuiSTPKZRM17CIrmT9K9f8StrZltrXVPAkNr9lSbULCTXUniewuZ oUmeGXy5C8kJubWG4RZCxLymckpur+bM/o8acKZ1isBjMXPDvEVOadbK4ynhcVQdTlni MLSi40ZU4yVWMIQdOn7SE4KpG0mv0nA1srzTCUa9HDyTq0U4wxnJDEPklSb9o6lOdWk5 TVJtqLmouKcWpOL+cW/YK/Zw+L1rZSaF4hu/CuqIlrdTXEBtvtGs3MsshntwmoW0bxrA 1upEqxDfl2QOqfN5744/ZN8Q/CXUy+oeErW88N6RbXcWn654fjL5Td5hvdXsTvSa4wzM ssbhlZnUKxK7ftDSI7DXksotHudPhutPeCGSXTIYZrZL+EwGe5hgmdHRYJZHmSBnfykc KGb7Od3O+K/gv4v8VePfBHjHUfjV46lg8IDVlsPCujarHoHh65utZtJdKn1HV9LvBfWd +mlxzeekPmyRxrFdO6StIwf5mnn+afWHhMdm7jg6VCqoU61OU6lSadWrBubjRqNTqy5I yrpypU5wVuWEYR9GeFoUXejhlJy+OXXRRjfRKztsrbJ9tfzX8E/DvwJ4b8Z3/jOHw1oV hrKq9xcapDYXUGqtE0ZeGVr+WVFiVnEivFJKFVyN0e1iD9iWV9qXxD01bnw5qOnav4j8 PvbXUNjHdahpeoQz+bNNp1va6iHvor2eQ25a50gPd21zFEwvrdLVxayWJv2bfivY6jo/ iTxG2k/ESyhjkbRPFlhqqaHHaabrINp5Vxa+Gra50zxUb+zvIw+oXNvb+Sga+VxC7PD4 /wDE79jS2vdYtvEXwn+K/iPwxcaGi3OseE9T0/WNM8L6kLmS4S4tIPFPhyWxvdPlmW0k jjvNO8Paw+k3DWcmpaY6GOGf0qlfCZljqUcZmdquHopwxVShWnTwcac/q8aGK9m/rFGj K6hLnjCPPKEW1PkSynNQo89LDRxNKdBV5fVpU5RnTThGm6k6k/f5oyjKk6cZ03BJOafK nw/xV+GWl/EnT9Un8U+E/D3hr4l3ts8+paoPDGl2ratc3iiW8tjpv9m6fp065MiWHiOy tNL1NVMclvb2hRLaP+cb9tjWfsXxRufhzpVzcyaP4e03TzeaVcyT3wsdduBOfLikDC6W 3s7UW97awzt5WbxXMUsKRZ/X/W/i9q3h+21Dw38U/H/jH4aeJvBuiaz4gtNa8AfFp/il ofxKijvY9EtfDuj2vivw3448NWt3DeaTqAtP7dl8C2kUyeIrbxJ40fWYtG0qD4S1TwL4 k+NPit9WuW+JGrW17ruqPqC+EPhd4O+G/ia5kjvrizmk1/xP4eN9YazrV1DbJfXd3puu XehJZ3VqI783SX1nbf0B4d4OfC2Kq5lmGJVfL50qksLTqUKuGjSg6dOvhatK0sVUUJUK lRU6dWcKdO1OnDE1Zzk4/nXElXCZoo4DDUa9HGqVOUpUsLUm6knSm8OpVansqcoN02qs 41akqCnBypznVpQq/mV4T+G/jLxlrOmab4d8OXGpXOpXUdpZi6MWlWN3ctJHGEa8uWs4 sFpI/PfzF2I4eR1BUn6huP2Gf2iNe1q2utN8L+A/L1mMXUNj4O8d6LrOl6fCklxY+UIY dU1K6SVjZ/bPIe6mmeK7guUJiuIxX7F/Cb/gll8NvHelzWieLPG2gtrem6fJqnhnxhFo XjyWPUI/FCXz2NzG1hp5snuToXhfUbufwv4psbrVNMu30681FreO5tZeB+K3/BHL44fA dZvHnwO+Leny6HpVjpk1x4e8W6jq/hvUVi0+1tLfVdct9R+ytp0Md/fwXmpLY+Q7aZHc /wBnxy3SWQupvr6/jHkWMzJYXAcR5VlGMUakI4XM8rxjhiXeLTljlVp0oyk3CKpwp1HF wn++aqRjH5WlwXnNHEe2xmX1vqijK1XDzoTrVVOV+fkmuelKkoLmTUozjUpuE9JxX47f ED9k/wCKnwm8IJrfxIk8PeE9ZudetdNsPCWoamXvdQsJLG/mutWiubJLiFZrG6gtbP7A 8bTTx3puY5lWBon6T4GfDO1bxh4X1Lw/8adc8CeMbCFbi+k0zw5eabfaLqE0zCGy0nVp tUX+14bzTSl6J5dPs0kDPbC2lAjml++/i5+yR+1p43+HcGu/Fn4SfEjxzqGk+GX/ALLi 0LX9NutMvdZaMyaT4j0SSzeCZ4XtfMMltcMI3IUtH5zulfnhf/DL9on4TeI7HWvH3gzx z4evdKvNHvLnT7/QNd1IrBoSWtpFDJNplle2sDR2FutiyPqNnLDEXbzEbGz6TLuKf9Y8 lxeGecZQsw5alOpPC1MNLDYiTT9mqdLETqSqqUWnOT9l70YqEakea3NicqhluZ4aahml TDykqzjXkoVaNJSdOdD93SpShCi1CveKqprEU1LEXc6EP6dPgVaJpHhEWnjjxFq/xtuF iGy98UeDfCcdwkskWZra0n0/StPF1DgR4v8AWLqeKGQsrOZgFf1PVv2ffgP4oWbVtQ+C +gNqSKPJ1Hw5qF/4b1BDLFL5jwajbeSbd2tyXlhig5j+aeKGIFk/Ci7/AOCscngXwzpO jfCf4Y2OoeI4Ev7TW5filMbrRbOKK30+0stR0/S/Dl3pN5e3c982ptPa395FHZzWNjNL /aRu5re0+VPiR/wUu/bI+I1vcQH4tf8ACB6dKHEunfDLw/pfg5mspBIgtJfEECXPiqW1 80SwGCXVykzkLL5sZdG/C6Pg/wAdZ5mVTGYfEwyLDVMTOc8UsTUpTqQtCnUUcFCrKEaK q06lXDuk6SrRqxnz+xnSjT+9q8Z5JhcJCCw061aj7WNOm4RVOryVKkaSqYmpQ9sueKpz qSVKSpSk4wliYw56n7+/FL4UfBjTbK70+4+HfiWwt4oba1axh16HVYopbZALW8W+17T5 tQdriGOaeSaG+ezdy1vBJEmIq/N/4n/s+6P49tbjTPDvgb4l3sEQ22L6fp2i39xHPKEk UW9/Bqk8wRY2LJZxsgZ0McJhlZ6+cf2bPjx4u8WfE9fhv45+LGt/F7TNb8O6PrOm+MNV OuXuq6N4kvNA0jWNX8OQv4lWy1eJdE1W/wBQ8OX2pSJ9hv8AUNKutQ0ea90rUrS9l/R7 VfhhMUim0XUruxVYEuvPt767jF0LSRx9otEuDFcCW9VhIqn98s0ZhnKgAR6xwWacE5lR o18xq18TWw9LG0asqWNpUqsJU6Mn9Yw1eFCvRrR5lTqYevTpVoOEouPuSt008RguI8vn PD4VU6UObmi406s7QahpiGmnfdLnbld78rPzNn/ZK+M2nXHhV/CK/Gf4fa1a+bZX1x41 8L+NW0q71KC5ZodatdS023NvpcdxaFLO602driCJrOKeG6nW7kit/wBLvgp4b/bk8OaL DofizXPhZ8Q/Ct1b3iNZ6zbeJfFNxrKQRtE+jw6fHAqC4maKS2l3yoEk8wSj92QOX8M+ Jfj78Gp9abwp8Rtd8TaXd3ks8mk6p4qgm1OC5ufJgEekxzSeTIiwi5gfS5HZvtDSqp3+ Wze4fC79rz4ojX9OtNatbmW1mW3vL2zjsFh1e3svNDrNbLhIbUme/uIxLGpe5uoihkle SIjt4p4gzrMsKpRwPD2NhQhRqRcsHB1ItRjKo5fXeev7R3Uk1OpDmi4KmqbjyTk2VZbg Zcn1nH06lWcL4dV08M4NObVSlJVKNdTXJL2cqfI4OampLSX59ftEfs3N4u1u81SD9nzS vDd4PLOpax4STxsLe6RlWSWM6Fb3TWU04gleeB4o4p4V2lLqJg1eQeGfg/4S8E6hcC6+ H5h0tLt2W6uhqWiao9ijJJFcX9jrqanDavLaPFLdQyahfwQs80dvcXLxfN/ULeePLl7+ yWx1zQtTsDpEGo6faFNLkuJbqSGNCkMUw+2wTTR3KB7edBOsQ22++QsE522+I/iizt3t r3wzY384+2Ge5FtHb20tsS2padEEiligkJtpILYMiJI8scjsSpQD5LC+Lme0Mvp5XWwl SrhoN01GnmWLoOnTap88U6lGV3GSlZKSimnFOUFBv0J8JZfPG1qkMTGo2qFZP6sp0pOp Shz0ISap1HUoyhL2zcHDnqfualWmotfjJ8MNM+DL6QzaMmleFvEMMks1jeeLoYHs9Ond GLWrX3ha3+1vA9u21jfafpmnxwzAT31tE+T9gSfBBNW8E634/wDDHhLR9f1vT9Hur3TY vDniPSpbTxHJY273MUL+JrG4TRIv7RKRpatPfRN9oP2WeGCUxRN9aD4keForoA+B/D91 fS3VlIJdb0fQ7qeB72GKVjZr/Yy3wa4uIQ9pYyzySqPOiMvmNGrdr4F8e/ChI9Q1TUvA vw/0DR5Y7+DVvEekOdELXplghMD2lra2+mIskn29bmSTUIbqC7hijOlXBuLia2+Yx/FW YYtOrSwNSq/aOsoYjHKdqcE5To8/t8LOsq1OkrxccRJycKVD2dWfv+3h8uhRpzpKgqEp qNKGIhh1zWbp2qRcJTc4pzcH9ZjFU0q040uSMa7+Uf8AgiF4K/a6u/8Agr58FfHPxn0C z8O+BtN+Hfx70zT/AA7oHi/w7rWlaJ/avwp8QLZ26abpOp3N7e37TwRRXF/JCgWRH8mK CAkt/oTPDqMvhyO2tNUi0DVJbC1trTULi0ivlsbuWOJIybC7lt0upC58tbeSSMs7bRlu D/Jz/wAE5/CPwJh/b/8Agv8AEL4ceLLOXW7m0+JtlD4fgurOK88QtP8ACjxpczRyubof 2gbS18/VIgpvZoobYzNPGkcsMP8AWzFPZahaWEsscUi3htru0jmijkPnKgvoHUYdRNb+ UZY5AdySRh0bcqmv6x8Ls/fEHDNDMKuBw+VqjiqmBp4OhRVKjGNH6vJTlTqzqS9rVqzl G1Vt1Y8srNTjf8G42wUcuzydL22IxDlToVqksSlNqo/e/dSlCEK1JQcLuKdNT5qL96nO K043djJvj2Kr7YzuDeYm1T5nH3fmLLtPI25PUVjXel2eozSvC1tDKLqxe/ubSOD7fLPp ksdxa21xchWkQRQyuEDYuLdLgSWzxb8trSfaPNg8kw+T5jG780SGTyfJm2C2KkKJftPk lzLlfI8wKN5QipeXmmWGm6hqOqy2ml6XbwXd1ql5qUtvZWdvZ28bi6vL+5mkS3htktoj LLcTyqiWyh5WRVIX9Ipc05eyUJOdRqCpxhz+0blB8sY2aneUkoxtdzStdq58YrT5ouM7 pxUe0n7kvPmjry20vJNWaRy/iy8urC908C71Way1m2vdFn0ext9ThhiiEZ1PVPESa7oH h/VdY07V9L0Ox1FNEtG1DSbPVtRng0+2uU1m406WOxp2taJo3gLSteth4uvfD1j4X0u/ tPtmh+OfEHji50pdNt5LRtQ0C702/wDiLqfiSW2MTahYajpVx4sl1AzpqdqdT+0oNKzs NO8NLp2l6H4faCxvblLaZtKhsYLLS4rHRDDa3morNdW0xtRbaRp2hWwsIL+6SaXTY3to 9Piubyz1QL5Lq6leS3lsTbWws7SG1eO+S6ja7a9ee9lvjbXENzG1jHZ262dm1nJBdST3 l4l5FHYuVOlCTlH2s3NpwlKVNKNNcymnSiqk4SnOMdHWkkoqSp2qcxSpxhJy53KE7VOW UnzN+7CcY+9VVOzU3FNQg4pTVNSlabAhtJ1WC3vJ0v7qWa6na786GyYWw2v5d7d+ZDby mCKCO10yFokuJTO9vGslzcUVzOma14g1zT4Na0vS/skV1d6bZTeHPF+n6n4X1vRG0/X7 zTPGk11eJHrNvq8sFpE8nhhdNsE8O+IJbCHUNM8Yaj4Y8Sabr9mU3Bwim48jvKLpzjKn WhOKi5xq0KihWozi58klUpw9+M4q7hKzqQlSqTpTU41IWVSE6dSnKnO1p0pxqwpyjUpT UoVYNXhOLWseVv8AgV/4MipY4tO/4KeGTxQvhISa3+wNbR6k76TGl9c3mt/tU2lp4bZt YgnhJ8VXc8PhxI7E22tzSamkOg3tlrElldRf37aV4h8Of2/qPw+sdTlufEXhLw14U13V dOun1O8vrXw/4ouvE+j+GdSu9W1BZRqUuq3ngjxNC8jX95qPnaXNcakIzd2011/nQ/8A Bkl8cLnRP2ov23f2ZrXwza3EvxZ+BXwv+PDeN7zUpGi0C2/Zy+KP/CC3nhRPC8dgjald eNLT9p6fUrLxIfEWnx+FLzwTBFLoHiaLxA76L/o1tr9gg8POYNZYeKLpbPTTH4b8RSm3 lbRdS18P4hEWlufCNoLHSrqA3/iwaLYrrUum+G2uB4i1nR9Lvk5TUF78VTc480GnrKzj Bt3UeaTny07qUlapFL301pTqRqKWG9hWnVjSq16U6bopaSpyqynCNGeIrU8PQo1nVUql OnS9vSrQqRVPEU6z9c0bTddsfsWqWFlqEMdzaahbpf2VvfRWupabcxX2majDHco6xX2m 38Fve2F1FsubW8gguLaSOWJXX+Wf/gr7+zl+2F4r/aL+HfjTwh+0h8PtA8D6B8N/Gcur +F4/C134b1QaFDr8F9pcSW17r3iCz1m90qxhvF1bxN9v0SPUGlATw3YpEAf6m727XbfQ w/aFuLWwN0JhbzLbDzftaRiG8eH7JPcxPZStPaRSyz2qNbSXkMUd3ZtN/ND/AMFgbTxT a/Fb9n+40DxR4x1fVfDXwm1CG+8RIbdb+e8vfEEtgup6umh6dpeg/a7+LTdSOqDTdI06 O0ndY7W2tLWZbdfgfEhY+pwrj8Pl2Cq5jiK1TCqWDoZZHMsVOn7ejO2GpzoV5UpycYc9 elTlKnScpezrWdKf0/BmKpQzrCQxGYYfA0IxxjhXxuJVDBUazo2k6kp1KcLy9lFTpqdJ 1eWNKdWClzR/nE/aN+Jv7Q/7Nthquk3+qa5eavouh29wljpmgxXVxL/Z32OG9uIX+z3N zeaetxqml251GWTekrzmUsyPO3xh4Om/bt+Nkmk61a+GvFeu6dpdprV3JcS6FBYbLnUb Oc2Mc0F+kMl7Y2d4YTbXUFsjNZNcPE63Ekez9iI9Z8bXyyNqclr4yvL2RtN/sjxVpkeq rc20V7BPdaeMG1mb91JZ3sjO4Y3EFmUZmRyvuvh74s6h4e1fTn8ZfBPXdCs9JtGsLHxN 4Hg86HT2jS9ghnuLCa5iuZ9OlE0ErW4kkMB/eITsIP8APWV0uMsBgE8H4V5li83xFWvU xWM/sDMZUp1I017uHoxwdH2LeJjVVSLnUUZTsqcHSkpfrGLzDIcVLmjxtkUcLGSoulhc 6wEIxSxHssRz1PrNRVJUFzc1PSTnRnTXI5xVP8QvDvjLxT4L1HSvC/xG1DwxpHiDRWvd VGl339tWuoW23TLqXULu4hvEsonDjfJuYvBDCYzEx2BVv67+3V8BfA+ow6Tqlva6/Da2 d9dyNaaRLcaY12+iedLa2mo6fe6pLb6rfQeVZOXs4reG51C2l1Q21m9zKn6O/tt/B/4K /tQ6Z4f0DX49W8BX80Wlw2XxY8Cw2B1eCx/srW5r7w14z0S8s1Nz4ajew0wJLBJdXsmq arDbQR2dpHc3NfgZ8Sf+CdXxM0P4gaho3wvnsvi34G0bwpLqtt4ybUrTwW+kQLDNa20e vQat9vWJ9P1u6tWuRHGkPiA3troulTWOualp5h/ROFOAZ8Vxhi+LOHOL8hryo88sPiMh zPDYChKWJ9gq08w+rxpU1UqtqOHknXnUcKcIy5oSfz2d8Z5VlVJ0Mv4l4dqYd+5DGRzj L54ilZpTnVwyrTcadOnCrVlzQnFWjUcZ0/i+4tV/au/Zr+KDad4ET9nrxPFdz6fp2p+G vCfjWxtLeX+wfFOj2mtafc+Za6ULmDSNa02/ttRtL2Ka0XX9JubDXbGyFlcqlvzvgr4K /A/w/wCPbjx94l+A+naIY9T0u50Y+EdV8W6Qvh3U9PilvdHubVtM8SRTNqF1LamK4vha Wrx3CwSw8Pz9M/sufAr4FfBX4U6RbeLtV0fU/ihLBBca3qYsNY1Ka0n8meWfTdKvh4fe CaySQx20UVzLFGTLN5hVQLk+1Xun+BvEEc9jZ+MPD1/Japq7x3mo6VrGnzm0toHuI5xJ PpcIgu3t7Sc2FlFdXV617JYWFs13NKsK+JmfCXHeWY3McPwp4eeJ2AyuFedCpXjl3ElO 9KPLUcqFaqnVp4aCaccRWrTm4pt4ic4zku3CcWcF11hp51xjwXGvNe0p0Z5xgKlKjFTh yUqlbE4ms/3cZwX+0V5VZxjOUpVOSpNZPwQ8I/sKRXbXlr4d+Gvw81bUYdO07T/DeueC PDK3Gm6pHfXEN/dN4l1b+1IJ5bm+m0+yggg+ztZXVteJLe6gk3lQe4+NvhdobrFpmkP8 Pdbsru3MlrPD4f8ADiaUk0DxTG3uJV0/7Gs91FqKBIZWjaaO3umhRUiYD5B8SfDXwudQ OpXes+Hbu0vIfs9m/wDZviO3MX2i3e1m1h44LOBftVsJFvyUu9wvE8qW31C2nuBLxfij 4RXXw78V+CtC8UeMfHz2njH4f2XxN0rw/wCFdfSzn07w9rd3dxWV/wCbqEr2z3MWdQ09 ordTCtyzXYSNkVx8xi/CvxHnmWGqYnJ+P8HisynVjl2Gx+V5rKM6tKjGqqOG+sKVfE+w pRlKUE/aScU6tVylep68OOeB1h6k8vzrhKrTwjpVMVWwWNwDw9HDVKipwlU5J3glVlFS rVp1U1KMOVaSdb48fAL+zdOvZ9U+A3hTxLqFu95Lbal4f0LTrm1e2s7ENcGVdFe3ktla JhcOIY3ljSObBeQBD+Uk3jLwL4a+IVnqPxT/AGb9Clf+1dF1jRp9Y07xDptpdaH4fsLP TbTQ9T0TV79/Dms2Bt7SKSZRpTgYgtneaIXC3P7Yat4j/ZU8EavpngH4heOviJ4oufG9 54bttG8PXWq6zDrNtfeIrPVr7V9Ln17w95FkZNOtLLRFaOaWHzhrUtvapcG2upLX5k/b k/Zm+FXxD8H+GbT9ljQJ7XxrJrAXxQfiTf3E7WHhmPSysEela5qSatdR3h1OGyVTax2u 62EvmO7lif0fwvynjzN6s8pnwhxrmtOtiMVlmJzqjQx9LBZfOOCnh6mGxFOrJQp1bTqR aqOo480HBQqxU18hxjmvBmFlRxUs/wCHcFUp0vrOEw0q9FYnH06jpYl1MLKC5q2ErOFN tOXsqk6L5otU4nlHg/8AZ2/Yc+Jei3r+ApvBi+I10ux1U6Rr/i7Vm1TQIRqGmTT3bRWh vdOuYGWd/DtyddtbqKVNRhnjjg1c2Ei/b/wa/Zr/AGDPDlo2neIof2Ydc8Q27RYiv734 fa5qcUrO7XNsdL8S/Zr148FGgmaGaZFdUaNzGK/APx3+xp8dfhr4fj8T+ILrwRb2f2HV LkwaX4m1a4votP0n7VLcF4YPD0MDW8v2SVo4Le6uZHIImiiXLV7p4a/4JmfHvx58Ovif 8bJvFHwX0rTPClnDqt5pVtea0r3F74o1nRo4/J0m08D2ehaHoo0jXNe1awudIfUrrS7v QtO0iHQdMhv7PVrL6TO/CHOMxp5rQjx3xRgKGT5jg451FKnOrl+JxdWOCjhJSqYmlKlz VPq6pYSk0qtaVWtOpTUqnP5mG8RciwSyeq8kwdT+2cPWeGq0Y1ayxkKVN1pVKGHo4Sq4 0qdCE6latOrThT9mnKXJVah+5HiDXP2UPhXrWnL4Iu/2b7rVpNT0qGbR/CGs/DTwJ4kf SIo4re7t45pbTUEOoQWivHp889rZRM0kUNuqXItgvXxfto/DjRXuNN1/WJImvo/7PtTY +LdAvZGtLowQR7vsGrSZkW1KzmCF4gMzqChiR3/C7w7+wl4i8jd4h074bWiQXusnRb3w /wCOPHV74oijnk8DR2dv4xfV/CMPhrXNBt9J0bxVb2EHhSw8Da3P4o8X6zrer6jL4W0X wx4JL/8AhgLX7HXX1nR/E2izJDcW19FCbmTRntIl1ESPaW0sdlfNqbxrLEkbGGKWZRcX M8EUYfy8a/0SeKq9KvQzBcXZjFSxFCGLqQVGOJtil7FwdbEQlPD4itRo4jC+1hTlf2VS dONRxUaw/j7wzhXNYWpkOX0VKhho+xq8seWPJFVKcKdJ1I+2nUUFCtyVFKEV7GD+P+pj 4bfFXSr74cWM/hHw1f8AjDwHoS6hpqWvhLUbXxpq9pptndXMltZSwJdXF9FeSaa9ncXd nLcT/wBk5NrbXc9jaRMfXLz4XeHvDVmfHXg/xVqmjSNaW+v6jplnb21xqEdvdWVtLcXG q6BczQ38U6Wj+S3lgDfbPKCBG+38mv2e/i94l/Zt8Ny+E9O+Enhu+vNVtoZ9X1XxJ4w1 q8u/FFrqunaetjLqdhbaJY2kUB0sC6skhVkdNSYmeVHAi9Of9peXxHfXGs+N/Ctz/bzT rZwap4e8QXcNwfD5uL6eTTLqS4hjMqqboNBA0TRxq8tuXa3WNK/GMf8ARL8anjMRHKeB c3dCc6/NiJYnA4eNahThh6lF+zr4tSq1ZTp4qmpVF7Kq1hqtGpU5+dfX4bxn4AjSpUMR xjgqdTlnWxUaksRjJ1ZVKc60/a1YUalq1WrUVSpTvGVKtfCzpUpKVOH6geHrmP4heC9V tfDvirQfiNY6dI2iXEd7okc+oaRrNpFITazWmrxPLDdxokRhEsbxNJDIysxVWr+GL9uL StCtv22fj7qr6Quo+BND+JcV1ruhW2u2fhzVL/SrG+8PaTq2m6Wt4JtRtbu6k1O1hja0 0q/ubRJbvUhZyWWk6i1n/XF+yF4l1r45ftI+GfhP4X1zVvBOr/Fu9ubK316e30vUrTSL rw14Y1/xNLfXFuttDeXU2orpD20jx3UUvnPZyNI0dt5T8v8AGj/g0r+Kn7QPxl+Mnxgu P24/AOhjxH4917XRpg+E2r+LNTsTfRWmtLZ6xL/wn2kNY3cAvZUhtJRcS3GnSafrBnA1 BbW3+38JPCjjbwq4pzJcc8PYvKVmGTRjlkatTBVJVq8sR7RTxH1X67FU4/VqqtUVGMvd gq1OpUUangcVcY8H8UZdhP8AVrNqWPjhcTQpV6dONelGFOnh3L2dKnWo0qUOStVT/dU/ aToU/Zydowq0v4nbXwloGla1p1v8SdU8V+B9Nuf+EjtdVs9N8Fz+JPG2k3eiabFBaXL+ HPEmqfDfRLnS9a8WC70Bnh8XnU9AGk6/LqGm3F1pun2eu8trN/Y6rdW97pujaR4ehWz0 uybSNDl164tPtGmaTYafd6zcy+JNS1qcXXiS8iute1SCLV49Oi1q71GDRNM8P6AukaFB /ZD8SP8Ag0pm8J3eoQXf7aNlbanrd7YeItC/sH4G37+GfDnhm4l8TR6v4Wk03xB8UtY8 Q6xdrd/8I8dC1+58WwyWGn2GrW2s2HiK91e11TR/Edb/AODYa00IFoP2vJdWuQbYCFvg vbaWnkpdQSX0sTyfETUd062qSNbwSQSQzTKkUz2wdLy2/oegq+KqJywuJoTdOnQpQVah Tw9WdSnRcq3NVxVSEW5v2dWpXrL2U6NZ0I0qFRyq/l1bGYPCrFRli/bKnOrJOnhq9STj CU3D2fLh1Wm3GVuXkUqrUXKjGpaEPkn9g3xjq8Wt+FtNtfsUNxd+DvDUlqViMpnjFvJY wNE0hW5ghvLZJ2udOEsaykxtOG8uzI+if+Cov7Rnxi+AnjL4CeM/hzrunaLEnhfxBqeq eHNdW1uNI8SxXF34esHU6LcGIXuoRSa212sNoY5bC1tpryJVtbRkH1T4B/YM0X4B6+fE GheMftOs2mnWun/2CPDdzN4S0W/tL5Ji3hg6vr8uvrpVuiRWsB1zUNR1e4sIWN1cvczm NPH/ANsn9kfxH+2rcfCr/hM/Hll4IufA9jfaTAuieFIJmupvE19Yo8+py3GtzWtumlol tZzTW0slrHaW8t00uwtIPyLLvCDifMOPqPE2I4ewCyGGGr08U8wxuXN1auJwuIkubDut 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 XS7zTtZ1tdWW9jsDc6Dq9zpNk9v5Cz2x1FIptN0liZovsVnceRNemOZbCKfyLhoPodPh f4M0/wAO6fe+JNZ8N2/iG4svPuraK3trdIkCkylPtX2aZngJVJzMDJC2MqC4zzZhmPDW SYmVaWLpSpzqyVGlSrU3N3jyOlOXIpSacrzcYwcpq7fK+V64SPEOd0qSjhMXhqnsV7OW Npu7w0XKjTcKijCNSnGFJ0E0lBKm48kHFxXwF4e+EPgebVEW7H9l2cUUYaL7PzMxllxE VUFY5PL8vezPg5UKoKsK+gLP4daLptnpcfhDSLvTV1iQ2ttqmrRSW0IuzbS3aWk7iM/Z WeOCd4/NARhHJGSX2I3ZaJrnhXQFs007w/baza5it77xDqUNhHqEMSJKsep3sU8FraJM 0iR5tY7ZZfMnjZbVYlfZ6BrWqa98QYra10Ke2XRILmN760gFqqz20UTqbffE8MUGJWim EkYL4haMKRKa8rH5tSrOEcvweIXtGpRq1J+0oxXMlJujzc0ZOzcXNKKdpcsoe6/Uy/LJ 4VYmOZYzDRcVKN8LalVUnTkotTqUpp2m4TlFxd4p01yuXNHxuw+C2lalpb6n4gvtO1bT tXsQ0MVxCZrfUrO4gZZ4ntrhFLxTxy4ljngO9GaKSLDnEPgr4f6FF4R0CysNI1qwtrfR dPjttM14iTWdNit7WNIrbXLxr7Ud97bRRrDd3L31+rzlpDdTPiVvZbnS20+J/tFzDdvo thLqz2K3EUl5BpsfmmS58kyCRLUNbSoLiRPJaSNo929Tj+en9qf/AIKQ/E/X9F1H4W/D vSNP8PJe3Jh17xToXnRrJOWvYLyW4je/vbiw0i71HLm3lZ55I4WLSt5kUp+Y428T8NwH lkq+Y16s/ayjUweU0VdTUHThKvXqpQjTjFYiNH284wTnNRhTlKUab9rI+FcVxJi5YHLK cqWDqVoVMVisVWspOnSboWTjGNeXsJ4iV4qK5I1JKPK5Nfst8WfFXgz4M/DjxL4l1HWP Duk3ul6Le3UN7qp8600m/wBu3T/tdlbzC4ngN35aGCNo577cFjODIy/xBftmeNPEvxa+ IDSw+JdNurLxJr0ut65F4Ws9Otb6za7vYY9e17TdDEGm6fqN9IhuLi5h1fxDptjcTbLa bU7SOV1gy/2mfjlqdtJq95e+Ml8WeKNL/s201Ox1a3ksJray1fyE1zUtDulhZfslsLeA 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 U9Nt5bzWNF0W1KrNcX0Nja3GoyWmlfariKwtXvHh+z5c/wAOeJHFOdZjxPToZ3Wxs8XX jWlS+ryc6FPCU3Rk6aw9STpyp4ZUJVVUgqcpRnKVaThShKH9K+HWRZbhuGMTXoZfCrKt Xw8KkakoqcKU04xnRnKUHJ291JcnvPlS96x+B37aXht9a1SGxtfCd94Z1uGL/hGp9T+z RW0eqf2jfQWtvY3t95a+bLZPsubSOaZUO+XOx5Oe18I+Br7wzpWh+HvGevJqmtWNnp0G pyW2gWt3Z6VDDFFb6dfR2eqQtZ2V5dBQtzqd3byQswP2SNMkn1j4reFfFC+ONV134iLd HQtPstFutL0iw1S0T7fdSCC406TSo76Xek7IogiuTGZGeNVjME53Lzt9Z6v4h8OXWqRW lzDHfajHe+I/tn9tvdS26OsWieG57jT9VjvHdbgRQNbXEKrPeFoBdzvKFb6ulm98jynK 6WIpzw9NU28VOUnD2tdQgoKdSTm4xcNaTcqanKMKem35lxdhoYbPKsaUJ06SuqUbKPVR jdKco8zdlo5e9orXV9r4k/DPwVrem2uv+K9Tu4bLw3J514yQyWt09ppdks76jPfQ2CaZ FBEyoJZLO+aV1Qu0KxjdXoP/AASv8U/CHxd/wU1/ZF17RpNNu/FHhz4zW8HhuaW/1GQ3 dpdaNrNhqTwKftJvNTazuJ/skMESPNdCGGZljlaaP44+I+oa5rnw4tr34s6r4xiOoa0P C9r4W0caTJbyTXEs09o11Z2F5qqWVxZWNjHe2sF8bDUzDAftFmixRTy/Rn/BK34E6x8M f+Cm/wCx5NIPB8WiWn7QPgZ9Iulu9P1XWdTt7szxtcwalo97eaXJeP8AaDBMkN3cRIzN AyxzKVH3HBmVxwc7Zlm2Kp1Y4j2eE9kr4WUPa0pU4UpqDq1PbTUaTnFxSdRQnP2SqX+O hmFOF8Ph54apzxkvq1OVObgsM6CxLST9x05VqE6sUuanKrbmca0IQ/03ob+drS0tbeHU oP7Ru9WuJphpZnt7e2trU3EtpqczPH/ZUl550cds7q0puI3gVQ24j8Z/+CjfxG1nwj8b f2edA0We9YeNvD15ptxcWIb7Hp8C6syT6jrEqSqkdmschtlXDlp3Ckcnb+1EOp6Xpul6 vNquoWGnxQC/vLiS+vLa0SCzQRI91K9xIiRWqPNErTyMIleVEL7mUH+b/wD4K2xeLf8A hpb9m/xF4L8T6A2kJ4H1bwze209st9F4e1Gy8YaRqF7cPFp3nXF1dXMF7bx3FjNEJbIR xvGqLcSE/aeMmXYbNOAMVh68q0vewtdyhzXlVpztSp06Kd480uSPJTV5VPea53p+heEm ClmXHGU4emqKV8TKUq0IypylQpSxFRNyg4Xpx9nN8zSioqd1KUIv2bTfDk1rbajZCWO7 AuYrqaKPC+ZLdTJcCZHuBBbuWdRNKEuiECEfK21D6Do9jfTSzzJrOnotpPJbSPp2pG4k WaPbuhaCzNwY5AHUtG7rMu7DRjcM+fXOkapLZpEusiK68tA09uI2FvKwHmywxTR3MBEn zgJIpCqwxlgrBZrO6g+WC+Xez8qqohkLAdJTMiq+4Dc7o4IHHYj/ADvePjTpUV9ZrSjG viJSoqtODan7JU3aXtI/BDSdOUZyqKoqsIwjQv8A3BPBV69ROticH7bnmr0sAuR0PaL6 tCaqSqRX1anUcZOFSKqz9rVjTpxqQoQ91sfDPi67Q3ek3NrcMDlUuNQubG5b0KRT245Y k5+c7v1roVl+KVlbm0m0m9UvsWOeGWxv9q5UyZRTa3C5UELJHMxjJ8xgwBQ+B6bYeLh8 1v8A2nGI13mSLUEKhOxVra5G055wUGKtX+oeKfDemeIfEul2/iPxVrkNiLm38MWWtvJe atcWcLiGy06HUbv+zrK5uNzKXjWIXEpVpjJIEZfcyzPaSqQpUpYyjXqygqfPKjWp1Kiq U/dmsTaChy897xqxbtCVO03OHy+bZPX5aznissr4eHM5RWEnTrRi4P7dGcZwabTjKLjJ WTjJJWlJ4+/an+E3wYkurj4t/ES78N3V8unTxeC/FdjHqGt2kPNkp07w4mlya5Db6hLG buWbURNEUP2mOW3tWVK/Nz9o7/gpd/wm9jqHgn9nDwnp/g2HU4Z7S++LPiWwt9GvUtZU YTP4Z0ourpLIgYR3l7HEY2cMqE4x8YftsftOyfGPxDP4P+J/7Mup+Br/AEeKxt31nV9H 8Wy/Ef8As25d1ht4NY8P2VvZQxzSRyPbSSX88cRjkSIPkq3wD4k0b4deI0uLLw14L+I+ hvd6Xb2M9sYPFOpm+Gn3Uey5T+2LpJYrtJihuZopIFAJBSSM7K/ovhrhTDfVFiMfhJqV aD9lUnCGOhTnPlnTqRlSjyTcVNNpR5ee8ZODjJR/HM1zeVGajha+CqTpVqSqwp4qrgIT j7SCqr3/AGrTs5OnB8ylJRp88YydSPt1pJpmmwSwy6hFdXVwlzdXuoX91C19eancyGS6 1C9nMqiW5nkJlLcDnaBtAFaD6p4d8q3kbWNFW6AC3cn9p26SyCViVaSNrtljMSbYgYUT euWdd2a+VovAXgG18O63pl78O/HN3cao8V7/AG3ceHLsX+nQ6YGWa30j7XqZWCC6uAjX kypI1ysZgQqrSEcvB8GfCOofZLNfhz8SdTvda+0pax6ZoWg5ldreRgIluNRla3njtk80 m48t96PMm3cAPr6PCuErSUZ1sXCTnCFOnRy5yjJzdlZymuXkstI296aVrN8vi1eK6sXX q4mhhsNRw6UvbVc2UKUqUKMpVKsoRlyqMfaVfa+2haThTqrmdOnKn9ijU/DUDTi58SeH 7WGNHkjabWdNQyspLNtWW4jZh1OQ5yRjb3rM1HWPh3q0MdrfeOvDNgIpre4gez8e2GlT vJA4niWd7TVLW4mgmxi501hPa3EfyXccsQIHyfbfB/wbZWulTyeBfih4iiu4YoIppLzw dP8A2QYzc2x0u5vb+UrZrAA8zGKSayRJleOWSQSCP0HRvhzp2rGHwxpPwl8fai92i6fo 2lP4o+EezUzqk6eda+FLC7lkn1C9vZrdXnXQLeW/uDCbiVBDBJLH0f6t0cBXjiMLWx0v q9RVVilh6DjSdCDqe0iqlSdOrBThFVOd+x9k5zfPGPJU5MdxFTxOHSrPLqWFqp0a8sRm dfDtRqr2UFFewhOFV4h06UFGdGcZS54T9rGnCf6jfBP/AIKCy/BeytPBni/xN4X8Y+D4 rKzvNHs9c8R2um6jDpt8JmtH8N69dGa21XSXeCSNVjOpW1tIhihniIENfoN8Pf25f2a/ iprmk+GvCHjSRvGmsFI7TwskT6lqjXL7d8cP9lC7tmhgOWNwZUQIPMcLgKP5qtL8O+Cr S4gaL4cXVtqNq1vdmwufiH8MrfWNLjhlFvHqGpWEBEtpaeYh3XLo8JVPMJdMvX0z8BPj nqHwe8ZP4v8AhbpPgJNb8Y2t1oovte+JPgjUYtZkyBd6bp1zpc8M0F8iEyzJpdzbsYY2 kIYqQPkc38PsPXoYivhaWZzxtKi6lNThShT5KFKVavUqOOIlP2VNRqVJr2fLTpc0pTfL KZ9VkXHGPw06dGWNwFSjOrGHsKbr4l2lKMUuaVFLmnKSjBJt81lu1f8AprXXfEmgai7J rFzDpxtmiezkhWdzcKxJuBPLIEKMpEYt/JHRpA+87KkHiTSPFTJY+JrFJbiS3+zRXtuF hVVL+Z5zwbR+9OQhcNkoNoHFfNPgf4o3mq+DrS8+Jvjb4V2niFBbQPpfhfxda6la6dEt pDIsF3fXlyDPe+VLC8xjaZPmUmeSQsatXPxG+HkUqg+P/CaTM21Yxr+mF2JAXChLkvk+ g3EdK/njN5Y9VKuBxGWVXKk3TjOGGbc1KMOVOVOlFTXuqUJO9RqcuapNO8f6FyyhlOPp UMY6scNiZQptezvha+Hqxvy1OV8s6ntPaWs4tTio2Wjv1njDwb4R0+e8t7YfbZ4Qj+VL HKkh8yNplW3MsYjuNsSl5PszzGHjzgmRn478b6bb/anXT7Y27liQgXLu6ZIiCjaMk44c hTj0OK+tvB/xY8L+Ir+30PRvF/hfX9VMNxLFpdnrGnavN9ngDF5FWJmmCCFA8rhQsYba zNjJ1dW0nwxrGqI2saXoFpaPasZ4fMSz1ZbszZjuGJvfsyWTxpLiNrVpXkaOQTosbwt8 LmGU43DYv9xSrYacKVKs8PVnGq5VpUFJ1KbpU4J0q2s4RUZ+wjKNKrVnNOc/v+F+Lp5V UaxkqmZ0ZVJ08NWg3Gp7Ck6VKt7anUcVKcMRGo4uHLz0lBxjNxlUfj/7Bmr+I9I/bL+F +lXuo20Wg6voPiqzk0q+067nvzq8tmlxa3Wn3+yWy02BoIWS5tzbwrK4Ekd1IcoP6QPD Gi+LtFsNehbXtE1LwYnh+0g8GaBcaT4lPinS9Utxqba7c+KfiFrXjTxI3imx1W4ksf7J t4PB+gXegQ212lzf+IxdWy6f/O98APhx4a0b/gox8GPFXh+71oJdaJrK3No2qC60meZd HvorS4ihcsIVRI2DJCIo2LK4iLNvH9JcEd82k2rW13ZxWcQ1VdSt3sJLie8RvtUdqlnc /brZLF4bkLNO8lnqAuYgYEjt2YXCf6D/AEdKNB8DxUI+wn9dlicbBurCNTEfVacbTjDW TnblSkuVOacnGzkv4X+kzRVTxB+vQjKFPOsvjj8NzcvtKcamIq02tLqLcoppNNPTmT2P 4Zv+DhK7i0T9vjwje6z4dt9W/tP4AeC7uK3imfekq3N5Yi8gZ7Uy3djHdWN7bKfJt2ne 3kBeB43QfiFP4z8Jm6S7tvC2qadeo4V3G+3tGjAJbfLtimRs4243qeckcZ/oh/4LwaZ4 M8TftYeBfEGpLr1hd3HwS0uK2tLuwutBvZRpuu6zp0zNY6ulnqEEUctis0VxPax2l7Y3 lne6fNdW8pkX+f8A1OHQdJuA8tpd3qKzyGF5EZ2hXMhD7WZG2qNxYc4Hfv8A2Lk8alLA YatzwpRdCE5xkpc8NNY+98Kg03a+i5eZvd/ytieaOOxNCVP2laFJupCMlVlCMaKqTqyV FyVOdOClKqmo+ylCpGtCEqc4Ravxo0zTbG8Sw0bVLpne3i8szS3Id7ieO3WJS6MTveQK oAJYkKuSeOH134hX93461HRLCyvV+w6Ubq603US8DQz287brKVVjjWSWPbIZEKAR8B8M CB6C2sWHjMf2D4L0OytNXtfJ1aMSW0JYx6LIuozSt5k0AkEawF3iBaSQL+7Rn4P6SeHf g14x8YWWu/EXX9G8Naxdv4KW0vItN0PREItbmcXF09vsSVn1Qq8hjl2zy+YQzpJkq349 4q+NP/EOszyvLalCljqWZKhPDuFVU8U8Y66w9KjTpunP2sajq29mkpTnGCV3ZH7Z4VeD lbxHyHOszhioYKjgatqlWph1JSp0qTqOMarq0lCEnbnu+VzjDmfun56+DdZ8ReLIbW2n ktoYrlYltrKZgqCNzhTGQIo5NoypA3njcTgHH0VffBvTrC18vVNQls9Xlt4ZL+eOG6Fx Z2zxrJFEIDAkUaeW6MrNMBKsinOwhj8feIfiLpvgzxTLpPhi217UrPSJbi1ij1S0Gm3V pcR394Gsp1WeZHe2Rokkuo4dNimk8xl021wwPpOmftJ+OdYtk0saVY6dFDBIV+0Qmb7W 0UZMcDMtlevLNckCKIyrDbAtvnuoIVaRf3TJs5weYZbh8yrUqlFYqhHE/VoU8Q3hlUjG SoQhiYyxEoU3dQbUnOCg4zqL95P8JznLq2XY3H4SM+d4XFVaHPSjJx/dS5J2UFL2k+fT mg5U3Z8vtYONV+r6v4J+HXhrS7mw03xfeeJRdqJL1Us9QtBDKRyikuVAjOQx8r5znBxy fDx4P8E67rl3pllFJp01iLSW5u5bMyER3YLo5gESFmbYfneVeuepxXUaX8SNcm1SK0Ph 20u9QuLWW+bSFFpA0ljHKkU1ybO2sI5xarNKiSSpLjzJFBOTXg3gH4meIdf/AGj/AIs6 PZ2U32a+0jSLXTtLsLKeRBqGixrDdpFJJIzTSRQM0TKpyqwBBkR4UxGZYSEsLTaglXru EU5LX3Fqm4xblzXVkkrK67LPC5di5RxDjKpP2UPaNuLTVK3xyjBz5enNq4rW0mfdS3Hg f4ceHI9P8NS3Go31xF/pUjmFZGDRjKqwjLxqJMsFXGM4JO3J8K134p69o76PdaVfzzX8 s93Ldaa9veq2ii0uoxYPLdyg2d+b6LNwot932fZ5U43sK6LR/hX8XvFFxPND4R8RS22+ YWmzT8yTyxKhjQ75fkjaR1SUY8+NCHWNsqDRT4W/Gm8luYoPBepT2a3N5E8R07ypLZrO 4lt7iKSSZI5c27wSRSSMihvLLAYK12zrVfqtOWHjOGHpRpUnN80lFuElBVqlTmfNU5Jy i51FOtyTleSjNvL6rB89XEVKM1U5nWhy0fZzhUg3KMoKLpRpe8lyR5eVpRtyc0X5vrHx i+IN79phfU7i0trxvMvIoSsXnSIXeJ+RglZJC3AHDMBzgjz+bxVql4jJqGs3TSOUG8LM gQKfm8s+ZtYN0Jfft25Xack/Ql98BPjBrNw17a+BrdMvDEsCzwW1vv2RQIsSMdglmYDO GJkndjjc+KpX/wAHPF3h+S0svF/hhNMvbwTx2lp/a+ntPKba2kvJljSJpsuttG0+wlWM Yzg9/ObxShB1E6FTEWqOMZKDqVKcKUZpTi4ut7KMIU5PVcijGSUWkdFCNB0lTpxhBQVK pOhTqaUpJ00tKbiuVPkp81lGULU5Xg1F+eaFcaLpdvpmt6hqura7aSXVzb6zo1pqelaD qELBfMszY6jdx+JLq4hmhDPdXUvhiG2t5lWyWeaSVZF2YPEtrdWoUaXaGGWWZ7Y/b7ee eK3SU4F6AiTGZUKgObe2juWDywxKnC91pPw08PX+qeFvDeoRR2OseM9Pm1Twxp9zfQx3 OpWdvb291JcQwylLhVktbiK6hMq/voJEkgDRvEzV/Gfgz4ZeAtXvfC99440nRfE1l4ak 8R3OjX2qHTXutMYyosFvcXaW9rfyXbxSItnZT3EhxiVE3AGKFdzw0KlWvGeHdRuFaEaD mpVORqEqqSdWEYLlhF1VTinzpuTm57r2SfslH2sp3nRlGzjPVSU01RjP2Hs1anB+zvJw k5SneM/Mdb0TQ/ElheeHpYr2ym8TImjpeaXaXF1qiHVHWzjXT7ZHjimuZnmEMQ37Q0m5 +AKo6h+zs/7Letv8D9S0bxjpuoR6PZ+LZ7Hx9Bpq3As9b+e2m0ubTZJEltpyrM+QGjlD Rt86mu+0TwLoXiLwv4b8R6L4uhhPiG20/V9NlS8uGutPM0lle2FxYXVncXEAuoXMkV9H eRW4spIxFFK1zuaB/wAaPD+qt8RLXX/HvxC1jxj4vvNCtbG41PxHqjazeizsvs/2CGO5 lZCsUEcm2NVXcMM7BN2T+KZ3xJi8P4tcK4GGPqrLsyy3Exhgkm8Ni3H2kPbp3s4uTlyV Je7NKlOk3CSlL9NyHhSnnXhznHF1BylTynEvDzlF1I80atSlGM3FxS9k4rnoVEuWpTmq kKk4TjbzGbR76ytHaHSoBaPOLdpfsx8hJWiedYXnI3rM8Y3quDlfmFfq/wD8EKdUkh/4 KOfB22uLKazuL3Q/iFYi0axmSIWX/COR3f2s3jSKhfz4fJ+zCLdged5uPlr83dLl01mK 3Uut6qiCNmZJfs0AdVWFMSAP5hClYkYEkIAgwq4r9Xv+CO1iLr/goL8E9kNxY29zaeNr UXcF5ImoQKfC97MQt6jK0TMINp2tlgSuMNiv17HQcssxauvaJuaqRcm3DkioYZ86nBU+ ZSk5Rgql2kqkUuV/mtKtVhGMY0ITrQlWnSkqlSDrw5YRpUZym5wg/aRqc1WNP7dpL93Z /wB4mnLOfDDrcGJsRXog8pWTFuJZQiyCSRy0wAO9lKo3G2Nelfhj/wAFBLbToPjjbXD3 U0dzqfgjw47pcXN1cWkS20cltGbe3mlSCyV13NcfZhAs0mJbje6hh+2vhXS9XsND146r 4jvfECanrOralpEN1YaTZL4a0iVIbe38N2L6XaWjahZ2c9tdXqahqsl5q08uoTxTXr20 NpDB/Hr/AMF7fFnirQP2u/AsOk67q9hplz8GfD1zLbabqU9nEzjUtRheRQCY/M2py2xy cEFR1H5osBLMKiw3O6TlSi3urqLi1otNJRjJdbpPdHp5lxFU4UwFfMIKddVksBUhCpOK qUq7hVcZPmg5JTpxnZte/CMk7xjJetX39npujS+EYbzE85DCwibYdrq774ywPMbCOZSR lgU68/dXlrF5EbaraNGisrySTQlyQgKuxVolVmYZYRwlCWPyoMV+BFl4x+IOqSMieLtc 2nCox124Xcc/Orh7ohQAV2BN7uxxtQDJ7/TfDPxq1uFYbOTxJeW8r/aQ8cmoXE5Koyqf ORGmWNlZmMQkETNtcqXVSu9LhXDYapOvHM3N1eXnlGFCrHmjGNGcYuFGD9xxkmq3ta9G q6kVVhGMKdL4+p4rVXz0lktOopRjUj7X2ScVWwlONKcJ06HtOVwmsRTjUr1XCpO7Tio0 4/tPceILNfPA17TkWWJo3y9oi7SBkIhAVWyF5jCt1wy7jnkbzxJ4fS6thLrli1wUlFu3 2lNrkKPOAxII9xQbtjZYDLJ0NfmX4X/Zv/aA8UzQIBd2KT/vY31rXGsAERgDL5d1PHKS pOQFUsoBIFdX4g/Zo8V+GnFtrnxY8L2t5GzJc2Q1W7vZIwUVlwLZ5lYsPMDKWUjC9CcL 7GDybAYWPt4YurFxpSpTjT5aN4OPs6ahT96M+RS5ai9lGTop0VOMJXXkVePcwxdP2jyl OCqKLVScpRjUV6kKqTim1GdNTlPlXLU9kk1KSa+6H1vw6moWWpDUbCC/0hr+PTbz7dAZ 7dL+EQXbRMXAX7TFiN1cOwVcrg4NZt74k0BYb60TXdJkYQrELj7TCzW5MavHPbGQsSyl ipWWNopHRldHUDd+dF74R0fRJom1T4iS6hErNFPJpmn6nK6S/ulgj/fuvneYpbGFURon JOcDsND/AOFE2dmLnxTqnxVup1lSRZdKgs9Ks2JLCOF5byO5LrJgsQ20Mo5GcEaXwdGL 5ZVZRVV1FF0uW9SnKko1ZU2n7z+r0oqVpRlGEHFyhCBzz4hxGLrctRYejTbo4iova2hK vUo0G5PmlOU6kHThSnJyvJUlCSSSgvrtPFGllpnudTsTaWxtora9S9Mst7K8JNybm2S0 t7W3ZXT90FmuhMpeQR2wTaXrqPh+61FZ7dbOaYWBRtYhhtldIWuTJ/Zss+5NRlAkY3Sx pBNZLyVmWQ7D8/x+O/g34c1CF9E+G97qzRR209tN4i8T3uogSSRJPDd3EOiarYQeYquo ltRcpJA+5J4o5YnjXs9E+LcHiC4X7J4N8AaNidjLd2PhfVry/MkjnzZBdXZ1mSaYu4Ys rsxdjlyTmsY51GiqjdOdVqk5QSbg4Kra0YuPLFxipTTlbllCWsN7/R5fVk5yjVkp4iXP GnhnRrRpwo1Yq1V+yxFOU6uqlGk4KhZ+9GovdVn4w/GLwb8INAstY8T3V8v9q3aafpdr ptkt9d3U25Wd0t7m509PIiiB8xnuYz8wKeYVKNymi/Hr4aeMvDPhuDRvFWj6f4+fW5bn xDp95rNoFk0dL7NlpVto9wlvdRX1xYlI7meK5vQLjc6RIjiNPN/2yPD174xttA8CXV5d /Yk8PS+KLyXS7GAHRj5jNp9ybfyUuTa3DI8txbOVaMQArGCGDfmx4c/Zs0nTvAniDxzp HxFOo+KLzULGwk01ReyXlzPcfaXgtNMjkt7W4tpL2SOF3EQkaFInElyPMVV/nvjHxCnX zSthFnFTA0sLXp4WeFp0IfvZTvJSr1qb55K/N785XhDlpp8ijFf1JwdwHj6OU4HGUcow +P8A7Qp1cfLFYlJVsLFU6KdOjGrao2o04KFGN6aqupUhGMq1WpU/d3xZrvwD1+O80/Sv E3ifQNa1a0ubRzq+o6Q1pPqYeB7gafbRzIyf2R5Raz8hxczhpBdQRiviv4pfty6L4S1T W7TwxcXdn4o8C6Jfxf8ACVNqJtdG8U2NpZg51DSUtNSQaxahIxp13FHF5jOsc06xEsPg +z+C3wxuWsm8b634zbVr/X54dF8B674hurHW9L1ez0XTE1CaLWIvKtJ9G17Wr2e8SCKN 9QhiNpFLKZQ/m/Y/jr9nr9kvwL4D8Na3bLLL4p8Sxaz4d1rQ/FUeqXdoLbUNPewNxZrc R/aBqcL7F06+Ukw3aJcRsrkV4lfFZdicPl0p4jFYqnX5vaP2TqujGpLn5qrTT9ypOcH7 WFSUIqFHmcacUvSw2J4poRx06PLlmKw/JV+rYxSp1VR5aSp0oxpuvTp1fZJKrGjVdNzj KvT/AIl31upftnfGv4rfDPwnfeHLC68aaDq8EWs63cj4W6PLfW1zZRxwfZbrxAl7bSw3 CuuXRTBFJAplZAAxr7s+FHxAsdW0Tw7qV9pujaVbyWEV94j0XxppVlq0UutWNsX1CTT/ AA3cQzRaWLq1IFvfSarY2k0yORdFQWr8gL/9qbwH+zVr2nWPhvT4ruJ9SttD8QeH4ZL2 wg07TtRtYnfUba3l8qJJ/s8iR288W2YBmkEoSRGr9E9F+JPwX1k2lqbq21keJ9I8ONea 5deN5VvxbS+KLewNtLLqTy6pYNp9i8kD3C3bxuzSwXMkWiTTM3mZrl1SU6X9nZU5YGjJ xxFWM4UZVZxi4uU6DUIyamlF35EnKU0lyqEvrOD+IKUoVXmvEkZYnG1YKnGUqssNSw1W lKrGeHqr28pe0mqVK0J0ZujUlUdduCjP7P8AFPi74BfFbQtLk0fwHqPw1/4RpRJpnju1 8P6D47hu5dRkex1O3HhbRPiXItrBqDtLHjVRJFaQhktbkNiE1PhD4Nh1uwn0/wCDXji9 mtPA2vW3hqLTdM+E/gXwhE2teJ9yzatrUGseImt9fheKM2VnbzX122ncuLGGfdIfgq5+ NX7MHhjxnoPhfXtG+G0N+3jX+wbvStcj8da5bRq1xdbrjSdU8C69pFnaRXdtbQXX9s30 K2Ul0twWvArRyN+o/wAINLs4PFXijXvhd8SPD/wzh8b6vpOjab4efS9R8V2urWEXhqXU dF1qHS9av47qdbqCC+s7WZr3Xkv4H3f2g3kLaV81j8LmmX0oYKtian9nYinVr4fByip1 KdScqMJRpcr5XXqXpR5E1OcIX1hSbh9lQzfIcdj6WJw+HhRzKhOVHGYnEQxVTKXhMKpz iq9ep7SUqUatarVpxxWl6tZ0E26h9H/sSR+INL/aq8Oy3XhubUrXRIfHWh6p4mn8Uvqe ox6po+ipc6zp2l+E9K8eeK7OGe78uDyrS2sbcIvlRW9vEQsY/oy8F376l4Y0fUJLC80z 7ba+eLHUI2h1C1SWSRo4ry3f57e5WMr59u4WWCQtDMiSxug/ni/Yl+AeqeC/jH4P1zRf if4wXRfiTdeObjWJ/DlloGj6Bd6jZ6ZcDTdX0iKaDWLXTIpo0e1stMjVZ0Futw+mLYot 0v8ARX4fIOkwEA8PdDOe63k659yRgnr9ea/cPChUY5FVhSqVajWJXM60IRqQlPDYWpNL 2NfEYeUPaVJ04SjWlNqjerTw1VzoQ/BPGurRxHFeHqUMTRruOX4elinh8HWwlGeJVOlJ ul9YpwlWpUYSjQpVacuS0XTmoVKcqVFtzHrD6l9q0vV7NrM6Y0C6Rc2Sy25vkuWP9qHU bd1usqgWzayBEOA8vEo4tppFnNBZ/brGwa6gu4NWkNtB5UH9tohEl/CpPmGQyPIUkmaS YoR5jMwzTNCstI03T47PQ0gh06Ka+aOK3kMkKXE1/cz6h87PITIdQkummBbKTNIhClSq 19F1aTWZbm+tZre50CZPL0uaOyvrW7W70+8vbDV1vWvWj82J7mGMac1vZxRvDDPcefcw z2sh/U+apVpWq+wnCKio+yoRpxlDRwjUauq9RPml7WaUppXt7t3+NfV4VqU5ype0otw5 1Ubr0eebc6cE5R5NfZynTjaN1SlOMVytLZku7WKRopbm3ilS3e7eOSaNJEtI2CyXTIzB lt42IV5iBGjEBmBNSQzRXEUU8Esc8E8aTQzQuskU0Uih45YpELJJHIjB0dCVdSGUkEGu P0fX7691pdH1jT4dK1iPStQv7rTbWz1vVrJbNdbax0q4h8ZyaVpegSTXenpFeXnh4Rtq lrPdkK01nYveXe5JodnJrlp4gM+rpe2Om3WlQ2kOva3BoT215PbXEst14ah1CPw9fajG 9rElpq17pk+qWFu1xa2N5b213dxTE4VKcpQlGLkptJqacHBPlcoTg6kKqupcs4S5J20k k+Y0jyupUi61OUabrU26HJXX1ilN03T9rCt7JxU4zjOcHNJ2ceazT0ppZIhF5dvLcb5o 4nETQKYY3OGuH8+aENFCPmkWIyTlf9VDI3y0Vg6Bp80M2savdSeIlu9Zv3Y6fruoWFzF pVnpzy2VlbaRZaNPNpNnYXUaPqkcu6bW7tL+NddujcWsFhpxWdOaqQjNRqQU4qSjVgqd RXX2oKUnHulJqaTXtIU581OMxk5RXNSlSkpTTjKVOUvdk4p81GrWpOMkueDhNtwkue0r xj/mTf8ABlWqt/wVN+Pe5Vbb+wF8UmXcoO1l/aK/ZV2sM5ww7EcjtX+nDHrAuNdOlWs2 iXFvDZXrXxj1sNrlpqdrNpeyzOhR2MitZiz1JLi9v5tUtp7KWbS4BptzHqYurb/Ma/4M sbeC6/4Kj/tA21zDHcW8/wDwT8+KsU0EyLJFNE/7RP7KyvHJG4KujqSrIwKsCQQQa/09 pvtnmbLZLWON7a4Y3czSSPDeBoBar9hjSIXNu6NcSXEn9oWskbQwxRxyi4ea1is6qUJU 2rKa9pD2Uqk6kXooU2qlONOTk43qVFOnGPM5KKvONPl5dXUUnKNnFKy96HxXhUcoyXNG aSg4K01U3tNN/qpO37t+2f4T/n/61fzZ/wDBX/wZBe+NPge1n9ssDqtv43l8/VdQvb2P VNZl/sa5voNHt9QvriS0trPT9OiuHsrCKz0hWeaWzia7OosP6GL66jg8cWMUkWu3k114 Y1kWZ0/TvEf/AAj+k2lld6XLrcniHU0v28HzavqVxdeG4PDGmXOnxeMVtYvEl1ohv9A/ 4SmXR/xI/wCChJOr+HvAWp6vq+szWltd+MbnRX8W+GLnwdrAsNc0zwbr6aLHbX8djeaq 2gHVDaPqqaXpv2Jph4Y1COfxF4d1u6k+/wDDd4ylxdlGJpU+SUcTOlGlWo1prE0qsKsX OFSmvYUlajUmp1akk4pwjSq4hSwy+L8QFSfCeYrE1PZwlPDT5YNVKvsoV9azhzRpJU5q F6VeS9pGrTjFwdZVKf41eHfh5ZeSLbUzDFCxBkZnK8DgEBmHO0kZAzzgHvXXQ/Bb4b3p k/4msVu0TOCoYSbZFYqyNyzqUIKsH+ZWUq2GBA5bVNXh1CBdLjkDXMpIiYNyRkkEsCBg gdOD3+uZ9pk8KT2kd5idtRh+1OscxnEKtdT2zJe8bo7ljB54hJYNb3ME+7MmF/ryaxHt aSpzcJVW4xpK0PaVIw9o2pP3ZWpU5yndxbtaPve5L+XaNTC3nKdOnJKnObqXk0pK3JS5 Yxm1KrPlpwbShdp1ZwhzTjs3/wAH9O05FlsrR9RtJpxDFd2zR7w73MEBLwMDiGKKVppZ RIGxEVihkZsR+d/tSa18KfghrHgXQV0nxa63XgbTrrxFa+FdO06/vrzxPraX1/ZT3eo6 peGS38u0soAkCWFxEY7xFXys+cnrXiH4sReHvhrrl94ansP7Y0+206x0jQ7ie3vNRtrn Wb7TvDuj6pNoluBcposOt39qjTzqEaN44x5rby35M+LNI/a4+I/ivX/HHxFb4f8Ajfwz okekeJPFmqeH1l8N+Iru10u1/sfRNLs54pbzUIIzG9rZWyra/ZIhNcsII90xf+SPHvxb x2QYvAZHw5xfRynO8BHFYnMIQU6jnOpTpLBYHERhzuhOFOUqimlVi6zpOrGNCrzUv6s8 B/CzKOIcBmGccVcLvNsoxNOjRy/Eyj7HknOpKpCdGSrxr8tBwlh69enzU3iYVIvki48n bftRfHTWf2c/FHwv1nwf4D8QQP4g0LwToXj7WL7TfEOq6TdeI/Eel3es2NmbXwzczW2t /YNE1m00260vU7SA6RqkTzNZ7bvTrp/rz4+/tVax+zv8dPhP8P7nwNc+JfCHxMh8DaD4 mu/D+gzw+I7LxlLomj2LabFawC6g05LS4u57OJrm2ZLZtJvIBAZLeTy/H/BPh7wz4w0m XxT4qNzrOm+BPjroHxR8a+ELFL7Wl8N+HvDMVzPr/hvw7dahBb2ksU2l+E7nStPn1DUZ dRbVINVkiEfm3MNfX+r+EYLy8+G37Q1zCnxK0Hwh+0p8TfiJ43EGs6Trclt4r0rwHB47 1LwVo1xpa6hpi21jqd7oNlFoer3Wna5odz/wl0Gq29vd6dFaXX8/Y7xd4tx1TBqtndaj i8ty2rX9m40sJHC069GmsdXw7xF61SVerUWJTpr/AGieJnVpYaknY/YP+Id8L4NzwM8l oYTCY6phqdHBzx+PxMMRLCQhPDV/9qnVlzYhValSPJVjQhUxUaOFaoSpUD57/aR+N918 MP2vfCugahYajfeA/GnipLG01GK002+1M+IPC9hLpWvWkwi/s/VZrFtS8P3MMuuTJNZW TxW/keW1ylrN+M/7a3xbvPGnj638beI7SbTfDllqweS20+b7K15ZS6PpOpXUFvcnE+of 8TPVra9muVb7bb2yTS5K5r995/gp4X+LXhf4FfErRdel8VaVcXP7QOqaZququsmpL8Qb mHxI914VvZ2SzS3ksPG2pG508RBs2HBcxktX4wftEfsxyaj8RPCvgnxZq4gItfEOu6xa WyNLaWl34R+GXhldc0C9G9GWaz/sBL++JWNhaX0csgcuzD8u/wBY4YrOsJLMq9evLK8B XwUVyyhJYWrXqVpxUVZwhXr1/aVedS9rUm5yn7yR9thMjhg8lxf9mQw9COZ46jipQTXK 6tOlQVp80bVJqFGrLmclUpyd0nFWWD+0n4P1/wAZ+DPD+pabpN9exeIPC+latHrVzcCF ZLe11LwZez2Nk9wU+1zxaOjXSrJuupHtpwAzFUap8DZrzwz+zTo/wys9Ht7rSdS8beLr nWfE40qW91GKXTtOt30DTruEATrc2U91cEXlmpVxvgRXWSMN9mftO/FjwvrHw78G+D/C li3h/QvDttB4At3tbKKO2t/EvgnT9KfxJqbSTiSWL+0NCmt9NurdJD5MxDyHMwFeM2Gj 6B4w/Yx+GOn+CPE+up4i+JGo6lceB99xHY6j4e8XQ6r4itPFeoX1zBGvm/8ACWDwzpEe haTB9quLO1MF4zKznfyZfmWLp4bBRqYakqCziE4wk1KFKblL2NecG+SaiuWcoTi47pqS k0vUx+CoVK88R7tepDLedc6U4NxcVKCpzi461EnCTb72S0f5/fskeEdW1fXvi3FfaI+s +ItO+y6tZnX7N9C1G903zra7nm0nT724S9aOSHLWktnIq3dhA90REjvEn0d+zn4s8a+H fFX7RNp4F1bUbQR3ep3/APoWom1tXi/sf4jyQTm3t3NtfyxLBFNa2yIwMhSYRSMpevKf 2cPFHjBv2ofE1ouq6hJ4n8C3/hHwev2U6Vqdtd23hzTo9PkSfUbS5jicxWR1me41Cza+ Qy2kCxq1tI91D9lfsx2fwv8Aiz8Qvjpc+KIL7whZ+JNK8S+IrHVIRO0y2eh6R4ib7EdO too21WTQNC1kX5Npe2EthLNFe3a3UYt7UfScTTlTnmE8XQhCnXweGxsaFC9aFL2dfldK MZyrVr1HFKkq7dRKdOdWbi1UfhZD/Dyt4WTqOFWtTpypVaDqVqFX906tRqpThH2Vp1ak Xy1J0I81GlUdSjGp+ZvxB8e6n4b/AGrPAvicJqir4X8fXb64uj6jFozyyRT6ZBbmS9WC +t7S9uHuxFcXVzpd6jPcFfJADCvvT4VePdZ8QfGDwp4m8cWk1lruveLbgR3lrfyR6Nda IbC73Lc6XLbtc+dd3nlyxXT6gkMcUIjtra4iukuIfk34u/Dm71D4h+IJf+Ej02K1OrjU 9Pvl1C2s7TU00p9KgurcXuryWFsNT8/R55LTS4ri71DUrx7bTdNi1HUbm1iuffPhn4pX SfiJ8ELedY7m+u9b0S0W6ed7RLITXemwvdPaTQ3C3qPp9zJAAZbQJcXEV+Hk8kWU/wCy +GmLo4bGZLmGDqSp4yjicrpVlHFWlHA1sW4S/wBllVjTV3XlOvKjKniJ0qDilW9hTVH8 p4/wyr5dn8a1NVlLAYu0ZVKcPYVPZyp+0hCaTq1ac6lKpP2cvaxpRnKMXrKP67yQWn2/ UrWKMQS2F7Nb3dksfli2uGCXBiAz8uEmD4bk7gWYscmv/Z0sEey5k86ZWdzN5AhLQyO8 sIEILAbIXjTeD+92iXA8zaPl/wCFnxEfV/2k/jP4G8RaiskmoavqdroEEcly0Tv4dgtY 7+PcHZYprfTLNpmcMHYAoCGGxfteOyMyl2EkhZEMZfLMY0RFRQxPIVdihQRsUBcdK/0E 4ezfDZtl1LE0J05yw1WeW140FONH29BxjKVOM6tacYSkpOCqynOFPlTqTbkz+IMdhMXl VajRxkZJvD4KrzzqSnUrxxNGMnU5px5muZXdScpTk5Wn70eaXpv7JmnrH+1D+z9MJVeF vin4MMiqodJ4rq/giaJmdVkU/v8AD4wQ6lCdmQf7UtFSG0068tooxDDDdy2lvDHGWVEF vbRQxrHGCVjVSoB+7GoyzKilh/GZ+zBDPbftG/AiWa1lgH/C4PACKp2b0jfXtMZpLlCw 8giV2tGRfNYSmPJCyHb/AGYWAvWkm+zTWcVnHrN//aq3ME0s81mdIUQx2E0dzBHZ3CX7 Wk8s1xFeRvZxXVukMc80V1b/AM8eN9lm+RxVWU3/AGdio1KlTnUp1Y13Uk7cqVpup+7V NKjGM4xpONKKt+8+E0qlTD52qkY0eXGU1Ck/ZXhCjGph3Tqexiuatz4edNzqRVSpK1Wb 5KnO/wCKb/g6s16x8GfFP9gXxLMlmt1J4O+N2nwXF9bG5Fv5GufDmdfIiTzGluJftU+U jHm24WNtkscsjQfy7fEXxTbfEbwNd32mXWkXNyok1KW3ubCwt/I1RIbhRbW+rNJLq/8A Zot9hntbiS0tWupHDWINvBct/W1/wc0eGPg749n/AGCPEfjGxv8AxZpV54c+OV54W1nw p4ka2s7rTbsfB+8XUrW806V7LVLPUbW4s5LS8ikmhktpfNt2kWcSr/Nqnw4/Ztl8PyR/ 8IZ4lv7ddPWAWOo+Otd+zrE5O+P7NHqSQAg8giISAkguVLKf54xeWSr1ee3JKL5GnBc0 ZRlHmupVoWlumnGyS0V9V9LxDxdlGU4zE4HH0q0qlCVOaisP7T2U48s4Sg3JWqQa3km4 PVcskmvgDwV4gn1LQLi1ltylml+buOxa0jP2WewQjdb6hAEkh0+Rj5O+JTCd6puEhG76 GtPtGr+FptX03WbObTrG1sprnStSurO21K3E+oWmnubSPCPPKs13BNmNHkaxjkkuNn2e U19E+GfAP7PVtZJLZfC/+z0ltYVhjt/GuuT7Y4JXj2yq2pXM9lNcXNs91JavJCrrLHLF bRWUtslek6Z4X+B+nWzCy+GttFFqSwrq8Da/rRi1S3gxcRW9wq3yq6RXkMF8vmJKPPt4 3AWVRMOSpk1OqounVi+R8kpKcWpzhWlGcoxVuXkj7rpyc250583LzckfgK/i5kOGTthc ym3ryqjR91uK5ot+1lGUqcr81nKOlk5aSf5++P79NO1C3i1HSF1qLUfDdza217FI8aQ3 6hvsOq2sqRP5kNtfhHuYCvl3MKzWxkiD+cnOaDq+q6g0dlZ2Ms108EVhbW9k0txdXUvn MI2ggVXaR3aZIY44AA5QbFZmYn9cdSHwZt9I0uPRvgv4Lvb6K3vPO0+//ta4Nnptpbvf G6W8ubn7M0Vykd6TZxN5o+zSMFYyxg8fda54Mv7xtQX4WeAdPvUt7FIpYNLIeOLTYILO yRGVlx9ntoIYkIAY+UHcvIWdvrMBhIToOn9Zk6tKHs+SoqtKMEqlbllHDyVNRpTqSq8l anTjGvCPu1KkKdNx8b/iLODxFeE44LFxw8KKilUlGE1H206kFCguaHLUqVMTzVlKM701 TkpqFqPy34VtvHXhrQNL8S3OmaxDoV/b/abXUrbcYZI7OaNxcvLCZo7d4pQrq7mMgrgM CcH6w/Yy/wCCgfxo/ZE+MD/FbwFeafqMuptfw+KtL8QQS3tj4qttQvpLm9bXYzLbyTXN zcF7iHUftCXEU5EkdwpOG9K8L/EO20/S7PS9O8DeCby3S3niOm6hoNtd6bGjupIW0lBh aMgkyIwxtQkEEZP6K/sAeMfFvxV+N2h/D/TP2ZP2ZPEen3mn38k1pqnwk8KwWK/Z7yzF vqN/qLaXcXm+2aGeCJPM+zyteSmaN5VtZbfHFZZShhcXKrVdRQpyqRpRUl7ScYpqCnFS vOduWDtZO3NJRu19HlnifQzXHYTD4HDYmi0mv3jqSjeCclTUKcKrU6spSjTclGmpz5qk 4Qcpr60i/wCChXwi/wCCgvga1j8R+GtJ+Dvxg0O/8S6pqlrC99NoHiuw1Lw/5M+o6LqW jrFqL67CtrpUUo1UC7NraQ3kd/HBYiS3/nL8feEta8T/ALS0Xh+w8Paze6zr2nS2Xguw uvDjLrvxEg0fSBqk9vZaTa6a9jeNIIWZl1CaOYQ3di9z5st0JLj+9FPgN8Nfht8KviP4 s+I/wL+DvgLULrQ9ZsJW+Ffw/wDCvhnxBBoU0d7a3t7Ya5Y+RdQXU9tL9tgTT5hqU0ay xJHfTyRWrfy9/wDBOzwP8QdH/wCCv/hPx38Tf7Su/Aly/wAVNN8K6R4zsfDdzqF7rKeF tUewt4NTuUhtmlGmXGmGBFkhSD7VBLPcIGLH8ApcNzlxxhsbQrTw2GzTAxeIwFerWnVp KniGoNQlJQoWrYys6blSp2r4yv7znVlzf1FguMMNh+EVQx1KCxmDSo4B16dOK9jjK9Ot PDTqOCnTw08TJOrF1YUp1JKonzav+oP9mD4yeCLP4MfBW08Qajpug+NvDXwn8I6Dq2nD To7DU9Nlj0HTl1TQbx57Vru1gtdQtY3msIbiKE6hZwzyI7RRk/Bv/BZXwZ8Nf2hfgJbD QpraPxHpNy2pan4qTS5rqGz0nzrKzmjmu4IxJc6m7TWx07T0YzTxW928QKxSZ/Vyy0nR PElpda/4Ss/DWvaLea94g0t77T7fTXQXGjz6lpF/BYyR2pgmvLPxDp0mk3sN1PbRxNBe l5vOtlik+Pf+CpXwTtfHX7HKeENI8eS+EfF1hrPgfUL3VvD1rY6VLeS2E001xdXWnQGe WwstTuNNvHtVaW4himh+zI9yYnNffcY8M4D/AFaxyw+LxtOrhKeHxUY1/wB5SThiKMnK SjTU6sJysnyVOd3UYyWiPg8s4qxeU46vmebYLA4DBUJ4hZjRjGtRxsHVU8NUnGnWU6dO rhpKCnDEQ1nyXpTjGpy/yXfsw/DLwLpehfGfw94jt521H7Bp3i/w3qRtYxHa6j4e0pdV tfJlJQbNQ2Q2vlO0TxNKWb5pAK/oBvvEWg2P7F/g7W/CMdjfeLYtC0bT/F2ialbSSCKW +mgt/Fus6Pp7x3MiTeZqMZk1O3K2lxBqoM04Zttfz5eFv2Ffi5Jf+PF0L42Xtw6PHq1z pU8t9b2muadGz675GvC3JK3kUJure4VWMMtmtpZyRCOyjZ/ue2+EP7SHh34exadNealN bWvh7TNN0e6h1i9uI7zOjX4t9G0yS+F7aSajY29k0ksVvDsjsYN11CVRXH8beIHB+LzD McPif7RnWlVxNKvOlT56dOmpw+r05tTqQ5aUp1LunNcy9pKCadU/XOH/ABw8Ms1wmFp4 XHV8DPLlieVQopxq0kqcoU/bOPvqrXUY1FG1vZxnab5VH4l+Lr6dBd6v4wuPC2teJtEt NEj0bS4k07Uriy0B9De2lW3tJPKJvtTt3vJngS0ecwLe2/2p3nnj2+B3F5HrPwV1bxJo OgX3hu8097u50H7NbxxX93cRmR5bnzJZnmtru40yK7SK1ghubm3vrZLYC6lkjA2PC3wj +MJvPhhZ6ldfHWCWx1Lx7/YGqxzWt5o97ZXl7ZLfabqFteeVpX9gaLc2Tf2M62lhcst+ h826W301LL778GfDDwOfAPhJfDVydRt9I8WXGm6/Zx6h45kddVu9N0jUb+2+IFitzd2W l6ztvVvJhpE+i2txBf6ZIbC8iurG6ufVnlONyHB0sHhsbTzHnlgpV60a+MpYNYak4Sjh K+EjUpqp7Gv7Fz517GrjKUZ03OHs3LzqnHXB2fYueJrZy8udTSWGq2qVK9KFVxhf2OMj SnSruFHE04VEqkLUXUhQqKdGHxt4I+D9n4t0/wDta+v4WvNa0LTZ7FvEVvd6p4g1SXTN OaGSDSNOuLe3ljvLi5+0Kk/2cJLBGrRzTpLG9e5/se/DSw0T9vP9km1ubFo9b8J/H74O 300txJeobmG88V2dlCtk8VkbFTEsslxNa3k0QMkTRebM5i39NpngT4jzeGdXvoPM0g6f 411SXR/t1wLibS7W71zVl8K21tem0sjdA2qeGE1W5tLNYGMt5p9rFdQTwapD8/fsY+Hf DvhT9sP9nLWfiH8Vfih8Sfib4e/an+EN7q+m6la3dtrq61ofxA01r7wzaeCLOY6leNb6 h/oOn6GtvNO08/kOn2nYh9fhDK82ef0KtTMqU6cMbz08HQjipVI8uIjG8ZctKmqcealZ 1Ki5nWowUJObprrzzMOB8dgsNQyivGjj58idSWIo81So6kYQoShTqVqbbUqcW6TnSjNz UasqcYV6v+iPJBotxjStZ8Ntr48Q3ur6DLcNoEWpadZWKaVJrUkOvSTrIljpF02nQ2sQ uA9pd6xLp1usYkniK/hZ/wAFWJbfwj8Q/gB4l07SLeR7Tw/421me1tPsGnNqF1a6t4Sl naS4lWO2W7uVCwvd3JYAbWkYqgFfvzpYdoNWWNzG7X1yqthXKlrWDy5AvAOF2sVPGBg5 7/zW/wDBasfESe1/ZQ8GaH4X/wCE08VeL9A+I/hbVtR+3JpEU8UerfDPTLzUFtrFXNne 65bX9xq9hDZSMulXCNZIzlAzf0t4hYani+EKtCqqdahUeDdVzlSpU6kFiKSlRUpXc5Vo uai1SlBJNTfM4xn1+DGIlS47wHsnONV4XOo01T9rzwr18oxkY4yKh7NQdHloSm41ac5q nBwlo5U/hPSf+CqXgvVLO0mg8O6HbXly8cy6Reahdwa1JaXF5NGkOn2Msey/un8l7VWh DxveRPGIwcqO88Sfts698S7TQY/hn4Q+JXw3itZZpNc1TWPBugXhNvNA8VtZT6P4g069 uzJJdM5ivLe1mbECtG7KCE8l8P8AgT9lDwdq1pfa/wDAm10r4h+BxLpvieW98J6nrmqx +I9AsdNvrZXhtNbjl0Sz1LS9Y057S61YLBczy39/DfNKs9vp3tfiH9oTRoNN08+GLL4w 2USxRXek6l4Y+EUvibQ/7Oh0/SNTsrjUNO8R6tMjw6xHFqkNsly0LRNHbTtDDay/abn+ eanhLwrg6yqRwGIw2KrUaNWjGdaVSg/axo16SqRh7aMlVjOFWCnyRgpRdSUHGSP2yh4k Y9YuLq4TBZj9Uq1ZVsNUqxpQlTVKbbdeFaCpVFTnCTpwlKtVUnh4UZ4irTpnkerfGv8A aDsHuItD8X/EWbULnUtMR9L0HwB8JdP1XVLrVDa29qIn8Q+ELXThc3UYjGb2+tsQQF5M Kiiu4e8/bF1iWR7zxF8WfDE+o6PYJq3h22PgCC60wxxRQWsjzaVpNw+lXl5L9skurjT7 /wAu5vDOsFytvYW9vb39Q/aB1TVtPm0y7vfjh4hk1DQ9fto7N/2XvhsIb1H0jSpbCCef WzdW/k3VhDa+IZZJgAt5aT2V5BG0sIt0i8TaprrapHZeEPjuRYXXiGwuI7X9nf4SQQh7 qLRb7QGDNoM8ltOdD0ydmjURWoDro5S4SGO4j76HCuV4apip/V5LMKKoyw+LjUpRcFGd DlqQm4RnKrSnSjGjTpVXPCunh8TTqUYqUZXjfE2vi8yo4ilwzkOFwFKMaeLy7EQzPE4X NKFRczw9VRqUaN/b0qcpqpDFKOHhOnKEFjP3fwb+2V8Cv24vil8TPCeveFPEvjnW7WT4 X6rofiMXGvaVpUWoau8niaz01b63txYaal1ps8mnTW0iQl47e5W5t2IY7fhr/hgz9sy8 8IQ6H4g8U6lo2oPq0N9ZJqPj/fPqGdPNzqFmb06g7WqWSmK7kSe4SGWeOKGNWlcJX76a 74pv9L0fU/F1/wCB/jRo3h3RtO1nXtU8V+IvAXwy8KaJ4e0sWNj4psdR1W6k8OJHZ2tp 9jnfVUd5RDLDDaRPLYxOg888f/Fzw7ov7MfxH/ah8G+IrnxL4Ys7XSfBfhufWLrwjP4U 1rVr/VfCs1npkV1pWjiIa2dRu5pL64bdEokWATQ2TzyJ9nleaVsDQwGT4OjFYdVqWXwq fu3z1FB1HBOCklL2cZTerfut8zvZfn+fYpZvmWY5nUoYLAvEQxGOlQoL2WCwbjKkqdOn CUY1IULy92VpJKnO805wR/PHpfwD+MGs/FrVPD2ofFHW31vwRbQWOrRN4rkuzYppM91p evaZejT7q7kt4pLwNaqGtpVkR0kZdsuK6/xB/wAE7PjF4F+E/wATPFWt/EvWNM+wah4c tby8l1u7szqXiK41K30rUtP0qC7hguZWW81O00ya8njt7dYWuGje5lDpbe8/An4O2fwX 8Ir8ZfH2pX/jC6+LHxFj0u71W0vZfDWralYwSjxb4j1T+0SUutt7qjabZXQcB0W8lVgS JMfZnx6+NHw88Z/s9eGLbwLceKLlNf8AiP8ADyKDV9X8SHV/7Qsr3xJe63qWpw2dyGaG DUdX01ZGkljYgac6gSyAyD7jFVsfRxmEoYWdSpT+suhWq0p05YalCjPllVhWpSqKrepC aco3pySi/aWnFr4yriUqU5VKGG9qoTxE6NVz9hUo+3pUayWKpUa9CpUjRq82HoSlD61y vlnGkq1Wl+Zngr/gnB8YfC/gzXZNQghtfDHirwzFFNres2cOr21pp3ii6g0mS806xTTd QSXUrpbl10rVFsl1LStXjil0e8sZrk3DXviZ/wAEytR+G3wkg+Ib+LbjX/DnhPxO3hrS 9As7bXNB1z7f4i8VWnhfSzrc3iDSfsUGlw6rbtBZTaNZySP/AGosWL2GQSR/0feLvDv9 tfsbfEK7uILG/kt/gLquv2UDXl8Ly+l8B6zp2uKbvUtIk0u7s2i8qcyizmgeLObeUI6R R/nH8Lvj18Gfix4e8T/AOTwlZeE/EPxFhvPCN/4pt/ib8QZZNH+IPivRbTUfAutaDDq+ rrbxjQNYsdHvPtdnfTrZak7Tx2sUsbibxctzPM8S5+2ozl9SzanTxdOHLKlWouSnz8sa lOacqes1RqUpfE1OFT3l216lHCRw3LPDRhXy6E8MowgpxmpuvPmkk1Kac2vfbScdG0z8 /wDwV+wR4E1651DXNM+JthcQ+OPD/l6fOuj+OtZh0LWtVms4NQ0uZtD0O6cXmifa7Vbr 7dezXFtZanY3smj/AGOdbi1+mvhx/wAEt9H0fSvDXi6Tx1e6zc+G9f1jUtP0y08CeLBF eatp99qPh+0slu0tZbC+sb1rJtZllmfT76KJJLK8toJLGdj87fs1fFy0vfhX8T/BniLS PCd749+B1vq3iHQRd+KX8R+FNQ/sXVLPRPiXpg13Qb4x39i2hw67rNjr+mazeaTeReF7 aexe4hNpcH6I+GX/AAUV0LxtrGreE9F8C/CnT9U8ELpthAt9B44l0u7sE03V9PjXw5Nr F7cxXEFpqr6nqOmv5kNtFDfSyzInmymvazDB5xja0ng50W6LjOeGthaPNRqL2iqVI0a1 J8tet9YVJUqWFp0qEY0KalKi6kuHC8U0I1ozmsLUp14RxOHnTdSXLScF7VVHQSp1o4rE ydSlUSw81hoQw9Bylhq+Ir+l/DX/AIJwaV4R8Xad4j1/4qal4j8PW2vJfyeG5fBesQRX 1rcf2hqzaNeXF7dWotIk0pLIRzxQTq13K0Zijt2F1F1OsfsM+EtbvPD0vwh+KF5YWaah 4rHiDXPHttBZ2yJouqafYmz0tDqVqy6lpl3c39s1vNsS+XT7q6inMEZY+9eB/iPdeP7r SbfRPEH7MlhJrep6Np7adL4W1a3n0ue88C65cajDHDNcSPdpav4dksdMukB8u91cQuWh uY3r6p0j4b+PNZ8MQeKtV8cfAfwuusTh5tI1HwJcadqUSJo974ev45LKZmltpZYYLW7s oogZ54JYJ7dGe4218Xj6+Iy2co4+FOWKhKhFVFiMO8PThWo4iSVWjGnVnUrOSozhKNen TpKhWpVaNaVeM6H2OAz7GVnSng69SHNTuuWjUlP3J07uNVpQjo2tI83vRlFrlfN+fPhP 9jf4q+AdQfxRof7Qnhfw9Ppiz+fqHgg283iJbOWSW2uIhanXLSPyTHb3320PcRwwRrBI 7PFOtXvid8Mf2rtN1LQZPBXiLSPi7YXthqNnqXjvxbeWeh69ayxzSyRW92LzX9U0xrWw Sz3addC3mWNdSEd3GrSQ7fuCH4a+L9YEZ1v46fC/TruMNcyJa/CeaYLBq+lNoGtz2r/Z wWlntXiVIwpmi828fasbSsrtO0HxF4Z1HSo5P2o/D2hTeKNL1DxXp1lovwjS41eHSrqW 0stTm+ww2t9LBcad4kgtkv4pIrWfTXutOnhljgvtPnvvmsdLJsfJVsT/AGZXrRpJc08P QjKLjOb9jTnGftakJUoRnJ8sFCV48qUYzqe7S4iz+lUpqVarRU5OGGmpKMZXioKlZckb ym2owV3LS0ubSPL/APBNWP4s6D+1p8MPCfxqsLZPGejazrHl6vpOrQa5pOq2+raDe3Nr Kl1HrmotZ3KW1tNZS2cEK2sVzY3kaQqxAs/61dJgOk+GFtrK21G/Rr/UVIm1GTUbuFNQ 1y6e7vZL3XdQaeS0083U1ybZbqWS2sIRY6TaOIbOxP8AJx+zhNrGp/8ABUv4I67a/EH4 ra5a2ml6Bb6ufFf/AAi//CPa6vin4d6vrs9jY6d4X0q00fRNW8La5Y6joms2enajrKFk ivpdQumv1vbv+rTwTrlvrmi69dadquk67o9vrfinTLPVNElsrixt7/w94g1rwx4n8O3l 3a6xqTXPiDwv4q0HW9O1/faaQmnXbLoUtm2q6Nqr1+z+HEGsszeNKnRo4aOZYegp4JTq 4f2ioVHQjVqU3Ww9KqqNGuqMqsqNOrRoqVNTnU5q3514uzdXFcI4up7XEN5G4fWsTRca n+8J1qcKroUMTPC1HQhL2lepVqKooYaNWnSw2Hw+G/i0/wCDiPxp4C8Kftp/Cm18ceLD pCap+zMbrTLLT4FW6nubLVtaWayuLh9TgFwmrE20bwJCk1taR3UiQ6i8sduPwe8C+LPg 58R31NdA1HUvEjaKQ9/bWfmv5VnFZzXUt3bx7lWdIvJksyTvAlUZAOCPvv8A4O5dG0a/ /a5/ZN8U6GumT2fiD9mSXXG1XTHtQuvxJ45ntLXUftduCL3z7AaekF8HmaS0gtYhIbeO NB8ef8E/vgs/xV/ZXXTfD95ofh3X5pbKN9fvtKu7i9t4Z/G98t1Ywz2kun3rRalZKuk3 cq3avZWd1LdQR3JtjG32vEPiPheBcswub5m4QwDq0MLia3LF0qdFNxjiP3ND21Xlg1Kp H325XcLyk5T/AD/hjgjGca5hmFDDzp0MfSyyrXo4bDxoU1jJYWSp4SnKp7Ohy1KtHklX lO7daU5zqVJSnVqM+HXh/QtZ+IHhTWfCnh+9k8Pa4kmqaHq2obUW90y4sZb3Tov9HaWI 39zaCKERxsY2u5PLVthDV+zvwg+JHgrw5Z+O/hjqsMmiTaDpmjXlvb6pd2iy3F7qUS3F t5E0qgyrIlqUFoioQshk3ZAY/nla/sufFD4eSadY6F8VtN0DTvDuqTaloWk6D4Qv/wCz tEtNWXUNul6cLuS4mTT9JtlistPjmuJ3tYY4XWaUhnPn0vwb+InizUbLxP4k+KPjLUPE 5u7qfV9btdHuVuNX03TrHQ9N0TT5oXlgs7X+z4Le/niuYIhPLe6tc291JLFp9rKP5B8b s14U8W89y3MMLxFhcJldLA+yhVpe3qzpVFifaU8bVoxpXpxkoSpyw3LLFW5aqoeynTqS /s/wZyriHw54RxGU4zIcTjMbmeYRxtbkq4eOHw+GhThCdP28ZNytN35YpynyylCMkmfE 3xY+OGpeGfj98XtA0z4eafqUXh3U/EPiqeeV9JsZbnSZtQubRpGTVEcXRW6ulntbOK6/ tTULtrSy02G9knVD9I3v7Qvg/R/hfe3tjF4DTxBp3hW/1W2tbNbBtQ1DXX0a2vRpsxtN TFzcGK7gie1t3C/Y2nd4wqGVoqHhj9mXU4/2jda0nxT/AMJf40tfEPw3/t3UNW1PQLLU pNTv9O1fw5etbiyIlW+TTJHuBbu6ySS2EC/ZLcX7LCvqvhf9nDw5Y6j8RY7f4fa9PF4f m8O3wI8G/DZxCur6dcxwtcJc6De6ekdwmmyW6tLDdqZkkuJT9gLW5/eMF46ZVw9h8Fgv aRxtLCZdg6eExUXFSnNYL6nWcXTqKL56FaUJUlytU69p+7UifgNfwQzPiDHV8ylJ4Lnz DHVJUajar/7RPEQq+0mpRU1Vw+IlRdP2MIxi6sZ86nyw+D/g1+0l8V9R+MPg34j/ABVk 1nTdKvPhn4m8Ia34o1RbqdLrxBb6te77NNS1KV/7Vv4prPRI7pS11PbwXdsxJhntCfoD xn4p+CVj8CvHnjfwX8QdOt/jne6dY6xpFncQa6mtfankvdYF9ZSw6PNpEs8ltcJcSi81 CxQ2Uu7fNLGtvJ9e6J8J7WyuLq2HhDWYNM1ez0Wznifwt8MbW/t4o/F99qN7exXl54Yu bq2kuUFiII9Mi07UvsVrq3hm51K7W71KFOR+KvwRA8DeKivgLVZNTl8MS20UVxrvh6yS C7s5LeynOl2GgaNpP2h5orS406KzjD2Uunz3esafaR/Zre4i+NzrxlocUZhk+BxVR4eW DzSGKw88vxUsI6vtKVKCwuMw1ehSl7bC151KVSMZTpVsTh1X56lCvKnH7DJ/CLG8N5fn WIorL5wxeXUsDCFXD4R0aGBoxSnVoQowdOCnSjGScLTVK7l/tFSTh+fH7M/xw8eafet/ wsT4qXUL3vhOxu9Kub+/uLa4l1S+1meKa2SNXijmnZLKMJcIiBkSVVdgpNe0eF/257vV /EfiCx1PxZqXh7UNI1i/0jRbn7QrwalqSWl/fafqlze3LyxJpWyG3uL1wXlexEr2x80o w9f+EH7MngnW/Afhu88UfDPR9S1y1fw9dHUD4jSGdoBeprUTsEhS6udLk0uO4OiRyz7J X1C/j3AoTP3lj+zZ8NI7pR/wq74SzXMI0iaVJr2eFLe2stL1iIWSZnhtbn7XouiWk9ve COWe40w3lvJK2oz3SyfVYj6ROV4KGJymEataOHniMO8RKvhvYYmDSaqU4uScaE580Kbr 06VS0ZKpC0kp/LU/AXE4qpHERxGF5MS6cLLCYitOHsaf1lLnWHk8LGdONlOpKjebjQcm 6sI1PnK3/at1i21zT7XUPHfh2x0g2891f6i19Pc/ZDbKJ2njtoDJPdJFaz2GpKLSOW6+ yT/aUgKRuVT4lfFWy8b678JtQ0rxvdeK7bSfEuq6l4mGnafeSW1rpEnhDVp5Zbg/ZEke G605pPJEU5mZiqq6SACvtDQ/2evh/earbPafDn4P6VHNHa/Y7NIG1VonPh1bu2s4fNk+ 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 hAkheaLT7u7t7e9wrLZ3c1tHceXO8Sn9PWs3FU5KNOEXGfLFwvLnjyRalzKVNU/fXLGP LOPLKTUlH8rjUg3anUi42lFqLi1KVOapzV09ZUakfZzj9mbUZWkkihYanqeoXNrIuiPY 6RLb6x9ouNTvFt9XhvrHVLey0tIdHt4Ly3n03WbEX+qpfy6vaXdlBHptvNpLz6hdDSt2 qKwXZ1KW5kmiNktlBBZ28YukmS5eeeTUJrs/amsrmN449NSwxZR3Nkyajm5mivhFDy/j /VrfRdD0+8utE8beII5vG3w20lLDwBHqkmuW9xr/AMQ/C+g2mt6gmkajpd1/whPhq71K HxH8SHmuJdLh+HmleKJ9b07VtGjv9LvK9rzw53RdFw9rGUUpNy9nVqJVFFVa7cakVGVJ KSl7J01OCq899K81CE5qMEoU5TsnU5dnO0m1Un7qag3CEvh0jOV3LX0631q31zX2vJEu dEuk0u60e5l1MS31vdNHd2+raONGt/D+nWthpNkLbTtQ0/U5tc1/V9XvtZ1m2vV0uw0b R47srRvNQis59MtpIr6STVr2TT7Z7XTr+9t4J49N1DVTLqlzZ281vo9iYNNngj1HVJbS xl1KbT9JjuG1PVNOtLop80Jtqmox5OSE4xnUnaapwbcnVqVJqdTmVaUOZQj7S1KFKiqd ONSjKKjJw5VOPNB8vLGcVKUHOOiUk5wmpSW84zu+ZM/ysv8Agz0+Nfhb4V/8FgbfwL4h 0/xBeav+0p+zB8bfgp4FuNGtNOuNO0nxVoV74G/aLu9Q8WTX2q6dc2Ph+TwT8AvGOl21 1o9pruov4q1Lw1Yy6VDpF5qmuaN/qLNruqeLdOTXvh14v8K/2FcaN4v0NJL7whrfii8s /iJb61p2g6TPqUWneLfDNxY2HgXV9N8XaJ8RvAOoafY+I5dZMNnc+KPANz4T1u01j/JK /wCDXH/lOv8AsM/93M/+seftBV/rjWs3iW01zxGRp2paloJmvLy2N/f+G7S4huYNC8Kf 2fpHgjTtN0+FtQ0PVr1vE1xq+qePvEWl65pXimKe2sYNR8I6lpVxoMy5o89ZzgqOHw9a vUpexq1a9aVN05xWHVNydSUacaz+qqhUq4qThCi/aJUMRrQrLDOWITpe1pKMqcK2GWMp 1eeSoyprDTwuKozmlV9sp11ClTp0akub2vsk9WGHRNJ1a6tbHSEsdR8UPe+I9VvtP0Ke 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 fcaOLW1trW1htZjqNvq1rdakmrzXmqf2jNbXVtNEdMtrbT49Ls7nTbux1KW6v9RXUbe1 0ll3a36adqiaNPY22sXMN/Jp15qNg13YQalNFJ9gm1KxsLrSrjULO2mMP2mCLULK8u7a Jolv4JnFyjBfzWs1wmoQi3srPSYNQu9cf7Ha6QZ990L+INLqUt7AbWK3S8nN1aJaQ21x CU1K7lFzFa6OpKMXGbXJBSn7T3Y0optuXxS5lJRhDnm0la32bqCrYiNNwptVFSUY/vHD mpqo4OVacpRV6Mb0m/aVYxhGm6VKVaclrpzGZYZTbpHJOI3MEc0jQwyTBSY0lmSKd4o2 farypBM0akssUhAQlQxxs1w14t7NLbzWtvHFaD7K1lGUeeVr2CRLcXbzXaTxRS+ZeS2v lWtuba3gka5luSp1krpygtbW5HzK+ktp6NarVOz1SeiE3JX96Ku7fC7pPSSa5tJLVap2 eqUtF/kG/wDBroof/gur+w4hLAMv7TakozIwDfsd/tBglXUhkYZ4ZSGU4IIIzX+vFpWp abcXWtaVbeILXWtT0TUBFrNml3pk2oaBLqdvDrGnaXqVpp6RS2B/sm9srnT01GEX13ps 1reyzXQuBcy/5D//AAa4/wDKdf8AYZ/7uZ/9Y8/aCr/XZ1i/gt73StOj0177VtQluLrT Gm0vWZNJt301IRe3Go+ILDRdV03QbpLG7lGlrqstlLrE4ksNPd2Fy9upwlKVOULc8Zck Y1K86NFqtKnGbnZulzrli4Tq05ctnCM6Uas5rWHI3yzdnPlhTlzwhGNSU4qPO6lo8ru4 6zp8spRm5NRcJQW0bvrNxq0mj6/ZXN1bz6LNJd61FcaSthoWpXj6ZeQaHb6/e6Zaza7/ AGndXcWo2umQ65dafDa2PiWS1bTtK06D8D/+C2vxN8VfDTwh+zPqPhnUrDT4Ln4heNT4 iGoW90zX2haZD4Xe4s7S+htriDTpbiS78qSS+SMT/uRFKmxif6BHtr9JrMxX6NaxpOuo JdWvm3l9IUjW0khuoLm0trEQsJWuIk06f7X5kaxtaGJml/lF/wCDmvxh4p8E/Ab9nA6f qPhzTT4r+JvxS8NnxZqDX2lXXhuyvdF0K902K2mW6azG17SNdSvb24hgDW0VzHZonmG2 5cXmea5TS/tHKq8cPmODqUZYetUXNJxjKLqOPs1K0OVuE01TacWoJxtN4YrB4PM6NbA5 nSeMwmJj7OrCUnyRpU4qNNLmcZKKSTgrPl2fKuVLwT4M/FLw78Uo9Zu7nVtN1TU4ta1X V38OaTHcNqjaMblCkM7KrkXtwoO3yDIP3wZMnAr6E0bw1YJfwm5iE9rNcKEtbqELAWMZ wLh36xoXUyI+Ayo6PgMTX80/gr9rjxJ8E/DOpX3gbxboOv8AjTV/D9rr3ivxHqd34fC6 zd3Ztzc23hu60ewsbK48p4nS3uXigDMFWOFoyJW/VH4H/tIePv2gfCfhy4+HvjfRm1yw 1G3k8ceHdctrjTdRlsry4gc2GlaxHb3mnXlzHELiCK5VoBOswWdkG2VPucH9IfDLh3HZ bn+U5y80rYLGZdTx+FcIUK08RQqU6WJqxdaFLCNSnzVq1Of8vLJxpxa/Gqvgnia/E2Hn kGbYGnl2FxeFxc44xqFSqqE6VOpSwz+rwlWhOMVWpQnQpRjPWdOm24njvwP1+48R/tTa n8MpdKsvHngrX/izqvime61o27p4dbSb6bSvDsdpcSlHjTQ18yfTbW+klsbm4CwW8M02 Au1qd34usv2wvEvgnStNj1zw14i8WaJ4q8dar42Y3FnqNppWpW8nhtoILaOztPDq2d5d hoIykWnjUbVHNu7xQ4x/hP8Asy/HfQP2ltYtr7wBq+haP408UaHfaD4pvrSHUtD+xWOq y6hLLd6lpt5cLZFmuCySTRRFPKcyRpkGvp746+GtE1v9qfxf40u9VtvCWneIPD+j+CGu preH7BZXHhaCN7XxfrEWqWtnJdeHbrxNbW09u626fayhjYOFEsn8b5vRo063tI0OaGKw MPrzpyda2KdN8kpVKfN7GEoNurCjOnSqTjTdXmqRhI/tLK8Q4eywVOrOjUqV4rDQjRqV 5ctBUqU4Upqk6eGU21zU5ciqOV/fmuY+S/2hPH/je4/bK8beGPC9xaat4a8UzaRYeI/7 dxd6Vb3nhyw0jU4YInW6t4Lazm1Bzqd/d2F9p0UKxw3U0ccsksic78a/EHjz4cfGjQfB /g/WrXxPq174XsPA2uwPDJeadPolxLNc39jDpNxqD20L6nYLDbXLJqEHkWaBZZZo5d6+ pv8AC+TxPofjvW9d8ZeAP+Fly22m63qWpXOlarP4R8XLpl2tv4p0mC3jjutYsbl9DtdN uprOw8PRzabIhXGoJcLbxcz8ePBJ1lvhT8RPBuu6Sbu0j1rw14ttNb0S8m1Kwhu9OY6V rmj/AGeV0sbLUtNumgsrXXbJ9QEEUd0TBOslqvmSpUMApU8RSprCUqFCnia0sNUvQqYe lUlChUr1acMTSX76cXRozVGpOMKk/aOlSa9bMalPD0sVjZYuth4U41v4fPFLmqYepVk6 Tqewq1oSo03F1KcqtKLqRpWjWqxn1X7dXhPxDd+F7y1+Hep6Rouqr8P/AAfe+fbap9n0 HSJ3v5dKkxd2WbWx883VtbWN3FslCvBumk3YPx7+1n8NdbuNJ+GPwzgvtSuL3W/BngzR PHvxA8JagNWWSx8G+HSkWiS6xaNttFk19tQW5SaZHmmtgjoTAjV0V98W9Xg8PtFLqjX0 tjLF4e0h7S0WWTUIPDU8SQNBp+pTX1is+nxTfaJiY2N5H5kssMSyNGPzb+PP7YVtpPin TbTwN471G+j0TUIbHWNKkm8m3/s+WMR64b6aBhJ9utrgzLBDEwhERUKik7BxZXSzvM8z +q5VSpYmhhZ1MVh8ZKnjlSqqcHGNWFOthqdT2U7wlT9pGjUnrz01I/L8X4j4mVPEYXKs rfJUpOFTF4j93KvUVROFdQjTg9FHl9+cuZXilBL3vtP40eCPDXwJRviV4O8UaJqHijxT 4WtdN1KMWMt14iv9VnspdP1PVbgLmPSbizgjgczXStdXMOoyhMbHB/Mz4e/B+b47fHO5 8DS3F/E/h7wvd+I4dXaeaz03RhaQPcSfa1WMlnv5ZorcA5m2HciMq8YusftM/EfXvHN+ 3gbw7feMtKvrm10TS7m50oSomtanHbStpyytGFJkiR2iiZDcmJw5O1cn9KvEXxf8WfCH wNoesWfwg8HaDqHifToU8e6vfrBp99HLZWsBvbHVbyAboby8VDHp8W9NsqKWIDED6nF4 3iHh/B08KoUMXnGcUZwwtWrXoUVh/wB3FqUqLtXap2lOEHKUp1KnJzKm404+DjuLcZOV OniMH7HE+2v7CM4qnSt7OMo8soQmpc8JSlz3kpylqoqMY/bfgnxZFL+y14Lt7q613xDf +BdIXw34vntJkvDHfQXp/sS5fThLJNL5Gn2sBtL2OGS5gd0tjCQj+X+Yfxj1vxInwk8V eHPh/p/xct9e1i9vNd8Qm78Pzx3K2X22OZb7S5PD9tdWGmNbWNhEmLmdTdGczSwNctJe vLr/AO1D4S8IeCZ7j4H+M/AWmtb2tx4nnXWdbtYtQ8Q6/MVuNV0nVtMudWi1GW4sjJu0 8nTpbGSWNYYWkkDx14T8KP8Ago14p8V6d4r8O/FDxP8A2BqOoXttqGga7ptvov8AZv2G B1aXRJtP1TR9QstRvLiWKKS2N/eaRY3MC3ek3V/bJfrBcfGZPwtxJUx2aZ/TwCdOWOwN WvhMTUre0So1KUK1arh4UXy0FONXGpJyVPkULONpw9fG5tHH1KVbFRrYenVw+HoVK75q rVnTbnBU1R9pTVaMfcnGpGlBqcuedNVV7v8ADD9nv4ReIPB3g7x18UvF3xL8ReA10+7v /C/w7+JPiyB9Dk17xDBY2vibWLrSY7B5NL1AGxiaO6muIp5LLS9MhupvLgsrI8X8Qfh1 8AbX4V+ILzRbDSl8aatpmn/C3QYNOlS81u28IaFc2mqSeIomvVu7zzZbPRILWHV9MEN7 baPZS6aGh0ie6t7nnPj2njrSvhv8PT8Xvi5o3xH+GHikXF1c6hoTaV4X8ceFU1y5tXs0 1Kzm1C8XU77TIZI76HS9DuDZzxRSW8EMstq622f8Cv2AU8ceKNHn1TxvpvxA8BeKNNmb wp49e91DTrvwy+k/8TW7sby0ne6LX8enqqBra/e2Rj5aSRbS9fZ5dhMVg5SzXHcSOkqG MxTw+AwNKLp1Yzn+8w7vThKdZtxVWNWFm268YqtJ1HnjsjxGJqyw8KEXXpU6Mm6jVSVK jaNTD1YwTUpUp+zhNWdrKK2cUeyaV4avH/Z+8JaBeadPoyprviPV7Wd2YG08PanoWl6Z EbaeZonN3c/ZVa3lZIQm6JX8vawH7+fsg/tI/Bb4W/sXfDO5+Jni/wAO6FH4b8O3S3On a7fWsuqyNoGsSPbTrpLLNPdNHdRxXenyRwuVnC3EB8xFYfyb/tw/F/xFpnia0+AOhzaz caD8OLhjD4vu/tNnrnjWxv4LVrNb+C1S0SHS7GdHisYoVC3MUcd1KySTGGH5HsfGXiy+ WzvtTPiO/u7GP7DbTX0l9dWEjl/9EsrNJS0RiiXa5g6CRdxZiTn9u4DzjN8gwlbNsXHC YnEY6jWjRjNThSjCcm6E5K6lGooKF0knzfZ92x8txBlcMxp4bB4icr4OvCVR0uanGtGl pKNOcUqkE03HnTvtZJ7f39+Cv+ClHwXHxc+DXhTw9Bq/ibT/ABx438DvY69eOba7ivfE HivR47a3s7eVZLl9OtDqaieMRolvFBHGGHlg1/V/5OuXF3pp0W6NvbweKba415Ums4ft ehHw/qMMlsRe6Nqr3KHVJNKuBDp1xol6xhWVdZW1jutN1L/JQ/Y18VrB+0D+zzpPxyuP F32uT4pfDO4+HmpWy3tzo+lXS+PtE1BIdXn00wvHG2qR28Mlm8rrFaEQ7kAUL/rfaVp1 nqtvqNjq1rZ30Uk2mS3FtLEstpJc2y293BKsUwY5hvLeO6g3EtHLEjAl0BFYHiXPs7zD HzzmrTxtWDVTDeywiwuWJVFOlCEMTapWqVIxhCNSbptwnFyinpEjL8DgMth7PB069OE/ ZfWJVaixM/aqnBVWuZUk1zc06MGk4QcIOtOUXWl/F9/wd/XU2u/s6/sUaJ/Y/juyupvj /wDGOHTtIi1nS4tI1q40nwv4e0nTtYuPDlkmsjV76/l1SOTwZqj6jpur6PpepeItMutB e68TSjSf4ivB3wD8Va3ok3iHUvCnilLfyruG3trizW0g+0taywRXtxcgS3cUUd26TtDB YzPJHA9v5se9po/7jf8Ag8C1KfTfgn+w7caR4g0vRvEOk/Gb4q3tuLm9tY7wWb+FvDav dxWUiTXM1obi2jtpZYYciR1hVw7AV/Lx8Kf2jrLxN8Pnu7qxuTf6TJFZ6pYaLplzfQ6p d7Qon0BY4bWW6inYea9ssYkjkDZdghNPHY3EYWlS+rclenCSjWt7P2t4TbknOELU9J2t yb25+ZKEV9JhMNRxMpRrt4alKmvY06casJxdSUm5RrSqObUotKD1nGzcar93k8Q+EXhy 48dwaf8AC3UPh14j8GeEZfD40TxR46u7a8uLi6vITY3ZtNDs7ixmtbOy+32aCS9i1BdU mtCyCGBbme1P6Sfsk/sh/s4fDb4r+EPiX8T9UfxRYeA/KudDsw3iFdS1bUrWV3019Va4 MUcdrpMEgs4YbX7PA1lbWtssLKsksvnHgz4h6pqmnmV9J8ReH9Ps9QM8WlaxDFas9xOk cUt9Z6bcTsVuHtVWFZroRswjSEuFQFfVW8V+IL3+z2t59It7C1NwWivYDBf3X2hwc3l3 BcTQztAAVhiit7eMK5WVpiqSDwKnF2Y0q9CnGm1S5o80E5TVGFqrdSKnUjSnJSlKMKdp NVKvO4crlJbY3hDLcdHEYajTzDD0s2vDHYjL/Y0KVCm6VRxrOeKVV1J06lKlRjTiq9Z+ 1hOdKVBVWv3zT9vn4N6JaXEWjWWqStcy208yx2crLILO3trNVWKVvLVVsbWC1QqV8tVS Q5dST5r4i/4KZ6O/nyeHfC93fW0cd1F9kn1G3tri4fKFTiRC8AiKOPMaTyW8zq2wCvxL Xx42sXF7pt/a3tp9kjjtPtaW8ENldWqhQqWdxbcyMQoD7/nYDMhY801JYWuFa2ijWKKR GgeTBYrE28ZMmWK5GSmcYzgV1S46zmjGMKVHDYWDlUqrkw3Im6tadSdZpK0p1KrnKrK9 51ZVJNuTbfhR8FOCZ8vPSxGJ9m2k62Ib5eanThySqJKo1CnCCpwk3Gknemoyk2/t+b/g p98c/FmsxWk3grwd4Zhunjhtr3UdO1hJ0kKRQyW8qXF+tvem1YGBdQMjwXUawzJaWyyC JfkD47ftSftIW0U1xpHjT4m+NvEU91Pb6T4Q0K+1LQdBlspRKgvmbTXsNPsVty4S3uB9 tmjIjkjVbhEeq3jcj4gaell4gujfyPp0WjW7WsxiurbTLOMCKG3vbY/abbyNuzESpJsC /vSiqF5L/hIfhh+zz8PftuqM1ha6EX1exefVbrUNfv3mlRxDYW95qL3FxMl3+/DLH5sQ LMrsi+WuOJ44zvHqNCOYYjGSco+yoRUcPCU4qKSqKi5Km4z91qLdrJ8ifur0cD4W8IZR Vni6GTZfRpzcaeIxDpe3qwhCKV6f1yS54qHLbk+K8bNx1XwzLqX7RviC+ubj4vQeHdSu /Emufabrwx4ni8Qa140TT9O02N4Naj8Rala39rcaJbJNJpzWSeJJ7+R7aePUNLstOuLC 5mb4X8OeEPBt3rur+NdV8Z63q2kyC407TbHxFY2TNp1qHvIbDRrKEOYJomgAAij+x2kA VWmfGyuW+Kf7Xvw0+I+pz+I7HwDqul+KNBkSDwnrl3rV7cXd7Z3VwzTxz6FZBNJlO4Cd /wC1dUTCTjyUuXV4V+WLXXNZ1m41iXSLq08T6x8RLiWHxNJqWlala3Xh0Q6gVS1kv5VT T4re/hIeFrG9ljjjHlziCVvIr0oYTHVlRpYylVpYqvVny/V8RQxsalRz9nTpQhhoTaaq UpqE51G8RCph5U04zp1K9VsJgaLpvCxw+Iw86EZ0adSnCnWhRdWpSn7WHO5UakuVf7PU pU69OC9tKMqNWnJf1V/s6ftQ638SfgDb6b8RtDi8e/Czx74dtrfSfD5vl0rxFodokzE2 +rarG4ku7q3aKGRrtNzfaI2ZG2yGNffNa/a88X+APC1pD8PfBotNC8NWUNtLpsT291fN p0DSyXOpyNGttb3D2yt9reG3to2mlaWKOPaqCv5/P2WZfip8L/A0U1x4lt73TV1C9js9 DOrQT6dDpOQzWOl29zHF5F3bTbpjdxSTqVcxeSwUOftKx+JLeL9AtTqEMmm3c/8AaUEF omqSWscokimVDfXRUG1eGUxzQ+WpjmYCEMFkLLy4jO+JcLU56WOhVoKlOEcXGhOpiaNP np1Z0o1lBzpyqSoQpyWsZu3NK0VUh4z8PvD3GzniquR0Y45OdSVKUlyVpycakl7O7h/t DjC7nKCclTdRw5FKPwv+1f8AtLaP8dvij4x1TxvoGqaP4u07UdK0PxBrV1o/2nQ4JVt1 0/SRr7GAPpGptJZ3aG3u5Yd32XyY0LwTmvk/XPg23iu9u9T03xlo82tWl7NZ3Q8L/Yrh pDHJIsl15un3DRzRoHKxvafaEdcESc5r0X4s/s3674h+KN3G3iuTTz491OG/1oh5ns7u 6hE7pNdCe4C32rPcSStbiYusZnmnV/3jA/N3in4YeL/hF440zw1pGs28nidNY8zR9X0n XIptLexfy1ga5s1sUure7W5Z/OBE0Zj/AHSW7SjzG6KUvrGNdanja/1rE069SpHEwnUn Vh+4SU5pcntFKUk42/eJw5FF0puXrfVMFhqMMLhcDCnQoy9jQjGNP2dGi78tOEHTjKyj GHNNSSbTXs1eNvW7f4cfEXw9Ba6tpnxI8T+GL3SNT0m009EOuS6teXdzcvG1zZWVqqW6 fZIv9JaG/wBT06KZHSOFpmYxDS1j4lfEXwrqr6n43+IXxIs/E3iS1k1SbUtE8e6npWh3 8kFxPFbiXT7iDUI7+4ni+wtHp9rJ4dk06S3mtb8awL7MH2Xq1j4q8AeEPDGt+NPEOm+O /E1nps99q39laRo+jRW0yRtelDqN7c6ZZ6jPbRJJzqEv2rKQwW9uztBBXyV8W/H/AMI/ iPrHh7wP4qvb/wAJbdT+0X/ijw1p/hzx0umS3dhPe2s9jNp/iLTtD1a31S8uLK11RtO8 YRpaJJcuzTXmnLpTzhsVXre0Xs1VlCXJUqKEHKkpqdKMH7vNDnVKtOCmlJzjU5Jv2ScP PrZdlMavsq6pqvVjLFUaCpxhVqQwv1aU3QUPY1cRh6dephoYtxnWjBYqNKtGSqww8/e/ BH7aus+MRpmheM7tPCo02+08X2vWE93b2+oaPlY8u11Hqa2F7fIDHLLIl/bJdIbhEjRh bL9u/s9fHXw3pP7XH7K2mafeR+Io9Z+O3wfN/r0c81za6RZ3XxN8NJBqExtVLSMqusUo jtlVi6eXHv4H5BeF/CmjahrVzoXirWvCtto3gnw497odzon/AAk09rPdNLDNDp9tp7nU HXWNVkluNQuYL65XTWma6Z7m3Roon+wfg5438BeCPjr+zNbarpgvr+7+PPwik0KTRra1 01rKxh+IXhwQS31rboLWBfOxIFMayFdxJOc1jTwVeblUoQqwhGFF1qdSKrRpKE1CMnze 0gp8+IUJVISalN0+aU+WFu2hgMBSq162GpxjOFGNObp0nSoWbV60KLSpyl7SfJCrKPtH BU4zjTd4L/WG8LzY8QavpV9r7X2r2r3usLptva/YbddC1e5W30sXcWblbmbTv7PksYbx bmGSd1uriS1jE6Rx/jN/wVsYJb/s0LJIywP4n8a2sgw0ijzYfDfz+WGBeRIo5dh5IJOO tft9opKzarls7riFsYwFBhAOT3Jx1Prt9DX4uf8ABWS48Nad4f8A2ftY8T3F9Z2dj488 SxW8mnpb3ErXk2nW0kNoLOVfOuHup4IlBgYJbxLI04IZCvL4j1FW4PzDmTjLlwt1ClT5 U3XpubjGnCnCCk7uMYr3VZXkkfe+FNdU+Pskqz+CEsTDlst6uFrxW0Yr4qj1fvJaJ2SP gbQ/AHheKCzvrnWNZYW0VwDaxS/Z7OY3awsxaKQDznhECtbyNue2MkzQkec+dOfxN8P/ AAxp8tvJfXtnZ2KzXt1ez3Vw6+TbAXdxcXurXDq0NvbxQu05kkW3ji3iQiLcD53qfj2B 4F5hdLdozdwO6ebbRSx74vNjRvklkXHkkrj7wAb7w5CTxfFdSanNd3GuTXGpytMHvnE8 NtGyG3g+zb4vsSrFsDBGjeaVh5lx5uSx/M8NlDlPD+2w7r0IUbReIqSg6dOcoV4UaVF0 5wdKoq9erKo2nF8vLTrKq5U/uMVj4SnWhq4x54tRd/aVFOmuRptRXuOq3JyvGcI0+Rqb nT9lj8e2WoLO2k6RqCR5iuIb1VzbXyzoWiMMwkijeJ4ikodGAkEhZXkH3OftvEWpyWWn 22paXpNpr9zZi+1fTvD99fXthZXEzO9wF1K+0vRJL4JKzRm5ksrH7TKJWihm2vKfPR4h kNk9vbedckGMbg5Z5egdgyxNsKjc4SGIJu+VRGp3LrvdW6wRyyssnkqm6UiQTJG4DL5x ctsY9GMRJJGDkHFfQULwc6fs9EpRShJac0nUg1OVO1oyceZRtJwi6SnShLlXi3dWupvE 11ClObjQvKNOc6kISc8RKSnPExoxr1o4f2U4Yem6jg4VamFpey37rVbO4LpPA8Ulps2M 6lUaRo2+6/mCKdNkjhwfMRZOWXzFBHLwwz+IL6PStOt7d7u4lSBLWUT5nafMaiIRIyvm V03hAV2Fye9cvreszXEjWUE5WzvI2jaVZYLV4SoDbikyu7Gf7kSwIxHLNsUhq+lPhRpF x4C8C3vxf1NLWX7DDd6b4WF6ztdSazOogtZ7aZYzbtHDvlJLHIaNSBljTqyq4aNFyrcs pe2qU4wcYqEXX5oOVnJ06kZcyspwdRudaVPlq0pLuVK/LUU4RioVaivOCUFGbvNtP3Jy nzyjTly1JfxZR5ZwnKh4qv7Twd4b0f4Z6es1rds0niTxmjwKrf23dNI1npDhWb/jxDuG i3t5c8juwztFfcHwm8O2fhXwX4OtGhMGsTaXc6/dwTeWHWfVBFK4kRWZN8IdYXwzBShC sQAa/NzwFos3j34i+G9Ammvru51fxBbTanqN1KzrOguGvr6XzWCu7E/ujkD5Soxiv1Xv 9NjsfFM/2SJ9Q07w14QW0j0XTgjXF1MHkuYLO1aae2gF3JBCI4FmuIYjIVWSSNMuvg5z joYOLjF/WISrOdSo1UjKrSk7RclOTUebl50nFTXNNTk0opdWAorEVatR0pU7VZxg3L2i 5E7qTm7ScrW+K8mlrZ78Z4x8R+LLAyHTtPivblVUwwmZLUMN22RvPWC5dNsTNwsMgYZT ADMw8e/aEj0zXvhz4f8AHn2S3h1jw8JdE123a1llke0ug8Mck0FrN5jRW15MksUsjC2j EridWRiB9M6td2UWn295Do89zq0tja3/APwjkb6WmuCK4khgkR7a91O2sVNg0xF7KdUa AtBLHbvcyeVHJ53L4fvNW+3+FdYu7Wy/4SGxmOoXWkwC3tZ2hWWK4k03TbybUpIiIDbh 7d7uVmm8yZbmLCxHgo5vQqSoTeHVKMZtU7u05x5U+ezjKDpp9ZK1Rtxg5NScPSr4Gf1b nvCfJUla0puvPmhD3ZQ/eUo06Dinf2cJzlWklKrGP7j4ZsLOL40eC5PCI1IP8S/B+mTX vhC7mmlWfxL4bt0Mtx4a8yV1M95pW4nT5nPnrEywzcoDXxlcz+J7KRLa4uZLZbKSWF4p Tvm+SSUSRySSXBkaRZMEzytI/BUABgV9t8Z+H9Q8A+OPJ0/V7zwjqPgfxQNXtbvThFa/ 2pND5+0aijxn7RZ3xud+otGYpblljH2hdpD+mfFj4b+Gvi14Bs/jT4Plb+0EaWH4i6PZ KSdMvAkfl3kVpbIzoZjFNPcTBNkq3EbqkKwSNJ93l+Nw2ChTf1idbDYuLdSCpVVKlPnb VKSjzKpKUYKqowbVpRim5qUY/C5hTtSlVnFyxGHhVqzjSpTr1FGEdXQhSjPEVpuEuVQp Ufazk/Zxpyco83zRpuuXptfMe5CZJ3K08YVdv8QcMSGI5Axxnjiupj1zUZYFEF7brEy/ Nm5hJJUHa3PzYGWHGOvQ4r5turjRo1NtHcMk8M26Iz3UnlGRPlzMY3DZ8suArZTfjcuB kMh8TaNaMYXZpptwDR+YFIC8kKfMJ5B6jpkdxX3UMM5YenVjecZOajG0Lr2apzileet4 zjyykqaUrq9oOR89XxLpvlavNXaV1efs3Dm5U7fA5w5mnZOcLtcyt9CS+JLqJo4E1K0a 5aRQ0KMCI4237bmR3URlC6lD5byShyMxbDvFU65qSCVG1UCDzFuTcjVJkuY53uzNJao0 YWaC1UBBHHHciNoXe08lYBh/GoPFGhjyXVFibzMMZHWUopOMEM/88jPUc0Xmu6UVlAm3 27ckRqhDg8fMBJCCCMjJR8HB+m6wycUnz7wk4zjSqSp1Va0/3cYfw5OXsotycHvVm/eZ TzGUY39q4qacJQjZrRpctSLclKSjKUfdceaTTuldP6x+AOvxXf7Uv7Nd1dWX9tT6N4yv o7XXbHS9Nup9Js59NkN/aPJFcrrzy6qYbdUt9L0zUhdvYql4bZo7MXH9ben3Mun22r6l qWq6baeH7a11C6kiurV7W6s5bOe+utS1S81efUfsx00WDWwFq2l2z2L2t3dT6jcx3Mdt Zfx1fsq+NtN0r9oX4H6TaeHNFvodZ+JOhwy6uzI+taTzMIJbEpdSxLAzEx3cZiiZ0IcA gHH9h9v4d0LV5bPVtQ0+C41Xw1qur3GiakN0F9p0moRLFfR293ayRz/YtQiEMeoaa7vp 995Fo95bTPa2xi8XhmnDDY/O8BHCVcHh8DUwlCjzSr1ZYiLeKxUq8Y18RVp0oynifZ8m FjQopQ9tUpVMXVxOIxHd4gVcTVyPg+oq8sVWrUMc4LFTpUqeHp06uAw8qMJYbDKvVtTp VcZbGVMVXq4ivKisVQwiw8MN/Fl/wdK3lk3xE/Y/u7qz0y/sJfhv44fTtT05bmDWXgvd WGy0k1F7vUdMudLF3b2mpwJa6JZXb7rmG41CeOS1ey/nr+BetWWmaVJbtLbJJchkc3Cy ciVW81WTYoZSv3F/vAYOa/oY/wCDqeO//wCE3/ZBvm0qVdOj8N+ONNt79dQ0id9QnOoi 8njg0e1vbnX4IbIMqy399pVpp8s7iC0uriVZVj/mr8CxW5tracm7glKs9qYoLktNhMyN F/owEnk4y4UMUyc4xX3dRUauBVOFSNRRc+dRrqs4Sk1UlCTU5ckoKXvU9PYpcjhDl5Y/ GZVWqU8aqiekXGKmoKCvFRh6u/s7xTbT1km+dyl73cah4nl1R/8AhH2g3vOxiEOnJ8xJ A3Rz+b8qkAFVPXPTivsP4Sy+OLLwxrqvrF/Busrm6kEQtimbVhi2vm+aRDIrMqQKH3mN vN2hefzytU1s62j28niy6hjnTPl6Rq0cLLuBJj2WZcc8Nx2zjBr7Z8J+OfEkehNoOleC 9cD6l5jXOqX2iaqtjEqWzPuuXj0u5vZZpZ12I6RsMyIuEy0g/D+OeHXm0acaGDoV6tOM alF4jmgnVbUIXtyzjOi5LEU4ykoynRdKouWbt/U3hfxhhOH3mLzTM61CmqdWlUhg6qxM Kjjyc6h7GU6M6c4RqQdanOqpRmp0btxmvz68SCwu/ibd313Dro1621W+hlu7648zTnsD DEsFvHaxWi3cd2bv7Q8k8l7JBJA8CJaxSRyTSd54d1298O2niizF34kaz8S6VPp+o2+k aw2gve6e80d2ukXFyLOc3WmR6pY6ZqFxY3EMkdybGDEsdzHFc2/NfEXSfHN140u9WsvC 3j1EZ51cy+D9aktrt2eNomgsY7Gd7UIMxsslzdGV1EiLGpCLds9I+I91pk9ungDxi00c YeG6h+G3iSR1Mn99n0xGjPJ+4Eyf4Hr9RyvDSo4LDUk4Xo4bDwk4QTiuSlC8YyaUkk58 tS1oykmnzxsz8IzbG06+MxtenUxNsTjMXVftZVKVT2VepPlalGpGrTnJcsqalGNWjF2X s5tqOdp3iWZbnw7aWeiWMdxZNdQC/bVNYnvtQF1NL5n25r+/vLFtltOdOMWlRWMT2qIt xBNcPcTze7+JhZ3OhW81tomiwzm1aC93XWmaZbadcx7o1e0kkvri5m+0wLHd3j3EdlHF eSTQwQi2jSQ+M6H4A+LFze+d/wAID8SpPL2NDFB4J8VvMJAwy5gm0KOOHcfmRYndmXkj HJ9p1f4Y/ErXNPu3u/g98XLWO6hLaXp+lfD7xDd6dL4gkEMFtb3UWq3AmhgvI0kae8he +vlKpHDayocRedj8spylSjCHM3Vk5zq1Kk5LnqutJRnOUpWjKbjSpNqlRpy9lSVKnGEV 6OU5xUwlGvPmjPVw5J1avNyVOaVSpTiqVWM3CUYRjCcoxhGTVPlgpJeWeBm0BLy/v57k wSC3iRzDFbv57KxDiQLu3R7SSrqg4XJcFgG6S5utLv76K3MdzJY2U0UyvPZLKkamSWVk styum2SSUyyIB8x+bAO7O74N/Zl+OWoW0z2vwF+MtzqLP5FpY2fw+8UuXSJsOJBb2AMq mMM6iOOd8KzT7Qu6u50z9kz9qDVNO/tvRv2dPjTeaVcXyabaahY+FdUl02W9WN5Z4fMa PzQIoFfYyAqJFZXcMoAv+zr8t3KPuXlKDbjFQaai0+VtyteNlZ9ZJOLei4h+r01apGft KnIqbt7S1SoqE24NR9yMnzyn0ptVYcy1WBoTaHNLrFmmvTWFrcR2/nCPT44vLVGH+shV EErLEWf5HXkbS6scjvRc+CNNMl1aa9c3Ol2zT/YLV7a8thceZDcIkkd3O+qvZrBMYGa2 dbs3MTTQieB1SatHR/2K/wBru6M32b9nL41bm/d3JHg7WP3qlSqrHvtdjjcASf7oPtXe Wn7Bv7ZwtobS6/ZR+Lkplt0ntiPAGr3JaCXc0dwmwBQXCkbHZZN+AYwCKj+zvau8q/LG hGPsoN3nV5cTFypUueFblfLUm6kYulD2SqzUvrChJ9FbPKdW9KGIjhf9knCpGFSlSWIq VasYKrGrFPExxWHpRaXsq9GgqL55wq1405Q/KjWTv+J11NDf2McVxcyA3FyPtEEazrIM tai1nuJVXI2ultJJFJskXayKw7bxvpMutaVZx6X4h0aDVJnvIpdPvtSTRjFbabp4vWu7 zVtdSw0Bba9VJoNPtl1Z9SuLyEWSWInurFbv6m8af8E3/wDgoXq/iGFtB/Yn+PupWUQO 25svhvf2JYsxcbpGZGmIPygys20YUEKBjU1H/gl//wAFGtX0mxtLT9hH9phb+NLj+0Li 98EG4sbotIDam0i8mCSxNvD+7uRJfahJcSfv4jaJ+5P3GGSVGMliVSl7KCUHCm42hCo0 ppxdScXKbm0qtPSEVFwcqntPy3MJxeIxUY0oV+eU6ka9T2ynGdV0ZSVOFPEextTcJRhK pCXtISlKcU3ShR+RfhJeQrpcdrdeRFLDIzvMJnaO5QuXJnRmeMuoZY0SCOAFEUkNLudv 0B8T6l4W1L4VadpWgW1suvSSJHeqswIlgEDM1+rSNkpFIEiEERMoLlyoVcnmfBn/AATJ /wCCiWhanomk6j+xn8XdEvtbWW102017R40udXubC2N1qR02GY20gSO2H2hrVGuJLaEF nmlBBH1dN/wS5/4KNX2g2Fon7Knju3ktmuIobeCyg068iS5YzSSXFz5sRuI2clP3lzLN GuEiiWHGPkeIMsq43G5XVhQlVjSrSxUIVXVpwnBRr0/a0XS5ZVnGvBRUYVqUE4VHKc3S eHqfV5DmU8tyzG0L0IVMfhPZUniVy3UaluajNpvklUozo1Z8ktqqjaolJfN66/oV58I7 22ubGG6nlillsZ7WWS002yiEUqSLDbTSSzXCzO6+UXkzA9vkl1ciuS/4Jd60f+Hn37L2 oiw03SUvPjFZRC0s0NvaxmfQdbt5Gt4XZ/KjkZmcQqdiFiqAKBX0tq3/AASk/wCCkune G72eX9mHxlFZWqr5q6lrGm5McrxwxtHb21/PKVeeUDZsE0S/PNDGnzV6V+w3/wAEkf8A go78I/23P2bfix4+/Z2vdA8BeEPi9oOs+I9cTWdPuV03Ro4L1Li8mto3luljhSUiR3RI w2B5g3Jv+iw1OlGGIrxp1KUcX7SpSjVq1qtlKS/dw9pOcYKnGEKTVKFGEpR9tOn7WvVq 1PmcdXjVqUKV8P7WnhlzzgoqpVjKrXca1ZQ52p1J050YuMacJRoRjy/upTf9/WjCW60+ 8aH7Xpn2bxBqwuEeC0LanBBLcxAZb7Qws7gtHcW80b293iGNG8pDLC34Uf8ABVrxVDpm v/BnVrBX1OC68I6wYLzTWa908mHWrpowzWRlD4YSYfDxlvkMkb7TX7saLqOkrLqGjR31 guqSS6lq50oXcA1JtPe6SGbUTZF1uhZfa5Uge78nyBcSLGZBIwU/iP8A8FTv2df2m/j5 dfB3Vv2afBXhPxppWgaH4lsPE+o6z450vwlYadLcaizaeLeS8v7GK7AnWUTkPNEWUxMI 3yR5WYOcKMfq9KrVk00qdGD9pJtrZqNS7VSaulzN81rq6ZWUxpzxSp4nE4XD0oKrJ1sV FezXJTqTipuHLKUqkl7Om5ytCUo8zjThK34r6x8Vbu68u9ur/Ufsq3kML2f9ox29tbi8 dAkedRlDsHM0cMa35aXzZVEZZjl+V1bxbcaZI94t3fQCK8k1B7Qb7cPcSBkdithdr9qJ SQ+b58NwskgSV9zxxNH6pqH/AAS5/wCCtusxRW9p8P8A4V+G7dCSGsPiR4BNz84w5+0a lfahPGX5LmDysk/LjpXnk/8AwR7/AOCneoXtvoWp6Z4YSbUH1Dyj/wALJ0YwRLaKk1zc 3l/YAQW1vM0oisbm6uIorucG1sWkdTGPkK88Y/ZTnga31hVqknVnR5OVVoxp040IOhzQ m5c1OdqqhUjVioQp+zcav2sf7ApONfF5jl0cQpfuKsauFSjPFTo0vq8eWadFzUnCXspS Vafs6SowjK8POtY+OPhbRIXn1u8hsyysyGe7lkvZkb5j5NqCs0hbjAQEcZLDNeFa3+1V pV3LPp/hPSlF2Uka21jxFePp+nwLHFPJI0lrtkleWUxJHbq8iK0jBGyZFx9Q6j/wQh/4 KAQzWU1/o/gO9k1C/ttNLQePrPVJYnut6pd38tr57WunW+0Nc3swW3t0KiWRdymtWD/g 37/bzeRDcX/wjty+RsfxrDLkAEtsEcZPTk4zgZJ9aSp5p8dbK8XVhKP7qzlRi6kKlO8p WhPnSipQlBOKfPzKS5bPv+sZI48tLNMLCV786lGUopaptN8vLezeruk72umflz4o+K/i vxq4k13Vbu5t4F/cWVvK1vYRvzlEgjIDjqd8u4gH1JqroijUJIZHLRouF2pjO1gAecZJ U7uhA5Y85xX6/aZ/wQM/bCS5fRbrxj8K7bV5LdNSFkNXnmsn0yOb7O9zJeofPW4jupEV LZLB43Rmka7RlETeq6F/wQG/aqhIS98ffCRIn2mVU1LXLhWj24wqxWLrGrAMG5USEnnc a+QzPK86rvkjgMVySuq1SGEhiOVVHChV9yrOEPa08LKpVpT5lNVKdJU50p8lan9hkvEX DuFm6lbNsDelCdGjCvW54RpTpyls6FWNG9erUsqcZum5PFQl7b3Y/i7P8EIPE95BqlpP a6zObuGVrTxdNqWqeHtPEClStpodpd21o0nzbdlwsisSRNlflrxz4z/s4pouit480jx2 niPxNJ4g1Cyn8rSVtZo7q/xLeaY2raVJc6hLELjz7dbW5jg/sTyDem9kmu7gQf1DeFf+ CKX7QWnwqi/Eb4TxJEsUYaYeL42RgccKdCZCBGjZxI8gJXeiIyy16RL/AMEY/jveQvby fE/4ShZP9YJbDxXMhjK42/utFXYhYb96s285BYivmaOUcZQilRwOZypYepGtgVCrShSv OUI13GMo1l7StCNGfNSr0JR9gm51fcge9jc78P8AMMNVo43NsApVqLpYqKpV5VIOF5U1 Gq4QajTqzqNc1N3crpU7tP8Age8cWXh681u2vPLv9O1m8uXg8TWUVlA13aXdtMIpvI8z UIxqLzWai4ge6awjeciJbhYibk+Pah8U9X8P63dJph1TwXdw3M6WLWl5eRRW0cjEQPHp 1/faqiBkCOy/abna5fErqAT/AGP/ABn/AODbL43/ABF8aeJNS8J/GT4V2ur6FG1/qE93 4U+I2htqU1/p0t/o2i+FdT1LwlY+D/FV1PcQPZahcx+K7ePw+8tvHrU0UkwROP8AGH/B qf8AGv4u6P4bvvFX7RPwU8La1YeG9E0qW30nwh4iW9tJLK2zMuuS6fDdWN/4giMzwapq VpfXVreTQiWC4kg2TP8AoWAyfNOWg8zyetBTglKWJnTnUpOdOlU9q6c63O4VYclSnPkc ffai4xlY/CMZVwWW1K1PJM79th/bylTnRUqfwzqKNNVVQUlKClUjOnzxuoxdRVJwUl/I ppH7TXxQ0bUDK+q6brurQSC8h1S9sZxM7CWH/Qbm2sBDHdZVDM7jyBLH5kayLJIpr7o+ AH7WvifXk0ew13xkfCPj7VNU+wxWd1pt1pem6p9ru1isTZtBHcxM0zyIPshhNwSdsayO Qp/cKP8A4M9PieZo2k/bX8AQE48g2vgbxA8rrEQB5ZkKF9uPmK7sHliBivR/Cf8Awabf EMRLY69+2f4ciubW5s7rVLG3+H99e3NrseV7MWOuSC0mhNzBEtxutQrQSkK37yJWO+bc EYLMsJU9jllKNelyTeIoxw9PExUuT3Z6tKk58nPdaylCPPHnpp9eScaZzleMeJ/tKtVp zjGjLD1qtSVFWjUaqQguSpOq7tyneairWsmov4i+GGtfFz4vrHpOmar4Sv8AWbdLxZv7 ZhFhc2o026VLiKwvzstrx5nhAkt2aGYorpNHz5dd3/wjvw/udN16fWPFcln4ispJINVt In8vwzcy28kDS/6TKF8rF1aRf6DZvcW5lCs0UMk7Mf05+BP/AAbS+K/hjL4lOmfth+J7 Kzl1DVNOOmX/AMPybG8YKkkGs2wbxJcG/sJppRJb3E8dnczvDMJrZch2+prr/ghbB4j8 IWnwttP2nU0ePwvcQX/ii70n4MiI6p4l1IG7kngvr3xFbafdWl2qGXUtKtLi9ntbhkjn ubEzRQn8xxfhvxTUryhSwyq4CLetJUcPUw8K0qcarqfvZKVGVRUedSetTk5eaUnf9iyn xhyh4KFHGVcdhMZas60ak62Iw0/Z1qVJTUEqlSkq0Zc1OpThJOMYxqKnN04z/m8/ab+P Hxnk8MaF4M+Gnw/OuW9vp9q9j4kS8Fnprm3tpIRs0i8ureWSa3tSA85D2ktw6pLZXXlp KPHPDHwc8Q/B/wCBWt/FL4teP9Gm+MHjrUbGfTdA1DV5NR1O1tftMWw317NqLxWWs6bb zFtMs7F7L+zkGPJe6maaT+tXw7/wQs+Hcmgf2n4Q/af1D+072G5tIPGWi/D3w1r1gkqN 9ivm02wbxTcab5lrqdnICr3NxLbXUElrI8ssWV8af/g2k+C/iK51O48U/tR/FnxPJeXW 7U5tR8BWWktFdCR5dRk8PQxeKrTT9PttReRGkmOn6kqtGWsr2KYSOOvLPDbOcJlv9n4H LsNh8FicRRxmOrUMRh5Sxs6TmsPWcJYh001CtUlCpzKS9tVVNe8+bn4l8UcszHExxOIx WKxuKw+Enl+FpPDSowy9OpS9pzuph6dXESThepKpBVYQhKFOPwQP5qf+CcOvW6/8FCP2 RfHOs/EC0e80r4/2Gjm31i41lvtUOqaHrNiJ21GC1n02ZpZtQaxt4pbsypepGskSW8iX J/0sPB93o/ie017S7yKDUorfWjfy6PrdmpvrLzLxNV05tR0q9tUW2e3vYI7vSyVmeIQW l0JluVBX+ej9mr/g3E+An7Mfxy+GPxy8K/H/AOKGsav8L/G1n400zRdT8N6QLDU5rOO6 iSzvL3+2ru8ffDdOj3376UhcIuMiv6LINPg1O3lgubayls7vVJ4NQkmuLm0vTGksd7aQ 2lxaeXLJm9jjYwNPCrKXyGy0T/svB+UVsnw+Iw2I9spYitTqyjL6tUjTo06coqNGnRUW qjnO86lTEz9rThCn7GnLmqy/C+Is4jj6irU4xklT5L81SEY1FVU1PnqUnVu7qMpctorV ufLZ9Pc6fDqyquo28nlQzkpbfaWMFwIbi3ubW5lSJly6TW0U0Kud0R3o2VkdTWvrXQtQ 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 2nLeKmn3mJINPBka6j/sSn0ZbrU9M1GfUNW/4lN3e3lna22pahp1hI17p8mmtb6pYafc 2tjrtpBDNNcWtvrtrqS2motDqFqYLu0tZIWrp/lQ3p1yXTb2yg1MalpbXFlOW022t1tr mBr251LUdRF1f2epJd3kGpW6aXBZ2r2VrBYwtp7Xl10UsLh8G3KjKNGk4VJ1lOtUjOMp PkcYOLnB0pUbym26UY+9D2c4u7TrzqRcpJ+0acV7aPNGCV+WdoVYttWUoLmcW5e9GPK0 /wCSLQ/+DS74A+C47m91f9uP4ypc69JpumfaL3wL4Nt4PtkgWzsLK0kuvEhmuJnnYw2f mSfaJiUjKsSAPYPDH/BrT+z14R8R+A/Gsv7S3xb8TeIPht4h0XxZpCyeC/B2mHV7zw3q lrrFhp967azLDGlzcWMcD3DbdgcyucruH9RGqadHq1hdadcPthu4jE7La2s5VSc5WG+t 7uzbB52z2s0R/ijPFZml6XqkGr6tf3mpXYs5sWel6PBeR3OnR2kapcnVZVn0m2v7XWbi 7muree3Oq6lpyWNvZtbCGWWaGO1TXM3yQlFcjtF6NttTT5pKb0Ub8qjo9G3drJzrc8rU +amlRbn7anFvmnUjU/dycJONJKk2qbnOaqyailTk31vhi6nuI57i8tWsbu4h0+e6s5JY bh7S5kti01q01s0tvM8D5R5IZJIpCu+NipUn40/aZ/Y/8D/tSW3hZfF+sazpcngXxHf6 /oa6QkBjfUpbCfTdl+JSTLAUZZSIGhkURkBtx3D7L0NWe7vFiuwUtntVu0KJLJKzW1wF jkk3KYJVZop2O3LjC7QrgjJWO4W4aSOX9wJr2J7ULEqs73oIufNIMmYYldREPkk8zLYY KRljMLh8fQrYTF4eNTCVG+elKckpqLp1afLyynJwU0oRVW0uanJt8rU5deDzPG5RjaOO y2pVpY2LtTqUfY81H2nuylL61aHL7Nttwc6nJL93zVHyH5naX/wTI+GLWbSeL/Fuvq8d latcv4bnGj2clxDHL9vnnGpyalIloG2Pao0rvbRrMZpJdylPFdT/AGZP+Ccui/EmL4Re LP2itEsvivNpN1r+gfC6f49eDovHGteGo7FtQh1e38M3UVnfRrcW0NzPCgSaNrSL7ZFd SwNKYf2TbR4pdbj11rvVfNt9HudHGmDU7kaFPFdXdpfPfT6L5i6fPqsRs0t7fVJo2ube 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 n2NhySTVg6Ap63tz16gRj/2U0UV63KtbpO7e6T31stNr9Du5n3ZS1Ow07SNOv9V1LU7y 30/TbO4vr2cL5vk2lpE89xL5UFvLPL5cUbPsijklfG1EZiFOH4ju9K0CS204Pr2seI9U 0/XL3w94b0prBNS8QSaFZLe3dhp99q8mmeHbK8kSSGK2fXtb0iweaZPNvIollkjKK5sV W+p0qVaFKnUvjsvoSp1FPklTxOPwmGqJulOlUT9nWlyyjUi1JRl0afDjMZVwyTgoy/2j K6Vp8zTjjcxp4SrflnF3VOTdPXSdnJSj7pt2nheeCZxc61dX1mtlYQW6zQQxaj9sg+1D UL69vbcxWVyL9GsjFa2uk6cllNBduHuIryGCw0P+EftMczXje3nKD+ezt1/CiitoU404 8seZq8nepOdWV5ScmuerKc7JtqMeblhFKEFGEYxXarxvZyd5zm+aUpe9UnKpJLmb5YqU moU42hSgo06cYU4Rin2ulW2jx302nWnm3V2ftEyb44ZL65hhEURlm2qhlMaJD58pJEaR qSVjUCvDoELB5LsATyT3TlbWedYNj3EzQNhwW85rcxG552faPN8r93sAKKrlWuiafLo4 xsuXm1Wl9ebW7a92PKk+ZyfNPmcuebuorlbVly31TtzXa5Y2cnFKEeVRfM5VzounXdwP s93dRrpd8Yr+3R2KXEjWAkjtZXmhLqkYvrS9Etm6MZIo4XlMRuYHJ9O0ZLyHTQGOo3Vl fajaW73N+Elt9Pksre6kMyAxRBJ9Uso2DP5rC4LxRSrFMEKK6MPRhiJyVS9oUMVUXLZN uhQrVoKTs7pygoyb97kbjGUbRcZw958zcpJv20tJSaTpRlGPKpOSgrU43jFKLblKylJt ppWhmfTNPn1vS7PT9Zn0+zk1ew07WNS1fT7HUntUN9Y2OrXEWi3Gq2VrcvPb2uoXGkaV Le26rcSabYtM1rE6HwjpNvdzXdvbLbm5Mst7DAWjjv7uSOzt01C9ffJczXsFpZRWcMpm 2m1PlTJKIbVrcorkmoxlLljGMZJrkSvFRl9lKfM2lZcrk5STSkpcyTKhKcElzyk0knKV ry2u5cqjG7td8sUk/hS0tiWmheEdai8TaFGt7c22n6jJ4f1q2a/1eJ7a+vrCy1+WO1v/ ALRDfKJLLxDYypLaXvlWqtHa2htvspiTXtvDaToZdUtreKfOqWxtLC7uZ9Ols5dRZtPu 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 7pSjF7pHwZRRRQI//9k= From owner-svn-src-all@freebsd.org Fri Oct 9 13:11:14 2020 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 E5A423FA4D8; Fri, 9 Oct 2020 13:11:14 +0000 (UTC) (envelope-from br@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C77kB5t9Wz4N6N; Fri, 9 Oct 2020 13:11:14 +0000 (UTC) (envelope-from br@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 AE7561A02A; Fri, 9 Oct 2020 13:11:14 +0000 (UTC) (envelope-from br@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099DBEdb065036; Fri, 9 Oct 2020 13:11:14 GMT (envelope-from br@FreeBSD.org) Received: (from br@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099DBEpM065035; Fri, 9 Oct 2020 13:11:14 GMT (envelope-from br@FreeBSD.org) Message-Id: <202010091311.099DBEpM065035@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: br set sender to br@FreeBSD.org using -f From: Ruslan Bukin Date: Fri, 9 Oct 2020 13:11:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366571 - head/sys/dev/iommu X-SVN-Group: head X-SVN-Commit-Author: br X-SVN-Commit-Paths: head/sys/dev/iommu X-SVN-Commit-Revision: 366571 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.33 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: Fri, 09 Oct 2020 13:11:15 -0000 Author: br Date: Fri Oct 9 13:11:14 2020 New Revision: 366571 URL: https://svnweb.freebsd.org/changeset/base/366571 Log: Add iommu_get_dev_ctx() helper that allows to instantiate an iommu context for a given device_t. Submitted by: andrew Reviewed by: kib Sponsored by: DARPA, AFRL Modified: head/sys/dev/iommu/busdma_iommu.c head/sys/dev/iommu/iommu.h Modified: head/sys/dev/iommu/busdma_iommu.c ============================================================================== --- head/sys/dev/iommu/busdma_iommu.c Fri Oct 9 12:44:56 2020 (r366570) +++ head/sys/dev/iommu/busdma_iommu.c Fri Oct 9 13:11:14 2020 (r366571) @@ -269,14 +269,12 @@ iommu_instantiate_ctx(struct iommu_unit *unit, device_ return (ctx); } -bus_dma_tag_t -iommu_get_dma_tag(device_t dev, device_t child) +struct iommu_ctx * +iommu_get_dev_ctx(device_t dev) { struct iommu_unit *unit; - struct iommu_ctx *ctx; - bus_dma_tag_t res; - unit = iommu_find(child, bootverbose); + unit = iommu_find(dev, bootverbose); /* Not in scope of any IOMMU ? */ if (unit == NULL) return (NULL); @@ -288,8 +286,20 @@ iommu_get_dma_tag(device_t dev, device_t child) dmar_instantiate_rmrr_ctxs(unit); #endif - ctx = iommu_instantiate_ctx(unit, child, false); - res = ctx == NULL ? NULL : (bus_dma_tag_t)ctx->tag; + return (iommu_instantiate_ctx(unit, dev, false)); +} + +bus_dma_tag_t +iommu_get_dma_tag(device_t dev, device_t child) +{ + struct iommu_ctx *ctx; + bus_dma_tag_t res; + + ctx = iommu_get_dev_ctx(child); + if (ctx == NULL) + return (NULL); + + res = (bus_dma_tag_t)ctx->tag; return (res); } Modified: head/sys/dev/iommu/iommu.h ============================================================================== --- head/sys/dev/iommu/iommu.h Fri Oct 9 12:44:56 2020 (r366570) +++ head/sys/dev/iommu/iommu.h Fri Oct 9 13:11:14 2020 (r366571) @@ -233,6 +233,7 @@ int bus_dma_iommu_load_ident(bus_dma_tag_t dmat, bus_d vm_paddr_t start, vm_size_t length, int flags); bus_dma_tag_t iommu_get_dma_tag(device_t dev, device_t child); +struct iommu_ctx *iommu_get_dev_ctx(device_t dev); SYSCTL_DECL(_hw_iommu); From owner-svn-src-all@freebsd.org Fri Oct 9 14:03:49 2020 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 84C2E3FBA20; Fri, 9 Oct 2020 14:03:49 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C78ts3JHXz4QNM; Fri, 9 Oct 2020 14:03:49 +0000 (UTC) (envelope-from gbe@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 3B8FA1A767; Fri, 9 Oct 2020 14:03:49 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099E3nZG098291; Fri, 9 Oct 2020 14:03:49 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099E3kVO098275; Fri, 9 Oct 2020 14:03:46 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010091403.099E3kVO098275@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Fri, 9 Oct 2020 14:03:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366572 - in head: sbin/devmatch sbin/fsck sbin/ifconfig sbin/mount_msdosfs usr.bin/chat usr.bin/du usr.bin/setchannel usr.bin/tftp usr.sbin/ctladm usr.sbin/extattrctl usr.sbin/i2c usr.... X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: in head: sbin/devmatch sbin/fsck sbin/ifconfig sbin/mount_msdosfs usr.bin/chat usr.bin/du usr.bin/setchannel usr.bin/tftp usr.sbin/ctladm usr.sbin/extattrctl usr.sbin/i2c usr.sbin/mountd usr.sbin/nfsu... X-SVN-Commit-Revision: 366572 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.33 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: Fri, 09 Oct 2020 14:03:49 -0000 Author: gbe (doc committer) Date: Fri Oct 9 14:03:45 2020 New Revision: 366572 URL: https://svnweb.freebsd.org/changeset/base/366572 Log: Fix a few mandoc issues - no blank before trailing delimiter - whitespace at end of input line - sections out of conventional order - normalizing date format - AUTHORS section without An macro Modified: head/sbin/devmatch/devmatch.8 head/sbin/fsck/fsck.8 head/sbin/ifconfig/ifconfig.8 head/sbin/mount_msdosfs/mount_msdosfs.8 head/usr.bin/chat/chat.8 head/usr.bin/du/du.1 head/usr.bin/setchannel/setchannel.1 head/usr.bin/tftp/tftp.1 head/usr.sbin/ctladm/ctladm.8 head/usr.sbin/extattrctl/extattrctl.8 head/usr.sbin/i2c/i2c.8 head/usr.sbin/mountd/exports.5 head/usr.sbin/nfsuserd/nfsuserd.8 head/usr.sbin/pmcstudy/pmcstudy.8 head/usr.sbin/traceroute6/traceroute6.8 Modified: head/sbin/devmatch/devmatch.8 ============================================================================== --- head/sbin/devmatch/devmatch.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/sbin/devmatch/devmatch.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -69,6 +69,8 @@ Produce more verbose output. .Sh SEE ALSO .Xr devinfo 8 , .Xr MODULE_PNP_INFO 9 +.Sh AUTHORS +.An Warner Losh Aq Mt imp@FreeBSD.org .Sh BUGS The kernel has hints in it, but we exclude it from the list of modules to suggest for unmatched devices. @@ -92,5 +94,3 @@ logical equivalent in USB, PCI, and others. .Pp Many drivers currently lack proper PNP table decorations and need to be updated. -.Sh AUTHORS -.An Warner Losh Aq Mt imp@FreeBSD.org Modified: head/sbin/fsck/fsck.8 ============================================================================== --- head/sbin/fsck/fsck.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/sbin/fsck/fsck.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -143,7 +143,7 @@ only if is compiled to support it. .It Fl f Force checking of file systems. -Running +Running .Dq Li fsck -f ignores the journal and does a full consistency check of the disk so will find and fix the errors about which the Modified: head/sbin/ifconfig/ifconfig.8 ============================================================================== --- head/sbin/ifconfig/ifconfig.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/sbin/ifconfig/ifconfig.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -592,7 +592,7 @@ Note that this must be configured on a physical interf not on a .Xr vlan 4 interface itself. -.It Fl vlanmtu , vlanhwtag, vlanhwfilter, vlanhwtso +.It Fl vlanmtu , vlanhwtag , vlanhwfilter , vlanhwtso If the driver offers user-configurable VLAN support, disable reception of extended frames, tag processing in hardware, frame filtering in hardware, or TSO on VLAN, Modified: head/sbin/mount_msdosfs/mount_msdosfs.8 ============================================================================== --- head/sbin/mount_msdosfs/mount_msdosfs.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/sbin/mount_msdosfs/mount_msdosfs.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -202,7 +202,7 @@ and first appeared in was renamed to the more aptly-named .Nm in -.Fx 5.0. +.Fx 5.0 . The character code conversion routine was added in 2003. .Sh AUTHORS Initial implementation as Modified: head/usr.bin/chat/chat.8 ============================================================================== --- head/usr.bin/chat/chat.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.bin/chat/chat.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -291,7 +291,8 @@ The .Dv SAY strings could be used to give progress messages in sections of the script where you want to have 'ECHO OFF' but still let the user -know what is happening. An example is: +know what is happening. +An example is: .Bd -literal -offset indent ABORT BUSY ECHO OFF Modified: head/usr.bin/du/du.1 ============================================================================== --- head/usr.bin/du/du.1 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.bin/du/du.1 Fri Oct 9 14:03:45 2020 (r366572) @@ -63,7 +63,7 @@ Calculate block counts in .Ar blocksize byte blocks. This is different from the -.Fl h, k, m, +.Fl h , k , m , .Fl Fl si and .Fl g @@ -172,7 +172,7 @@ options override each other and the command's actions by the last one specified. .Pp The -.Fl h, k, m +.Fl h , k , m and .Fl Fl si options all override each other; the last one specified determines @@ -183,7 +183,7 @@ the block counts used. If the environment variable .Ev BLOCKSIZE is set, and the -.Fl h, k, m +.Fl h , k , m or .Fl Fl si options are not specified, the block counts will be displayed in units of @@ -191,7 +191,7 @@ that block size. If .Ev BLOCKSIZE is not set, and the -.Fl h, k, m +.Fl h , k , m or .Fl Fl si options are not specified, the block counts will be displayed in 512-byte Modified: head/usr.bin/setchannel/setchannel.1 ============================================================================== --- head/usr.bin/setchannel/setchannel.1 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.bin/setchannel/setchannel.1 Fri Oct 9 14:03:45 2020 (r366572) @@ -61,8 +61,8 @@ Select svideo input. .It Fl t Select tuner. .It Fl g Cm geom -Select geometry. The first resolution is for NTSC, the second for -PAL. +Select geometry. +The first resolution is for NTSC, the second for PAL. .Pp VCD: 352x240 or 352x288 SVCD: 480x480 or 480x576 @@ -91,7 +91,8 @@ Frequency in MHz (must include decimal point). .Sh HISTORY The .Nm -program first appeared in the -multimedia mailing-list in January 2004. The +program first appeared in the -multimedia mailing-list in January 2004. +The .Nm program first appeared in the FreeBSD Ports collection in October 2004. .Sh AUTHORS Modified: head/usr.bin/tftp/tftp.1 ============================================================================== --- head/usr.bin/tftp/tftp.1 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.bin/tftp/tftp.1 Fri Oct 9 14:03:45 2020 (r366572) @@ -74,7 +74,8 @@ Shorthand for "mode binary" Sets the TFTP blksize option in TFTP Read Request or Write Request packets to .Ar [size] -as specified in RFC 2348. Valid values are between 8 and 65464. +as specified in RFC 2348. +Valid values are between 8 and 65464. If no blocksize is specified, then by default a blocksize of 512 bytes will be used. .Pp @@ -82,8 +83,8 @@ will be used. Sets the TFTP blksize2 option in TFTP Read Request or Write Request packets to .Ar [size] . -Values are restricted to powers of 2 between 8 and 32768. This is a -non-standard TFTP option. +Values are restricted to powers of 2 between 8 and 32768. +This is a non-standard TFTP option. .Pp .It Cm connect Ar host Op Ar port Set the @@ -109,7 +110,8 @@ or commands. .Pp .It Cm debug Ar level -Enable or disable debugging levels during verbose output. The value of +Enable or disable debugging levels during verbose output. +The value of .Ar level can be one of .Cm packet , simple , options , @@ -156,7 +158,8 @@ The default is .It Cm packetdrop [arg] Randomly drop .Ar arg -out of 100 packets during a transfer. This is a debugging feature. +out of 100 packets during a transfer. +This is a debugging feature. .Pp .It Cm put Ar file Op Oo Ar host : Oc Ns Ar remotename .It Cm put Ar file1 file2 ... fileN Op Oo Ar host : Oc Ns Ar remote-directory @@ -178,7 +181,8 @@ see the example under the command. .Pp .It Cm options Ar [arg] -Enable or disable support for TFTP options. The valid values of +Enable or disable support for TFTP options. +The valid values of .Ar arg are .Cm on @@ -198,8 +202,8 @@ Set the per-packet retransmission timeout, in seconds. .Pp .It Cm rollover [arg] Specify the rollover option in TFTP Read Request or Write -Request packets. After 65535 packets have been transmitted, set the block -counter to +Request packets. +After 65535 packets have been transmitted, set the block counter to .Ar arg . Valid values of .Ar arg Modified: head/usr.sbin/ctladm/ctladm.8 ============================================================================== --- head/usr.sbin/ctladm/ctladm.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.sbin/ctladm/ctladm.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -233,8 +233,8 @@ utility take the following optional arguments: .It Fl C Ar retries Specify the number of times to retry a command in the event of failure. .It Fl D Ar device -Specify the device to open. This allows opening a device other than the -default device, +Specify the device to open. +This allows opening a device other than the default device, .Pa /dev/cam/ctl , to be opened for sending commands. .It Fl I Ar id @@ -272,29 +272,31 @@ READ command to the device, and write the requested da stdout. .Bl -tag -width 12n .It Fl l Ar lba -Specify the starting Logical Block Address for the READ. This can be -specified in decimal, octal (starting with 0), hexadecimal (starting with -0x) or any other base supported by +Specify the starting Logical Block Address for the READ. +This can be specified in decimal, octal (starting with 0), +hexadecimal (starting with 0x) or any other base supported by .Xr strtoull 3 . .It Fl d Ar datalen Specify the length, in 512 byte blocks, of the READ request. .It Fl f Ar file -Specify the destination for the data read by the READ command. Either a -filename or +Specify the destination for the data read by the READ command. +Either a filename or .Sq - for stdout may be specified. .It Fl c Ar cdbsize Specify the minimum .Tn SCSI -CDB (Command Data Block) size to be used for the READ request. Allowable -values are 6, 10, 12 and 16. Depending upon the LBA and amount of data -requested, a larger CDB size may be used to satisfy the request. (e.g., -for LBAs above 0xffffffff, READ(16) must be used to satisfy the request.) +CDB (Command Data Block) size to be used for the READ request. +Allowable values are 6, 10, 12 and 16. +Depending upon the LBA and amount of data requested, a larger CDB +size may be used to satisfy the request. (e.g., for LBAs above 0xffffffff, +READ(16) must be used to satisfy the request.) .It Fl b Ar blocksize Specify the blocksize of the underlying .Tn SCSI device, so the transfer length -can be calculated accurately. The blocksize can be obtained via the +can be calculated accurately. +The blocksize can be obtained via the .Tn SCSI READ CAPACITY command. .It Fl N @@ -310,29 +312,31 @@ Read data from a file or stdin, and write the data to WRITE command. .Bl -tag -width 12n .It Fl l Ar lba -Specify the starting Logical Block Address for the WRITE. This can be -specified in decimal, octal (starting with 0), hexadecimal (starting with -0x) or any other base supported by +Specify the starting Logical Block Address for the WRITE. +This can be specified in decimal, octal (starting with 0), hexadecimal +(starting with 0x) or any other base supported by .Xr strtoull 3 . .It Fl d Ar atalen Specify the length, in 512 byte blocks, of the WRITE request. .It Fl f Ar file -Specify the source for the data to be written by the WRITE command. Either a -filename or +Specify the source for the data to be written by the WRITE command. +Either a filename or .Sq - for stdin may be specified. .It Fl c Ar cdbsize Specify the minimum .Tn SCSI -CDB (Command Data Block) size to be used for the READ request. Allowable -values are 6, 10, 12 and 16. Depending upon the LBA and amount of data -requested, a larger CDB size may be used to satisfy the request. (e.g., -for LBAs above 0xffffffff, READ(16) must be used to satisfy the request.) +CDB (Command Data Block) size to be used for the READ request. +Allowable values are 6, 10, 12 and 16. +Depending upon the LBA and amount of data requested, a larger CDB size +may be used to satisfy the request. (e.g., for LBAs above 0xffffffff, READ(16) +must be used to satisfy the request.) .It Fl b Ar blocksize Specify the blocksize of the underlying .Tn SCSI device, so the transfer length -can be calculated accurately. The blocksize can be obtained via the +can be calculated accurately. +The blocksize can be obtained via the .Tn SCSI READ CAPACITY command. .It Fl N @@ -346,18 +350,20 @@ This is to be used for performance testing. Send the .Tn SCSI READ CAPACITY command to the device and display the device size and device -block size. By default, READ CAPACITY(10) is -used. If the device returns a maximum LBA of 0xffffffff, however, +block size. +By default, READ CAPACITY(10) is used. +If the device returns a maximum LBA of 0xffffffff, however, .Nm will automatically issue a READ CAPACITY(16), which is implemented as a -service action of the SERVICE ACTION IN(16) opcode. The user can specify -the minimum CDB size with the +service action of the SERVICE ACTION IN(16) opcode. +The user can specify the minimum CDB size with the .Fl c -argument. Valid values for the +argument. +Valid values for the .Fl c -option are 10 and 16. If a 10 byte CDB is specified, the request will be -automatically reissued with a 16 byte CDB if the maximum LBA returned is -0xffffffff. +option are 10 and 16. +If a 10 byte CDB is specified, the request will be automatically reissued +with a 16 byte CDB if the maximum LBA returned is 0xffffffff. .It Ic modesense Send a .Tn SCSI @@ -365,17 +371,21 @@ MODE SENSE command to the device, and display the requ page list. .Bl -tag -width 10n .It Fl m Ar page -Specify the mode page to display. This option and the +Specify the mode page to display. +This option and the .Fl l -option are mutually exclusive. One of the two must be specified, though. +option are mutually exclusive. +One of the two must be specified, though. Mode page numbers may be specified in decimal or hexadecimal. .It Fl l Request that the list of mode pages supported by the device be returned. This option and the .Fl m -option are mutually exclusive. One of the two must be specified, though. +option are mutually exclusive. +One of the two must be specified, though. .It Fl P Ar pc -Specify the mode page control value. Possible values are: +Specify the mode page control value. +Possible values are: .Bl -tag -width 2n -compact .It 0 Current values. @@ -391,8 +401,8 @@ Disable block descriptors when sending the mode sense .It Fl S Ar subpage Specify the subpage used with the mode sense request. .It Fl c Ar cdbsize -Specify the CDB size used for the mode sense request. Supported values are -6 and 10. +Specify the CDB size used for the mode sense request. +Supported values are 6 and 10. .El .It Ic start Send the @@ -401,54 +411,56 @@ START STOP UNIT command to the specified LUN with the bit set. .Bl -tag -width 4n .It Fl i -Set the immediate bit in the CDB. Note that CTL does not support the -immediate bit, so this is primarily useful for making sure that CTL returns -the proper error. +Set the immediate bit in the CDB. +Note that CTL does not support the immediate bit, so this is primarily +useful for making sure that CTL returns the proper error. .El .It Ic stop Send the .Tn SCSI START STOP UNIT command to the specified LUN with the start -bit cleared. We use an ordered tag to stop the LUN, so we can guarantee -that all pending I/O executes before it is stopped. (CTL guarantees this -anyway, but +bit cleared. +We use an ordered tag to stop the LUN, so we can guarantee that all pending +I/O executes before it is stopped. +(CTL guarantees this anyway, but .Nm sends an ordered tag for completeness.) .Bl -tag -width 4n .It Fl i -Set the immediate bit in the CDB. Note that CTL does not support the -immediate bit, so this is primarily useful for making sure that CTL returns -the proper error. +Set the immediate bit in the CDB. +Note that CTL does not support the immediate bit, so this is primarily +useful for making sure that CTL returns the proper error. .El .It Ic synccache Send the .Tn SCSI -SYNCHRONIZE CACHE command to the device. By default, SYNCHRONIZE -CACHE(10) is used. If the specified starting LBA is greater than -0xffffffff or the length is greater than 0xffff, though, -SYNCHRONIZE CACHE(16) will be used. The 16 byte command will also be used -if the user specifies a 16 byte CDB with the +SYNCHRONIZE CACHE command to the device. +By default, SYNCHRONIZE CACHE(10) is used. +If the specified starting LBA is greater than 0xffffffff or the length is +greater than 0xffff, though, SYNCHRONIZE CACHE(16) will be used. +The 16 byte command will also be used if the user specifies a 16 byte CDB with the .Fl c argument. .Bl -tag -width 14n .It Fl l Ar lba -Specify the starting LBA of the cache region to synchronize. This option is a -no-op for CTL. If you send a SYNCHRONIZE CACHE command, it will sync the -cache for the entire LUN. +Specify the starting LBA of the cache region to synchronize. +This option is a no-op for CTL. +If you send a SYNCHRONIZE CACHE command, it will sync the cache for the entire LUN. .It Fl b Ar blockcount -Specify the length of the cache region to synchronize. This option is a -no-op for CTL. If you send a SYNCHRONIZE CACHE command, it will sync the -cache for the entire LUN. +Specify the length of the cache region to synchronize. +This option is a no-op for CTL. +If you send a SYNCHRONIZE CACHE command, it will sync the cache for the entire LUN. .It Fl r -Specify relative addressing for the starting LBA. CTL does not support -relative addressing, since it only works for linked commands, and CTL -does not support linked commands. +Specify relative addressing for the starting LBA. +CTL does not support relative addressing, since it only works for linked commands, +and CTL does not support linked commands. .It Fl i Tell the target to return status immediately after issuing the SYNCHRONIZE CACHE -command rather than waiting for the cache to finish syncing. CTL does not -support this bit. +command rather than waiting for the cache to finish syncing. +CTL does not support this bit. .It Fl c Ar cdbsize -Specify the minimum CDB size. Valid values are 10 and 16 bytes. +Specify the minimum CDB size. +Valid values are 10 and 16 bytes. .El .It Ic lunlist List all LUNs registered with CTL. @@ -457,14 +469,15 @@ Because this command uses the ioctl port, it will only This command is the equivalent of doing a REPORT LUNS on one LUN and then an INQUIRY on each LUN in the system. .It Ic delay -Delay commands at the given location. There are two places where commands -may be delayed currently: before data is transferred +Delay commands at the given location. +There are two places where commands may be delayed currently: before data is transferred .Pq Dq datamove and just prior to sending status to the host .Pq Dq done . One of the two must be supplied as an argument to the .Fl l -option. The +option. +The .Fl t option must also be specified. .Bl -tag -width 12n @@ -473,9 +486,10 @@ Delay command(s) at the specified location. This can either be at the data movement stage (datamove) or prior to command completion (done). .It Fl t Ar delaytime -Delay command(s) for the specified number of seconds. This must be -specified. If set to 0, it will clear out any previously set delay for -this particular location (datamove or done). +Delay command(s) for the specified number of seconds. +This must be specified. +If set to 0, it will clear out any previously set delay for this particular +location (datamove or done). .It Fl T Ar delaytype Specify the delay type. By default, the @@ -898,11 +912,12 @@ as write protected. Set to "on", makes LUN removable. .It Va reordering Set to "unrestricted", allows target to process commands with SIMPLE task -attribute in arbitrary order. Any data integrity exposures related to -command sequence order shall be explicitly handled by the application -client through the selection of appropriate commands and task attributes. -The default value is "restricted". It improves data integrity, but may -introduce some additional delays. +attribute in arbitrary order. +Any data integrity exposures related to command sequence order shall be +explicitly handled by the application client through the selection of +appropriate commands and task attributes. +The default value is "restricted". +It improves data integrity, but may introduce some additional delays. .It Va serseq Set to "on" to serialize consecutive reads/writes. Set to "read" to serialize consecutive reads. Modified: head/usr.sbin/extattrctl/extattrctl.8 ============================================================================== --- head/usr.sbin/extattrctl/extattrctl.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.sbin/extattrctl/extattrctl.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -178,4 +178,4 @@ and introduced in It was developed to support security extensions requiring additional labels to be associated with each file or directory. .Sh AUTHORS -Robert N M Watson +.An Robert N M Watson Modified: head/usr.sbin/i2c/i2c.8 ============================================================================== --- head/usr.sbin/i2c/i2c.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.sbin/i2c/i2c.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -55,8 +55,8 @@ The .Nm utility can be used to perform raw data transfers (read or write) with devices -on the I2C bus. It can also scan the bus for available devices and reset the -I2C controller. +on the I2C bus. +It can also scan the bus for available devices and reset the I2C controller. .Pp The options are as follows: .Bl -tag -width ".Fl d Ar direction" @@ -124,10 +124,10 @@ Zero means that the offset is ignored and not passed t .Sh WARNINGS Great care must be taken when manipulating slave I2C devices with the .Nm -utility. Often times important configuration data for the system is kept in -non-volatile but write enabled memories located on the I2C bus, for example -Ethernet hardware addresses, RAM module parameters (SPD), processor reset -configuration word etc. +utility. +Often times important configuration data for the system is kept in non-volatile +but write enabled memories located on the I2C bus, for example Ethernet hardware +addresses, RAM module parameters (SPD), processor reset configuration word etc. .Pp It is very easy to render the whole system unusable when such configuration data is deleted or altered, so use the @@ -135,13 +135,14 @@ data is deleted or altered, so use the (write) command only if you know exactly what you are doing. .Pp Also avoid ungraceful interrupting of an ongoing transaction on the I2C bus, -as it can lead to potentially dangerous effects. Consider the following -scenario: when the host CPU is reset (for whatever reason) in the middle of a -started I2C transaction, the I2C slave device could be left in write mode -waiting for data or offset to arrive. When the CPU reinitializes itself and -talks to this I2C slave device again, the commands and other control info it -sends are treated by the slave device as data or offset it was waiting for, -and there's great potential for corruption if such a write is performed. +as it can lead to potentially dangerous effects. +Consider the following scenario: when the host CPU is reset (for whatever reason) +in the middle of a started I2C transaction, the I2C slave device could be left +in write mode waiting for data or offset to arrive. +When the CPU reinitializes itself and talks to this I2C slave device again, +the commands and other control info it sends are treated by the slave device +as data or offset it was waiting for, and there's great potential for +corruption if such a write is performed. .Sh EXAMPLES .Bl -bullet .It Modified: head/usr.sbin/mountd/exports.5 ============================================================================== --- head/usr.sbin/mountd/exports.5 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.sbin/mountd/exports.5 Fri Oct 9 14:03:45 2020 (r366572) @@ -28,7 +28,7 @@ .\" @(#)exports.5 8.3 (Berkeley) 3/29/95 .\" $FreeBSD$ .\" -.Dd Feb 11, 2019 +.Dd February 11, 2019 .Dt EXPORTS 5 .Os .Sh NAME @@ -316,9 +316,10 @@ There can only be one NFSv4 root directory per server. As such, all entries of this form must specify the same directory path. For file systems other than ZFS, this location can be any directory and does not -need to be within an exported file system. If it is not in an exported -file system, a very limited set of operations are permitted, so that an -NFSv4 client can traverse the tree to an exported file system. +need to be within an exported file system. +If it is not in an exported file system, a very limited set of operations +are permitted, so that an NFSv4 client can traverse the tree to an +exported file system. Although parts of the NFSv4 tree can be non-exported, the entire NFSv4 tree must consist of local file systems capable of being exported via NFS. All ZFS file systems in the subtree below the NFSv4 tree root must be @@ -330,10 +331,11 @@ mount points. The .Fl sec option on these line(s) specifies what security flavors may be used for -NFSv4 operations that do not use file handles. Since these operations -(SetClientID, SetClientIDConfirm, Renew, DelegPurge and ReleaseLockOnwer) -allocate/modify state in the server, it is possible to restrict some clients to -the use of the krb5[ip] security flavors, via this option. +NFSv4 operations that do not use file handles. +Since these operations (SetClientID, SetClientIDConfirm, Renew, DelegPurge +and ReleaseLockOnwer) allocate/modify state in the server, it is possible +to restrict some clients to the use of the krb5[ip] security flavors, +via this option. See the .Sx EXAMPLES section below. @@ -507,12 +509,13 @@ V4: /wingsdl/nfsv4 .Ed .Pp Only one V4: line is needed or allowed to declare where NFSv4 is -rooted. The other lines declare specific exported directories with +rooted. +The other lines declare specific exported directories with their absolute paths given in /etc/exports. .Pp The exported directories' paths are used for both v3 and v4. -However, they are interpreted differently for v3 and v4. A client -mount command for usr-ports would use the server-absolute name when +However, they are interpreted differently for v3 and v4. +A client mount command for usr-ports would use the server-absolute name when using nfsv3: .Bd -literal -offset indent mount server:/wingsdl/nfsv4/usr-ports /mnt/tmp @@ -525,8 +528,9 @@ mount server:/usr-ports /mnt/tmp .Ed .Pp This also differentiates which version you want if the client can do -both v3 and v4. The former will only ever do a v3 mount and the -latter will only ever do a v4 mount. +both v3 and v4. +The former will only ever do a v3 mount and the latter will only ever +do a v4 mount. .Pp Note that due to different mount behavior between NFSv3 and NFSv4 a NFSv4 mount request for a directory that the client does not have Modified: head/usr.sbin/nfsuserd/nfsuserd.8 ============================================================================== --- head/usr.sbin/nfsuserd/nfsuserd.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.sbin/nfsuserd/nfsuserd.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -53,11 +53,12 @@ owner and owner_group strings. It also provides support for manage-gids and must be running on the server if this is being used for any version of NFS. .Pp -Upon startup, it loads the machines DNS domain name, plus timeout and -cache size limit into the kernel. It then preloads the cache with group -and user information, up to the cache size limit and forks off N children -(default 4), that service requests from the kernel for cache misses. The -master server is there for the sole purpose of killing off the slaves. +Upon startup, it loads the machines DNS domain name, plus timeout and cache size +limit into the kernel. +It then preloads the cache with group and user information, up to the cache size +limit and forks off N children (default 4), that service requests from the kernel +for cache misses. +The master server is there for the sole purpose of killing off the slaves. To stop the nfsuserd, send a SIGUSR1 to the master server. .Pp The following options are available: @@ -72,13 +73,14 @@ reported by Overrides the default timeout for cache entries, in minutes. The longer the time out, the better the performance, but the longer it takes for replaced -entries to be seen. If your user/group database management system almost -never re-uses the same names or id numbers, a large timeout is recommended. +entries to be seen. +If your user/group database management system almost never re-uses the same names +or id numbers, a large timeout is recommended. The default is 1 minute. .It Fl usermax Ar max_cache_size -Overrides the default upper bound on the cache size. The larger the cache, -the more kernel memory is used, but the better the performance. If your -system can afford the memory use, make this the sum of the number of +Overrides the default upper bound on the cache size. +The larger the cache, the more kernel memory is used, but the better the performance. +If your system can afford the memory use, make this the sum of the number of entries in your group and password databases. The default is 200 entries. .It Fl verbose @@ -98,12 +100,13 @@ on the server instead of the list of groups provided i This can be used to avoid the 16 group limit for AUTH_SYS. .It Ar num_servers Specifies how many servers to create (max 20). -The default of 4 may be sufficient. You should run enough servers, so that +The default of 4 may be sufficient. +You should run enough servers, so that .Xr ps 1 shows almost no running time for one or two of the slaves after the system -has been running for a long period. Running too few will have a major -performance impact, whereas running too many will only tie up some resources, -such as a process table entry and swap space. +has been running for a long period. +Running too few will have a major performance impact, whereas running too many +will only tie up some resources, such as a process table entry and swap space. .El .Sh SEE ALSO .Xr getgrent 3 , @@ -126,7 +129,8 @@ use and .Xr getpwent 3 library calls to resolve requests and will hang if the servers handling -those requests fail and the library functions don't return. See +those requests fail and the library functions don't return. +See .Xr group 5 and .Xr passwd 5 Modified: head/usr.sbin/pmcstudy/pmcstudy.8 ============================================================================== --- head/usr.sbin/pmcstudy/pmcstudy.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.sbin/pmcstudy/pmcstudy.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd Mar 26, 2015 +.Dd March 26, 2015 .Dt PMCSTUDY 8 .Os .Sh NAME @@ -140,6 +140,6 @@ Run all canned tests. The .Nm utility first appeared in -.Fx 11.0. +.Fx 11.0 . .Sh AUTHORS .An Randall Stewart Aq Mt rrs@FreeBSD.org Modified: head/usr.sbin/traceroute6/traceroute6.8 ============================================================================== --- head/usr.sbin/traceroute6/traceroute6.8 Fri Oct 9 13:11:14 2020 (r366571) +++ head/usr.sbin/traceroute6/traceroute6.8 Fri Oct 9 14:03:45 2020 (r366572) @@ -99,7 +99,8 @@ Debug mode. .It Fl f Ar firsthop Specify how many hops to skip in trace. .It Fl g Ar gateway -Specify intermediate gateway. Please note that +Specify intermediate gateway. +Please note that .Nm tries to use routing headers. .It Fl I @@ -150,7 +151,8 @@ The size of probe packets must be a multiple of 4. If .Ar datalen is up to 28, probe packets consist of a SHUTDOWN-ACK chunk possibly bundled -with a PAD chunk. For larger probe packets, an INIT chunk is used. +with a PAD chunk. +For larger probe packets, an INIT chunk is used. .It Fl t Ar tclass .Ar tclass specifies the From owner-svn-src-all@freebsd.org Fri Oct 9 14:33:11 2020 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 331423FC733; Fri, 9 Oct 2020 14:33:11 +0000 (UTC) (envelope-from rscheff@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C79Xl0d60z4T9q; Fri, 9 Oct 2020 14:33:11 +0000 (UTC) (envelope-from rscheff@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 EDAC91AD72; Fri, 9 Oct 2020 14:33:10 +0000 (UTC) (envelope-from rscheff@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099EXA9o019084; Fri, 9 Oct 2020 14:33:10 GMT (envelope-from rscheff@FreeBSD.org) Received: (from rscheff@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099EX9gT019077; Fri, 9 Oct 2020 14:33:09 GMT (envelope-from rscheff@FreeBSD.org) Message-Id: <202010091433.099EX9gT019077@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rscheff set sender to rscheff@FreeBSD.org using -f From: Richard Scheffenegger Date: Fri, 9 Oct 2020 14:33:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366573 - in head: sys/dev/iscsi usr.bin/iscsictl usr.sbin/iscsid X-SVN-Group: head X-SVN-Commit-Author: rscheff X-SVN-Commit-Paths: in head: sys/dev/iscsi usr.bin/iscsictl usr.sbin/iscsid X-SVN-Commit-Revision: 366573 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.33 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: Fri, 09 Oct 2020 14:33:11 -0000 Author: rscheff Date: Fri Oct 9 14:33:09 2020 New Revision: 366573 URL: https://svnweb.freebsd.org/changeset/base/366573 Log: Add DSCP support for network QoS to iscsi initiator. Allow the DSCP codepoint also to be configurable for the traffic in the direction from the initiator to the target, such that writes and any requests are also treated in the appropriate QoS class. Reviewed by: mav MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D26714 Modified: head/sys/dev/iscsi/iscsi_ioctl.h head/usr.bin/iscsictl/Makefile head/usr.bin/iscsictl/iscsi.conf.5 head/usr.bin/iscsictl/iscsictl.c head/usr.bin/iscsictl/iscsictl.h head/usr.bin/iscsictl/parse.y head/usr.bin/iscsictl/token.l head/usr.sbin/iscsid/iscsid.c Modified: head/sys/dev/iscsi/iscsi_ioctl.h ============================================================================== --- head/sys/dev/iscsi/iscsi_ioctl.h Fri Oct 9 14:03:45 2020 (r366572) +++ head/sys/dev/iscsi/iscsi_ioctl.h Fri Oct 9 14:33:09 2020 (r366573) @@ -70,7 +70,8 @@ struct iscsi_session_conf { int isc_iser; char isc_offload[ISCSI_OFFLOAD_LEN]; int isc_enable; - int isc_spare[4]; + int isc_dscp; + int isc_spare[3]; }; /* Modified: head/usr.bin/iscsictl/Makefile ============================================================================== --- head/usr.bin/iscsictl/Makefile Fri Oct 9 14:03:45 2020 (r366572) +++ head/usr.bin/iscsictl/Makefile Fri Oct 9 14:33:09 2020 (r366573) @@ -7,7 +7,7 @@ CFLAGS+= -I${.CURDIR} CFLAGS+= -I${SRCTOP}/sys/dev/iscsi MAN= iscsi.conf.5 iscsictl.8 -LIBADD= xo +LIBADD= util xo YFLAGS+= -v LFLAGS+= -i Modified: head/usr.bin/iscsictl/iscsi.conf.5 ============================================================================== --- head/usr.bin/iscsictl/iscsi.conf.5 Fri Oct 9 14:03:45 2020 (r366572) +++ head/usr.bin/iscsictl/iscsi.conf.5 Fri Oct 9 14:33:09 2020 (r366573) @@ -145,6 +145,16 @@ for iSCSI over RDMA, or .Qq Ar iSCSI . Default is .Qq Ar iSCSI . +.It Cm dscp +The DiffServ Codepoint used for sending data. The DSCP can be +set to numeric, or hexadecimal values directly, as well as the +well-defined +.Qq Ar cs +and +.Qq Ar af +codepoints. +Default is no specified dscp codepoint, which means the default +of the outgoing interface is used. .El .Sh FILES .Bl -tag -width indent Modified: head/usr.bin/iscsictl/iscsictl.c ============================================================================== --- head/usr.bin/iscsictl/iscsictl.c Fri Oct 9 14:03:45 2020 (r366572) +++ head/usr.bin/iscsictl/iscsictl.c Fri Oct 9 14:33:09 2020 (r366573) @@ -87,6 +87,7 @@ target_new(struct conf *conf) if (targ == NULL) xo_err(1, "calloc"); targ->t_conf = conf; + targ->t_dscp = -1; TAILQ_INSERT_TAIL(&conf->conf_targets, targ, t_next); return (targ); @@ -358,6 +359,7 @@ conf_from_target(struct iscsi_session_conf *conf, conf->isc_data_digest = ISCSI_DIGEST_CRC32C; else conf->isc_data_digest = ISCSI_DIGEST_NONE; + conf->isc_dscp = targ->t_dscp; } static int @@ -535,6 +537,9 @@ kernel_list(int iscsi_fd, const struct target *targ __ "Target portal:", conf->isc_target_addr); xo_emit("{L:/%-26s}{V:alias/%s}\n", "Target alias:", state->iss_target_alias); + if (conf->isc_dscp != -1) + xo_emit("{L:/%-26s}{V:dscp/0x%02x}\n", + "Target DSCP:", conf->isc_dscp); xo_close_container("target"); xo_open_container("auth"); Modified: head/usr.bin/iscsictl/iscsictl.h ============================================================================== --- head/usr.bin/iscsictl/iscsictl.h Fri Oct 9 14:03:45 2020 (r366572) +++ head/usr.bin/iscsictl/iscsictl.h Fri Oct 9 14:33:09 2020 (r366573) @@ -78,6 +78,7 @@ struct target { int t_session_type; int t_enable; int t_protocol; + int t_dscp; char *t_offload; char *t_user; char *t_secret; Modified: head/usr.bin/iscsictl/parse.y ============================================================================== --- head/usr.bin/iscsictl/parse.y Fri Oct 9 14:03:45 2020 (r366572) +++ head/usr.bin/iscsictl/parse.y Fri Oct 9 14:33:09 2020 (r366573) @@ -44,6 +44,8 @@ #include #include "iscsictl.h" +#include +#include extern FILE *yyin; extern char *yytext; @@ -61,7 +63,9 @@ extern void yyrestart(FILE *); %token AUTH_METHOD ENABLE HEADER_DIGEST DATA_DIGEST TARGET_NAME TARGET_ADDRESS %token INITIATOR_NAME INITIATOR_ADDRESS INITIATOR_ALIAS USER SECRET %token MUTUAL_USER MUTUAL_SECRET SEMICOLON SESSION_TYPE PROTOCOL OFFLOAD -%token IGNORED EQUALS OPENING_BRACKET CLOSING_BRACKET +%token IGNORED EQUALS OPENING_BRACKET CLOSING_BRACKET DSCP +%token AF11 AF12 AF13 AF21 AF22 AF23 AF31 AF32 AF33 AF41 AF42 AF43 +%token BE EF CS0 CS1 CS2 CS3 CS4 CS5 CS6 CS7 %union { @@ -127,6 +131,8 @@ target_entry: protocol | ignored + | + dscp ; target_name: TARGET_NAME EQUALS STR @@ -294,6 +300,48 @@ ignored: IGNORED EQUALS STR { xo_warnx("obsolete statement ignored at line %d", lineno); } + ; + +dscp: DSCP EQUALS STR + { + uint64_t tmp; + + if (strcmp($3, "0x") == 0) { + tmp = strtol($3 + 2, NULL, 16); + } else if (expand_number($3, &tmp) != 0) { + yyerror("invalid numeric value"); + free($3); + return(1); + } + if (tmp >= 0x40) { + yyerror("invalid dscp value"); + return(1); + } + + target->t_dscp = tmp; + } + | DSCP EQUALS BE { target->t_dscp = IPTOS_DSCP_CS0 >> 2 ; } + | DSCP EQUALS EF { target->t_dscp = IPTOS_DSCP_EF >> 2 ; } + | DSCP EQUALS CS0 { target->t_dscp = IPTOS_DSCP_CS0 >> 2 ; } + | DSCP EQUALS CS1 { target->t_dscp = IPTOS_DSCP_CS1 >> 2 ; } + | DSCP EQUALS CS2 { target->t_dscp = IPTOS_DSCP_CS2 >> 2 ; } + | DSCP EQUALS CS3 { target->t_dscp = IPTOS_DSCP_CS3 >> 2 ; } + | DSCP EQUALS CS4 { target->t_dscp = IPTOS_DSCP_CS4 >> 2 ; } + | DSCP EQUALS CS5 { target->t_dscp = IPTOS_DSCP_CS5 >> 2 ; } + | DSCP EQUALS CS6 { target->t_dscp = IPTOS_DSCP_CS6 >> 2 ; } + | DSCP EQUALS CS7 { target->t_dscp = IPTOS_DSCP_CS7 >> 2 ; } + | DSCP EQUALS AF11 { target->t_dscp = IPTOS_DSCP_AF11 >> 2 ; } + | DSCP EQUALS AF12 { target->t_dscp = IPTOS_DSCP_AF12 >> 2 ; } + | DSCP EQUALS AF13 { target->t_dscp = IPTOS_DSCP_AF13 >> 2 ; } + | DSCP EQUALS AF21 { target->t_dscp = IPTOS_DSCP_AF21 >> 2 ; } + | DSCP EQUALS AF22 { target->t_dscp = IPTOS_DSCP_AF22 >> 2 ; } + | DSCP EQUALS AF23 { target->t_dscp = IPTOS_DSCP_AF23 >> 2 ; } + | DSCP EQUALS AF31 { target->t_dscp = IPTOS_DSCP_AF31 >> 2 ; } + | DSCP EQUALS AF32 { target->t_dscp = IPTOS_DSCP_AF32 >> 2 ; } + | DSCP EQUALS AF33 { target->t_dscp = IPTOS_DSCP_AF33 >> 2 ; } + | DSCP EQUALS AF41 { target->t_dscp = IPTOS_DSCP_AF41 >> 2 ; } + | DSCP EQUALS AF42 { target->t_dscp = IPTOS_DSCP_AF42 >> 2 ; } + | DSCP EQUALS AF43 { target->t_dscp = IPTOS_DSCP_AF43 >> 2 ; } ; %% Modified: head/usr.bin/iscsictl/token.l ============================================================================== --- head/usr.bin/iscsictl/token.l Fri Oct 9 14:03:45 2020 (r366572) +++ head/usr.bin/iscsictl/token.l Fri Oct 9 14:33:09 2020 (r366573) @@ -68,6 +68,7 @@ enable { return ENABLE; } protocol { return PROTOCOL; } offload { return OFFLOAD; } port { return IGNORED; } +dscp { return DSCP; } MaxConnections { return IGNORED; } TargetAlias { return IGNORED; } TargetPortalGroupTag { return IGNORED; } @@ -86,6 +87,28 @@ tags { return IGNORED; } maxluns { return IGNORED; } sockbufsize { return IGNORED; } chapDigest { return IGNORED; } +af11 { return AF11; } +af12 { return AF12; } +af13 { return AF13; } +af21 { return AF21; } +af22 { return AF22; } +af23 { return AF23; } +af31 { return AF31; } +af32 { return AF32; } +af33 { return AF33; } +af41 { return AF41; } +af42 { return AF42; } +af43 { return AF43; } +be { return CS0; } +ef { return EF; } +cs0 { return CS0; } +cs1 { return CS1; } +cs2 { return CS2; } +cs3 { return CS3; } +cs4 { return CS4; } +cs5 { return CS5; } +cs6 { return CS6; } +cs7 { return CS7; } \"[^"]+\" { yylval.str = strndup(yytext + 1, strlen(yytext) - 2); return STR; } [a-zA-Z0-9\.\-_/\:\[\]]+ { yylval.str = strdup(yytext); return STR; } Modified: head/usr.sbin/iscsid/iscsid.c ============================================================================== --- head/usr.sbin/iscsid/iscsid.c Fri Oct 9 14:03:45 2020 (r366572) +++ head/usr.sbin/iscsid/iscsid.c Fri Oct 9 14:33:09 2020 (r366573) @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -276,6 +277,25 @@ connection_new(int iscsi_fd, const struct iscsi_daemon if (setsockopt(conn->conn_socket, SOL_SOCKET, SO_SNDBUF, &sockbuf, sizeof(sockbuf)) == -1) log_warn("setsockopt(SO_SNDBUF) failed"); + if (conn->conn_conf.isc_dscp != -1) { + int tos = conn->conn_conf.isc_dscp << 2; + if (to_ai->ai_family == AF_INET) { + if (setsockopt(conn->conn_socket, + IPPROTO_IP, IP_TOS, + &tos, sizeof(tos)) == -1) + log_warn("setsockopt(IP_TOS) " + "failed for %s", + from_addr); + } else + if (to_ai->ai_family == AF_INET6) { + if (setsockopt(conn->conn_socket, + IPPROTO_IPV6, IPV6_TCLASS, + &tos, sizeof(tos)) == -1) + log_warn("setsockopt(IPV6_TCLASS) " + "failed for %s", + from_addr); + } + } if (from_ai != NULL) { error = bind(conn->conn_socket, from_ai->ai_addr, from_ai->ai_addrlen); From owner-svn-src-all@freebsd.org Fri Oct 9 14:45:42 2020 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 83D653FCD1C; Fri, 9 Oct 2020 14:45:42 +0000 (UTC) (envelope-from mhorne@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C79qB2pznz4TgM; Fri, 9 Oct 2020 14:45:42 +0000 (UTC) (envelope-from mhorne@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 3FB8E1AE79; Fri, 9 Oct 2020 14:45:42 +0000 (UTC) (envelope-from mhorne@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099EjfKb025071; Fri, 9 Oct 2020 14:45:41 GMT (envelope-from mhorne@FreeBSD.org) Received: (from mhorne@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099EjfFf025070; Fri, 9 Oct 2020 14:45:41 GMT (envelope-from mhorne@FreeBSD.org) Message-Id: <202010091445.099EjfFf025070@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mhorne set sender to mhorne@FreeBSD.org using -f From: Mitchell Horne Date: Fri, 9 Oct 2020 14:45:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366574 - head/sys/riscv/conf X-SVN-Group: head X-SVN-Commit-Author: mhorne X-SVN-Commit-Paths: head/sys/riscv/conf X-SVN-Commit-Revision: 366574 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.33 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: Fri, 09 Oct 2020 14:45:42 -0000 Author: mhorne Date: Fri Oct 9 14:45:41 2020 New Revision: 366574 URL: https://svnweb.freebsd.org/changeset/base/366574 Log: RISC-V LINT kernel config Create the RISC-V NOTES and LINT files. As of r366559, LINT configs are no longer generated but checked in to the tree. Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D26502 Added: head/sys/riscv/conf/LINT (contents, props changed) head/sys/riscv/conf/NOTES (contents, props changed) Added: head/sys/riscv/conf/LINT ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/riscv/conf/LINT Fri Oct 9 14:45:41 2020 (r366574) @@ -0,0 +1,4 @@ +# $FreeBSD$ + +include "../../conf/NOTES" +include NOTES Added: head/sys/riscv/conf/NOTES ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/riscv/conf/NOTES Fri Oct 9 14:45:41 2020 (r366574) @@ -0,0 +1,96 @@ +# +# NOTES -- Lines that can be cut/pasted into kernel and hints configs. +# +# This file contains machine dependent kernel configuration notes. For +# machine independent notes, look in /sys/conf/NOTES. +# +# $FreeBSD$ +# + +cpu RISCV + +makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols +makeoptions WITH_CTF=1 # Run ctfconvert(1) for DTrace support + +options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed. +options KDTRACE_FRAME # Ensure frames are compiled in +options KDTRACE_HOOKS # Kernel DTrace hooks +options DDB_CTF # Kernel ELF linker loads CTF data +options FPE # Floating-point extension support +options RACCT_DEFAULT_TO_DISABLED # Set kern.racct.enable=0 by default +options INTRNG # Include INTRNG framework + +# RISC-V SBI console +device rcons + +# EXT_RESOURCES pseudo devices +options EXT_RESOURCES +device clk +device phy +device regulator +device syscon +device syscon_power +device riscv_syscon + +# Backlight subsystem +device backlight + +# VirtIO support +device virtio # Generic VirtIO bus (required) +device virtio_pci # VirtIO PCI device +device vtnet # VirtIO Ethernet device +device virtio_blk # VirtIO Block device +device virtio_mmio # VirtIO MMIO bus +device virtio_random # VirtIO Entropy device + +# NOTE: dtrace introduces CDDL-licensed components into the kernel +device dtrace # dtrace core +device dtraceall # include all dtrace modules + +# Serial (COM) ports +device uart_lowrisc # lowRISC UART driver +device uart_ns8250 # ns8250-type UART driver + +# RTC +device goldfish_rtc # QEMU RTC + +# Ethernet drivers +device xae # Xilinx AXI Ethernet MAC + +# DMA support +device xdma # DMA interface +device axidma # Xilinx AXI DMA Controller + +# SPI +device xilinx_spi # Xilinx AXI Quad-SPI Controller + +# SOC-specific +device fe310aon +device fu540spi +files "../sifive/files.sifive" + +# Flattened Device Tree +options FDT +makeoptions MODULES_EXTRA+="dtb/sifive" + +# FreeBSD/riscv didn't exist for these releases +nooptions COMPAT_FREEBSD4 +nooptions COMPAT_FREEBSD5 +nooptions COMPAT_FREEBSD6 +nooptions COMPAT_FREEBSD7 +nooptions COMPAT_FREEBSD9 +nooptions COMPAT_FREEBSD10 +nooptions COMPAT_FREEBSD11 + +# No support for remote GDB +nooptions GDB + +# riscv doesn't support inb/outb, so disable chipset probing which needs it +nooptions PPC_PROBE_CHIPSET + +# Makes assumptions about bus tags that aren't true on riscv +nodevice snd_cmi + +# Don't yet have hwpmc(4) +nodevice hwpmc +nooptions HWPMC_HOOKS From owner-svn-src-all@freebsd.org Fri Oct 9 15:14:21 2020 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 CC19D3FC9E5; Fri, 9 Oct 2020 15:14:21 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7BSF5PsFz4W0v; Fri, 9 Oct 2020 15:14:21 +0000 (UTC) (envelope-from gbe@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 984561BB0C; Fri, 9 Oct 2020 15:14:21 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099FEL8I043334; Fri, 9 Oct 2020 15:14:21 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099FEJKF043324; Fri, 9 Oct 2020 15:14:19 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010091514.099FEJKF043324@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Fri, 9 Oct 2020 15:14:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366575 - in head: libexec/rtld-elf share/man/man4 share/man/man4/man4.i386 share/man/man4/man4.powerpc stand/defaults stand/forth tools/tools/ether_reflect tools/tools/vimage X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: in head: libexec/rtld-elf share/man/man4 share/man/man4/man4.i386 share/man/man4/man4.powerpc stand/defaults stand/forth tools/tools/ether_reflect tools/tools/vimage X-SVN-Commit-Revision: 366575 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.33 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: Fri, 09 Oct 2020 15:14:21 -0000 Author: gbe (doc committer) Date: Fri Oct 9 15:14:19 2020 New Revision: 366575 URL: https://svnweb.freebsd.org/changeset/base/366575 Log: Fix a few mandoc issues - whitespace at end of input line - skipping paragraph macro: Pp at the end of Sh - new sentence, new line - consider using OS macro: Fx - AUTHORS section without An macro - skipping paragraph macro: Pp before Ss Modified: head/libexec/rtld-elf/rtld.1 head/share/man/man4/acpi_ibm.4 head/share/man/man4/man4.i386/glxiic.4 head/share/man/man4/man4.powerpc/smu.4 head/share/man/man4/ng_checksum.4 head/stand/defaults/loader.conf.5 head/stand/forth/beastie.4th.8 head/stand/forth/brand.4th.8 head/tools/tools/ether_reflect/ether_reflect.1 head/tools/tools/vimage/vimage.8 Modified: head/libexec/rtld-elf/rtld.1 ============================================================================== --- head/libexec/rtld-elf/rtld.1 Fri Oct 9 14:45:41 2020 (r366574) +++ head/libexec/rtld-elf/rtld.1 Fri Oct 9 15:14:19 2020 (r366575) @@ -360,7 +360,7 @@ In the direct execution mode, .Nm emulates verification of the binary execute permission for the current user. -This is done to avoid breaking user expectations in naively restricted +This is done to avoid breaking user expectations in naively restricted execution environments. The verification only uses Unix .Dv DACs , Modified: head/share/man/man4/acpi_ibm.4 ============================================================================== --- head/share/man/man4/acpi_ibm.4 Fri Oct 9 14:45:41 2020 (r366574) +++ head/share/man/man4/acpi_ibm.4 Fri Oct 9 15:14:19 2020 (r366575) @@ -274,7 +274,7 @@ Speaker volume. .It Va dev.acpi_ibm.0.mute Indicates, whether the speakers are muted or not. .It Va dev.acpi_ibm.0.mic_mute -Indicates, whether the microphone led (present on some model) is on or not. +Indicates, whether the microphone led (present on some model) is on or not. Note that this does not mean that the microphone input is muted. .It Va dev.acpi_ibm.0.thinklight Indicates, whether the ThinkLight keyboard light is activated or not. @@ -452,8 +452,8 @@ case ${NOTIFY} in if [ $LEVEL -eq 0 ]; then sysctl dev.acpi_ibm.0.mic_led=1 mixer rec 0 - fi - if [ $LEVEL -eq 1 ]; then + fi + if [ $LEVEL -eq 1 ]; then sysctl dev.acpi_ibm.0.mic_led=0 mixer rec 30 fi Modified: head/share/man/man4/man4.i386/glxiic.4 ============================================================================== --- head/share/man/man4/man4.i386/glxiic.4 Fri Oct 9 14:45:41 2020 (r366574) +++ head/share/man/man4/man4.i386/glxiic.4 Fri Oct 9 15:14:19 2020 (r366575) @@ -50,8 +50,8 @@ glxiic_load="YES" The .Nm driver supports the System Management Bus controller of the Geode LX -series CS5536 Companion Device. The Geode LX is a member of the AMD -Geode family of integrated x86 system chips. +series CS5536 Companion Device. +The Geode LX is a member of the AMD Geode family of integrated x86 system chips. .Pp Although AMD refers to this device as a System Management Bus (SMBus) controller, it is really an I2C controller (it lacks SMBus ALERT# and @@ -70,17 +70,18 @@ and tunable: .Bl -tag -width indent .It Va dev.glxiic.0.timeout -This variable controls the I2C bus timeout in milliseconds. The -default timeout is 35 milliseconds. A value of zero disables the -timeout. +This variable controls the I2C bus timeout in milliseconds. +The default timeout is 35 milliseconds. +A value of zero disables the timeout. .El .Sh CAVEAT The .Nm driver uses the interrupt line number configured by the board firmware -by default. If no interrupt line number has been configured by the -board firmware (or to override the interrupt line number configured by -board firmware), place the following line in +by default. +If no interrupt line number has been configured by the board firmware +(or to override the interrupt line number configured by board firmware), +place the following line in .Xr device.hints 5 : .Bd -ragged -offset indent hint.glxiic.0.irq="10" Modified: head/share/man/man4/man4.powerpc/smu.4 ============================================================================== --- head/share/man/man4/man4.powerpc/smu.4 Fri Oct 9 14:45:41 2020 (r366574) +++ head/share/man/man4/man4.powerpc/smu.4 Fri Oct 9 15:14:19 2020 (r366575) @@ -60,45 +60,47 @@ Apple System Management Unit .Sh THERMAL MANAGEMENT The .Nm -driver provides basic automatic thermal management. Without a userspace -daemon providing more advanced control, the driver will attempt to maintain -system temperatures in a conservative range through coarse-grained control of -system cooling devices (see below). Automatic kernel-level thermal control -will take over if more than 3 seconds elapses between userspace cooling -setting adjustments. +driver provides basic automatic thermal management. +Without a userspace daemon providing more advanced control, the driver will +attempt to maintain system temperatures in a conservative range through +coarse-grained control of system cooling devices (see below). +Automatic kernel-level thermal control will take over if more than 3 +seconds elapses between userspace cooling setting adjustments. .Sh SYSCTL VARIABLES The .Nm driver provides power management services and thermal readout through a sysctl interface. -The following sysctls can be used to control the -power management behavior and to examine current system power and -thermal conditions. +The following sysctls can be used to control the power management behavior +and to examine current system power and thermal conditions. .Bl -tag -width indent .It Va dev.smu.%d.server_mode Restart after power failure behavior (1 causes system to reboot after power cut, 0 causes system to remain off). .It Va dev.smu.%d.target_temp -Target system temperature, in degrees Celsius. The +Target system temperature, in degrees Celsius. +The .Nm driver will attempt to adjust fans to maintain the temperature of the warmest component in the system at or below this level. .It Va dev.smu.%d.critical_temp -System critical temperature, in degrees Celsius. If any component in -the system exceeds this temperature, the machine will be shut down within -500 ms. +System critical temperature, in degrees Celsius. +If any component in the system exceeds this temperature, the machine +will be shut down within 500 ms. .It Va dev.smu.%d.fans.%s.minrpm Minimum allowed speed for this fan. .It Va dev.smu.%d.fans.%s.maxrpm Maximum allowed speed for this fan. .It Va dev.smu.%d.fans.%s.rpm -Current speed for this fan. The fan speed can be adjusted by changing this -sysctl. If more than 3 seconds elapses between fan speed adjustments, the -kernel will resume automatic control of the fan. +Current speed for this fan. +The fan speed can be adjusted by changing this sysctl. +If more than 3 seconds elapses between fan speed adjustments, the kernel will +resume automatic control of the fan. .It Va dev.smu.%d.sensors.%s -Current reading from this sensor. Four sensor types are supported. Temperature -sensors are in units of degrees Celsius, current sensors in milliamps, voltage -sensors in millivolts, and power sensors in milliwatts. +Current reading from this sensor. +Four sensor types are supported. +Temperature sensors are in units of degrees Celsius, current sensors in +milliamps, voltage sensors in millivolts, and power sensors in milliwatts. .El .Sh LED INTERFACE The Modified: head/share/man/man4/ng_checksum.4 ============================================================================== --- head/share/man/man4/ng_checksum.4 Fri Oct 9 14:45:41 2020 (r366574) +++ head/share/man/man4/ng_checksum.4 Fri Oct 9 15:14:19 2020 (r366575) @@ -44,7 +44,8 @@ This node type has two hooks: Packets received on this hook are processed according to settings specified in config and then forwarded to the .Ar out -hook, if it exists and is connected. Otherwise they are reflected back to the +hook, if it exists and is connected. +Otherwise they are reflected back to the .Ar in hook. .It Va out @@ -58,13 +59,15 @@ This node type supports the generic control messages, .It Dv NGM_CHECKSUM_SETDLT Pq Ic setdlt Sets the data link type on the .Va in -hook. Currently, supported types are +hook. +Currently, supported types are .Cm DLT_RAW (raw IP datagrams) and .Cm DLT_EN10MB (Ethernet). DLT_ definitions can be found in the .In net/bpf.h -header. Currently used values are +header. +Currently used values are .Cm DLT_EN10MB = 1 and .Cm DLT_RAW @@ -74,7 +77,8 @@ This control message obtains the data link type on the .Va in hook. .It Dv NGM_CHECKSUM_SETCONFIG Pq Ic setconfig -Sets the node configuration. The following +Sets the node configuration. +The following .Vt "struct ng_checksum_config" must be supplied as an argument: .Bd -literal -offset 4n Modified: head/stand/defaults/loader.conf.5 ============================================================================== --- head/stand/defaults/loader.conf.5 Fri Oct 9 14:45:41 2020 (r366574) +++ head/stand/defaults/loader.conf.5 Fri Oct 9 15:14:19 2020 (r366575) @@ -38,7 +38,6 @@ it you can specify the kernel to be booted, parameters it, and additional modules to be loaded; and generally set all variables described in .Xr loader 8 . -.Pp .Sh SYNTAX Though .Nm Ns 's Modified: head/stand/forth/beastie.4th.8 ============================================================================== --- head/stand/forth/beastie.4th.8 Fri Oct 9 14:45:41 2020 (r366574) +++ head/stand/forth/beastie.4th.8 Fri Oct 9 15:14:19 2020 (r366575) @@ -103,7 +103,8 @@ The default behavior is to not delay. The environment variables that effect its behavior are: .Bl -tag -width bootfile -offset indent .It Va loader_logo -Selects the desired logo in the beastie boot menu. Possible values are: +Selects the desired logo in the beastie boot menu. +Possible values are: .Dq Li fbsdbw , .Dq Li beastie , .Dq Li beastiebw , @@ -112,9 +113,11 @@ Selects the desired logo in the beastie boot menu. Pos (default), and .Dq Li none . .It Va loader_logo_x -Sets the desired column position of the logo. Default is 46. +Sets the desired column position of the logo. +Default is 46. .It Va loader_logo_y -Sets the desired row position of the logo. Default is 4. +Sets the desired row position of the logo. +Default is 4. .It Va beastie_disable If set to .Dq YES , @@ -122,9 +125,10 @@ the beastie boot menu will be skipped. The beastie boot menu is always skipped if running non-x86 hardware. .It Va loader_delay If set to a number higher than zero, introduces a delay before starting the -beastie boot menu. During the delay the user can press either Ctrl-C to skip -the menu or ENTER to proceed to the menu. The default is to not delay when -loading the menu. +beastie boot menu. +During the delay the user can press either Ctrl-C to skip the menu or ENTER +to proceed to the menu. +The default is to not delay when loading the menu. .El .Sh FILES .Bl -tag -width /boot/loader.4th -compact Modified: head/stand/forth/brand.4th.8 ============================================================================== --- head/stand/forth/brand.4th.8 Fri Oct 9 14:45:41 2020 (r366574) +++ head/stand/forth/brand.4th.8 Fri Oct 9 15:14:19 2020 (r366575) @@ -81,14 +81,17 @@ The default values are 2 (x) and 1 (y). The environment variables that effect its behavior are: .Bl -tag -width bootfile -offset indent .It Va loader_brand -Selects the desired brand in the beastie boot menu. Possible values are: +Selects the desired brand in the beastie boot menu. +Possible values are: .Dq Li fbsd (default) or .Dq Li none . .It Va loader_brand_x -Sets the desired column position of the brand. Default is 2. +Sets the desired column position of the brand. +Default is 2. .It Va loader_brand_y -Sets the desired row position of the brand. Default is 1. +Sets the desired row position of the brand. +Default is 1. .El .Sh FILES .Bl -tag -width /boot/loader.4th -compact Modified: head/tools/tools/ether_reflect/ether_reflect.1 ============================================================================== --- head/tools/tools/ether_reflect/ether_reflect.1 Fri Oct 9 14:45:41 2020 (r366574) +++ head/tools/tools/ether_reflect/ether_reflect.1 Fri Oct 9 15:14:19 2020 (r366575) @@ -45,11 +45,13 @@ command implements a simple ethernet packet reflector .Xr PCAP 3 library and .Xr bpf 4 , -the Berkeley Packet Filter. The program is useful primarily to test -the low level round trip time of packets through an Ethernet interface -and/or a switch. Network protocols, such as IP, and the network stack -in general are never invoked, only the device driver that implements -the particular interface is executed. As the +the Berkeley Packet Filter. +The program is useful primarily to test the low level round trip time +of packets through an Ethernet interface and/or a switch. +Network protocols, such as IP, and the network stack in general are never +invoked, only the device driver that implements the particular interface +is executed. +As the .Nm command uses the .Xr bpf 4 @@ -67,13 +69,14 @@ ether type for driver testing. .It Fl i Ar interface Network interface, which can be found with ifconfig(1). .It Fl t Ar timeout -The time, in milliseconds, to wait for a packet. Lower times decrease -latency at the cost of CPU. +The time, in milliseconds, to wait for a packet. +Lower times decrease latency at the cost of CPU. .It Fl p -Set the device into promiscuous mode before testing. This is not -usually necessary. +Set the device into promiscuous mode before testing. +This is not usually necessary. .It Fl d -Debug output. Print various small pieces of debug information. +Debug output. +Print various small pieces of debug information. .El .Sh EXAMPLES The following is an example of a typical usage @@ -84,7 +87,8 @@ command: .Dl "ether_reflect -i em0 -t 1" .Pp Reflect all test packets, those with an ether type of 0x8822, which -are seen on ineterface em0. The timeout is 1 millisecond. +are seen on ineterface em0. +The timeout is 1 millisecond. .Pp .Dl "ether_reflect -i em0 -a 00:00:00:aa:bb:cc -t 1" .Pp Modified: head/tools/tools/vimage/vimage.8 ============================================================================== --- head/tools/tools/vimage/vimage.8 Fri Oct 9 14:45:41 2020 (r366574) +++ head/tools/tools/vimage/vimage.8 Fri Oct 9 15:14:19 2020 (r366575) @@ -65,20 +65,17 @@ and . .Ss Overview A virtual image or vimage is a jail with its own independent network -stack instance. Every process, socket and network interface present -in the system is always attached to one, and only one, virtual network -stack instance (vnet). -During system bootup sequence a default vnet -is created to which all the configured interfaces and user processes -are initially attached. -Assuming that enough system resources are -are available, a user with sufficient privileges can create and manage -a hierarchy of subordinated virtual images. +stack instance. +Every process, socket and network interface present in the system is always +attached to one, and only one, virtual network stack instance (vnet). +During system bootup sequence a default vnet is created to which all the configured +interfaces and user processes are initially attached. +Assuming that enough system resources are are available, a user with sufficient +privileges can create and manage a hierarchy of subordinated virtual images. The .Nm command allows for creation, deletion and monitoring of virtual images, -as well as for execution of arbitrary processes in a targeted virtual -image. +as well as for execution of arbitrary processes in a targeted virtual image. .Ss Invocation If invoked with no modifiers, the .Nm @@ -109,12 +106,13 @@ using the same syntax as with the -c form of the comma Delete the virtual image .Ar vname . No processes and/or sockets should exist in the target virtual image -in order for the delete request to succeed. Non-loopback interfaces -residing in the target virtual image will be reassigned to the virtual -image's parent. +in order for the delete request to succeed. +Non-loopback interfaces residing in the target virtual image +will be reassigned to the virtual image's parent. .It Fl l -List the properties and statistics for virtual images one level -below the current one in the hierarchy. If an optional argument +List the properties and statistics for virtual images one level below +the current one in the hierarchy. +If an optional argument .Ar vname is provided, only the information regarding the target virtual image .Ar vname @@ -183,11 +181,12 @@ command exits 0 on success, and >0 if an error occurs. .Xr jls 8 .Sh HISTORY Network stack virtualization framework first appeared as a patchset -against the FreeBSD 4.7 kernel in 2002, and was maintained outside -of the main FreeBSD tree. +against the +.Fx 4.7 +kernel in 2002, and was maintained outside of the main FreeBSD tree. As a result of a project sponsored by the FreeBSD Foundation and -Stiching NLNet, integrated virtualized network stack first appeared -in FreeBSD 8.0. +Stiching NLNet, integrated virtualized network stack first appeared in +.Fx 8.0 . .Sh AUTHORS .An Marko Zec Aq Mt zec@fer.hr .Sh BUGS From owner-svn-src-all@freebsd.org Fri Oct 9 15:19:30 2020 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 339633FD2B9; Fri, 9 Oct 2020 15:19:30 +0000 (UTC) (envelope-from markj@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7BZB0LYgz4W1x; Fri, 9 Oct 2020 15:19:30 +0000 (UTC) (envelope-from markj@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 DE9A01BA85; Fri, 9 Oct 2020 15:19:29 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099FJT15043609; Fri, 9 Oct 2020 15:19:29 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099FJTtR043608; Fri, 9 Oct 2020 15:19:29 GMT (envelope-from markj@FreeBSD.org) Message-Id: <202010091519.099FJTtR043608@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Fri, 9 Oct 2020 15:19:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366576 - head/usr.sbin/syslogd X-SVN-Group: head X-SVN-Commit-Author: markj X-SVN-Commit-Paths: head/usr.sbin/syslogd X-SVN-Commit-Revision: 366576 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.33 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: Fri, 09 Oct 2020 15:19:30 -0000 Author: markj Date: Fri Oct 9 15:19:29 2020 New Revision: 366576 URL: https://svnweb.freebsd.org/changeset/base/366576 Log: syslogd: Avoid trimming host names in RFC 5424 mode RFC 5424 says that implementations should log hostnames in FQDN format. Only trim host names in RFC 3164 mode. PR: 250014 Submitted by: Dmitry Wagin MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D26644 Modified: head/usr.sbin/syslogd/syslogd.c Modified: head/usr.sbin/syslogd/syslogd.c ============================================================================== --- head/usr.sbin/syslogd/syslogd.c Fri Oct 9 15:14:19 2020 (r366575) +++ head/usr.sbin/syslogd/syslogd.c Fri Oct 9 15:19:29 2020 (r366576) @@ -2300,7 +2300,9 @@ cvthname(struct sockaddr *f) hl = strlen(hname); if (hl > 0 && hname[hl-1] == '.') hname[--hl] = '\0'; - trimdomain(hname, hl); + /* RFC 5424 prefers logging FQDNs. */ + if (RFC3164OutputFormat) + trimdomain(hname, hl); return (hname); } @@ -2927,7 +2929,9 @@ cfline(const char *line, const char *prog, const char hl = strlen(f->f_host); if (hl > 0 && f->f_host[hl-1] == '.') f->f_host[--hl] = '\0'; - trimdomain(f->f_host, hl); + /* RFC 5424 prefers logging FQDNs. */ + if (RFC3164OutputFormat) + trimdomain(f->f_host, hl); } /* save program name if any */ From owner-svn-src-all@freebsd.org Fri Oct 9 15:27:40 2020 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 31CA83FD2DA; Fri, 9 Oct 2020 15:27:40 +0000 (UTC) (envelope-from markj@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7Blc0JQNz4W9b; Fri, 9 Oct 2020 15:27:40 +0000 (UTC) (envelope-from markj@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 DD2A81BAA3; Fri, 9 Oct 2020 15:27:39 +0000 (UTC) (envelope-from markj@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099FRdhj049513; Fri, 9 Oct 2020 15:27:39 GMT (envelope-from markj@FreeBSD.org) Received: (from markj@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099FRcVh049505; Fri, 9 Oct 2020 15:27:38 GMT (envelope-from markj@FreeBSD.org) Message-Id: <202010091527.099FRcVh049505@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: markj set sender to markj@FreeBSD.org using -f From: Mark Johnston Date: Fri, 9 Oct 2020 15:27:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366577 - in head/usr.bin/col: . tests X-SVN-Group: head X-SVN-Commit-Author: markj X-SVN-Commit-Paths: in head/usr.bin/col: . tests X-SVN-Commit-Revision: 366577 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.33 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: Fri, 09 Oct 2020 15:27:40 -0000 Author: markj Date: Fri Oct 9 15:27:37 2020 New Revision: 366577 URL: https://svnweb.freebsd.org/changeset/base/366577 Log: col(1): Fix a couple of bugs - When flushing extra lines after all input has been processed, make sure that local state is reinitialized correctly. - When -f is specified, make sure to end output with a full newline. - Fix some style issues and update comments. - Add some regression tests. PR: 249308 Submitted by: Yang Zhong MFC after: 3 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26536 Added: head/usr.bin/col/tests/hlf.in (contents, props changed) head/usr.bin/col/tests/hlf2.in (contents, props changed) head/usr.bin/col/tests/nl.in (contents, props changed) head/usr.bin/col/tests/nl2.in (contents, props changed) head/usr.bin/col/tests/nl3.in (contents, props changed) head/usr.bin/col/tests/rlf3.in (contents, props changed) Modified: head/usr.bin/col/col.c head/usr.bin/col/tests/Makefile head/usr.bin/col/tests/col_test.sh (contents, props changed) Modified: head/usr.bin/col/col.c ============================================================================== --- head/usr.bin/col/col.c Fri Oct 9 15:19:29 2020 (r366576) +++ head/usr.bin/col/col.c Fri Oct 9 15:27:37 2020 (r366577) @@ -100,7 +100,7 @@ struct line_str { }; static void addto_lineno(int *, int); -static LINE *alloc_line(void); +static LINE *alloc_line(void); static void dowarn(int); static void flush_line(LINE *); static void flush_lines(int); @@ -109,7 +109,7 @@ static void free_line(LINE *); static void usage(void); static CSET last_set; /* char_set of last char printed */ -static LINE *lines; +static LINE *lines; static int compress_spaces; /* if doing space -> tab conversion */ static int fine; /* if `fine' resolution (half lines) */ static int max_bufd_lines; /* max # of half lines to keep in memory */ @@ -340,8 +340,16 @@ main(int argc, char **argv) } if (ferror(stdin)) err(1, NULL); - if (extra_lines) + if (extra_lines) { + /* + * Extra lines only exist if no lines have been flushed + * yet. This means that 'lines' must point to line zero + * after we flush the extra lines. + */ flush_lines(extra_lines); + l = lines; + this_line = 0; + } /* goto the last line that had a character on it */ for (; l->l_next; l = l->l_next) @@ -353,14 +361,22 @@ main(int argc, char **argv) PUTC(SI); /* flush out the last few blank lines */ - if (max_line > this_line) - nblank_lines = max_line - this_line; - if (max_line & 1) - nblank_lines++; + if (max_line >= this_line) + nblank_lines = max_line - this_line + (max_line & 1); + if (nblank_lines == 0) + /* end with a newline even if the source doesn't */ + nblank_lines = 2; flush_blanks(); exit(0); } +/* + * Prints the first 'nflush' lines. Printed lines are freed. + * After this function returns, 'lines' points to the first + * of the remaining lines, and 'nblank_lines' will have the + * number of half line feeds between the final flushed line + * and the first remaining line. + */ static void flush_lines(int nflush) { @@ -372,11 +388,10 @@ flush_lines(int nflush) if (l->l_line) { flush_blanks(); flush_line(l); + free(l->l_line); } - if (l->l_line || l->l_next) + if (l->l_next) nblank_lines++; - if (l->l_line) - (void)free(l->l_line); free_line(l); } if (lines) @@ -384,9 +399,8 @@ flush_lines(int nflush) } /* - * Print a number of newline/half newlines. If fine flag is set, nblank_lines - * is the number of half line feeds, otherwise it is the number of whole line - * feeds. + * Print a number of newline/half newlines. + * nblank_lines is the number of half line feeds. */ static void flush_blanks(void) Modified: head/usr.bin/col/tests/Makefile ============================================================================== --- head/usr.bin/col/tests/Makefile Fri Oct 9 15:19:29 2020 (r366576) +++ head/usr.bin/col/tests/Makefile Fri Oct 9 15:27:37 2020 (r366577) @@ -4,8 +4,14 @@ PACKAGE= tests ATF_TESTS_SH= col_test -${PACKAGE}FILES+= \ +${PACKAGE}FILES+= \ + hlf.in \ + hlf2.in \ + nl.in \ + nl2.in \ + nl3.in \ rlf.in \ - rlf2.in + rlf2.in \ + rlf3.in .include Modified: head/usr.bin/col/tests/col_test.sh ============================================================================== --- head/usr.bin/col/tests/col_test.sh Fri Oct 9 15:19:29 2020 (r366576) +++ head/usr.bin/col/tests/col_test.sh Fri Oct 9 15:27:37 2020 (r366577) @@ -1,5 +1,44 @@ # $FreeBSD$ +atf_test_case nl + +nl_head() +{ + atf_set "descr" "testing just newlines" +} +nl_body() +{ + atf_check \ + -o inline:"a\nb\n" \ + -e empty \ + -s exit:0 \ + col < $(atf_get_srcdir)/nl.in + + atf_check \ + -o inline:"a\nb\n" \ + -e empty \ + -s exit:0 \ + col -f < $(atf_get_srcdir)/nl.in + + atf_check \ + -o inline:"a\nb\n" \ + -e empty \ + -s exit:0 \ + col < $(atf_get_srcdir)/nl2.in + + atf_check \ + -o inline:"a\nb\n" \ + -e empty \ + -s exit:0 \ + col -f < $(atf_get_srcdir)/nl2.in + + atf_check \ + -o inline:"a\n\nb\n\n" \ + -e empty \ + -s exit:0 \ + col < $(atf_get_srcdir)/nl3.in +} + atf_test_case rlf rlf_head() @@ -25,9 +64,50 @@ rlf_body() -e empty \ -s exit:0 \ col -x < $(atf_get_srcdir)/rlf2.in + + atf_check \ + -o inline:" b\na\n" \ + -e empty \ + -s exit:0 \ + col < $(atf_get_srcdir)/rlf3.in } +atf_test_case hlf + +hlf_head() +{ + atf_set "descr" "testing half line feed" +} +hlf_body() +{ + atf_check \ + -o inline:"a f\naf\n" \ + -e empty \ + -s exit:0 \ + col < $(atf_get_srcdir)/hlf.in + + atf_check \ + -o inline:"a f9 f9 a\n" \ + -e empty \ + -s exit:0 \ + col -f < $(atf_get_srcdir)/hlf.in + + atf_check \ + -o inline:"a\n f\n" \ + -e empty \ + -s exit:0 \ + col < $(atf_get_srcdir)/hlf2.in + + atf_check \ + -o inline:"a9 f\n9" \ + -e empty \ + -s exit:0 \ + col -f < $(atf_get_srcdir)/hlf2.in +} + atf_init_test_cases() { + atf_add_test_case nl atf_add_test_case rlf + atf_add_test_case hlf } Added: head/usr.bin/col/tests/hlf.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/col/tests/hlf.in Fri Oct 9 15:27:37 2020 (r366577) @@ -0,0 +1,2 @@ +a +a8f8f Added: head/usr.bin/col/tests/hlf2.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/col/tests/hlf2.in Fri Oct 9 15:27:37 2020 (r366577) @@ -0,0 +1 @@ +a9f Added: head/usr.bin/col/tests/nl.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/col/tests/nl.in Fri Oct 9 15:27:37 2020 (r366577) @@ -0,0 +1,2 @@ +a +b Added: head/usr.bin/col/tests/nl2.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/col/tests/nl2.in Fri Oct 9 15:27:37 2020 (r366577) @@ -0,0 +1,2 @@ +a +b \ No newline at end of file Added: head/usr.bin/col/tests/nl3.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/col/tests/nl3.in Fri Oct 9 15:27:37 2020 (r366577) @@ -0,0 +1,4 @@ +a + +b + Added: head/usr.bin/col/tests/rlf3.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/col/tests/rlf3.in Fri Oct 9 15:27:37 2020 (r366577) @@ -0,0 +1 @@ +a b From owner-svn-src-all@freebsd.org Fri Oct 9 15:29:06 2020 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 9122E3FD42E; Fri, 9 Oct 2020 15:29:06 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7BnG3Ggkz4WmS; Fri, 9 Oct 2020 15:29:06 +0000 (UTC) (envelope-from imp@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 539641B74A; Fri, 9 Oct 2020 15:29:06 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099FT6eR049636; Fri, 9 Oct 2020 15:29:06 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099FT6Ab049635; Fri, 9 Oct 2020 15:29:06 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010091529.099FT6Ab049635@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 15:29:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366578 - head/sbin/devd X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/sbin/devd X-SVN-Commit-Revision: 366578 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.33 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: Fri, 09 Oct 2020 15:29:06 -0000 Author: imp Date: Fri Oct 9 15:29:05 2020 New Revision: 366578 URL: https://svnweb.freebsd.org/changeset/base/366578 Log: Avoid using single quotes in arguments to logger. Single quotes interfere with the workaround put in with r335753 and aren't necessary in this case. I believe that all the underling issues with r335753 have been corrected, but need to do more extensive followup before reverting it as a bad idea. PR: 240411 MFC After: 2 days (to give it time to get into 12.2) Modified: head/sbin/devd/zfs.conf Modified: head/sbin/devd/zfs.conf ============================================================================== --- head/sbin/devd/zfs.conf Fri Oct 9 15:27:37 2020 (r366577) +++ head/sbin/devd/zfs.conf Fri Oct 9 15:29:05 2020 (r366578) @@ -5,73 +5,73 @@ notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.checksum"; - action "logger -p local7.warn -t ZFS 'checksum mismatch, zpool=$pool path=$vdev_path offset=$zio_offset size=$zio_size'"; + action "logger -p local7.warn -t ZFS checksum mismatch, zpool=$pool path=$vdev_path offset=$zio_offset size=$zio_size"; }; notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.io"; - action "logger -p local7.warn -t ZFS 'vdev I/O failure, zpool=$pool path=$vdev_path offset=$zio_offset size=$zio_size error=$zio_err'"; + action "logger -p local7.warn -t ZFS vdev I/O failure, zpool=$pool path=$vdev_path offset=$zio_offset size=$zio_size error=$zio_err"; }; notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.data"; - action "logger -p local7.warn -t ZFS 'pool I/O failure, zpool=$pool error=$zio_err'"; + action "logger -p local7.warn -t ZFS pool I/O failure, zpool=$pool error=$zio_err"; }; notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.zpool"; - action "logger -p local7.err -t ZFS 'failed to load zpool $pool'"; + action "logger -p local7.err -t ZFS failed to load zpool $pool"; }; notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.vdev\..*"; - action "logger -p local7.err -t ZFS 'vdev problem, zpool=$pool path=$vdev_path type=$type'"; + action "logger -p local7.err -t ZFS vdev problem, zpool=$pool path=$vdev_path type=$type"; }; notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.io_failure"; - action "logger -p local7.alert -t ZFS 'catastrophic pool I/O failure, zpool=$pool'"; + action "logger -p local7.alert -t ZFS catastrophic pool I/O failure, zpool=$pool"; }; notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.probe_failure"; - action "logger -p local7.err -t ZFS 'vdev probe failure, zpool=$pool path=$vdev_path'"; + action "logger -p local7.err -t ZFS vdev probe failure, zpool=$pool path=$vdev_path"; }; notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.log_replay"; - action "logger -p local7.err -t ZFS 'pool log replay failure, zpool=$pool'"; + action "logger -p local7.err -t ZFS pool log replay failure, zpool=$pool"; }; notify 10 { match "system" "ZFS"; match "type" "ereport.fs.zfs.config_cache_write"; - action "logger -p local7.warn -t ZFS 'failed to write zpool.cache, zpool=$pool'"; + action "logger -p local7.warn -t ZFS failed to write zpool.cache, zpool=$pool"; }; notify 10 { match "system" "ZFS"; match "type" "resource.fs.zfs.removed"; - action "logger -p local7.notice -t ZFS 'vdev is removed, pool_guid=$pool_guid vdev_guid=$vdev_guid'"; + action "logger -p local7.notice -t ZFS vdev is removed, pool_guid=$pool_guid vdev_guid=$vdev_guid"; }; notify 10 { match "system" "ZFS"; match "type" "resource.fs.zfs.autoreplace"; - action "logger -p local7.info -t ZFS 'autoreplace is configured for vdev, pool_guid=$pool_guid vdev_guid=$vdev_guid'"; + action "logger -p local7.info -t ZFS autoreplace is configured for vdev, pool_guid=$pool_guid vdev_guid=$vdev_guid"; }; notify 10 { match "system" "ZFS"; match "type" "resource.fs.zfs.statechange"; - action "logger -p local7.notice -t ZFS 'vdev state changed, pool_guid=$pool_guid vdev_guid=$vdev_guid'"; + action "logger -p local7.notice -t ZFS vdev state changed, pool_guid=$pool_guid vdev_guid=$vdev_guid"; }; From owner-svn-src-all@freebsd.org Fri Oct 9 15:45:35 2020 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 0A5303FDC48; Fri, 9 Oct 2020 15:45:35 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7C8G6V7Hz4XpG; Fri, 9 Oct 2020 15:45:34 +0000 (UTC) (envelope-from imp@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 C29001BCC6; Fri, 9 Oct 2020 15:45:34 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099FjYS4062102; Fri, 9 Oct 2020 15:45:34 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099FjY2F062101; Fri, 9 Oct 2020 15:45:34 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010091545.099FjY2F062101@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 15:45:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366579 - head/sbin/devd X-SVN-Group: head X-SVN-Commit-Author: imp X-SVN-Commit-Paths: head/sbin/devd X-SVN-Commit-Revision: 366579 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.33 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: Fri, 09 Oct 2020 15:45:35 -0000 Author: imp Date: Fri Oct 9 15:45:34 2020 New Revision: 366579 URL: https://svnweb.freebsd.org/changeset/base/366579 Log: Remove gratuitous use of '' around arguments There's no need to use ' here, so remove it. This use causes no problems, but is a bad example. Modified: head/sbin/devd/devd.conf Modified: head/sbin/devd/devd.conf ============================================================================== --- head/sbin/devd/devd.conf Fri Oct 9 15:29:05 2020 (r366578) +++ head/sbin/devd/devd.conf Fri Oct 9 15:45:34 2020 (r366579) @@ -229,7 +229,7 @@ notify 10 { match "system" "ACPI"; match "subsystem" "Thermal"; match "notify" "0xcc"; - action "logger -p kern.emerg 'WARNING: system temperature too high, shutting down soon!'"; + action "logger -p kern.emerg WARNING: system temperature too high, shutting down soon!"; }; # User requested suspend, so perform preparation steps and then execute From owner-svn-src-all@freebsd.org Fri Oct 9 15:50:51 2020 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 1695D3FDEA8; Fri, 9 Oct 2020 15:50:51 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7CGL6sSKz4Xf1; Fri, 9 Oct 2020 15:50:50 +0000 (UTC) (envelope-from gbe@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 B57271BCC9; Fri, 9 Oct 2020 15:50:50 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099Foo39063004; Fri, 9 Oct 2020 15:50:50 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099FooNU062998; Fri, 9 Oct 2020 15:50:50 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010091550.099FooNU062998@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Fri, 9 Oct 2020 15:50:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366580 - head/share/man/man4 X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/share/man/man4 X-SVN-Commit-Revision: 366580 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.33 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: Fri, 09 Oct 2020 15:50:51 -0000 Author: gbe (doc committer) Date: Fri Oct 9 15:50:50 2020 New Revision: 366580 URL: https://svnweb.freebsd.org/changeset/base/366580 Log: bpf(4): Update the man page to reflect reality PR: 131918 Submitted by: guy at alum dot mit dot edu Reviewed by: gnn, gbe Approved by: gnn MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D25993 Modified: head/share/man/man4/bpf.4 Modified: head/share/man/man4/bpf.4 ============================================================================== --- head/share/man/man4/bpf.4 Fri Oct 9 15:45:34 2020 (r366579) +++ head/share/man/man4/bpf.4 Fri Oct 9 15:50:50 2020 (r366580) @@ -49,7 +49,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 21, 2016 +.Dd October 9, 2020 .Dt BPF 4 .Os .Sh NAME @@ -73,12 +73,6 @@ ioctl. A given interface can be shared by multiple listeners, and the filter underlying each descriptor will see an identical packet stream. .Pp -A separate device file is required for each minor device. -If a file is in use, the open will fail and -.Va errno -will be set to -.Er EBUSY . -.Pp Associated with each open instance of a .Nm file is a user-settable packet filter. @@ -86,19 +80,6 @@ Whenever a packet is received by an interface, all file descriptors listening on that interface apply their filter. Each descriptor that accepts the packet receives its own copy. .Pp -The packet filter will support any link level protocol that has fixed length -headers. -Currently, only Ethernet, -.Tn SLIP , -and -.Tn PPP -drivers have been modified to interact with -.Nm . -.Pp -Since packet data is in network byte order, applications should use the -.Xr byteorder 3 -macros to extract multi-byte values. -.Pp A packet can be sent out on the network by writing to a .Nm file descriptor. @@ -313,7 +294,7 @@ with If the requested buffer size cannot be accommodated, the closest allowable size will be set and returned in the argument. A read call will result in -.Er EIO +.Er EINVAL if it is passed a buffer that is not this size. .It Dv BIOCGDLT .Pq Li u_int @@ -324,6 +305,43 @@ The device types, prefixed with .Dq Li DLT_ , are defined in .In net/bpf.h . +.It Dv BIOCGDLTLIST +.Pq Li "struct bpf_dltlist" +Returns an array of the available types of the data link layer +underlying the attached interface: +.Bd -literal -offset indent +struct bpf_dltlist { + u_int bfl_len; + u_int *bfl_list; +}; +.Ed +.Pp +The available types are returned in the array pointed to by the +.Va bfl_list +field while their length in u_int is supplied to the +.Va bfl_len +field. +.Er ENOMEM +is returned if there is not enough buffer space and +.Er EFAULT +is returned if a bad address is encountered. +The +.Va bfl_len +field is modified on return to indicate the actual length in u_int +of the array returned. +If +.Va bfl_list +is +.Dv NULL , +the +.Va bfl_len +field is set to indicate the required length of an array in u_int. +.It Dv BIOCSDLT +.Pq Li u_int +Changes the type of the data link layer underlying the attached interface. +.Er EINVAL +is returned if no interface has been specified or the specified +type is not available for the interface. .It Dv BIOCPROMISC Forces the interface into promiscuous mode. All packets, not just those destined for the local host, are processed. @@ -331,6 +349,9 @@ Since more than one file can be listening on a given i a listener that opened its interface non-promiscuously may receive packets promiscuously. This problem can be remedied with an appropriate filter. +.Pp +The interface remains in promiscuous mode until all files listening +promiscuously are closed. .It Dv BIOCFLUSH Flushes the buffer of incoming packets, and resets the statistics that are returned by BIOCGSTATS. @@ -344,7 +365,7 @@ structure. All other fields are undefined. .It Dv BIOCSETIF .Pq Li "struct ifreq" -Sets the hardware interface associate with the file. +Sets the hardware interface associated with the file. This command must be performed before any packets can be read. The device is indicated by name using the @@ -357,7 +378,7 @@ Additionally, performs the actions of .It Dv BIOCSRTIMEOUT .It Dv BIOCGRTIMEOUT .Pq Li "struct timeval" -Set or get the read timeout parameter. +Sets or gets the read timeout parameter. The argument specifies the length of time to wait before timing out on a read request. @@ -387,7 +408,7 @@ kernel because of buffer overflows .El .It Dv BIOCIMMEDIATE .Pq Li u_int -Enable or disable +Enables or disables .Dq immediate mode , based on the truth value of the argument. When immediate mode is enabled, reads return immediately upon packet @@ -407,7 +428,7 @@ An array of instructions and its length is passed in u the following structure: .Bd -literal struct bpf_program { - int bf_len; + u_int bf_len; struct bpf_insn *bf_insns; }; .Ed @@ -469,10 +490,18 @@ An incompatible filter may result in undefined behavior (most likely, an error returned by .Fn ioctl or haphazard packet matching). +.It Dv BIOCGRSIG +.It Dv BIOCSRSIG +.Pq Li u_int +Sets or gets the receive signal. +This signal will be sent to the process or process group specified by +.Dv FIOSETOWN . +It defaults to +.Dv SIGIO . .It Dv BIOCSHDRCMPLT .It Dv BIOCGHDRCMPLT .Pq Li u_int -Set or get the status of the +Sets or gets the status of the .Dq header complete flag. Set to zero if the link level source address should be filled in automatically @@ -489,7 +518,7 @@ Use and .Dv BIOCGDIRECTION instead. -Set or get the flag determining whether locally generated packets on the +Sets or gets the flag determining whether locally generated packets on the interface should be returned by BPF. Set to zero to see only incoming packets on the interface. Set to one to see packets originating locally and remotely on the interface. @@ -497,7 +526,7 @@ This flag is initialized to one by default. .It Dv BIOCSDIRECTION .It Dv BIOCGDIRECTION .Pq Li u_int -Set or get the setting determining whether incoming, outgoing, or all packets +Sets or gets the setting determining whether incoming, outgoing, or all packets on the interface should be returned by BPF. Set to .Dv BPF_D_IN @@ -631,6 +660,57 @@ therefore ownership is not assigned, the user process against .Vt bzh_user_gen . .El +.Sh STANDARD IOCTLS +.Nm +now supports several standard +.Xr ioctl 2 Ns 's +which allow the user to do async and/or non-blocking I/O to an open +.I bpf +file descriptor. +.Bl -tag -width SIOCGIFADDR +.It Dv FIONREAD +.Pq Li int +Returns the number of bytes that are immediately available for reading. +.It Dv SIOCGIFADDR +.Pq Li "struct ifreq" +Returns the address associated with the interface. +.It Dv FIONBIO +.Pq Li int +Sets or clears non-blocking I/O. +If arg is non-zero, then doing a +.Xr read 2 +when no data is available will return -1 and +.Va errno +will be set to +.Er EAGAIN . +If arg is zero, non-blocking I/O is disabled. +Note: setting this overrides the timeout set by +.Dv BIOCSRTIMEOUT . +.It Dv FIOASYNC +.Pq Li int +Enables or disables async I/O. +When enabled (arg is non-zero), the process or process group specified by +.Dv FIOSETOWN +will start receiving +.Dv SIGIO 's +when packets arrive. +Note that you must do an +.Dv FIOSETOWN +in order for this to take affect, +as the system will not default this for you. +The signal may be changed via +.Dv BIOCSRSIG . +.It Dv FIOSETOWN +.It Dv FIOGETOWN +.Pq Li int +Sets or gets the process or process group (if negative) that should +receive +.Dv SIGIO +when packets are available. +The signal may be changed using +.Dv BIOCSRSIG +(see above). +.El .Sh BPF HEADER One of the following structures is prepended to each packet returned by .Xr read 2 @@ -750,10 +830,10 @@ and implicit program counter. The following structure defines the instruction format: .Bd -literal struct bpf_insn { - u_short code; - u_char jt; - u_char jf; - u_long k; + u_short code; + u_char jt; + u_char jf; + bpf_u_int32 k; }; .Ed .Pp @@ -964,7 +1044,7 @@ variables controls the behaviour of the .Nm subsystem .Bl -tag -width indent -.It Va net.bpf.optimize_writers: No 0 +.It Va net.bpf.optimize_writers : No 0 Various programs use BPF to send (but not receive) raw packets (cdpd, lldpd, dhcpd, dhcp relays, etc. are good examples of such programs). They do not need incoming packets to be send to them. @@ -973,20 +1053,20 @@ makes new BPF users to be attached to write-only inter explicitly specifies read filter via .Fn pcap_set_filter . This removes any performance degradation for high-speed interfaces. -.It Va net.bpf.stats: +.It Va net.bpf.stats : Binary interface for retrieving general statistics. -.It Va net.bpf.zerocopy_enable: No 0 +.It Va net.bpf.zerocopy_enable : No 0 Permits zero-copy to be used with net BPF readers. Use with caution. -.It Va net.bpf.maxinsns: No 512 +.It Va net.bpf.maxinsns : No 512 Maximum number of instructions that BPF program can contain. Use .Xr tcpdump 1 .Fl d option to determine approximate number of instruction for any filter. -.It Va net.bpf.maxbufsize: No 524288 +.It Va net.bpf.maxbufsize : No 524288 Maximum buffer size to allocate for packets buffer. -.It Va net.bpf.bufsize: No 4096 +.It Va net.bpf.bufsize : No 4096 Default buffer size to allocate for packets buffer. .El .Sh EXAMPLES @@ -1052,7 +1132,6 @@ struct bpf_insn insns[] = { .Xr kqueue 2 , .Xr poll 2 , .Xr select 2 , -.Xr byteorder 3 , .Xr ng_bpf 4 , .Xr bpf 9 .Rs @@ -1100,8 +1179,6 @@ This could be fixed in the kernel with additional proc However, we favor the model where all files must assume that the interface is promiscuous, and if so desired, must utilize a filter to reject foreign packets. -.Pp -Data link protocols with variable length headers are not currently supported. .Pp The .Dv SEESENT , From owner-svn-src-all@freebsd.org Fri Oct 9 16:19:12 2020 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 EE0C73FDF44; Fri, 9 Oct 2020 16:19:12 +0000 (UTC) (envelope-from garga.bsd@gmail.com) Received: from mail-qk1-x742.google.com (mail-qk1-x742.google.com [IPv6:2607:f8b0:4864:20::742]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7Cv41BY6z4Z93; Fri, 9 Oct 2020 16:19:11 +0000 (UTC) (envelope-from garga.bsd@gmail.com) Received: by mail-qk1-x742.google.com with SMTP id w12so11135871qki.6; Fri, 09 Oct 2020 09:19:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=eZ4Zb6YkjaSjgBE3z+bh6aa9Kz7SvAogIr4EzUjXJAI=; b=J6ZOHW9/svdeV412msjzSoXYuqUtzyguiBZ5Hi/D9U9olFY95fvGgjyAVxKGjOhIe2 y6ZDCP8dnZUoF+TOjvBy7FXjLb1wsa2FAFpl/c9w6HoD7pgejxM8Fg4taFd+MhjGFSjo NMJ5/K5ev7VukaItOyFABVCsviMaKbbO91gMcU+AS9yEbjY7eQsF0LSXIxAtKP4Dok15 NlMZgg9CAkHb3TJro/MDMY/o63bG4gVtW2uw/JbeP9RiCj8tV+G+10XJuS7wJmVQneiq ZmycZaGlp/Km0Z28/V2Kngmbuu3HgG+UyRawwBU6LCvGBCoY3AqlXnGqGq/m5wQvccGa fHRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=eZ4Zb6YkjaSjgBE3z+bh6aa9Kz7SvAogIr4EzUjXJAI=; b=N8OUGsl5ZTZIclWyIensmyyQZA8Kto39kCz6iqPPrcM9K9mpe8QZClsCERVGPOzVJ1 YZlvVq3BFxqDmRfarfV5+1dBKswjh2Jn1uG2XfW2N5iDpTmv19sgcxz6aIdWF6Fb9M6V 7BzFyESsbLt4Zo1aAe9H39gOvmI42RHNijCeqkhdgS1PCro0aHLuBEZjY+dCK/Ve0aKs wqjQcqFmQppBXip9q482Hp+WdPvCN30AbwscX9BVqcpkO0vp/7c7OOkbpifejqUrl7zY Gn6mNbERe9A7GQ/6pVYd/gvmnwBZKATOWQhCOSQpCdvGk+lVS7hEq3xIF3KZMbCiOrQj inYg== X-Gm-Message-State: AOAM533Zf8xxjnJvvcnlMYyf0d6s9Vkbm3XbOr9r3I+heAX8JieVfLjU 0vWlQb5xQyytAohQgobaXK+ofO61a+M= X-Google-Smtp-Source: ABdhPJwZT7eAzk/3e8laLlvv3QHkIbn2ZMLzy/GoT4HUZBKBsZuZhkfcyKsy8APRWc1uQrjTYFU9ew== X-Received: by 2002:a05:620a:1275:: with SMTP id b21mr13306273qkl.135.1602260350775; Fri, 09 Oct 2020 09:19:10 -0700 (PDT) Received: from mbp.home (200-12-5-188.rev.tribenet.com.br. [200.12.5.188]) by smtp.gmail.com with ESMTPSA id k4sm1251013qkj.46.2020.10.09.09.19.08 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 09 Oct 2020 09:19:09 -0700 (PDT) Sender: Renato Botelho Subject: Re: svn commit: r366578 - head/sbin/devd To: Warner Losh , src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org References: <202010091529.099FT6Ab049635@repo.freebsd.org> From: Renato Botelho Message-ID: Date: Fri, 9 Oct 2020 13:19:06 -0300 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.3.2 MIME-Version: 1.0 In-Reply-To: <202010091529.099FT6Ab049635@repo.freebsd.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 4C7Cv41BY6z4Z93 X-Spamd-Bar: --- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=J6ZOHW9/; dmarc=none; spf=pass (mx1.freebsd.org: domain of gargabsd@gmail.com designates 2607:f8b0:4864:20::742 as permitted sender) smtp.mailfrom=gargabsd@gmail.com X-Spamd-Result: default: False [-3.06 / 15.00]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20161025]; RCVD_TLS_ALL(0.00)[]; FROM_HAS_DN(0.00)[]; RCPT_COUNT_THREE(0.00)[4]; R_SPF_ALLOW(-0.20)[+ip6:2607:f8b0:4000::/36:c]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MIME_GOOD(-0.10)[text/plain]; DMARC_NA(0.00)[FreeBSD.org]; NEURAL_HAM_LONG(-0.97)[-0.968]; TO_DN_SOME(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_COUNT_THREE(0.00)[3]; NEURAL_HAM_MEDIUM(-0.99)[-0.993]; DKIM_TRACE(0.00)[gmail.com:+]; NEURAL_HAM_SHORT(-0.90)[-0.896]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::742:from]; FORGED_SENDER(0.30)[garga@FreeBSD.org,gargabsd@gmail.com]; MIME_TRACE(0.00)[0:+]; FREEMAIL_ENVFROM(0.00)[gmail.com]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; TAGGED_FROM(0.00)[]; FROM_NEQ_ENVFROM(0.00)[garga@FreeBSD.org,gargabsd@gmail.com]; MAILMAN_DEST(0.00)[svn-src-head,svn-src-all] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Fri, 09 Oct 2020 16:19:13 -0000 On 09/10/20 12:29, Warner Losh wrote: > Author: imp > Date: Fri Oct 9 15:29:05 2020 > New Revision: 366578 > URL: https://svnweb.freebsd.org/changeset/base/366578 > > Log: > Avoid using single quotes in arguments to logger. > > Single quotes interfere with the workaround put in with r335753 and > aren't necessary in this case. I believe that all the underling issues > with r335753 have been corrected, but need to do more extensive > followup before reverting it as a bad idea. Hi Warner, How to proceed if it's needed to pass multiple parameters to a command in following format? cmd param1 'param2 has spaces and a $variable' -- Renato Botelho From owner-svn-src-all@freebsd.org Fri Oct 9 16:58:01 2020 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 81B973FECF7 for ; Fri, 9 Oct 2020 16:58:01 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: from mail-qv1-xf2c.google.com (mail-qv1-xf2c.google.com [IPv6:2607:f8b0:4864:20::f2c]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7Dlr3yRMz4bYw for ; Fri, 9 Oct 2020 16:58:00 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: by mail-qv1-xf2c.google.com with SMTP id s17so5063481qvr.11 for ; Fri, 09 Oct 2020 09:58:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=bFzenl8q6mRh1QA1QrALHI2ofIATACNohrXdRR91tKI=; b=ADO3TObjm+WNgZZSqsuOoOczQLqnnZyJlDgtVCZZ51e6VgTUbqpG0Zl1PYdCnhIZ+6 DwPc/M+lClBGkXTv+e+BKrrFBq5u/jX9vkNaLTPUx8wZxijrNPfib/nqCg/Hl4VmV1vF RkJYvjX8T+dLzJX9rQqDSCyzeN5aQh7zTJQ2R0ZF/9xzIt+e+dsIHqzxbGKbt9lnjvk1 nCDij1sVT+7E8VQ6JCIn1tm11PoAhVe5WVFMxwPthOSFmBD60l6Xu7HtlBImPQSb4kcC +G3ozr+2ZkZ1LhnVVHotvDLpmG27g04Yer0darFPhjk5TDduuA0CFueiXcTWVzGdKwjz nnDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=bFzenl8q6mRh1QA1QrALHI2ofIATACNohrXdRR91tKI=; b=nAkkWPxIejY+/KpEd78yD2v3sdy8bKvFnBeYj9Zc5ICcyDb7O1QU/aFxGiD85l4Mh2 6H+H1WyyuxYVchY/DRsyquld9uMaAko0dNphJaSAM5zD7Km7E61SbjQO0tecVcB4wh8m 78FJ9tZbDzhlwjt4nhRAruK7gABruFr8js5GO1B9MmUk1HbCknJF6YQrad1/eah/U0/x rCP2FeUYUncIGiRWDJ8fFdBKu2IcUPZWVwySQ2avCngk+y3knUTAowjY7SZ33cyPvS/h q+WIxuHYKmtmFAALFhasgLaoTapFOLbplODKGehAheoE+zIIiBM6yhmHGgg+M7VdvLVw loGQ== X-Gm-Message-State: AOAM530cJUimavllVk2gACSeNQTRLfAsM4uUM1jekPexV+Nn7N3sKqsG KYncS0RFEXnd089abPVQ89dLADncIz8tqJsul4Lbuw== X-Google-Smtp-Source: ABdhPJz/qqSj4EImb66toGfe5Z18UxwiRuK+T0uWpZTaJ3r1yElKjwv2XsqrXY2gVa/A0Bvezb07kUukebH3b/Cq920= X-Received: by 2002:ad4:544a:: with SMTP id h10mr14026153qvt.35.1602262679475; Fri, 09 Oct 2020 09:57:59 -0700 (PDT) MIME-Version: 1.0 References: <202010091529.099FT6Ab049635@repo.freebsd.org> In-Reply-To: From: Warner Losh Date: Fri, 9 Oct 2020 10:57:48 -0600 Message-ID: Subject: Re: svn commit: r366578 - head/sbin/devd To: Renato Botelho Cc: Warner Losh , src-committers , svn-src-all , svn-src-head X-Rspamd-Queue-Id: 4C7Dlr3yRMz4bYw X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=bsdimp-com.20150623.gappssmtp.com header.s=20150623 header.b=ADO3TObj; dmarc=none; spf=none (mx1.freebsd.org: domain of wlosh@bsdimp.com has no SPF policy when checking 2607:f8b0:4864:20::f2c) smtp.mailfrom=wlosh@bsdimp.com X-Spamd-Result: default: False [-2.28 / 15.00]; ARC_NA(0.00)[]; MAILMAN_DEST(0.00)[svn-src-all]; R_DKIM_ALLOW(-0.20)[bsdimp-com.20150623.gappssmtp.com:s=20150623]; NEURAL_HAM_MEDIUM(-0.96)[-0.960]; FROM_HAS_DN(0.00)[]; NEURAL_HAM_LONG(-0.99)[-0.987]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; PREVIOUSLY_DELIVERED(0.00)[svn-src-all@freebsd.org]; DMARC_NA(0.00)[bsdimp.com]; RCPT_COUNT_FIVE(0.00)[5]; TO_MATCH_ENVRCPT_SOME(0.00)[]; TO_DN_ALL(0.00)[]; DKIM_TRACE(0.00)[bsdimp-com.20150623.gappssmtp.com:+]; NEURAL_HAM_SHORT(-0.33)[-0.330]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::f2c:from]; R_SPF_NA(0.00)[no SPF record]; FORGED_SENDER(0.30)[imp@bsdimp.com,wlosh@bsdimp.com]; MIME_TRACE(0.00)[0:+,1:+,2:~]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; RCVD_TLS_ALL(0.00)[]; FROM_NEQ_ENVFROM(0.00)[imp@bsdimp.com,wlosh@bsdimp.com]; RCVD_COUNT_TWO(0.00)[2] Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.33 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Fri, 09 Oct 2020 16:58:01 -0000 On Fri, Oct 9, 2020 at 10:19 AM Renato Botelho wrote: > On 09/10/20 12:29, Warner Losh wrote: > > Author: imp > > Date: Fri Oct 9 15:29:05 2020 > > New Revision: 366578 > > URL: https://svnweb.freebsd.org/changeset/base/366578 > > > > Log: > > Avoid using single quotes in arguments to logger. > > > > Single quotes interfere with the workaround put in with r335753 and > > aren't necessary in this case. I believe that all the underling issues > > with r335753 have been corrected, but need to do more extensive > > followup before reverting it as a bad idea. > > Hi Warner, > > How to proceed if it's needed to pass multiple parameters to a command > in following format? > > cmd param1 'param2 has spaces and a $variable' > action "cmd param1 'param2 has spaces and a '$variable"; should do the trick. I'm documenting this now... Warner From owner-svn-src-all@freebsd.org Fri Oct 9 18:16:44 2020 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 AC95F4281B2; Fri, 9 Oct 2020 18:16:44 +0000 (UTC) (envelope-from garga.bsd@gmail.com) Received: from mail-qk1-x741.google.com (mail-qk1-x741.google.com [IPv6:2607:f8b0:4864:20::741]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7GVg5RYhz4fRD; Fri, 9 Oct 2020 18:16:43 +0000 (UTC) (envelope-from garga.bsd@gmail.com) Received: by mail-qk1-x741.google.com with SMTP id s7so11491728qkh.11; Fri, 09 Oct 2020 11:16:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=40i5Zjl1Dsky5Um6Z6CDbvnXpgGiZPs2ZSei7LjAcpU=; b=l4fzf4bqlJC7r+nFyMO/ca67SEC3RkzbybD4Qf5Qh3KUWxZcYlMaePOPDZ58yTUkpy f5EiBPNstr9+A+Gng74DR9DbfkY4lYeGZsNe4H+cJUZyZ02a7s94ravkXW+bmzfTOJiQ QZsi0RV2vPA6Zb7YcEa74aivjbuSgxZrmbDbGd4lLz77DblJ7Aj7Qyriu1oR1OoNkF9y loEM64wtQswjkLD1HigIzmAzd8uTqz5A86AW+yKmA2VcNKfa7qKw8N1swg/GEj3VdVGD zxfBs0bS9/Ozd2EbKQog27qlIWQBnMyDxiPrRxG38Artz3IYCdsFcpscRDmQ0feKqGoy YnbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:cc:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=40i5Zjl1Dsky5Um6Z6CDbvnXpgGiZPs2ZSei7LjAcpU=; b=Ft4e8w4r+HSvqA2yQnAk+Py3dKbW74DhakBM9ZaMK35nVkKrZ14BmFxmpKQ7YfVKJ5 WuaQyTSq0wlSsr8oNI4K6bCKNhNWnO3veyMqDIQlXn3nPWNNwkE3dt4BSCXCm84XM+Cf NNp0r9l5ae2KY+6fx982srN6oBZaOiSSFDuFFu8xo5aQDo/f+YOxSC6WdOgQt8gL6Ahi eXq9UoLhPGM7zY9YlXbD8vtluEMBP8ZiAE/FeYSXDJ8XUqRu2TbkKxZ3b58UA0KmAA32 ZqulG/kYr132krNDEwO4NDhWthAvfAvYgtS+SepA6QhCc8VgUxlQ5zh7cZFVV6ial/pA m+8w== X-Gm-Message-State: AOAM533f7o+KbOz7VeMXC5C78JziwWtpXgw3Cv/BCUshHcDKzRI6SiO9 i60mUO1UB3gpHfeWbRfL5+5nbAPEv9I= X-Google-Smtp-Source: ABdhPJzcxjb8goKwldQRrSbRSE7Qeo3XALxRNMxzL7MgSEJRyEFIoOaXrXtdCS8vhOYgEdjR6L3MPw== X-Received: by 2002:a05:620a:958:: with SMTP id w24mr15348180qkw.65.1602267402626; Fri, 09 Oct 2020 11:16:42 -0700 (PDT) Received: from mbp.home (200-12-5-188.rev.tribenet.com.br. [200.12.5.188]) by smtp.gmail.com with ESMTPSA id d12sm7025950qtb.9.2020.10.09.11.16.40 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 09 Oct 2020 11:16:41 -0700 (PDT) Sender: Renato Botelho Subject: Re: svn commit: r366578 - head/sbin/devd To: Warner Losh Cc: Warner Losh , src-committers , svn-src-all , svn-src-head References: <202010091529.099FT6Ab049635@repo.freebsd.org> From: Renato Botelho Message-ID: <2f49af1f-f0fb-f5f0-82bf-8b46ead027c1@FreeBSD.org> Date: Fri, 9 Oct 2020 15:16:38 -0300 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.3.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 4C7GVg5RYhz4fRD X-Spamd-Bar: --- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=l4fzf4bq; dmarc=none; spf=pass (mx1.freebsd.org: domain of gargabsd@gmail.com designates 2607:f8b0:4864:20::741 as permitted sender) smtp.mailfrom=gargabsd@gmail.com X-Spamd-Result: default: False [-3.02 / 15.00]; RCVD_TLS_ALL(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20161025]; MID_RHS_MATCH_FROM(0.00)[]; FROM_HAS_DN(0.00)[]; R_SPF_ALLOW(-0.20)[+ip6:2607:f8b0:4000::/36]; NEURAL_HAM_LONG(-1.00)[-1.003]; MIME_GOOD(-0.10)[text/plain]; DMARC_NA(0.00)[FreeBSD.org]; ARC_NA(0.00)[]; RCPT_COUNT_FIVE(0.00)[5]; RCVD_COUNT_THREE(0.00)[3]; TO_MATCH_ENVRCPT_SOME(0.00)[]; TO_DN_ALL(0.00)[]; DKIM_TRACE(0.00)[gmail.com:+]; NEURAL_HAM_SHORT(-0.80)[-0.796]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::741:from]; NEURAL_HAM_MEDIUM(-1.02)[-1.018]; FORGED_SENDER(0.30)[garga@FreeBSD.org,gargabsd@gmail.com]; MIME_TRACE(0.00)[0:+]; FREEMAIL_ENVFROM(0.00)[gmail.com]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; TAGGED_FROM(0.00)[]; FROM_NEQ_ENVFROM(0.00)[garga@FreeBSD.org,gargabsd@gmail.com]; MAILMAN_DEST(0.00)[svn-src-head,svn-src-all] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Fri, 09 Oct 2020 18:16:44 -0000 On 09/10/20 13:57, Warner Losh wrote: > > > On Fri, Oct 9, 2020 at 10:19 AM Renato Botelho > wrote: > > On 09/10/20 12:29, Warner Losh wrote: > > Author: imp > > Date: Fri Oct  9 15:29:05 2020 > > New Revision: 366578 > > URL: https://svnweb.freebsd.org/changeset/base/366578 > > > > > Log: > >    Avoid using single quotes in arguments to logger. > > > >    Single quotes interfere with the workaround put in with > r335753 and > >    aren't necessary in this case. I believe that all the > underling issues > >    with r335753 have been corrected, but need to do more extensive > >    followup before reverting it as a bad idea. > > Hi Warner, > > How to proceed if it's needed to pass multiple parameters to a command > in following format? > > cmd param1 'param2 has spaces and a $variable' > > > action "cmd param1 'param2 has spaces and a '$variable"; > > should do the trick. I'm documenting this now... It worked!! Thanks! From owner-svn-src-all@freebsd.org Fri Oct 9 18:20:51 2020 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 E905D4282CC; Fri, 9 Oct 2020 18:20:51 +0000 (UTC) (envelope-from garga.bsd@gmail.com) Received: from mail-qk1-x736.google.com (mail-qk1-x736.google.com [IPv6:2607:f8b0:4864:20::736]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7GbR2Q2fz4fyb; Fri, 9 Oct 2020 18:20:50 +0000 (UTC) (envelope-from garga.bsd@gmail.com) Received: by mail-qk1-x736.google.com with SMTP id v123so11529871qkd.9; Fri, 09 Oct 2020 11:20:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=8zdOJNgO7FqDolUaVZ3t7pdohdNRne2h8mcl06Luck8=; b=gCSZD0w8UifIvA1+X6tTscThFMKavHO16Vucy4fm2UlhNprx5gGY2AOdjhD8N+1/LN M5eVmAy9RGFNGO2kcx4j9XDNHGH4ycDaN6HggG/wszbah7OgpQy2l3n1ha5pUyUqhq2o YmWHwGikH5WxWTbwdBAUiC3okqTCWU/6U9LbTlbUDiPFpVqJRxHcUZC+E1b1849Stnuq rzTpibBpXV7SGvnan+Cwodh+e6oqcZoopp3FjZJ39cotoHvxuN2BPf4NjfUHwPMiu1l0 DXKwbvlWmIw5P5Vb/RJWPjLsXR/CIZHBNCr4nv0prD7m6EmyqFOVtxjalmI7PvdcDnkJ tepg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:from:to:cc:references:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=8zdOJNgO7FqDolUaVZ3t7pdohdNRne2h8mcl06Luck8=; b=hSCyXwJTMgB917UAh6nfQCZU9X1fv7jZPs3XISEQFI5Lfsx20Ded3vI78v30DcPhVm 462bZettG/3RdP5RfbH8CoyJ8uR7zp7FU66PNxvii6NSIzlaFfsm5oJ7wfKhPlGcGyvF 9ExV4Mvc9q99UK/yVrJqXUyldlq7qv7coqedYLU1Y2c7M9rbHd1WutNKCks0eOJGfBFV G1NpEOWjdsSm2y48QoLgt5PAW1jdmHHdR6GfYFL+gfZMIYPUOruca28BOXHm7yeCs2Py eQXivV2WKz5EQnO+c8zkfXPn61P50yxxkDpdXFfa1Dyqc/2wvCsseLOwvfJ/e20O+V+B WQ7A== X-Gm-Message-State: AOAM533c9c+yYraHOZ1GGt/Ob4i30sc/izaOcvUnwSbyqVThTn8X03if Qb2aK/sVYr2LUG65ZvxubRevZiEvcFM= X-Google-Smtp-Source: ABdhPJxTA69ntoKKbIZVkOVsTj1XYni2528uoEoOsEx2p30LL47/ve8ToWeuyyTVPy3m+cEokXTatw== X-Received: by 2002:a05:620a:142e:: with SMTP id k14mr9531795qkj.483.1602267650125; Fri, 09 Oct 2020 11:20:50 -0700 (PDT) Received: from mbp.home (200-12-5-188.rev.tribenet.com.br. [200.12.5.188]) by smtp.gmail.com with ESMTPSA id i19sm6426858qti.71.2020.10.09.11.20.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 09 Oct 2020 11:20:49 -0700 (PDT) Sender: Renato Botelho Subject: Re: svn commit: r366578 - head/sbin/devd From: Renato Botelho To: Warner Losh Cc: Warner Losh , src-committers , svn-src-all , svn-src-head References: <202010091529.099FT6Ab049635@repo.freebsd.org> <2f49af1f-f0fb-f5f0-82bf-8b46ead027c1@FreeBSD.org> Message-ID: <563930e3-19ec-44dd-fd6f-1d55859d9235@FreeBSD.org> Date: Fri, 9 Oct 2020 15:20:46 -0300 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.3.2 MIME-Version: 1.0 In-Reply-To: <2f49af1f-f0fb-f5f0-82bf-8b46ead027c1@FreeBSD.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 4C7GbR2Q2fz4fyb X-Spamd-Bar: --- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=gmail.com header.s=20161025 header.b=gCSZD0w8; dmarc=none; spf=pass (mx1.freebsd.org: domain of gargabsd@gmail.com designates 2607:f8b0:4864:20::736 as permitted sender) smtp.mailfrom=gargabsd@gmail.com X-Spamd-Result: default: False [-3.28 / 15.00]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20161025]; RCVD_TLS_ALL(0.00)[]; FROM_HAS_DN(0.00)[]; R_SPF_ALLOW(-0.20)[+ip6:2607:f8b0:4000::/36:c]; MID_RHS_MATCH_FROM(0.00)[]; MIME_GOOD(-0.10)[text/plain]; DMARC_NA(0.00)[FreeBSD.org]; NEURAL_HAM_LONG(-1.00)[-1.004]; RCPT_COUNT_FIVE(0.00)[5]; RCVD_COUNT_THREE(0.00)[3]; TO_MATCH_ENVRCPT_SOME(0.00)[]; TO_DN_ALL(0.00)[]; DKIM_TRACE(0.00)[gmail.com:+]; NEURAL_HAM_SHORT(-1.06)[-1.058]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::736:from]; NEURAL_HAM_MEDIUM(-1.02)[-1.017]; FORGED_SENDER(0.30)[garga@FreeBSD.org,gargabsd@gmail.com]; MIME_TRACE(0.00)[0:+]; FREEMAIL_ENVFROM(0.00)[gmail.com]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; TAGGED_FROM(0.00)[]; FROM_NEQ_ENVFROM(0.00)[garga@FreeBSD.org,gargabsd@gmail.com]; MAILMAN_DEST(0.00)[svn-src-head,svn-src-all] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Fri, 09 Oct 2020 18:20:52 -0000 On 09/10/20 15:16, Renato Botelho wrote: > On 09/10/20 13:57, Warner Losh wrote: >> >> >> On Fri, Oct 9, 2020 at 10:19 AM Renato Botelho > > wrote: >> >>     On 09/10/20 12:29, Warner Losh wrote: >>      > Author: imp >>      > Date: Fri Oct  9 15:29:05 2020 >>      > New Revision: 366578 >>      > URL: https://svnweb.freebsd.org/changeset/base/366578 >>     >>      > >>      > Log: >>      >    Avoid using single quotes in arguments to logger. >>      > >>      >    Single quotes interfere with the workaround put in with >>     r335753 and >>      >    aren't necessary in this case. I believe that all the >>     underling issues >>      >    with r335753 have been corrected, but need to do more extensive >>      >    followup before reverting it as a bad idea. >> >>     Hi Warner, >> >>     How to proceed if it's needed to pass multiple parameters to a >> command >>     in following format? >> >>     cmd param1 'param2 has spaces and a $variable' >> >> >> action "cmd param1 'param2 has spaces and a '$variable"; >> >> should do the trick. I'm documenting this now... > > It worked!! Thanks! Oooops, too fast. I wrote this script: #!/bin/sh echo "Param1 = '${1}'" >> /root/log echo "Param2 = '${2}'" >> /root/log And added this action on devd config: notify 0 { match "system" "IFNET"; match "type" "LINK_UP"; media-type "ethernet"; action "/root/log.sh -c 'interface linkup start '$subsystem"; }; notify 0 { match "system" "IFNET"; match "type" "LINK_DOWN"; media-type "ethernet"; action "/root/log.sh -c 'interface linkup stop '$subsystem"; }; And got the following output on /root/log: Param1 = '-c' Param2 = 'interface linkup start $em0' From owner-svn-src-all@freebsd.org Fri Oct 9 18:30:50 2020 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 26D3242854C; Fri, 9 Oct 2020 18:30:50 +0000 (UTC) (envelope-from emaste@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7Gpy0Jzyz4gLH; Fri, 9 Oct 2020 18:30:50 +0000 (UTC) (envelope-from emaste@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 E24271DAD6; Fri, 9 Oct 2020 18:30:49 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099IUn0X060670; Fri, 9 Oct 2020 18:30:49 GMT (envelope-from emaste@FreeBSD.org) Received: (from emaste@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099IUnSS060668; Fri, 9 Oct 2020 18:30:49 GMT (envelope-from emaste@FreeBSD.org) Message-Id: <202010091830.099IUnSS060668@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: emaste set sender to emaste@FreeBSD.org using -f From: Ed Maste Date: Fri, 9 Oct 2020 18:30:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366581 - in stable/12/usr.sbin/makefs: . cd9660 X-SVN-Group: stable-12 X-SVN-Commit-Author: emaste X-SVN-Commit-Paths: in stable/12/usr.sbin/makefs: . cd9660 X-SVN-Commit-Revision: 366581 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.33 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: Fri, 09 Oct 2020 18:30:50 -0000 Author: emaste Date: Fri Oct 9 18:30:49 2020 New Revision: 366581 URL: https://svnweb.freebsd.org/changeset/base/366581 Log: MFC r365847: makefs: connect cd9660 El Torito EFI boot image system type Sponsored by: The FreeBSD Foundation Modified: stable/12/usr.sbin/makefs/cd9660/cd9660_eltorito.c stable/12/usr.sbin/makefs/makefs.8 Directory Properties: stable/12/ (props changed) Modified: stable/12/usr.sbin/makefs/cd9660/cd9660_eltorito.c ============================================================================== --- stable/12/usr.sbin/makefs/cd9660/cd9660_eltorito.c Fri Oct 9 15:50:50 2020 (r366580) +++ stable/12/usr.sbin/makefs/cd9660/cd9660_eltorito.c Fri Oct 9 18:30:49 2020 (r366581) @@ -107,9 +107,11 @@ cd9660_add_boot_disk(iso9660_disk *diskStructure, cons else if (strcmp(sysname, "macppc") == 0 || strcmp(sysname, "mac68k") == 0) new_image->system = ET_SYS_MAC; + else if (strcmp(sysname, "efi") == 0) + new_image->system = ET_SYS_EFI; else { warnx("boot disk system must be " - "i386, powerpc, macppc, or mac68k"); + "i386, powerpc, macppc, mac68k, or efi"); free(temp); free(new_image); return 0; Modified: stable/12/usr.sbin/makefs/makefs.8 ============================================================================== --- stable/12/usr.sbin/makefs/makefs.8 Fri Oct 9 15:50:50 2020 (r366580) +++ stable/12/usr.sbin/makefs/makefs.8 Fri Oct 9 18:30:49 2020 (r366581) @@ -35,7 +35,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 20, 2019 +.Dd September 17, 2020 .Dt MAKEFS 8 .Os .Sh NAME @@ -385,8 +385,9 @@ is one of .Ql i386 , .Ql mac68k , .Ql macppc , +.Ql powerpc , or -.Ql powerpc . +.Ql efi . .It Sy generic-bootimage Load a generic boot image into the first 32K of the cd9660 image. .It Sy hard-disk-boot From owner-svn-src-all@freebsd.org Fri Oct 9 18:47:39 2020 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 3F56D428B92 for ; Fri, 9 Oct 2020 18:47:39 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com [IPv6:2607:f8b0:4864:20::72e]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7HBL45mvz4gsx for ; Fri, 9 Oct 2020 18:47:38 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: by mail-qk1-x72e.google.com with SMTP id y198so11673254qka.0 for ; Fri, 09 Oct 2020 11:47:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=rtM+ywnkXWfrOb7ty7VXxqr0q9zt3m2p+Sv8oy4Z/rE=; b=v7ORr8goSEoqzu/AWwgfjbDkPyDCsQ904heLSnp3WnXCWJ/2lP18nj2+E3zLJF40uQ gxmlTkjsWm5GWD50QuusZzjK6PW2zeYnw04VRijIscsv8zVHyRvock1ubySVnx/v/Nfy MMXjznhp4bTWFHRJrDmLMn7gTGnevP3ClxHVT9HwiT0tFuXYCtiAiB/d3gXwYK1JPAT+ bY1bD/X0kEZQ2Q2NMWO7ZZCjnnMHiKxQ8dc7HRyc5NcnfmVCL9h7rR2l2kasArsGEHZr A16beZrkQ5/01ilvDSKx/xTf3dcBVkccQa237HqKPSy4qHKYTvKlbGdyznww0+WeEaP9 88HQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=rtM+ywnkXWfrOb7ty7VXxqr0q9zt3m2p+Sv8oy4Z/rE=; b=i7qBlhHI0kACy+elrnPC5mLTHiZnVHC6POfFgOTHKDBwgMQo/z2Qr7aJNVWvCx8019 Dfu6UiIrBTK388jovAvb+964nA0xJuKAQg4Qc9Y8DNS2c9EItcVNJ/yn6xjqvfwswipG IjDLDXYncBk4rUb5sgPM9sq7ySKSPOHRmN1QKoEaEC1jEYL08nVuZIuOrNt5FWVO8ITK nzjS9tingsyB2E8GP1tAGQw6R7o0tIEGD/frn5YkZ8EgMM4jWiil6pMQDJfr5tz5DKYl +u3NNGLjFI+IeZzyJz4AK77ezDxQfEbrq420oZNlDgS9zQfTplLH91grIQMTiL2CaXc0 Zc5w== X-Gm-Message-State: AOAM530Mo9WZxDUwEzCHSHNxOylzG0RbRlxxv4BVow8GqCetJoUv9m25 LUoHkTy3bdNAmwfyu6ZJMYxOsIBFkA1QxcQXAGcXlQ== X-Google-Smtp-Source: ABdhPJxX/BPn+2ecmijz+aZDrER8TDO2L4ElLnjjJdN6WLASKrgx0A+FavpzmL8nNhXO4fPEMu25+2HPCh2UP0GW460= X-Received: by 2002:ae9:ee06:: with SMTP id i6mr14577167qkg.380.1602269257645; Fri, 09 Oct 2020 11:47:37 -0700 (PDT) MIME-Version: 1.0 References: <202010091529.099FT6Ab049635@repo.freebsd.org> <2f49af1f-f0fb-f5f0-82bf-8b46ead027c1@FreeBSD.org> <563930e3-19ec-44dd-fd6f-1d55859d9235@FreeBSD.org> In-Reply-To: <563930e3-19ec-44dd-fd6f-1d55859d9235@FreeBSD.org> From: Warner Losh Date: Fri, 9 Oct 2020 12:47:25 -0600 Message-ID: Subject: Re: svn commit: r366578 - head/sbin/devd To: Renato Botelho Cc: Warner Losh , src-committers , svn-src-all , svn-src-head X-Rspamd-Queue-Id: 4C7HBL45mvz4gsx X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=bsdimp-com.20150623.gappssmtp.com header.s=20150623 header.b=v7ORr8go; dmarc=none; spf=none (mx1.freebsd.org: domain of wlosh@bsdimp.com has no SPF policy when checking 2607:f8b0:4864:20::72e) smtp.mailfrom=wlosh@bsdimp.com X-Spamd-Result: default: False [-2.95 / 15.00]; RCVD_TLS_ALL(0.00)[]; ARC_NA(0.00)[]; R_DKIM_ALLOW(-0.20)[bsdimp-com.20150623.gappssmtp.com:s=20150623]; NEURAL_HAM_MEDIUM(-0.96)[-0.962]; FROM_HAS_DN(0.00)[]; NEURAL_HAM_LONG(-0.99)[-0.987]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; PREVIOUSLY_DELIVERED(0.00)[svn-src-all@freebsd.org]; DMARC_NA(0.00)[bsdimp.com]; RCPT_COUNT_FIVE(0.00)[5]; TO_MATCH_ENVRCPT_SOME(0.00)[]; TO_DN_ALL(0.00)[]; DKIM_TRACE(0.00)[bsdimp-com.20150623.gappssmtp.com:+]; NEURAL_HAM_SHORT(-1.00)[-1.000]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::72e:from]; R_SPF_NA(0.00)[no SPF record]; FORGED_SENDER(0.30)[imp@bsdimp.com,wlosh@bsdimp.com]; MIME_TRACE(0.00)[0:+,1:+,2:~]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; FROM_NEQ_ENVFROM(0.00)[imp@bsdimp.com,wlosh@bsdimp.com]; MAILMAN_DEST(0.00)[svn-src-all]; RCVD_COUNT_TWO(0.00)[2] Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.33 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Fri, 09 Oct 2020 18:47:39 -0000 On Fri, Oct 9, 2020, 12:20 PM Renato Botelho wrote: > On 09/10/20 15:16, Renato Botelho wrote: > > On 09/10/20 13:57, Warner Losh wrote: > >> > >> > >> On Fri, Oct 9, 2020 at 10:19 AM Renato Botelho >> > wrote: > >> > >> On 09/10/20 12:29, Warner Losh wrote: > >> > Author: imp > >> > Date: Fri Oct 9 15:29:05 2020 > >> > New Revision: 366578 > >> > URL: https://svnweb.freebsd.org/changeset/base/366578 > >> > >> > > >> > Log: > >> > Avoid using single quotes in arguments to logger. > >> > > >> > Single quotes interfere with the workaround put in with > >> r335753 and > >> > aren't necessary in this case. I believe that all the > >> underling issues > >> > with r335753 have been corrected, but need to do more > extensive > >> > followup before reverting it as a bad idea. > >> > >> Hi Warner, > >> > >> How to proceed if it's needed to pass multiple parameters to a > >> command > >> in following format? > >> > >> cmd param1 'param2 has spaces and a $variable' > >> > >> > >> action "cmd param1 'param2 has spaces and a '$variable"; > >> > >> should do the trick. I'm documenting this now... > > > > It worked!! Thanks! > > Oooops, too fast. > > I wrote this script: > > #!/bin/sh > > echo "Param1 = '${1}'" >> /root/log > echo "Param2 = '${2}'" >> /root/log > > And added this action on devd config: > > notify 0 { > match "system" "IFNET"; > match "type" "LINK_UP"; > media-type "ethernet"; > action "/root/log.sh -c 'interface linkup start '$subsystem"; > }; > > notify 0 { > match "system" "IFNET"; > match "type" "LINK_DOWN"; > media-type "ethernet"; > action "/root/log.sh -c 'interface linkup stop '$subsystem"; > }; > > And got the following output on /root/log: > > Param1 = '-c' > Param2 = 'interface linkup start $em0' > Doh. I'll dig deeper. Warner > From owner-svn-src-all@freebsd.org Fri Oct 9 19:10:01 2020 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 2B177429912; Fri, 9 Oct 2020 19:10:01 +0000 (UTC) (envelope-from mjg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7Hh902qRz4kpv; Fri, 9 Oct 2020 19:10:01 +0000 (UTC) (envelope-from mjg@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 C02FE1E421; Fri, 9 Oct 2020 19:10:00 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099JA0Yd087373; Fri, 9 Oct 2020 19:10:00 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099JA08f087371; Fri, 9 Oct 2020 19:10:00 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010091910.099JA08f087371@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Fri, 9 Oct 2020 19:10:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366582 - in head/sys: fs/deadfs kern X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: in head/sys: fs/deadfs kern X-SVN-Commit-Revision: 366582 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.33 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: Fri, 09 Oct 2020 19:10:01 -0000 Author: mjg Date: Fri Oct 9 19:10:00 2020 New Revision: 366582 URL: https://svnweb.freebsd.org/changeset/base/366582 Log: cache: fix vexec panic when racing against vgone Use of dead_vnodeops would result in a panic instead of returning the intended EOPNOTSUPP error. While here make sure to abort, not just try to return a partial result. The former allows the regular lookup to restart from scratch, while the latter makes it stuck with an unusable vnode. Reported by: kevans Modified: head/sys/fs/deadfs/dead_vnops.c head/sys/kern/vfs_cache.c Modified: head/sys/fs/deadfs/dead_vnops.c ============================================================================== --- head/sys/fs/deadfs/dead_vnops.c Fri Oct 9 18:30:49 2020 (r366581) +++ head/sys/fs/deadfs/dead_vnops.c Fri Oct 9 19:10:00 2020 (r366582) @@ -79,6 +79,7 @@ struct vop_vector dead_vnodeops = { .vop_vptocnp = VOP_EBADF, .vop_unset_text = dead_unset_text, .vop_write = dead_write, + .vop_fplookup_vexec = VOP_EOPNOTSUPP, }; VFS_VOP_VECTOR_REGISTER(dead_vnodeops); Modified: head/sys/kern/vfs_cache.c ============================================================================== --- head/sys/kern/vfs_cache.c Fri Oct 9 18:30:49 2020 (r366581) +++ head/sys/kern/vfs_cache.c Fri Oct 9 19:10:00 2020 (r366582) @@ -4040,32 +4040,46 @@ cache_fplookup_parse_advance(struct cache_fpl *fpl) } } +/* + * See the API contract for VOP_FPLOOKUP_VEXEC. + */ static int __noinline cache_fplookup_failed_vexec(struct cache_fpl *fpl, int error) { + struct vnode *dvp; + seqc_t dvp_seqc; + dvp = fpl->dvp; + dvp_seqc = fpl->dvp_seqc; + /* * Hack: they may be looking up foo/bar, where foo is a * regular file. In such a case we need to turn ENOTDIR, * but we may happen to get here with a different error. */ - if (fpl->dvp->v_type != VDIR) { + if (dvp->v_type != VDIR) { + /* + * The check here is predominantly to catch + * EOPNOTSUPP from dead_vnodeops. If the vnode + * gets doomed past this point it is going to + * fail seqc verification. + */ + if (VN_IS_DOOMED(dvp)) { + return (cache_fpl_aborted(fpl)); + } error = ENOTDIR; } switch (error) { case EAGAIN: - /* - * Can happen when racing against vgone. - * */ - case EOPNOTSUPP: - cache_fpl_partial(fpl); + if (!vn_seqc_consistent(dvp, dvp_seqc)) { + error = cache_fpl_aborted(fpl); + } else { + cache_fpl_partial(fpl); + } break; default: - /* - * See the API contract for VOP_FPLOOKUP_VEXEC. - */ - if (!vn_seqc_consistent(fpl->dvp, fpl->dvp_seqc)) { + if (!vn_seqc_consistent(dvp, dvp_seqc)) { error = cache_fpl_aborted(fpl); } else { cache_fpl_smr_exit(fpl); From owner-svn-src-all@freebsd.org Fri Oct 9 19:12:56 2020 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 4B73642966A; Fri, 9 Oct 2020 19:12:56 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7HlX1WHfz4lKm; Fri, 9 Oct 2020 19:12:56 +0000 (UTC) (envelope-from gbe@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 1748A1E619; Fri, 9 Oct 2020 19:12:56 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099JCt7t093387; Fri, 9 Oct 2020 19:12:55 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099JCjYf093334; Fri, 9 Oct 2020 19:12:45 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010091912.099JCjYf093334@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Fri, 9 Oct 2020 19:12:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366583 - in head: lib/libc/capability lib/libc/sys lib/libgssapi lib/libmd lib/libmt lib/libpathconv lib/libpmc lib/libradius lib/librpcsec_gss lib/libsysdecode lib/libusb lib/libutil ... X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: in head: lib/libc/capability lib/libc/sys lib/libgssapi lib/libmd lib/libmt lib/libpathconv lib/libpmc lib/libradius lib/librpcsec_gss lib/libsysdecode lib/libusb lib/libutil lib/msun/man share/man/ma... X-SVN-Commit-Revision: 366583 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.33 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: Fri, 09 Oct 2020 19:12:56 -0000 Author: gbe (doc committer) Date: Fri Oct 9 19:12:44 2020 New Revision: 366583 URL: https://svnweb.freebsd.org/changeset/base/366583 Log: Fix a few mandoc issues - skipping paragraph macro: Pp after Sh - sections out of conventional order: Sh EXAMPLES - whitespace at end of input line - normalizing date format Modified: head/lib/libc/capability/cap_rights_init.3 head/lib/libc/sys/cpuset_getaffinity.2 head/lib/libc/sys/cpuset_getdomain.2 head/lib/libc/sys/fhlink.2 head/lib/libc/sys/getitimer.2 head/lib/libc/sys/getsockopt.2 head/lib/libgssapi/gss_accept_sec_context.3 head/lib/libmd/mdX.3 head/lib/libmd/ripemd.3 head/lib/libmd/sha.3 head/lib/libmd/sha256.3 head/lib/libmd/sha512.3 head/lib/libmd/skein.3 head/lib/libmt/mt.3 head/lib/libpathconv/abs2rel.3 head/lib/libpmc/pmc.sandybridge.3 head/lib/libpmc/pmc.sandybridgeuc.3 head/lib/libradius/libradius.3 head/lib/librpcsec_gss/rpc_gss_set_callback.3 head/lib/libsysdecode/sysdecode_mask.3 head/lib/libusb/libusb20.3 head/lib/libutil/login_ok.3 head/lib/msun/man/sincos.3 head/share/man/man4/fdt_pinctrl.4 head/share/man/man4/ig4.4 head/share/man/man4/man4.i386/ce.4 head/share/man/man4/mlx5io.4 head/share/man/man4/mrsas.4 head/share/man/man4/ng_pppoe.4 head/share/man/man4/qlxgbe.4 head/share/man/man4/rtwn.4 head/share/man/man4/sa.4 head/share/man/man4/smartpqi.4 head/share/man/man4/spigen.4 head/share/man/man4/syscons.4 head/share/man/man4/udbp.4 head/share/man/man9/OF_finddevice.9 head/share/man/man9/backlight.9 head/share/man/man9/vnet.9 head/usr.bin/dpv/dpv.1 head/usr.bin/indent/indent.1 head/usr.bin/localedef/localedef.1 head/usr.bin/mkimg/mkimg.1 head/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 head/usr.sbin/camdd/camdd.8 head/usr.sbin/mlx5tool/mlx5tool.8 head/usr.sbin/nfsd/pnfsserver.4 head/usr.sbin/zonectl/zonectl.8 Modified: head/lib/libc/capability/cap_rights_init.3 ============================================================================== --- head/lib/libc/capability/cap_rights_init.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libc/capability/cap_rights_init.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -239,7 +239,7 @@ The functions .Fn cap_rights_is_set , .Fn cap_rights_is_valid , .Fn cap_rights_merge , -.Fn cap_rights_remove +.Fn cap_rights_remove and .Fn cap_rights_contains first appeared in Modified: head/lib/libc/sys/cpuset_getaffinity.2 ============================================================================== --- head/lib/libc/sys/cpuset_getaffinity.2 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libc/sys/cpuset_getaffinity.2 Fri Oct 9 19:12:44 2020 (r366583) @@ -149,7 +149,7 @@ was either preposterously large or smaller than the ke The calling process did not have the credentials required to complete the operation. .It Bq Er ECAPMODE -The calling process attempted to act on a process other than itself, while +The calling process attempted to act on a process other than itself, while in capability mode. See .Xr capsicum 4 . Modified: head/lib/libc/sys/cpuset_getdomain.2 ============================================================================== --- head/lib/libc/sys/cpuset_getdomain.2 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libc/sys/cpuset_getdomain.2 Fri Oct 9 19:12:44 2020 (r366583) @@ -119,7 +119,8 @@ Memory is allocated on a round-robin basis by cycling .Fa mask . .It Dv DOMAINSET_POLICY_FIRSTTOUCH Memory is allocated on the domain local to the CPU the requesting thread is -running on. Failure to allocate from this domain will fallback to round-robin. +running on. +Failure to allocate from this domain will fallback to round-robin. .It Dv DOMAINSET_POLICY_PREFER Memory is allocated preferentially from the single domain specified in the mask. If memory is unavailable the domains listed in the parent cpuset will be @@ -167,7 +168,7 @@ was either preposterously large or smaller than the ke The calling process did not have the credentials required to complete the operation. .It Bq Er ECAPMODE -The calling process attempted to act on a process other than itself, while +The calling process attempted to act on a process other than itself, while in capability mode. See .Xr capsicum 4 . Modified: head/lib/libc/sys/fhlink.2 ============================================================================== --- head/lib/libc/sys/fhlink.2 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libc/sys/fhlink.2 Fri Oct 9 19:12:44 2020 (r366583) @@ -178,7 +178,7 @@ The link count of the file pointed at by .Fa fhp would exceed 32767. .It Bq Er EACCES -A component of +A component of .Fa to prefix denies search permission. .It Bq Er EACCES Modified: head/lib/libc/sys/getitimer.2 ============================================================================== --- head/lib/libc/sys/getitimer.2 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libc/sys/getitimer.2 Fri Oct 9 19:12:44 2020 (r366583) @@ -28,7 +28,7 @@ .\" @(#)getitimer.2 8.3 (Berkeley) 5/16/95 .\" $FreeBSD$ .\" -.Dd May 1, 2020 +.Dd May 1, 2020 .Dt GETITIMER 2 .Os .Sh NAME Modified: head/lib/libc/sys/getsockopt.2 ============================================================================== --- head/lib/libc/sys/getsockopt.2 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libc/sys/getsockopt.2 Fri Oct 9 19:12:44 2020 (r366583) @@ -28,7 +28,7 @@ .\" @(#)getsockopt.2 8.4 (Berkeley) 5/2/95 .\" $FreeBSD$ .\" -.Dd June 03, 2020 +.Dd June 3, 2020 .Dt GETSOCKOPT 2 .Os .Sh NAME @@ -219,7 +219,8 @@ if they all set before binding the port. Incoming TCP and UDP connections are distributed among the sharing processes based on a hash function of local port number, foreign IP -address and port number. A maximum of 256 processes can share one socket. +address and port number. +A maximum of 256 processes can share one socket. .Pp .Dv SO_KEEPALIVE enables the Modified: head/lib/libgssapi/gss_accept_sec_context.3 ============================================================================== --- head/lib/libgssapi/gss_accept_sec_context.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libgssapi/gss_accept_sec_context.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -52,8 +52,9 @@ .Fa "gss_cred_id_t *delegated_cred_handle" .Fc .Sh DESCRIPTION -Allows a remotely initiated security context between the application -and a remote peer to be established. The routine may return a +Allows a remotely initiated security context between the application and a remote +peer to be established. +The routine may return a .Fa output_token which should be transferred to the peer application, where the peer application will present it to @@ -78,7 +79,8 @@ parameters. .Pp Portable applications should be constructed to use the token length and return status to determine whether a token needs to be sent or -waited for. Thus a typical portable caller should always invoke +waited for. +Thus a typical portable caller should always invoke .Fn gss_accept_sec_context within a loop: .Bd -literal @@ -166,10 +168,9 @@ returned to a caller (i.e. when accompanied by a .Dv GSS_S_COMPLETE status code), applications -should not rely on this behavior as the flag was not defined in -Version 1 of the GSS-API. Instead, applications should be prepared to -use per-message services after a successful context establishment, -according to the +should not rely on this behavior as the flag was not defined in Version 1 of the GSS-API. +Instead, applications should be prepared to use per-message services after a +successful context establishment, according to the .Dv GSS_C_INTEG_FLAG and .Dv GSS_C_CONF_FLAG values. @@ -190,9 +191,10 @@ fails, the implementation should not create a context object, and should leave the value of the context_handle parameter set to .Dv GSS_C_NO_CONTEXT to -indicate this. In the event of a failure on a subsequent call, the -implementation is permitted to delete the "half-built" security -context (in which case it should set the +indicate this. +In the event of a failure on a subsequent call, the implementation is +permitted to delete the "half-built" security context (in which case it +should set the .Fa context_handle parameter to .Dv GSS_C_NO_CONTEXT ), but the preferred behavior is to leave the Modified: head/lib/libmd/mdX.3 ============================================================================== --- head/lib/libmd/mdX.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libmd/mdX.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -157,7 +157,7 @@ The .Fn MDXFile and .Fn MDXFileChunk -may return NULL when underlying +may return NULL when underlying .Xr open 2 , .Xr fstat 2 , .Xr lseek 2 , Modified: head/lib/libmd/ripemd.3 ============================================================================== --- head/lib/libmd/ripemd.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libmd/ripemd.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -137,7 +137,7 @@ The .Fn RIPEMD160_File and .Fn RIPEMD160_FileChunk -may return NULL when underlying +may return NULL when underlying .Xr open 2 , .Xr fstat 2 , .Xr lseek 2 , Modified: head/lib/libmd/sha.3 ============================================================================== --- head/lib/libmd/sha.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libmd/sha.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -168,7 +168,7 @@ The .Fn SHA1_File and .Fn SHA1_FileChunk -may return NULL when underlying +may return NULL when underlying .Xr open 2 , .Xr fstat 2 , .Xr lseek 2 , Modified: head/lib/libmd/sha256.3 ============================================================================== --- head/lib/libmd/sha256.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libmd/sha256.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -159,7 +159,7 @@ The .Fn SHA256_File and .Fn SHA256_FileChunk -may return NULL when underlying +may return NULL when underlying .Xr open 2 , .Xr fstat 2 , .Xr lseek 2 , Modified: head/lib/libmd/sha512.3 ============================================================================== --- head/lib/libmd/sha512.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libmd/sha512.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -203,7 +203,7 @@ The .Fn SHA512_File and .Fn SHA512_FileChunk -may return NULL when underlying +may return NULL when underlying .Xr open 2 , .Xr fstat 2 , .Xr lseek 2 , Modified: head/lib/libmd/skein.3 ============================================================================== --- head/lib/libmd/skein.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libmd/skein.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -201,7 +201,7 @@ The .Fn SKEIN256_File and .Fn SKEIN256_FileChunk -may return NULL when underlying +may return NULL when underlying .Xr open 2 , .Xr fstat 2 , .Xr lseek 2 , @@ -220,15 +220,15 @@ These functions appeared in .Fx 11.0 . .Sh AUTHORS .An -nosplit -The core hash routines were imported from version 1.3 of the optimized +The core hash routines were imported from version 1.3 of the optimized Skein reference implementation written by .An Doug Whiting as submitted to the NSA SHA-3 contest. The algorithms were developed by -.An Niels Ferguson , +.An Niels Ferguson , .An Stefan Lucks , -.An Bruce Schneier , -.An Doug Whiting , +.An Bruce Schneier , +.An Doug Whiting , .An Mihir Bellare , .An Tadayoshi Kohno , .An Jon Callas, Modified: head/lib/libmt/mt.3 ============================================================================== --- head/lib/libmt/mt.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libmt/mt.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -1,7 +1,7 @@ -.\" +.\" .\" Copyright (c) 2013, 2015 Spectra Logic Corporation .\" All rights reserved. -.\" +.\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: @@ -13,7 +13,7 @@ .\" ("Disclaimer") and any redistribution must be conditioned upon .\" including a substantially similar Disclaimer requirement for further .\" binary redistribution. -.\" +.\" .\" NO WARRANTY .\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS .\" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT @@ -26,9 +26,9 @@ .\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING .\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGES. -.\" +.\" .\" Authors: Ken Merry (Spectra Logic Corporation) -.\" +.\" .\" $FreeBSD$ .\" .Dd February 13, 2015 @@ -177,7 +177,7 @@ driver returns some status data as XML-formatted strin the primary purpose of this library is to make it easier for the software developer to parse those strings and extract the status values. .Pp -The +The .Fn mt_start_element , .Fn mt_end_element , and @@ -310,7 +310,7 @@ except that it prints the results to standard output i .Pp .Fn mt_param_entry_sbuf prints the -.Ar entry +.Ar entry to the given sbuf .Ar sb . The argument @@ -361,7 +361,7 @@ See below for notes on the return values. Returns the bits per inch or bits per mm values for a given density entry specified by the .Ar density_num . -If the +If the .Ar bpi argument is non-zero, the bits per inch value is returned. Otherwise, the bits per mm value is returned. @@ -375,8 +375,8 @@ to the supplied density name. gets the current XML status / parameter string from the sa(4) driver instance referenced by the open file descriptor .Ar mtfd . -The -.Xr mtio 4 +The +.Xr mtio 4 .Xr ioctl 2 to be used is supplied as the .Ar cmd @@ -425,7 +425,7 @@ If the density is not known, will return "UNKNOWN". .Pp .Fn mt_density_bp -returns the bits per inch value for the given density (if the +returns the bits per inch value for the given density (if the .Ar bpi field is non-zero), the bits per mm value otherwise, or 0 if the supplied .Ar density_num Modified: head/lib/libpathconv/abs2rel.3 ============================================================================== --- head/lib/libpathconv/abs2rel.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libpathconv/abs2rel.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -119,8 +119,8 @@ yields: path == "../../../sys/kern" /* It's correct but ... */ -That is correct, but a little redundant. If you wish get the simple -answer 'kern', do the following. +That is correct, but a little redundant. +If you wish get the simple answer 'kern', do the following. path = abs2rel(realpath("/sys/kern", r1), realpath("/sys", r2), result, MAXPATHLEN); Modified: head/lib/libpmc/pmc.sandybridge.3 ============================================================================== --- head/lib/libpmc/pmc.sandybridge.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libpmc/pmc.sandybridge.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -1,4 +1,4 @@ -.\" Copyright (c) 2012 Davide Italiano +.\" Copyright (c) 2012 Davide Italiano .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without Modified: head/lib/libpmc/pmc.sandybridgeuc.3 ============================================================================== --- head/lib/libpmc/pmc.sandybridgeuc.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libpmc/pmc.sandybridgeuc.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -1,4 +1,4 @@ -.\" Copyright (c) 2012 Davide Italiano +.\" Copyright (c) 2012 Davide Italiano .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without Modified: head/lib/libradius/libradius.3 ============================================================================== --- head/lib/libradius/libradius.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libradius/libradius.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -485,7 +485,8 @@ To free the resources used by the RADIUS library, call .Fn rad_close . .Ss Server operation Server mode operates much alike to client mode, except packet send and receive -steps are swapped. To operate as server you should obtain server context with +steps are swapped. +To operate as server you should obtain server context with .Fn rad_server_open function, passing opened and bound UDP socket file descriptor as argument. You should define allowed clients and their secrets using @@ -493,9 +494,9 @@ You should define allowed clients and their secrets us function. port, timeout and max_tries arguments are ignored in server mode. You should call .Fn rad_receive_request -function to receive request from client. If you do not want to block on socket -read, you are free to use any poll(), select() or non-blocking sockets for -the socket. +function to receive request from client. +If you do not want to block on socket read, you are free to use any +poll(), select() or non-blocking sockets for the socket. Received request can be parsed with same parsing functions as for client. To respond to the request you should call .Fn rad_create_response Modified: head/lib/librpcsec_gss/rpc_gss_set_callback.3 ============================================================================== --- head/lib/librpcsec_gss/rpc_gss_set_callback.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/librpcsec_gss/rpc_gss_set_callback.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -74,7 +74,8 @@ GSS-API delegated credentials (if any) .It gss_context The GSS-API context .It lock -A structure used to enforce a particular QOP and service. Set +A structure used to enforce a particular QOP and service. +Set .Fa lock->locked to .Dv TRUE Modified: head/lib/libsysdecode/sysdecode_mask.3 ============================================================================== --- head/lib/libsysdecode/sysdecode_mask.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libsysdecode/sysdecode_mask.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -194,17 +194,17 @@ and .Xr fcntl 2 commands. .It Fn sysdecode_sctp_nxt_flags -The +The .Fa nxt_flags member of a .Vt struct sctp_nxtinfo . .It Fn sysdecode_sctp_rcv_flags -The +The .Fa rcv_flags member of a .Vt struct sctp_rcvinfo . .It Fn sysdecode_sctp_snd_flags -The +The .Fa snd_flags member of a .Vt struct sctp_sndinfo . Modified: head/lib/libusb/libusb20.3 ============================================================================== --- head/lib/libusb/libusb20.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libusb/libusb20.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -314,15 +314,16 @@ This function returns NULL in case of failure. . .Fn libusb20_tr_get_time_complete will return the completion time of an USB transfer in -millisecond units. This function is most useful for isochronous USB -transfers when doing echo cancelling. +millisecond units. +This function is most useful for isochronous USB transfers when doing echo +cancelling. . .Pp . .Fn libusb20_tr_get_actual_frames will return the actual number of USB frames after an USB -transfer completed. A value of zero means that no data was transferred. -. +transfer completed. +A value of zero means that no data was transferred. .Pp . .Fn libusb20_tr_get_actual_length @@ -691,9 +692,11 @@ Before this call will succeed the USB device must be o .Fa setup is a pointer to a decoded and host endian SETUP packet. .Fa data -is a pointer to a data transfer buffer associated with the control transaction. This argument can be NULL. +is a pointer to a data transfer buffer associated with the control transaction. +This argument can be NULL. .Fa pactlen -is a pointer to a variable that will hold the actual transfer length after the control transaction is complete. +is a pointer to a variable that will hold the actual transfer length after the +control transaction is complete. .Fa timeout is the transaction timeout given in milliseconds. A timeout of zero means no timeout. @@ -792,10 +795,11 @@ The USB device need not be opened when calling this fu .Pp . .Fn libusb20_dev_alloc_config -will read out and decode the USB config descriptor for -the given USB device and config index. This function returns a pointer -to the decoded configuration which must eventually be passed to -free(). NULL is returned in case of failure. +will read out and decode the USB config descriptor for the given USB device +and config index. +This function returns a pointer to the decoded configuration which must eventually +be passed to free(). +NULL is returned in case of failure. . .Pp . @@ -902,8 +906,8 @@ will set the global USB device side mode template to The new template is not activated until after the next USB enumeration. The template number decides how the USB device will present itself to -the USB Host, like Mass Storage Device, USB Ethernet Device. Also see -the +the USB Host, like Mass Storage Device, USB Ethernet Device. +Also see the .Xr usb2_template 4 module. This function returns zero on success else a LIBUSB20_ERROR value is @@ -966,10 +970,9 @@ returned. .Fn libusb20_be_alloc_default .Fn libusb20_be_alloc_freebsd .Fn libusb20_be_alloc_linux -These functions are used to allocate a specific USB backend or the -operating system default USB backend. Allocating a backend is a way to -scan for currently present USB devices. -. +These functions are used to allocate a specific USB backend or the operating system +default USB backend. +Allocating a backend is a way to scan for currently present USB devices. .Pp . .Fn libusb20_be_device_foreach Modified: head/lib/libutil/login_ok.3 ============================================================================== --- head/lib/libutil/login_ok.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/libutil/login_ok.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -19,7 +19,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 10, 2020 +.Dd May 10, 2020 .Dt LOGIN_OK 3 .Os .Sh NAME Modified: head/lib/msun/man/sincos.3 ============================================================================== --- head/lib/msun/man/sincos.3 Fri Oct 9 19:10:00 2020 (r366582) +++ head/lib/msun/man/sincos.3 Fri Oct 9 19:12:44 2020 (r366583) @@ -50,33 +50,33 @@ and functions compute the sine and cosine of .Fa x . Using these functions allows argument reduction to occur only -once instead of twice with individual invocations of +once instead of twice with individual invocations of .Fn sin -and +and .Fn cos . -Like +Like .Fn sin -and +and .Fn cos , a large magnitude argument may yield a result with little or no significance. .Sh RETURN VALUES -Upon returning from +Upon returning from .Fn sincos , .Fn sincosf , and .Fn sincosl , -the memory pointed to by -.Ar "*s" +the memory pointed to by +.Ar "*s" and -.Ar "*c" +.Ar "*c" are assigned the values of sine and cosine, respectively. .Sh SEE ALSO .Xr cos 3 , .Xr sin 3 , .Sh HISTORY -These functions were added to +These functions were added to .Fx 9.0 -to aid in writing various complex function contained in +to aid in writing various complex function contained in .St -isoC-99 . Modified: head/share/man/man4/fdt_pinctrl.4 ============================================================================== --- head/share/man/man4/fdt_pinctrl.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/fdt_pinctrl.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -33,10 +33,9 @@ .Sh SYNOPSIS .Cd "device fdt_pinctrl" .Sh DESCRIPTION -.Pp Pin multiplexing is a technology used to re-purpose a single physical connection (depending on chip packaging it may be -pin, ball, or pad) by routing its signal to any one of several +pin, ball, or pad) by routing its signal to any one of several different SoC internal devices. For example, based on the actual device design, a single SoC chip pin might perform any of these roles: SPI clock, I2C Modified: head/share/man/man4/ig4.4 ============================================================================== --- head/share/man/man4/ig4.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/ig4.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -71,7 +71,7 @@ device with the same unit number. .An -nosplit The .Nm -driver was written for +driver was written for .Dx by .An Matthew Dillon Modified: head/share/man/man4/man4.i386/ce.4 ============================================================================== --- head/share/man/man4/man4.i386/ce.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/man4.i386/ce.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -9,7 +9,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" +.\" .\" THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE Modified: head/share/man/man4/mlx5io.4 ============================================================================== --- head/share/man/man4/mlx5io.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/mlx5io.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -10,7 +10,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" +.\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE Modified: head/share/man/man4/mrsas.4 ============================================================================== --- head/share/man/man4/mrsas.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/mrsas.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -34,7 +34,7 @@ .\" .\" $FreeBSD$ .\" -.Dd Mar 13, 2019 +.Dd March 13, 2019 .Dt MRSAS 4 .Os .Sh NAME Modified: head/share/man/man4/ng_pppoe.4 ============================================================================== --- head/share/man/man4/ng_pppoe.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/ng_pppoe.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -110,9 +110,9 @@ using the .Qq Li [AC-Name\\][Host-Uniq|]Service-Name syntax. To set a binary Host-Uniq, it must be encoded as a hexadecimal lowercase -string and prefixed with +string and prefixed with .Qq Li 0x , -for example +for example .Qq Li 0x6d792d746167 is equivalent to .Qq Li my-tag . Modified: head/share/man/man4/qlxgbe.4 ============================================================================== --- head/share/man/man4/qlxgbe.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/qlxgbe.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -53,7 +53,7 @@ TCP and UDP checksum offload for both IPv4 and IPv6, Large Segment Offload for both IPv4 and IPv6, Jumbo frames, VLAN Tag, and Receive Side scaling, ability to select either HW or Software LRO, -when LRO is enabled (default HW LRO). +when LRO is enabled (default HW LRO). For further hardware information, see .Pa http://www.qlogic.com/ . .Sh HARDWARE Modified: head/share/man/man4/rtwn.4 ============================================================================== --- head/share/man/man4/rtwn.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/rtwn.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -150,9 +150,9 @@ prompt before booting the kernel or stored in .It Va dev.rtwn.%d.hwcrypto This tunable controls how key slots are assigned: .br -0 - disable h/w crypto support. Features that require access -to frame contents (e.g., TCP/UDP/IP Rx checksum validation) -will not work; +0 - disable h/w crypto support. +Features that require access to frame contents (e.g., TCP/UDP/IP Rx +checksum validation) will not work; .br 1 - use h/w crypto support for pairwise keys only; .br Modified: head/share/man/man4/sa.4 ============================================================================== --- head/share/man/man4/sa.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/sa.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -251,7 +251,7 @@ The user can query parameters using (which uses the .Dv MTIOCPARAMGET ioctl) and the user can set parameters using -.Dq mt param -s +.Dq mt param -s (which uses the .Dv MTIOCPARAMSET ioctl). @@ -281,13 +281,13 @@ driver reports entering Programmable Early Warning, Ea of Media conditions by returning a write with 0 bytes written, and .Dv errno set to 0. -If +If .Va eot_warn is set to 1, the .Nm driver will set .Dv errno -to +to .Dv ENOSPC when it enters any of the out of space conditions. .It protection.protection_supported @@ -353,10 +353,10 @@ In addition, when EOM is injected, the tape position s to temporarily show Beyond of the Programmable Early Warning (BPEW) status. To see BPEW status, use the .Dv MTIOCEXTGET -ioctl, which is used by the -.Dq mt status +ioctl, which is used by the +.Dq mt status command. -To inject an EOM notification, set the +To inject an EOM notification, set the .Pp .Va kern.cam.sa.%d.inject_eom .Pp Modified: head/share/man/man4/smartpqi.4 ============================================================================== --- head/share/man/man4/smartpqi.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/smartpqi.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -71,7 +71,7 @@ driver include: .It HPE Gen10 Smart Array Controller Family .It -OEM Controllers based on the Microsemi Chipset +OEM Controllers based on the Microsemi Chipset .El .Sh FILES .Bl -tag -width /boot/kernel/aac.ko -compact Modified: head/share/man/man4/spigen.4 ============================================================================== --- head/share/man/man4/spigen.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/spigen.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -58,7 +58,7 @@ line on the bus, and all I/O performed through that in with that chip-select line asserted. .Pp SPI data transfers are inherently bi-directional; there are not separate -read and write operations. +read and write operations. When commands and data are sent to a device, data also comes back from the device, although in some cases the data may not be useful (or even documented or predictable for some devices). @@ -129,7 +129,7 @@ The setting remains in effect for subsequent transfers is not necessary to reset this before each transfer. .El .Sh HINTS CONFIGURATION -On a +On a .Xr device.hints 5 based system, such as .Li MIPS , Modified: head/share/man/man4/syscons.4 ============================================================================== --- head/share/man/man4/syscons.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/syscons.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -422,7 +422,7 @@ These options remove the .Qq dumb , .Qq sc , and -.Qq scteken +.Qq scteken terminal emulators, respectively. .El .Ss Driver Flags Modified: head/share/man/man4/udbp.4 ============================================================================== --- head/share/man/man4/udbp.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man4/udbp.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -118,7 +118,7 @@ has been expressly designed to follow its specificatio .Xr ngctl 8 .\" .Rs -.%B Universal Serial Bus: Communications Class Subclass Specification for Ethernet Emulation Model Devices +.%B Universal Serial Bus: Communications Class Subclass Specification for Ethernet Emulation Model Devices .%N Revision 1.0 .%D February 2, 2005 .%I USB Implementers Forum, Inc. @@ -136,8 +136,8 @@ makes them unsuitable as a "drop-in" replacement for a for a USB 3.0 SuperSpeed cable, latency is comparable to 100BaseTX Ethernet (but often worse), with throughput comparable to 2.5GBASE-T. .Pp -However, their energy efficiency makes them attractive for embedded -applications. A Plugable PL27A1 cable claims 24mA of USB3 bus power, +However, their energy efficiency makes them attractive for embedded applications. +A Plugable PL27A1 cable claims 24mA of USB3 bus power, as compared to 150mA for a typical USB 3.0 to Gigabit Ethernet interface. .Sh HISTORY The @@ -160,6 +160,6 @@ and .An Nick Hibma Aq Mt n_hibma@FreeBSD.org . .Pp This manual page was written by -.An Nick Hibma Aq Mt n_hibma@FreeBSD.org +.An Nick Hibma Aq Mt n_hibma@FreeBSD.org and updated by .An Bruce Simpson Aq Mt bms@FreeBSD.org . Modified: head/share/man/man9/OF_finddevice.9 ============================================================================== --- head/share/man/man9/OF_finddevice.9 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man9/OF_finddevice.9 Fri Oct 9 19:12:44 2020 (r366583) @@ -37,23 +37,10 @@ .Ft phandle_t .Fn OF_finddevice "const char *path" .Sh DESCRIPTION -.Pp .Fn OF_finddevice returns the phandle for the node specified by the .Fa path . Returns -1 if the path cannot be found in the tree. -.Sh CAVEATS -The return value should only be checked with equality -operators (equal to, not equal to) and not relational comparison -(less than, greater than ). -There is a discrepancy between IEEE 1275 standard and -.Fx Ns 's -internal representation of a phandle: IEEE 1275 -requires the return value of this function to be -1 if the path -is not found. -But phandle_t is an unsigned type, so it cannot -be relationally compared with -1 or 0, this comparison -is always true or always false. .Sh EXAMPLES .Bd -literal phandle_t root, i2c; @@ -72,3 +59,15 @@ is always true or always false. .An -nosplit This manual page was written by .An Oleksandr Tymoshenko Aq Mt gonzo@FreeBSD.org . +.Sh CAVEATS +The return value should only be checked with equality +operators (equal to, not equal to) and not relational comparison +(less than, greater than ). +There is a discrepancy between IEEE 1275 standard and +.Fx Ns 's +internal representation of a phandle: IEEE 1275 +requires the return value of this function to be -1 if the path +is not found. +But phandle_t is an unsigned type, so it cannot +be relationally compared with -1 or 0, this comparison +is always true or always false. Modified: head/share/man/man9/backlight.9 ============================================================================== --- head/share/man/man9/backlight.9 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man9/backlight.9 Fri Oct 9 19:12:44 2020 (r366583) @@ -22,7 +22,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 02, 2020 +.Dd October 2, 2020 .Dt BACKLIGHT 9 .Os .Sh NAME Modified: head/share/man/man9/vnet.9 ============================================================================== --- head/share/man/man9/vnet.9 Fri Oct 9 19:10:00 2020 (r366582) +++ head/share/man/man9/vnet.9 Fri Oct 9 19:12:44 2020 (r366583) @@ -39,7 +39,6 @@ .Cd "options VNET_DEBUG" .Pp .In sys/vnet.h -.Pp .\"------------------------------------------------------------ .Ss "Constants and Global Variables" .\" Modified: head/usr.bin/dpv/dpv.1 ============================================================================== --- head/usr.bin/dpv/dpv.1 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.bin/dpv/dpv.1 Fri Oct 9 19:12:44 2020 (r366583) @@ -144,7 +144,8 @@ Prevent visually distracting initialization/exit routi .Xr dialog 1 several times. .It Fl l -Line mode. Read lines from input instead of bytes. +Line mode. +Read lines from input instead of bytes. .It Fl L Ar size Label size. If negative, shrink to longest label width. Modified: head/usr.bin/indent/indent.1 ============================================================================== --- head/usr.bin/indent/indent.1 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.bin/indent/indent.1 Fri Oct 9 19:12:44 2020 (r366583) @@ -122,7 +122,8 @@ is named .Sq Pa /blah/blah/file , the backup file is named .Sq Pa file.BAK -by default. The extension used for the backup file may be overridden using the +by default. +The extension used for the backup file may be overridden using the .Ev SIMPLE_BACKUP_SUFFIX environment variable. .Pp Modified: head/usr.bin/localedef/localedef.1 ============================================================================== --- head/usr.bin/localedef/localedef.1 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.bin/localedef/localedef.1 Fri Oct 9 19:12:44 2020 (r366583) @@ -124,9 +124,9 @@ See .Sx NOTES . .It Fl U Ignore the presence of character symbols that have no matching character -definition. This facilitates the use of a common locale definition file -to be used across multiple encodings, even when some symbols are not -present in a given encoding. +definition. +This facilitates the use of a common locale definition file to be used across multiple +encodings, even when some symbols are not present in a given encoding. .It Fl v Emit verbose debugging output on standard output. .It Fl w Ar widthfile Modified: head/usr.bin/mkimg/mkimg.1 ============================================================================== --- head/usr.bin/mkimg/mkimg.1 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.bin/mkimg/mkimg.1 Fri Oct 9 19:12:44 2020 (r366583) @@ -223,8 +223,8 @@ The preferred file extension is ".qcow" and ".qcow2" f (resp.), but ".qcow" is sometimes used for version 2 files as well. .Ss RAW file format This file format is a sector by sector representation of an actual disk. -There is no extra information that describes or relates to the format -itself. The size of the file is the size of the (virtual) disk. +There is no extra information that describes or relates to the format itself. +The size of the file is the size of the (virtual) disk. This file format is suitable for being copyied onto a disk with utilities like .Nm dd . Modified: head/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 ============================================================================== --- head/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.sbin/bsnmpd/tools/bsnmptools/bsnmpget.1 Fri Oct 9 19:12:44 2020 (r366583) @@ -148,7 +148,8 @@ Information (SMIv2). The context to query with SNMPv3 PDUs. .Bl -tag -width \& .It Cm context=name -The context name. Default is "" (empty). +The context name. +Default is "" (empty). .It Cm context-engine=engine-id The SNMP Engine ID of the context to query with SNMPv3 PDUs, represented as binary octet string. Modified: head/usr.sbin/camdd/camdd.8 ============================================================================== --- head/usr.sbin/camdd/camdd.8 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.sbin/camdd/camdd.8 Fri Oct 9 19:12:44 2020 (r366583) @@ -1,7 +1,7 @@ -.\" +.\" .\" Copyright (c) 2015 Spectra Logic Corporation .\" All rights reserved. -.\" +.\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: @@ -13,7 +13,7 @@ .\" ("Disclaimer") and any redistribution must be conditioned upon .\" including a substantially similar Disclaimer requirement for further .\" binary redistribution. -.\" +.\" .\" NO WARRANTY .\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS .\" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT @@ -26,11 +26,11 @@ .\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING .\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGES. -.\" +.\" .\" Authors: Ken Merry (Spectra Logic Corporation) -.\" -.\" $FreeBSD$ .\" +.\" $FreeBSD$ +.\ .Dd November 11, 2015 .Dt CAMDD 8 .Os @@ -70,7 +70,7 @@ The following options are available: .Bl -tag -width 12n .It Fl i | o Ar args Specify the input and output device or file. -Both +Both .Fl i and .Fl o @@ -96,7 +96,7 @@ name and unit number, for instance or a regular peripheral driver name and unit number, for instance .Dq da5 . It can also be the path of a -.Xr pass 4 +.Xr pass 4 or other disk device, like .Dq /dev/da5 . It may also be a bus:target:lun, for example: @@ -127,7 +127,7 @@ It does support probing disk sector size and capacity blocksize and maximum transfer size information. The file interface supports standard files, disks, tape drives, special devices, pipes and standard input and output. -If the file is specified as a +If the file is specified as a .Dq - , standard input or standard output are used. For tape devices, the specified blocksize will be the size that @@ -138,7 +138,7 @@ size. So, that means .Nm will not write anything smaller than the sector size. -At the end of a transfer, if there isn't sufficient data from the reader +At the end of a transfer, if there isn't sufficient data from the reader to yield a full block, .Nm will add zeros on the end of the data from the reader to make up a full @@ -171,7 +171,7 @@ Specify a desired queue depth for the input or output will attempt to keep the requested number of requests of the specified blocksize queued to the input or output device. Queue depths greater than 1 are only supported for the asynchronous -.Xr pass 4 +.Xr pass 4 output method. The queue depth is maintained on a best effort basis, and may not be possible to maintain for especially fast devices. @@ -261,7 +261,7 @@ Stop the transfer after 100MB has been written. Copy disk da8 using a 1MB blocksize and desired queue depth of 3 to the file disk.img. .Pp -.Dl camdd -i file=/etc/rc -o file=- +.Dl camdd -i file=/etc/rc -o file=- .Pp Read the file /etc/rc and write it to standard output. .Pp Modified: head/usr.sbin/mlx5tool/mlx5tool.8 ============================================================================== --- head/usr.sbin/mlx5tool/mlx5tool.8 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.sbin/mlx5tool/mlx5tool.8 Fri Oct 9 19:12:44 2020 (r366583) @@ -10,7 +10,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" +.\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE Modified: head/usr.sbin/nfsd/pnfsserver.4 ============================================================================== --- head/usr.sbin/nfsd/pnfsserver.4 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.sbin/nfsd/pnfsserver.4 Fri Oct 9 19:12:44 2020 (r366583) @@ -266,7 +266,7 @@ Note that the must be the exac string used when the DS was mounted on the MDS. .Pp Once the mirrored DS has been disabled, the pNFS service should continue to -function, but file updates will only happen on the DS(s) +function, but file updates will only happen on the DS(s) that have not been disabled. Assuming two way mirroring, that implies the one DS of the pair stored in the .Dq pnfsd.dsfile Modified: head/usr.sbin/zonectl/zonectl.8 ============================================================================== --- head/usr.sbin/zonectl/zonectl.8 Fri Oct 9 19:10:00 2020 (r366582) +++ head/usr.sbin/zonectl/zonectl.8 Fri Oct 9 19:12:44 2020 (r366583) @@ -1,7 +1,7 @@ -.\" +.\" .\" Copyright (c) 2015 Spectra Logic Corporation .\" All rights reserved. -.\" +.\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: @@ -13,7 +13,7 @@ .\" ("Disclaimer") and any redistribution must be conditioned upon .\" including a substantially similar Disclaimer requirement for further .\" binary redistribution. -.\" +.\" .\" NO WARRANTY .\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS .\" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT @@ -26,11 +26,11 @@ *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-all@freebsd.org Fri Oct 9 20:13:21 2020 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 1D86742BF8C for ; Fri, 9 Oct 2020 20:13:21 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: from mail-qv1-xf2d.google.com (mail-qv1-xf2d.google.com [IPv6:2607:f8b0:4864:20::f2d]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7K5D0bNYz4q2c for ; Fri, 9 Oct 2020 20:13:19 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: by mail-qv1-xf2d.google.com with SMTP id j3so5355388qvi.7 for ; Fri, 09 Oct 2020 13:13:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=E4DvHZfegp7U1G8Cos7RjkcaKeraE3GXOQH80Do5jIA=; b=YDenw7cpv2a5vAxIMUyC7AzyhTZyX6jD9W1Oitbd1ocM+DXIb/+1/aMaK52gf0AQrX pGnSG3Jcyrp8I+F8UOjVirJ4D0VO+EwzjDo2b2RjyoViG8hLr/IJgiWV3FWYV9/zXwEc NeW97b+rIYLh4gWsdsaKalRZkpdP7ARgWMv4ao3hUQmBSlcViqFwuVM81W5sWWoQK4+W wAe8vlEO/8Lq2M2HvbuS0mOwx9PvjZnLr0Mz99pjKIxm00KqnxzCuyThNzYyOleRntjw VHxqWHIpA5s2ZGAJ6wEeZhx10EF4ssmdXDue2YXtsDDL6azeLl+xCKH803aeZ6JAcxDk 6+/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=E4DvHZfegp7U1G8Cos7RjkcaKeraE3GXOQH80Do5jIA=; b=Ip1NqTkcwUgd5bEEGfe6sRjLfq8ttdmyUsQ3HkfW6EiUAmEc+MF9c1eRojippcgrzf rWWRi1TqC/R1Sg6T+NwGeCnPTU/wW0NW5pH/4VJAsXvdu4noDcMp0T5MU83GPI65CepJ bJd8LY6BzFbWITJ3ECiuxOhCDGoy1uTveWv5Ws0M9qkd+qhvLj8UwYhcvSb6I5z58DKx 4CCH2bMqRF17Se6rMR1kcznUU5jIXfbsg+2Dm4A8bZ8Kr8qesmJ7Te4a1T7C3FYFzv2J MTs8Zlib1Y6nJs3vcNZK2zrGscXhyKPVFohfxxhdG3tCZcfzcyxXiBuAHm4+5s6da4/I r9yQ== X-Gm-Message-State: AOAM531OkKzLTuJ2v+us7chuUu6A72+KjXWgiCd0rrxjL5Y5ee5JWEd+ q65M8XkSdV/oqCleCjiwwla1h+E0VYEbmNNQR2f5+Q== X-Google-Smtp-Source: ABdhPJwh+gi0Zw9hEH4A3yuaDL+3EJgHSeZobwUl+Ymd0KG9chWiIyVCuomHiIyxIZFcSV+GSUl43CT8e4dKh5UcpKc= X-Received: by 2002:a05:6214:174f:: with SMTP id dc15mr14059435qvb.26.1602274399025; Fri, 09 Oct 2020 13:13:19 -0700 (PDT) MIME-Version: 1.0 References: <202010091529.099FT6Ab049635@repo.freebsd.org> <2f49af1f-f0fb-f5f0-82bf-8b46ead027c1@FreeBSD.org> <563930e3-19ec-44dd-fd6f-1d55859d9235@FreeBSD.org> In-Reply-To: From: Warner Losh Date: Fri, 9 Oct 2020 14:13:08 -0600 Message-ID: Subject: Re: svn commit: r366578 - head/sbin/devd To: Renato Botelho Cc: Warner Losh , src-committers , svn-src-all , svn-src-head X-Rspamd-Queue-Id: 4C7K5D0bNYz4q2c X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org; dkim=pass header.d=bsdimp-com.20150623.gappssmtp.com header.s=20150623 header.b=YDenw7cp; dmarc=none; spf=none (mx1.freebsd.org: domain of wlosh@bsdimp.com has no SPF policy when checking 2607:f8b0:4864:20::f2d) smtp.mailfrom=wlosh@bsdimp.com X-Spamd-Result: default: False [-2.65 / 15.00]; ARC_NA(0.00)[]; MAILMAN_DEST(0.00)[svn-src-all]; R_DKIM_ALLOW(-0.20)[bsdimp-com.20150623.gappssmtp.com:s=20150623]; NEURAL_HAM_MEDIUM(-0.95)[-0.954]; FROM_HAS_DN(0.00)[]; NEURAL_HAM_LONG(-0.98)[-0.979]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; PREVIOUSLY_DELIVERED(0.00)[svn-src-all@freebsd.org]; DMARC_NA(0.00)[bsdimp.com]; RCPT_COUNT_FIVE(0.00)[5]; TO_MATCH_ENVRCPT_SOME(0.00)[]; TO_DN_ALL(0.00)[]; DKIM_TRACE(0.00)[bsdimp-com.20150623.gappssmtp.com:+]; NEURAL_HAM_SHORT(-0.72)[-0.716]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::f2d:from]; R_SPF_NA(0.00)[no SPF record]; FORGED_SENDER(0.30)[imp@bsdimp.com,wlosh@bsdimp.com]; MIME_TRACE(0.00)[0:+,1:+,2:~]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; RCVD_TLS_ALL(0.00)[]; FROM_NEQ_ENVFROM(0.00)[imp@bsdimp.com,wlosh@bsdimp.com]; RCVD_COUNT_TWO(0.00)[2] Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.33 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Fri, 09 Oct 2020 20:13:21 -0000 On Fri, Oct 9, 2020 at 12:47 PM Warner Losh wrote: > > > On Fri, Oct 9, 2020, 12:20 PM Renato Botelho wrote: > >> On 09/10/20 15:16, Renato Botelho wrote: >> > On 09/10/20 13:57, Warner Losh wrote: >> >> >> >> >> >> On Fri, Oct 9, 2020 at 10:19 AM Renato Botelho > >> > wrote: >> >> >> >> On 09/10/20 12:29, Warner Losh wrote: >> >> > Author: imp >> >> > Date: Fri Oct 9 15:29:05 2020 >> >> > New Revision: 366578 >> >> > URL: https://svnweb.freebsd.org/changeset/base/366578 >> >> >> >> > >> >> > Log: >> >> > Avoid using single quotes in arguments to logger. >> >> > >> >> > Single quotes interfere with the workaround put in with >> >> r335753 and >> >> > aren't necessary in this case. I believe that all the >> >> underling issues >> >> > with r335753 have been corrected, but need to do more >> extensive >> >> > followup before reverting it as a bad idea. >> >> >> >> Hi Warner, >> >> >> >> How to proceed if it's needed to pass multiple parameters to a >> >> command >> >> in following format? >> >> >> >> cmd param1 'param2 has spaces and a $variable' >> >> >> >> >> >> action "cmd param1 'param2 has spaces and a '$variable"; >> >> >> >> should do the trick. I'm documenting this now... >> > >> > It worked!! Thanks! >> >> Oooops, too fast. >> >> I wrote this script: >> >> #!/bin/sh >> >> echo "Param1 = '${1}'" >> /root/log >> echo "Param2 = '${2}'" >> /root/log >> >> And added this action on devd config: >> >> notify 0 { >> match "system" "IFNET"; >> match "type" "LINK_UP"; >> media-type "ethernet"; >> action "/root/log.sh -c 'interface linkup start '$subsystem"; >> }; >> >> notify 0 { >> match "system" "IFNET"; >> match "type" "LINK_DOWN"; >> media-type "ethernet"; >> action "/root/log.sh -c 'interface linkup stop '$subsystem"; >> }; >> >> And got the following output on /root/log: >> >> Param1 = '-c' >> Param2 = 'interface linkup start $em0' >> > > Doh. I'll dig deeper. > It works for me. Did you remember to kill -HUP devd? Warner From owner-svn-src-all@freebsd.org Fri Oct 9 20:20:43 2020 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 5E9A742C08C; Fri, 9 Oct 2020 20:20:43 +0000 (UTC) (envelope-from jhb@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7KFl1tPwz4qCS; Fri, 9 Oct 2020 20:20:43 +0000 (UTC) (envelope-from jhb@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 1FC301EF58; Fri, 9 Oct 2020 20:20:43 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099KKhOP030800; Fri, 9 Oct 2020 20:20:43 GMT (envelope-from jhb@FreeBSD.org) Received: (from jhb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099KKgPM030799; Fri, 9 Oct 2020 20:20:42 GMT (envelope-from jhb@FreeBSD.org) Message-Id: <202010092020.099KKgPM030799@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jhb set sender to jhb@FreeBSD.org using -f From: John Baldwin Date: Fri, 9 Oct 2020 20:20:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366584 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: jhb X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366584 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.33 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: Fri, 09 Oct 2020 20:20:43 -0000 Author: jhb Date: Fri Oct 9 20:20:42 2020 New Revision: 366584 URL: https://svnweb.freebsd.org/changeset/base/366584 Log: Don't invoke semunload() if seminit() fails during MOD_LOAD. The module handler code invokes a MOD_UNLOAD event immediately if MOD_LOAD fails. The result was that if seminit() failed, semunload() was invoked twice. semunload() is not idempotent however and would try to remove it's process_exit eventhandler twice resulting in a panic. Reviewed by: kib, markj Obtained from: CheriBSD MFC after: 1 month Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D26696 Modified: head/sys/kern/sysv_sem.c Modified: head/sys/kern/sysv_sem.c ============================================================================== --- head/sys/kern/sysv_sem.c Fri Oct 9 19:12:44 2020 (r366583) +++ head/sys/kern/sysv_sem.c Fri Oct 9 20:20:42 2020 (r366584) @@ -381,8 +381,6 @@ sysvsem_modload(struct module *module, int cmd, void * switch (cmd) { case MOD_LOAD: error = seminit(); - if (error != 0) - semunload(); break; case MOD_UNLOAD: error = semunload(); From owner-svn-src-all@freebsd.org Fri Oct 9 20:31:43 2020 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 7F69C42C504; Fri, 9 Oct 2020 20:31:43 +0000 (UTC) (envelope-from mjg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7KVR2pspz4rD5; Fri, 9 Oct 2020 20:31:43 +0000 (UTC) (envelope-from mjg@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 42B261F0C1; Fri, 9 Oct 2020 20:31:43 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099KVhjT040735; Fri, 9 Oct 2020 20:31:43 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099KVhxm040734; Fri, 9 Oct 2020 20:31:43 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010092031.099KVhxm040734@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Fri, 9 Oct 2020 20:31:43 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366587 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366587 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.33 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: Fri, 09 Oct 2020 20:31:43 -0000 Author: mjg Date: Fri Oct 9 20:31:42 2020 New Revision: 366587 URL: https://svnweb.freebsd.org/changeset/base/366587 Log: vfs: fix a panic when truncating comming from copy_file_range Truncating requires an exclusive lock, but it was not taken if the filesystem indicates support for shared writes. This only concerns ZFS. In particular fixes cp of files which have trailing holes. Reported by: bdrewery Modified: head/sys/kern/vfs_vnops.c Modified: head/sys/kern/vfs_vnops.c ============================================================================== --- head/sys/kern/vfs_vnops.c Fri Oct 9 20:30:27 2020 (r366586) +++ head/sys/kern/vfs_vnops.c Fri Oct 9 20:31:42 2020 (r366587) @@ -2975,18 +2975,22 @@ vn_write_outvp(struct vnode *outvp, char *dat, off_t o bwillwrite(); mp = NULL; error = vn_start_write(outvp, &mp, V_WAIT); - if (error == 0) { + if (error != 0) + break; + if (growfile) { + error = vn_lock(outvp, LK_EXCLUSIVE); + if (error == 0) { + error = vn_truncate_locked(outvp, outoff + xfer, + false, cred); + VOP_UNLOCK(outvp); + } + } else { if (MNT_SHARED_WRITES(mp)) lckf = LK_SHARED; else lckf = LK_EXCLUSIVE; error = vn_lock(outvp, lckf); - } - if (error == 0) { - if (growfile) - error = vn_truncate_locked(outvp, outoff + xfer, - false, cred); - else { + if (error == 0) { error = vn_rdwr(UIO_WRITE, outvp, dat, xfer2, outoff, UIO_SYSSPACE, IO_NODELOCKED, curthread->td_ucred, cred, NULL, curthread); From owner-svn-src-all@freebsd.org Fri Oct 9 21:01:53 2020 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 D7F5F42CFCD; Fri, 9 Oct 2020 21:01:53 +0000 (UTC) (envelope-from imp@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7L9F5PmQz4sl3; Fri, 9 Oct 2020 21:01:53 +0000 (UTC) (envelope-from imp@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 9C6831FB2B; Fri, 9 Oct 2020 21:01:53 +0000 (UTC) (envelope-from imp@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099L1reB060370; Fri, 9 Oct 2020 21:01:53 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099L1rxQ060369; Fri, 9 Oct 2020 21:01:53 GMT (envelope-from imp@FreeBSD.org) Message-Id: <202010092101.099L1rxQ060369@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 9 Oct 2020 21:01:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366588 - stable/12/stand/efi/loader X-SVN-Group: stable-12 X-SVN-Commit-Author: imp X-SVN-Commit-Paths: stable/12/stand/efi/loader X-SVN-Commit-Revision: 366588 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.33 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: Fri, 09 Oct 2020 21:01:53 -0000 Author: imp Date: Fri Oct 9 21:01:53 2020 New Revision: 366588 URL: https://svnweb.freebsd.org/changeset/base/366588 Log: MFC: r366216 imp Fix video on PCI heuristic The video on PCI heuristic was broken. It was supposed to infer a video device when the last element of the path was a PCI DEVICE PATH node. However, the last node in the device path is an END node, so this heuristic never fired. This leads, among other things, to bhyve only producing output in the serial connection once we leave the boot loader. This restores the dual headed boot on bhyve + UEFI (as we did in 11.2), but will favor serial in the absence of other config which may be a change from 11.2. MFC After: 3 days Differential Revision: https://reviews.freebsd.org/D26572 Modified: stable/12/stand/efi/loader/main.c Directory Properties: stable/12/ (props changed) Modified: stable/12/stand/efi/loader/main.c ============================================================================== --- stable/12/stand/efi/loader/main.c Fri Oct 9 20:31:42 2020 (r366587) +++ stable/12/stand/efi/loader/main.c Fri Oct 9 21:01:53 2020 (r366588) @@ -717,6 +717,10 @@ parse_uefi_con_out(void) ep = buf + sz; node = (EFI_DEVICE_PATH *)buf; while ((char *)node < ep) { + if (IsDevicePathEndType(node)) { + if (pci_pending && vid_seen == 0) + vid_seen = ++seen; + } pci_pending = false; if (DevicePathType(node) == ACPI_DEVICE_PATH && DevicePathSubType(node) == ACPI_DP) { @@ -749,8 +753,6 @@ parse_uefi_con_out(void) } node = NextDevicePathNode(node); /* Skip the end node */ } - if (pci_pending && vid_seen == 0) - vid_seen = ++seen; /* * Truth table for RB_MULTIPLE | RB_SERIAL From owner-svn-src-all@freebsd.org Fri Oct 9 22:23:40 2020 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 3F6B342F282; Fri, 9 Oct 2020 22:23:40 +0000 (UTC) (envelope-from np@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7Mzc1Jbrz3VLv; Fri, 9 Oct 2020 22:23:40 +0000 (UTC) (envelope-from np@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 EB3DC20577; Fri, 9 Oct 2020 22:23:39 +0000 (UTC) (envelope-from np@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099MNdIt012570; Fri, 9 Oct 2020 22:23:39 GMT (envelope-from np@FreeBSD.org) Received: (from np@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099MNdOD012568; Fri, 9 Oct 2020 22:23:39 GMT (envelope-from np@FreeBSD.org) Message-Id: <202010092223.099MNdOD012568@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: np set sender to np@FreeBSD.org using -f From: Navdeep Parhar Date: Fri, 9 Oct 2020 22:23:39 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366589 - in head/sys/dev/cxgbe: . common X-SVN-Group: head X-SVN-Commit-Author: np X-SVN-Commit-Paths: in head/sys/dev/cxgbe: . common X-SVN-Commit-Revision: 366589 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.33 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: Fri, 09 Oct 2020 22:23:40 -0000 Author: np Date: Fri Oct 9 22:23:39 2020 New Revision: 366589 URL: https://svnweb.freebsd.org/changeset/base/366589 Log: cxgbe(4): More fixes for the T6 FCS error counter. r365732 was the first attempt to get an accurate count but it was writing to some read-only registers to clear them and that obviously didn't work. Instead, note the counter's value when it is supposed to be cleared and subtract it from future readings. dev..stats.rx_fcs_error should not be serviced from the MPS register for T6. The stats.* sysctls should all use T5_PORT_REG for T5 and above. This must have been missed in the initial T5 support years ago. Fix it while here. MFC after: 3 days Sponsored by: Chelsio Communications Modified: head/sys/dev/cxgbe/adapter.h head/sys/dev/cxgbe/common/t4_hw.c head/sys/dev/cxgbe/t4_main.c Modified: head/sys/dev/cxgbe/adapter.h ============================================================================== --- head/sys/dev/cxgbe/adapter.h Fri Oct 9 21:01:53 2020 (r366588) +++ head/sys/dev/cxgbe/adapter.h Fri Oct 9 22:23:39 2020 (r366589) @@ -314,6 +314,8 @@ struct port_info { struct port_stats stats; u_int tnl_cong_drops; u_int tx_parse_error; + int fcs_reg; + uint64_t fcs_base; u_long tx_toe_tls_records; u_long tx_toe_tls_octets; u_long rx_toe_tls_records; Modified: head/sys/dev/cxgbe/common/t4_hw.c ============================================================================== --- head/sys/dev/cxgbe/common/t4_hw.c Fri Oct 9 21:01:53 2020 (r366588) +++ head/sys/dev/cxgbe/common/t4_hw.c Fri Oct 9 22:23:39 2020 (r366589) @@ -6852,8 +6852,8 @@ void t4_get_port_stats_offset(struct adapter *adap, in */ void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p) { - u32 bgmap = adap2pinfo(adap, idx)->mps_bg_map; - struct link_config *lc = &adap->port[idx]->link_cfg; + struct port_info *pi = adap->port[idx]; + u32 bgmap = pi->mps_bg_map; u32 stat_ctl = t4_read_reg(adap, A_MPS_STAT_CTL); #define GET_STAT(name) \ @@ -6922,25 +6922,8 @@ void t4_get_port_stats(struct adapter *adap, int idx, p->rx_ppp6 = GET_STAT(RX_PORT_PPP6); p->rx_ppp7 = GET_STAT(RX_PORT_PPP7); - /* - * The T6's MPS's RX_PORT_CRC_ERROR register doesn't actually count CRC - * errors so get that information from the MAC instead. Which MAC is in - * use depends on speed and FEC. The MAC counters clear on reset or - * link state change so we are only reporting errors for this - * incarnation of the link here. - */ - if (chip_id(adap) != CHELSIO_T6) - p->rx_fcs_err = GET_STAT(RX_PORT_CRC_ERROR); - else if (lc->link_ok) { - if (lc->speed > 25000 || - (lc->speed == 25000 && lc->fec == FEC_RS)) { - p->rx_fcs_err = t4_read_reg64(adap, T5_PORT_REG(idx, - A_MAC_PORT_AFRAMECHECKSEQUENCEERRORS)); - } else { - p->rx_fcs_err = t4_read_reg64(adap, T5_PORT_REG(idx, - A_MAC_PORT_MTIP_1G10G_RX_CRCERRORS)); - } - } + if (pi->fcs_reg != -1) + p->rx_fcs_err = t4_read_reg64(adap, pi->fcs_reg) - pi->fcs_base; if (chip_id(adap) >= CHELSIO_T5) { if (stat_ctl & F_COUNTPAUSESTATRX) { @@ -10769,12 +10752,6 @@ void t4_clr_port_stats(struct adapter *adap, int idx) t4_write_reg(adap, A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L + i * 8, 0); } - if (chip_id(adap) == CHELSIO_T6) { - t4_write_reg64(adap, T5_PORT_REG(idx, - A_MAC_PORT_AFRAMECHECKSEQUENCEERRORS), 0); - t4_write_reg64(adap, T5_PORT_REG(idx, - A_MAC_PORT_MTIP_1G10G_RX_CRCERRORS), 0); - } } /** Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Fri Oct 9 21:01:53 2020 (r366588) +++ head/sys/dev/cxgbe/t4_main.c Fri Oct 9 22:23:39 2020 (r366589) @@ -1253,6 +1253,23 @@ t4_attach(device_t dev) mtx_init(&pi->pi_lock, pi->lockname, 0, MTX_DEF); sc->chan_map[pi->tx_chan] = i; + /* + * The MPS counter for FCS errors doesn't work correctly on the + * T6 so we use the MAC counter here. Which MAC is in use + * depends on the link settings which will be known when the + * link comes up. + */ + if (is_t6(sc)) { + pi->fcs_reg = -1; + } else if (is_t4(sc)) { + pi->fcs_reg = PORT_REG(pi->tx_chan, + A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L); + } else { + pi->fcs_reg = T5_PORT_REG(pi->tx_chan, + A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L); + } + pi->fcs_base = 0; + /* All VIs on this port share this media. */ ifmedia_init(&pi->media, IFM_IMASK, cxgbe_media_change, cxgbe_media_status); @@ -7049,155 +7066,88 @@ cxgbe_sysctls(struct port_info *pi) &pi->tx_parse_error, 0, "# of tx packets with invalid length or # of segments"); -#define SYSCTL_ADD_T4_REG64(pi, name, desc, reg) \ - SYSCTL_ADD_OID(ctx, children, OID_AUTO, name, \ - CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, reg, \ +#define T4_REGSTAT(name, stat, desc) \ + SYSCTL_ADD_OID(ctx, children, OID_AUTO, #name, \ + CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, \ + (is_t4(sc) ? PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_##stat##_L) : \ + T5_PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_##stat##_L)), \ sysctl_handle_t4_reg64, "QU", desc) - SYSCTL_ADD_T4_REG64(pi, "tx_octets", "# of octets in good frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BYTES_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_frames", "total # of good frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_FRAMES_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_bcast_frames", "# of broadcast frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_BCAST_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_mcast_frames", "# of multicast frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_MCAST_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ucast_frames", "# of unicast frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_UCAST_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_error_frames", "# of error frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_ERROR_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_frames_64", - "# of tx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_64B_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_frames_65_127", - "# of tx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_65B_127B_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_frames_128_255", - "# of tx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_128B_255B_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_frames_256_511", - "# of tx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_256B_511B_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_frames_512_1023", - "# of tx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_512B_1023B_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_frames_1024_1518", - "# of tx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1024B_1518B_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_frames_1519_max", - "# of tx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_1519B_MAX_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_drop", "# of dropped tx frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_DROP_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_pause", "# of pause frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PAUSE_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ppp0", "# of PPP prio 0 frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP0_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ppp1", "# of PPP prio 1 frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP1_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ppp2", "# of PPP prio 2 frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP2_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ppp3", "# of PPP prio 3 frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP3_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ppp4", "# of PPP prio 4 frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP4_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ppp5", "# of PPP prio 5 frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP5_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ppp6", "# of PPP prio 6 frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP6_L)); - SYSCTL_ADD_T4_REG64(pi, "tx_ppp7", "# of PPP prio 7 frames transmitted", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_TX_PORT_PPP7_L)); - - SYSCTL_ADD_T4_REG64(pi, "rx_octets", "# of octets in good frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BYTES_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_frames", "total # of good frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_FRAMES_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_bcast_frames", "# of broadcast frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_BCAST_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_mcast_frames", "# of multicast frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MCAST_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ucast_frames", "# of unicast frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_UCAST_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_too_long", "# of frames exceeding MTU", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_ERROR_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_jabber", "# of jabber frames", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_MTU_CRC_ERROR_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_fcs_err", - "# of frames received with bad FCS", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_CRC_ERROR_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_len_err", - "# of frames received with length error", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LEN_ERROR_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_symbol_err", "symbol errors", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_SYM_ERROR_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_runt", "# of short frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_LESS_64B_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_frames_64", - "# of rx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_64B_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_frames_65_127", - "# of rx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_65B_127B_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_frames_128_255", - "# of rx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_128B_255B_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_frames_256_511", - "# of rx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_256B_511B_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_frames_512_1023", - "# of rx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_512B_1023B_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_frames_1024_1518", - "# of rx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1024B_1518B_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_frames_1519_max", - "# of rx frames in this range", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_1519B_MAX_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_pause", "# of pause frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PAUSE_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ppp0", "# of PPP prio 0 frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP0_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ppp1", "# of PPP prio 1 frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP1_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ppp2", "# of PPP prio 2 frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP2_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ppp3", "# of PPP prio 3 frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP3_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ppp4", "# of PPP prio 4 frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP4_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ppp5", "# of PPP prio 5 frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP5_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ppp6", "# of PPP prio 6 frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP6_L)); - SYSCTL_ADD_T4_REG64(pi, "rx_ppp7", "# of PPP prio 7 frames received", - PORT_REG(pi->tx_chan, A_MPS_PORT_STAT_RX_PORT_PPP7_L)); - -#undef SYSCTL_ADD_T4_REG64 - -#define SYSCTL_ADD_T4_PORTSTAT(name, desc) \ +/* We get these from port_stats and they may be stale by up to 1s */ +#define T4_PORTSTAT(name, desc) \ SYSCTL_ADD_UQUAD(ctx, children, OID_AUTO, #name, CTLFLAG_RD, \ &pi->stats.name, desc) - /* We get these from port_stats and they may be stale by up to 1s */ - SYSCTL_ADD_T4_PORTSTAT(rx_ovflow0, - "# drops due to buffer-group 0 overflows"); - SYSCTL_ADD_T4_PORTSTAT(rx_ovflow1, - "# drops due to buffer-group 1 overflows"); - SYSCTL_ADD_T4_PORTSTAT(rx_ovflow2, - "# drops due to buffer-group 2 overflows"); - SYSCTL_ADD_T4_PORTSTAT(rx_ovflow3, - "# drops due to buffer-group 3 overflows"); - SYSCTL_ADD_T4_PORTSTAT(rx_trunc0, - "# of buffer-group 0 truncated packets"); - SYSCTL_ADD_T4_PORTSTAT(rx_trunc1, - "# of buffer-group 1 truncated packets"); - SYSCTL_ADD_T4_PORTSTAT(rx_trunc2, - "# of buffer-group 2 truncated packets"); - SYSCTL_ADD_T4_PORTSTAT(rx_trunc3, - "# of buffer-group 3 truncated packets"); + T4_REGSTAT(tx_octets, TX_PORT_BYTES, "# of octets in good frames"); + T4_REGSTAT(tx_frames, TX_PORT_FRAMES, "total # of good frames"); + T4_REGSTAT(tx_bcast_frames, TX_PORT_BCAST, "# of broadcast frames"); + T4_REGSTAT(tx_mcast_frames, TX_PORT_MCAST, "# of multicast frames"); + T4_REGSTAT(tx_ucast_frames, TX_PORT_UCAST, "# of unicast frames"); + T4_REGSTAT(tx_error_frames, TX_PORT_ERROR, "# of error frames"); + T4_REGSTAT(tx_frames_64, TX_PORT_64B, "# of tx frames in this range"); + T4_REGSTAT(tx_frames_65_127, TX_PORT_65B_127B, "# of tx frames in this range"); + T4_REGSTAT(tx_frames_128_255, TX_PORT_128B_255B, "# of tx frames in this range"); + T4_REGSTAT(tx_frames_256_511, TX_PORT_256B_511B, "# of tx frames in this range"); + T4_REGSTAT(tx_frames_512_1023, TX_PORT_512B_1023B, "# of tx frames in this range"); + T4_REGSTAT(tx_frames_1024_1518, TX_PORT_1024B_1518B, "# of tx frames in this range"); + T4_REGSTAT(tx_frames_1519_max, TX_PORT_1519B_MAX, "# of tx frames in this range"); + T4_REGSTAT(tx_drop, TX_PORT_DROP, "# of dropped tx frames"); + T4_REGSTAT(tx_pause, TX_PORT_PAUSE, "# of pause frames transmitted"); + T4_REGSTAT(tx_ppp0, TX_PORT_PPP0, "# of PPP prio 0 frames transmitted"); + T4_REGSTAT(tx_ppp1, TX_PORT_PPP1, "# of PPP prio 1 frames transmitted"); + T4_REGSTAT(tx_ppp2, TX_PORT_PPP2, "# of PPP prio 2 frames transmitted"); + T4_REGSTAT(tx_ppp3, TX_PORT_PPP3, "# of PPP prio 3 frames transmitted"); + T4_REGSTAT(tx_ppp4, TX_PORT_PPP4, "# of PPP prio 4 frames transmitted"); + T4_REGSTAT(tx_ppp5, TX_PORT_PPP5, "# of PPP prio 5 frames transmitted"); + T4_REGSTAT(tx_ppp6, TX_PORT_PPP6, "# of PPP prio 6 frames transmitted"); + T4_REGSTAT(tx_ppp7, TX_PORT_PPP7, "# of PPP prio 7 frames transmitted"); -#undef SYSCTL_ADD_T4_PORTSTAT + T4_REGSTAT(rx_octets, RX_PORT_BYTES, "# of octets in good frames"); + T4_REGSTAT(rx_frames, RX_PORT_FRAMES, "total # of good frames"); + T4_REGSTAT(rx_bcast_frames, RX_PORT_BCAST, "# of broadcast frames"); + T4_REGSTAT(rx_mcast_frames, RX_PORT_MCAST, "# of multicast frames"); + T4_REGSTAT(rx_ucast_frames, RX_PORT_UCAST, "# of unicast frames"); + T4_REGSTAT(rx_too_long, RX_PORT_MTU_ERROR, "# of frames exceeding MTU"); + T4_REGSTAT(rx_jabber, RX_PORT_MTU_CRC_ERROR, "# of jabber frames"); + if (is_t6(sc)) { + T4_PORTSTAT(rx_fcs_err, + "# of frames received with bad FCS since last link up"); + } else { + T4_REGSTAT(rx_fcs_err, RX_PORT_CRC_ERROR, + "# of frames received with bad FCS"); + } + T4_REGSTAT(rx_len_err, RX_PORT_LEN_ERROR, "# of frames received with length error"); + T4_REGSTAT(rx_symbol_err, RX_PORT_SYM_ERROR, "symbol errors"); + T4_REGSTAT(rx_runt, RX_PORT_LESS_64B, "# of short frames received"); + T4_REGSTAT(rx_frames_64, RX_PORT_64B, "# of rx frames in this range"); + T4_REGSTAT(rx_frames_65_127, RX_PORT_65B_127B, "# of rx frames in this range"); + T4_REGSTAT(rx_frames_128_255, RX_PORT_128B_255B, "# of rx frames in this range"); + T4_REGSTAT(rx_frames_256_511, RX_PORT_256B_511B, "# of rx frames in this range"); + T4_REGSTAT(rx_frames_512_1023, RX_PORT_512B_1023B, "# of rx frames in this range"); + T4_REGSTAT(rx_frames_1024_1518, RX_PORT_1024B_1518B, "# of rx frames in this range"); + T4_REGSTAT(rx_frames_1519_max, RX_PORT_1519B_MAX, "# of rx frames in this range"); + T4_REGSTAT(rx_pause, RX_PORT_PAUSE, "# of pause frames received"); + T4_REGSTAT(rx_ppp0, RX_PORT_PPP0, "# of PPP prio 0 frames received"); + T4_REGSTAT(rx_ppp1, RX_PORT_PPP1, "# of PPP prio 1 frames received"); + T4_REGSTAT(rx_ppp2, RX_PORT_PPP2, "# of PPP prio 2 frames received"); + T4_REGSTAT(rx_ppp3, RX_PORT_PPP3, "# of PPP prio 3 frames received"); + T4_REGSTAT(rx_ppp4, RX_PORT_PPP4, "# of PPP prio 4 frames received"); + T4_REGSTAT(rx_ppp5, RX_PORT_PPP5, "# of PPP prio 5 frames received"); + T4_REGSTAT(rx_ppp6, RX_PORT_PPP6, "# of PPP prio 6 frames received"); + T4_REGSTAT(rx_ppp7, RX_PORT_PPP7, "# of PPP prio 7 frames received"); + T4_PORTSTAT(rx_ovflow0, "# drops due to buffer-group 0 overflows"); + T4_PORTSTAT(rx_ovflow1, "# drops due to buffer-group 1 overflows"); + T4_PORTSTAT(rx_ovflow2, "# drops due to buffer-group 2 overflows"); + T4_PORTSTAT(rx_ovflow3, "# drops due to buffer-group 3 overflows"); + T4_PORTSTAT(rx_trunc0, "# of buffer-group 0 truncated packets"); + T4_PORTSTAT(rx_trunc1, "# of buffer-group 1 truncated packets"); + T4_PORTSTAT(rx_trunc2, "# of buffer-group 2 truncated packets"); + T4_PORTSTAT(rx_trunc3, "# of buffer-group 3 truncated packets"); + +#undef T4_REGSTAT +#undef T4_PORTSTAT + SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, "tx_toe_tls_records", CTLFLAG_RD, &pi->tx_toe_tls_records, "# of TOE TLS records transmitted"); @@ -10560,6 +10510,12 @@ clear_stats(struct adapter *sc, u_int port_id) /* MAC stats */ t4_clr_port_stats(sc, pi->tx_chan); + if (is_t6(sc)) { + if (pi->fcs_reg != -1) + pi->fcs_base = t4_read_reg64(sc, pi->fcs_reg); + else + pi->stats.rx_fcs_err = 0; + } pi->tx_parse_error = 0; pi->tnl_cong_drops = 0; mtx_lock(&sc->reg_lock); @@ -10732,17 +10688,37 @@ t4_os_link_changed(struct port_info *pi) { struct vi_info *vi; struct ifnet *ifp; - struct link_config *lc; + struct link_config *lc = &pi->link_cfg; + struct adapter *sc = pi->adapter; int v; PORT_LOCK_ASSERT_OWNED(pi); + if (is_t6(sc)) { + if (lc->link_ok) { + if (lc->speed > 25000 || + (lc->speed == 25000 && lc->fec == FEC_RS)) { + pi->fcs_reg = T5_PORT_REG(pi->tx_chan, + A_MAC_PORT_AFRAMECHECKSEQUENCEERRORS); + } else { + pi->fcs_reg = T5_PORT_REG(pi->tx_chan, + A_MAC_PORT_MTIP_1G10G_RX_CRCERRORS); + } + pi->fcs_base = t4_read_reg64(sc, pi->fcs_reg); + pi->stats.rx_fcs_err = 0; + } else { + pi->fcs_reg = -1; + } + } else { + MPASS(pi->fcs_reg != -1); + MPASS(pi->fcs_base == 0); + } + for_each_vi(pi, v, vi) { ifp = vi->ifp; if (ifp == NULL) continue; - lc = &pi->link_cfg; if (lc->link_ok) { ifp->if_baudrate = IF_Mbps(lc->speed); if_link_state_change(ifp, LINK_STATE_UP); From owner-svn-src-all@freebsd.org Fri Oct 9 22:42:05 2020 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 9091742F2F7; Fri, 9 Oct 2020 22:42:05 +0000 (UTC) (envelope-from allanjude@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7NNs38ZYz3WJg; Fri, 9 Oct 2020 22:42:05 +0000 (UTC) (envelope-from allanjude@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 357BF20951; Fri, 9 Oct 2020 22:42:05 +0000 (UTC) (envelope-from allanjude@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099Mg4pA024810; Fri, 9 Oct 2020 22:42:04 GMT (envelope-from allanjude@FreeBSD.org) Received: (from allanjude@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099Mg4Lg024808; Fri, 9 Oct 2020 22:42:04 GMT (envelope-from allanjude@FreeBSD.org) Message-Id: <202010092242.099Mg4Lg024808@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: allanjude set sender to allanjude@FreeBSD.org using -f From: Allan Jude Date: Fri, 9 Oct 2020 22:42:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366590 - in stable/12: stand/libsa/zfs usr.bin/netstat X-SVN-Group: stable-12 X-SVN-Commit-Author: allanjude X-SVN-Commit-Paths: in stable/12: stand/libsa/zfs usr.bin/netstat X-SVN-Commit-Revision: 366590 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.33 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: Fri, 09 Oct 2020 22:42:05 -0000 Author: allanjude Date: Fri Oct 9 22:42:04 2020 New Revision: 366590 URL: https://svnweb.freebsd.org/changeset/base/366590 Log: MFC r364787: ZFS: whitelist zstd and encryption in the loader Please note that neither zstd nor encryption is supported by the loader at this instant. This change makes it safe to use those features in one's root pool, but not in one's root dataset. Modified: stable/12/stand/libsa/zfs/zfsimpl.c stable/12/usr.bin/netstat/route.c Directory Properties: stable/12/ (props changed) Modified: stable/12/stand/libsa/zfs/zfsimpl.c ============================================================================== --- stable/12/stand/libsa/zfs/zfsimpl.c Fri Oct 9 22:23:39 2020 (r366589) +++ stable/12/stand/libsa/zfs/zfsimpl.c Fri Oct 9 22:42:04 2020 (r366590) @@ -127,6 +127,8 @@ static const char *features_for_read[] = { "com.delphix:device_removal", "com.delphix:obsolete_counts", "com.intel:allocation_classes", + "org.freebsd:zstd_compress", + "com.datto:encryption", NULL }; Modified: stable/12/usr.bin/netstat/route.c ============================================================================== --- stable/12/usr.bin/netstat/route.c Fri Oct 9 22:23:39 2020 (r366589) +++ stable/12/usr.bin/netstat/route.c Fri Oct 9 22:42:04 2020 (r366590) @@ -772,12 +772,7 @@ rt_stats(void) xo_emit("{W:rtstat: symbol not in namelist}\n"); return; } - if ((rttaddr = nl[N_RTTRASH].n_value) == 0) { - xo_emit("{W:rttrash: symbol not in namelist}\n"); - return; - } kread(rtsaddr, (char *)&rtstat, sizeof (rtstat)); - kread(rttaddr, (char *)&rttrash, sizeof (rttrash)); xo_emit("{T:routing}:\n"); #define p(f, m) if (rtstat.f || sflag <= 1) \ @@ -793,7 +788,17 @@ rt_stats(void) "{N:/destination%s found unreachable}\n"); p(rts_wildcard, "\t{:wildcard-uses/%hu} " "{N:/use%s of a wildcard route}\n"); + p(rts_nh_idx_alloc_failure, "\t{:nexthop-index-alloc-failures/%hu} " + "{N:/nexthop index alloc failure%s}\n"); + p(rts_nh_alloc_failure, "\t{:nexthop-alloc-failures/%hu} " + "{N:/nexthop allocation failure%s}\n"); #undef p + + if ((rttaddr = nl[N_RTTRASH].n_value) == 0) { + xo_emit("{W:rttrash: symbol not in namelist}\n"); + return; + } + kread(rttaddr, (char *)&rttrash, sizeof (rttrash)); if (rttrash || sflag <= 1) xo_emit("\t{:unused-but-not-freed/%u} " From owner-svn-src-all@freebsd.org Fri Oct 9 22:50:16 2020 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 BC50C42FB20; Fri, 9 Oct 2020 22:50:16 +0000 (UTC) (envelope-from allanjude@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7NZJ4YzBz3WZj; Fri, 9 Oct 2020 22:50:16 +0000 (UTC) (envelope-from allanjude@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 800F5208CC; Fri, 9 Oct 2020 22:50:16 +0000 (UTC) (envelope-from allanjude@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099MoGxu025398; Fri, 9 Oct 2020 22:50:16 GMT (envelope-from allanjude@FreeBSD.org) Received: (from allanjude@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099MoGnj025397; Fri, 9 Oct 2020 22:50:16 GMT (envelope-from allanjude@FreeBSD.org) Message-Id: <202010092250.099MoGnj025397@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: allanjude set sender to allanjude@FreeBSD.org using -f From: Allan Jude Date: Fri, 9 Oct 2020 22:50:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366591 - stable/12/stand/efi/loader X-SVN-Group: stable-12 X-SVN-Commit-Author: allanjude X-SVN-Commit-Paths: stable/12/stand/efi/loader X-SVN-Commit-Revision: 366591 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.33 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: Fri, 09 Oct 2020 22:50:16 -0000 Author: allanjude Date: Fri Oct 9 22:50:16 2020 New Revision: 366591 URL: https://svnweb.freebsd.org/changeset/base/366591 Log: Revert r366590 that contains garbage Modified: stable/12/stand/efi/loader/main.c Directory Properties: stable/12/ (props changed) Modified: stable/12/stand/efi/loader/main.c ============================================================================== --- stable/12/stand/efi/loader/main.c Fri Oct 9 22:42:04 2020 (r366590) +++ stable/12/stand/efi/loader/main.c Fri Oct 9 22:50:16 2020 (r366591) @@ -717,10 +717,6 @@ parse_uefi_con_out(void) ep = buf + sz; node = (EFI_DEVICE_PATH *)buf; while ((char *)node < ep) { - if (IsDevicePathEndType(node)) { - if (pci_pending && vid_seen == 0) - vid_seen = ++seen; - } pci_pending = false; if (DevicePathType(node) == ACPI_DEVICE_PATH && DevicePathSubType(node) == ACPI_DP) { @@ -753,6 +749,8 @@ parse_uefi_con_out(void) } node = NextDevicePathNode(node); /* Skip the end node */ } + if (pci_pending && vid_seen == 0) + vid_seen = ++seen; /* * Truth table for RB_MULTIPLE | RB_SERIAL From owner-svn-src-all@freebsd.org Fri Oct 9 22:59:29 2020 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 3BDD242FA6D; Fri, 9 Oct 2020 22:59:29 +0000 (UTC) (envelope-from allanjude@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7Nmx0qQ3z3X10; Fri, 9 Oct 2020 22:59:29 +0000 (UTC) (envelope-from allanjude@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 D7CEF20E38; Fri, 9 Oct 2020 22:59:28 +0000 (UTC) (envelope-from allanjude@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099MxSjK031513; Fri, 9 Oct 2020 22:59:28 GMT (envelope-from allanjude@FreeBSD.org) Received: (from allanjude@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099MxSsS031510; Fri, 9 Oct 2020 22:59:28 GMT (envelope-from allanjude@FreeBSD.org) Message-Id: <202010092259.099MxSsS031510@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: allanjude set sender to allanjude@FreeBSD.org using -f From: Allan Jude Date: Fri, 9 Oct 2020 22:59:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366592 - in stable/12: stand/efi/loader stand/libsa/zfs usr.bin/netstat X-SVN-Group: stable-12 X-SVN-Commit-Author: allanjude X-SVN-Commit-Paths: in stable/12: stand/efi/loader stand/libsa/zfs usr.bin/netstat X-SVN-Commit-Revision: 366592 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.33 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: Fri, 09 Oct 2020 22:59:29 -0000 Author: allanjude Date: Fri Oct 9 22:59:27 2020 New Revision: 366592 URL: https://svnweb.freebsd.org/changeset/base/366592 Log: Clean up the mess I made with r366590 and r366591 Modified: stable/12/stand/efi/loader/main.c stable/12/stand/libsa/zfs/zfsimpl.c stable/12/usr.bin/netstat/route.c Directory Properties: stable/12/ (props changed) Modified: stable/12/stand/efi/loader/main.c ============================================================================== --- stable/12/stand/efi/loader/main.c Fri Oct 9 22:50:16 2020 (r366591) +++ stable/12/stand/efi/loader/main.c Fri Oct 9 22:59:27 2020 (r366592) @@ -717,6 +717,10 @@ parse_uefi_con_out(void) ep = buf + sz; node = (EFI_DEVICE_PATH *)buf; while ((char *)node < ep) { + if (IsDevicePathEndType(node)) { + if (pci_pending && vid_seen == 0) + vid_seen = ++seen; + } pci_pending = false; if (DevicePathType(node) == ACPI_DEVICE_PATH && DevicePathSubType(node) == ACPI_DP) { @@ -749,8 +753,6 @@ parse_uefi_con_out(void) } node = NextDevicePathNode(node); /* Skip the end node */ } - if (pci_pending && vid_seen == 0) - vid_seen = ++seen; /* * Truth table for RB_MULTIPLE | RB_SERIAL Modified: stable/12/stand/libsa/zfs/zfsimpl.c ============================================================================== --- stable/12/stand/libsa/zfs/zfsimpl.c Fri Oct 9 22:50:16 2020 (r366591) +++ stable/12/stand/libsa/zfs/zfsimpl.c Fri Oct 9 22:59:27 2020 (r366592) @@ -127,8 +127,6 @@ static const char *features_for_read[] = { "com.delphix:device_removal", "com.delphix:obsolete_counts", "com.intel:allocation_classes", - "org.freebsd:zstd_compress", - "com.datto:encryption", NULL }; Modified: stable/12/usr.bin/netstat/route.c ============================================================================== --- stable/12/usr.bin/netstat/route.c Fri Oct 9 22:50:16 2020 (r366591) +++ stable/12/usr.bin/netstat/route.c Fri Oct 9 22:59:27 2020 (r366592) @@ -772,7 +772,12 @@ rt_stats(void) xo_emit("{W:rtstat: symbol not in namelist}\n"); return; } + if ((rttaddr = nl[N_RTTRASH].n_value) == 0) { + xo_emit("{W:rttrash: symbol not in namelist}\n"); + return; + } kread(rtsaddr, (char *)&rtstat, sizeof (rtstat)); + kread(rttaddr, (char *)&rttrash, sizeof (rttrash)); xo_emit("{T:routing}:\n"); #define p(f, m) if (rtstat.f || sflag <= 1) \ @@ -788,17 +793,7 @@ rt_stats(void) "{N:/destination%s found unreachable}\n"); p(rts_wildcard, "\t{:wildcard-uses/%hu} " "{N:/use%s of a wildcard route}\n"); - p(rts_nh_idx_alloc_failure, "\t{:nexthop-index-alloc-failures/%hu} " - "{N:/nexthop index alloc failure%s}\n"); - p(rts_nh_alloc_failure, "\t{:nexthop-alloc-failures/%hu} " - "{N:/nexthop allocation failure%s}\n"); #undef p - - if ((rttaddr = nl[N_RTTRASH].n_value) == 0) { - xo_emit("{W:rttrash: symbol not in namelist}\n"); - return; - } - kread(rttaddr, (char *)&rttrash, sizeof (rttrash)); if (rttrash || sflag <= 1) xo_emit("\t{:unused-but-not-freed/%u} " From owner-svn-src-all@freebsd.org Fri Oct 9 23:02:10 2020 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 8144342FDAA; Fri, 9 Oct 2020 23:02:10 +0000 (UTC) (envelope-from allanjude@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7Nr22xJ7z3XJx; Fri, 9 Oct 2020 23:02:10 +0000 (UTC) (envelope-from allanjude@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 48AF620DE2; Fri, 9 Oct 2020 23:02:10 +0000 (UTC) (envelope-from allanjude@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099N2AGv037102; Fri, 9 Oct 2020 23:02:10 GMT (envelope-from allanjude@FreeBSD.org) Received: (from allanjude@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099N2Axn037101; Fri, 9 Oct 2020 23:02:10 GMT (envelope-from allanjude@FreeBSD.org) Message-Id: <202010092302.099N2Axn037101@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: allanjude set sender to allanjude@FreeBSD.org using -f From: Allan Jude Date: Fri, 9 Oct 2020 23:02:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366593 - stable/12/stand/libsa/zfs X-SVN-Group: stable-12 X-SVN-Commit-Author: allanjude X-SVN-Commit-Paths: stable/12/stand/libsa/zfs X-SVN-Commit-Revision: 366593 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.33 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: Fri, 09 Oct 2020 23:02:10 -0000 Author: allanjude Date: Fri Oct 9 23:02:09 2020 New Revision: 366593 URL: https://svnweb.freebsd.org/changeset/base/366593 Log: MFC r364787: ZFS: whitelist zstd and encryption in the loader Please note that neither zstd nor encryption is supported by the loader at this instant. This change makes it safe to use those features in one's root pool, but not in one's root dataset. Modified: stable/12/stand/libsa/zfs/zfsimpl.c Directory Properties: stable/12/ (props changed) Modified: stable/12/stand/libsa/zfs/zfsimpl.c ============================================================================== --- stable/12/stand/libsa/zfs/zfsimpl.c Fri Oct 9 22:59:27 2020 (r366592) +++ stable/12/stand/libsa/zfs/zfsimpl.c Fri Oct 9 23:02:09 2020 (r366593) @@ -127,6 +127,8 @@ static const char *features_for_read[] = { "com.delphix:device_removal", "com.delphix:obsolete_counts", "com.intel:allocation_classes", + "org.freebsd:zstd_compress", + "com.datto:encryption", NULL }; From owner-svn-src-all@freebsd.org Fri Oct 9 23:49:43 2020 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 D2140430BCA; Fri, 9 Oct 2020 23:49:43 +0000 (UTC) (envelope-from bdrewery@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7Ptv51v2z3ZTc; Fri, 9 Oct 2020 23:49:43 +0000 (UTC) (envelope-from bdrewery@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 904ED219A0; Fri, 9 Oct 2020 23:49:43 +0000 (UTC) (envelope-from bdrewery@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 099NnhHO062778; Fri, 9 Oct 2020 23:49:43 GMT (envelope-from bdrewery@FreeBSD.org) Received: (from bdrewery@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 099Nngbw062774; Fri, 9 Oct 2020 23:49:42 GMT (envelope-from bdrewery@FreeBSD.org) Message-Id: <202010092349.099Nngbw062774@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bdrewery set sender to bdrewery@FreeBSD.org using -f From: Bryan Drewery Date: Fri, 9 Oct 2020 23:49:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366594 - in head/sys: kern sys vm X-SVN-Group: head X-SVN-Commit-Author: bdrewery X-SVN-Commit-Paths: in head/sys: kern sys vm X-SVN-Commit-Revision: 366594 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.33 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: Fri, 09 Oct 2020 23:49:43 -0000 Author: bdrewery Date: Fri Oct 9 23:49:42 2020 New Revision: 366594 URL: https://svnweb.freebsd.org/changeset/base/366594 Log: Use unlocked page lookup for inmem() to avoid object lock contention Reviewed By: kib, markj Submitted by: mlaier Sponsored by: Dell EMC Differential Revision: https://reviews.freebsd.org/D26653 Modified: head/sys/kern/vfs_bio.c head/sys/sys/buf.h head/sys/vm/vm_page.c head/sys/vm/vm_page.h Modified: head/sys/kern/vfs_bio.c ============================================================================== --- head/sys/kern/vfs_bio.c Fri Oct 9 23:02:09 2020 (r366593) +++ head/sys/kern/vfs_bio.c Fri Oct 9 23:49:42 2020 (r366594) @@ -154,7 +154,6 @@ caddr_t __read_mostly unmapped_buf; /* Used below and for softdep flushing threads in ufs/ffs/ffs_softdep.c */ struct proc *bufdaemonproc; -static int inmem(struct vnode *vp, daddr_t blkno); static void vm_hold_free_pages(struct buf *bp, int newbsize); static void vm_hold_load_pages(struct buf *bp, vm_offset_t from, vm_offset_t to); @@ -3585,48 +3584,54 @@ incore(struct bufobj *bo, daddr_t blkno) * associated VM object. This is like incore except * it also hunts around in the VM system for the data. */ - -static int +bool inmem(struct vnode * vp, daddr_t blkno) { vm_object_t obj; vm_offset_t toff, tinc, size; - vm_page_t m; + vm_page_t m, n; vm_ooffset_t off; + int valid; ASSERT_VOP_LOCKED(vp, "inmem"); if (incore(&vp->v_bufobj, blkno)) - return 1; + return (true); if (vp->v_mount == NULL) - return 0; + return (false); obj = vp->v_object; if (obj == NULL) - return (0); + return (false); size = PAGE_SIZE; if (size > vp->v_mount->mnt_stat.f_iosize) size = vp->v_mount->mnt_stat.f_iosize; off = (vm_ooffset_t)blkno * (vm_ooffset_t)vp->v_mount->mnt_stat.f_iosize; - VM_OBJECT_RLOCK(obj); for (toff = 0; toff < vp->v_mount->mnt_stat.f_iosize; toff += tinc) { - m = vm_page_lookup(obj, OFF_TO_IDX(off + toff)); - if (!m) - goto notinmem; + m = vm_page_lookup_unlocked(obj, OFF_TO_IDX(off + toff)); +recheck: + if (m == NULL) + return (false); + tinc = size; if (tinc > PAGE_SIZE - ((toff + off) & PAGE_MASK)) tinc = PAGE_SIZE - ((toff + off) & PAGE_MASK); - if (vm_page_is_valid(m, - (vm_offset_t) ((toff + off) & PAGE_MASK), tinc) == 0) - goto notinmem; + /* + * Consider page validity only if page mapping didn't change + * during the check. + */ + valid = vm_page_is_valid(m, + (vm_offset_t)((toff + off) & PAGE_MASK), tinc); + n = vm_page_lookup_unlocked(obj, OFF_TO_IDX(off + toff)); + if (m != n) { + m = n; + goto recheck; + } + if (!valid) + return (false); } - VM_OBJECT_RUNLOCK(obj); - return 1; - -notinmem: - VM_OBJECT_RUNLOCK(obj); - return (0); + return (true); } /* Modified: head/sys/sys/buf.h ============================================================================== --- head/sys/sys/buf.h Fri Oct 9 23:02:09 2020 (r366593) +++ head/sys/sys/buf.h Fri Oct 9 23:49:42 2020 (r366594) @@ -549,6 +549,7 @@ int vfs_bio_awrite(struct buf *); void vfs_busy_pages_acquire(struct buf *bp); void vfs_busy_pages_release(struct buf *bp); struct buf *incore(struct bufobj *, daddr_t); +bool inmem(struct vnode *, daddr_t); struct buf *gbincore(struct bufobj *, daddr_t); struct buf *gbincore_unlocked(struct bufobj *, daddr_t); struct buf *getblk(struct vnode *, daddr_t, int, int, int, int); Modified: head/sys/vm/vm_page.c ============================================================================== --- head/sys/vm/vm_page.c Fri Oct 9 23:02:09 2020 (r366593) +++ head/sys/vm/vm_page.c Fri Oct 9 23:49:42 2020 (r366594) @@ -1698,6 +1698,21 @@ vm_page_lookup(vm_object_t object, vm_pindex_t pindex) } /* + * vm_page_lookup_unlocked: + * + * Returns the page associated with the object/offset pair specified; + * if none is found, NULL is returned. The page may be no longer be + * present in the object at the time that this function returns. Only + * useful for opportunistic checks such as inmem(). + */ +vm_page_t +vm_page_lookup_unlocked(vm_object_t object, vm_pindex_t pindex) +{ + + return (vm_radix_lookup_unlocked(&object->rtree, pindex)); +} + +/* * vm_page_relookup: * * Returns a page that must already have been busied by Modified: head/sys/vm/vm_page.h ============================================================================== --- head/sys/vm/vm_page.h Fri Oct 9 23:02:09 2020 (r366593) +++ head/sys/vm/vm_page.h Fri Oct 9 23:49:42 2020 (r366594) @@ -700,6 +700,7 @@ int vm_page_insert (vm_page_t, vm_object_t, vm_pindex_ void vm_page_invalid(vm_page_t m); void vm_page_launder(vm_page_t m); vm_page_t vm_page_lookup(vm_object_t, vm_pindex_t); +vm_page_t vm_page_lookup_unlocked(vm_object_t, vm_pindex_t); vm_page_t vm_page_next(vm_page_t m); void vm_page_pqbatch_drain(void); void vm_page_pqbatch_submit(vm_page_t m, uint8_t queue); From owner-svn-src-all@freebsd.org Sat Oct 10 00:01:41 2020 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 2E84A430E2D; Sat, 10 Oct 2020 00:01:41 +0000 (UTC) (envelope-from rmacklem@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7Q8j0TlBz3Zsr; Sat, 10 Oct 2020 00:01:41 +0000 (UTC) (envelope-from rmacklem@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 E8F87217FD; Sat, 10 Oct 2020 00:01:40 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A01eLj072591; Sat, 10 Oct 2020 00:01:40 GMT (envelope-from rmacklem@FreeBSD.org) Received: (from rmacklem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A01ew2072529; Sat, 10 Oct 2020 00:01:40 GMT (envelope-from rmacklem@FreeBSD.org) Message-Id: <202010100001.09A01ew2072529@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to rmacklem@FreeBSD.org using -f From: Rick Macklem Date: Sat, 10 Oct 2020 00:01:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366595 - head/usr.sbin/mountd X-SVN-Group: head X-SVN-Commit-Author: rmacklem X-SVN-Commit-Paths: head/usr.sbin/mountd X-SVN-Commit-Revision: 366595 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.33 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: Sat, 10 Oct 2020 00:01:41 -0000 Author: rmacklem Date: Sat Oct 10 00:01:40 2020 New Revision: 366595 URL: https://svnweb.freebsd.org/changeset/base/366595 Log: Modify mountd.c so that it does not always malloc 4K for the map credentials. r362163 upgraded mountd so that it could handle MAX_NGROUPS groups for the anonymous user credentials (the ones provided by -maproot and -mapall exports options). The problem is that this resulted in every export structure growing by about 4Kbytes, because the cr_groups field went from 16->MAX_NGROUPS. This patch fixes this by only including a small 32 element cr_groups in the structure and then malloc()'ng cr_groups when a larger one is needed. The value of SMALLNGROUPS is arbitrarily set to 32, assuming most users used by -maproot or -mapall will be in <= 32 groups. Reviewed by: kib, freqlabs Differential Revision: https://reviews.freebsd.org/D26521 Modified: head/usr.sbin/mountd/mountd.c Modified: head/usr.sbin/mountd/mountd.c ============================================================================== --- head/usr.sbin/mountd/mountd.c Fri Oct 9 23:49:42 2020 (r366594) +++ head/usr.sbin/mountd/mountd.c Sat Oct 10 00:01:40 2020 (r366595) @@ -115,11 +115,15 @@ struct dirlist { /* * maproot/mapall credentials. + * cr_smallgrps can be used for a group list up to SMALLNGROUPS in size. + * Larger group lists are malloc'd/free'd. */ +#define SMALLNGROUPS 32 struct expcred { uid_t cr_uid; int cr_ngroups; - gid_t cr_groups[NGROUPS_MAX + 1]; + gid_t cr_smallgrps[SMALLNGROUPS]; + gid_t *cr_groups; }; struct exportlist { @@ -1514,6 +1518,7 @@ get_exportlist_one(int passno) uint64_t exflags; v4root_phase = 0; + anon.cr_groups = NULL; dirhead = (struct dirlist *)NULL; while (get_line()) { if (debug) @@ -1527,6 +1532,7 @@ get_exportlist_one(int passno) * Set defaults. */ has_host = FALSE; + anon.cr_groups = anon.cr_smallgrps; anon.cr_uid = UID_NOBODY; anon.cr_ngroups = 1; anon.cr_groups[0] = GID_NOGROUP; @@ -1822,6 +1828,10 @@ nextline: free_dir(dirhead); dirhead = (struct dirlist *)NULL; } + if (anon.cr_groups != anon.cr_smallgrps) { + free(anon.cr_groups); + anon.cr_groups = NULL; + } } } @@ -2905,6 +2915,8 @@ free_exp(struct exportlist *ep) grp = grp->gr_next; free_grp(tgrp); } + if (ep->ex_defanon.cr_groups != ep->ex_defanon.cr_smallgrps) + free(ep->ex_defanon.cr_groups); free((caddr_t)ep); } @@ -3457,14 +3469,17 @@ static void parsecred(char *namelist, struct expcred *cr) { char *name; - int cnt; + int inpos; char *names; struct passwd *pw; struct group *gr; + gid_t groups[NGROUPS_MAX + 1]; + int ngroups; /* * Set up the unprivileged user. */ + cr->cr_groups = cr->cr_smallgrps; cr->cr_uid = UID_NOBODY; cr->cr_groups[0] = GID_NOGROUP; cr->cr_ngroups = 1; @@ -3487,24 +3502,28 @@ parsecred(char *namelist, struct expcred *cr) return; } cr->cr_uid = pw->pw_uid; - cr->cr_ngroups = NGROUPS_MAX + 1; - if (getgrouplist(pw->pw_name, pw->pw_gid, cr->cr_groups, - &cr->cr_ngroups)) { + ngroups = NGROUPS_MAX + 1; + if (getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups)) { syslog(LOG_ERR, "too many groups"); - cr->cr_ngroups = NGROUPS_MAX + 1; + ngroups = NGROUPS_MAX + 1; } /* * Compress out duplicate. */ - if (cr->cr_ngroups > 1 && cr->cr_groups[0] == - cr->cr_groups[1]) { - for (cnt = 2; cnt < cr->cr_ngroups; cnt++) - cr->cr_groups[cnt - 1] = cr->cr_groups[cnt]; - cr->cr_ngroups--; - } - if (cr->cr_ngroups > NGROUPS_MAX) - cr->cr_ngroups = NGROUPS_MAX; + if (ngroups > 1 && groups[0] == groups[1]) { + ngroups--; + inpos = 2; + } else + inpos = 1; + if (ngroups > NGROUPS_MAX) + ngroups = NGROUPS_MAX; + if (ngroups > SMALLNGROUPS) + cr->cr_groups = malloc(ngroups * sizeof(gid_t)); + cr->cr_ngroups = ngroups; + cr->cr_groups[0] = groups[0]; + memcpy(&cr->cr_groups[1], &groups[inpos], (ngroups - 1) * + sizeof(gid_t)); return; } /* @@ -3523,17 +3542,20 @@ parsecred(char *namelist, struct expcred *cr) while (names != NULL && *names != '\0' && cr->cr_ngroups < NGROUPS_MAX) { name = strsep_quote(&names, ":"); if (isdigit(*name) || *name == '-') { - cr->cr_groups[cr->cr_ngroups++] = atoi(name); + groups[cr->cr_ngroups++] = atoi(name); } else { if ((gr = getgrnam(name)) == NULL) { syslog(LOG_ERR, "unknown group: %s", name); continue; } - cr->cr_groups[cr->cr_ngroups++] = gr->gr_gid; + groups[cr->cr_ngroups++] = gr->gr_gid; } } if (names != NULL && *names != '\0' && cr->cr_ngroups == NGROUPS_MAX) syslog(LOG_ERR, "too many groups"); + if (cr->cr_ngroups > SMALLNGROUPS) + cr->cr_groups = malloc(cr->cr_ngroups * sizeof(gid_t)); + memcpy(cr->cr_groups, groups, cr->cr_ngroups * sizeof(gid_t)); } #define STRSIZ (MNTNAMLEN+MNTPATHLEN+50) @@ -3642,6 +3664,8 @@ free_grp(struct grouplist *grp) if (grp->gr_ptr.gt_net.nt_name) free(grp->gr_ptr.gt_net.nt_name); } + if (grp->gr_anon.cr_groups != grp->gr_anon.cr_smallgrps) + free(grp->gr_anon.cr_groups); free((caddr_t)grp); } @@ -3860,6 +3884,10 @@ cp_cred(struct expcred *outcr, struct expcred *incr) outcr->cr_uid = incr->cr_uid; outcr->cr_ngroups = incr->cr_ngroups; + if (outcr->cr_ngroups > SMALLNGROUPS) + outcr->cr_groups = malloc(outcr->cr_ngroups * sizeof(gid_t)); + else + outcr->cr_groups = outcr->cr_smallgrps; memcpy(outcr->cr_groups, incr->cr_groups, incr->cr_ngroups * sizeof(gid_t)); } From owner-svn-src-all@freebsd.org Sat Oct 10 01:13:15 2020 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 94BE4433D31; Sat, 10 Oct 2020 01:13:15 +0000 (UTC) (envelope-from emaste@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7RlH3Tslz3gm2; Sat, 10 Oct 2020 01:13:15 +0000 (UTC) (envelope-from emaste@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 5B3A2224EC; Sat, 10 Oct 2020 01:13:15 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A1DF0N018924; Sat, 10 Oct 2020 01:13:15 GMT (envelope-from emaste@FreeBSD.org) Received: (from emaste@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A1DFUN018923; Sat, 10 Oct 2020 01:13:15 GMT (envelope-from emaste@FreeBSD.org) Message-Id: <202010100113.09A1DFUN018923@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: emaste set sender to emaste@FreeBSD.org using -f From: Ed Maste Date: Sat, 10 Oct 2020 01:13:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366596 - head/sys/modules/crypto X-SVN-Group: head X-SVN-Commit-Author: emaste X-SVN-Commit-Paths: head/sys/modules/crypto X-SVN-Commit-Revision: 366596 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.33 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: Sat, 10 Oct 2020 01:13:15 -0000 Author: emaste Date: Sat Oct 10 01:13:14 2020 New Revision: 366596 URL: https://svnweb.freebsd.org/changeset/base/366596 Log: modules/crypto: reenable assembly optimized skein implementation r366344 corrected the optimized amd64 skein assembly implementation, so we can now enable it again. Also add a dependency on this Makefile for the skein_block object, so that it will be rebuit (similar to r366362). PR: 248221 Sponsored by: The FreeBSD Foundation Modified: head/sys/modules/crypto/Makefile Modified: head/sys/modules/crypto/Makefile ============================================================================== --- head/sys/modules/crypto/Makefile Sat Oct 10 00:01:40 2020 (r366595) +++ head/sys/modules/crypto/Makefile Sat Oct 10 01:13:14 2020 (r366596) @@ -28,14 +28,18 @@ SRCS += sha1.c sha256c.c sha512c.c SRCS += skein.c skein_block.c # unroll the 256 and 512 loops, half unroll the 1024 CFLAGS.skein_block.c += -DSKEIN_LOOP=995 -#.if exists(${MACHINE_ARCH}/skein_block_asm.S) -#.PATH: ${SRCTOP}/sys/crypto/skein/${MACHINE_ARCH} -#SRCS += skein_block_asm.S -#CFLAGS += -DSKEIN_ASM -DSKEIN_USE_ASM=1792 # list of block functions to replace with assembly: 256+512+1024 = 1792 -#ACFLAGS += -DELF -Wa,--noexecstack -## Fully unroll all loops in the assembly optimized version -#ACFLAGS += -DSKEIN_LOOP=0 -#.endif +.if exists(${MACHINE_ARCH}/skein_block_asm.S) +.PATH: ${SRCTOP}/sys/crypto/skein/${MACHINE_ARCH} +SRCS += skein_block_asm.S +CFLAGS += -DSKEIN_ASM -DSKEIN_USE_ASM=1792 # list of block functions to replace with assembly: 256+512+1024 = 1792 +ACFLAGS += -DELF -Wa,--noexecstack +# Fully unroll all loops in the assembly optimized version +ACFLAGS += -DSKEIN_LOOP=0 +# 20201002 Add explict Makefile dependency for reenabled assembly optimized +# version. SKEIN_USE_ASM determines which routines should come from the assembly +# vs C versions, and skein_block needs to be rebuilt if it changes. +skein_block.o: Makefile +.endif SRCS += siphash.c SRCS += gmac.c gfmult.c SRCS += blake2b-ref.c From owner-svn-src-all@freebsd.org Sat Oct 10 03:48:18 2020 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 B260E43A226; Sat, 10 Oct 2020 03:48:18 +0000 (UTC) (envelope-from mjg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7WBB4Kfgz47Fy; Sat, 10 Oct 2020 03:48:18 +0000 (UTC) (envelope-from mjg@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 794492447C; Sat, 10 Oct 2020 03:48:18 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A3mIvt014382; Sat, 10 Oct 2020 03:48:18 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A3mHSo014380; Sat, 10 Oct 2020 03:48:17 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010100348.09A3mHSo014380@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Sat, 10 Oct 2020 03:48:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366597 - in head/sys: kern sys X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: in head/sys: kern sys X-SVN-Commit-Revision: 366597 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.33 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: Sat, 10 Oct 2020 03:48:18 -0000 Author: mjg Date: Sat Oct 10 03:48:17 2020 New Revision: 366597 URL: https://svnweb.freebsd.org/changeset/base/366597 Log: vfs: support lockless dirfd lookups Modified: head/sys/kern/kern_descrip.c head/sys/kern/vfs_cache.c head/sys/sys/file.h Modified: head/sys/kern/kern_descrip.c ============================================================================== --- head/sys/kern/kern_descrip.c Sat Oct 10 01:13:14 2020 (r366596) +++ head/sys/kern/kern_descrip.c Sat Oct 10 03:48:17 2020 (r366597) @@ -2708,6 +2708,111 @@ get_locked: return (error); } +#ifdef CAPABILITIES +int +fgetvp_lookup_smr(int fd, struct nameidata *ndp, struct vnode **vpp, bool *fsearch) +{ + const struct filedescent *fde; + const struct fdescenttbl *fdt; + struct filedesc *fdp; + struct file *fp; + struct vnode *vp; + const cap_rights_t *haverights; + cap_rights_t rights; + seqc_t seq; + + VFS_SMR_ASSERT_ENTERED(); + + rights = *ndp->ni_rightsneeded; + cap_rights_set_one(&rights, CAP_LOOKUP); + + fdp = curproc->p_fd; + fdt = fdp->fd_files; + if (__predict_false((u_int)fd >= fdt->fdt_nfiles)) + return (EBADF); + seq = seqc_read_any(fd_seqc(fdt, fd)); + if (__predict_false(seqc_in_modify(seq))) + return (EAGAIN); + fde = &fdt->fdt_ofiles[fd]; + haverights = cap_rights_fde_inline(fde); + fp = fde->fde_file; + if (__predict_false(fp == NULL)) + return (EAGAIN); + if (__predict_false(cap_check_inline_transient(haverights, &rights))) + return (EAGAIN); + *fsearch = ((fp->f_flag & FSEARCH) != 0); + vp = fp->f_vnode; + if (__predict_false(vp == NULL || vp->v_type != VDIR)) { + return (EAGAIN); + } + if (!filecaps_copy(&fde->fde_caps, &ndp->ni_filecaps, false)) { + return (EAGAIN); + } + /* + * Use an acquire barrier to force re-reading of fdt so it is + * refreshed for verification. + */ + atomic_thread_fence_acq(); + fdt = fdp->fd_files; + if (__predict_false(!seqc_consistent_nomb(fd_seqc(fdt, fd), seq))) + return (EAGAIN); + /* + * If file descriptor doesn't have all rights, + * all lookups relative to it must also be + * strictly relative. + * + * Not yet supported by fast path. + */ + CAP_ALL(&rights); + if (!cap_rights_contains(&ndp->ni_filecaps.fc_rights, &rights) || + ndp->ni_filecaps.fc_fcntls != CAP_FCNTL_ALL || + ndp->ni_filecaps.fc_nioctls != -1) { +#ifdef notyet + ndp->ni_lcf |= NI_LCF_STRICTRELATIVE; +#else + return (EAGAIN); +#endif + } + *vpp = vp; + return (0); +} +#else +int +fgetvp_lookup_smr(int fd, struct nameidata *ndp, struct vnode **vpp, bool *fsearch) +{ + const struct fdescenttbl *fdt; + struct filedesc *fdp; + struct file *fp; + struct vnode *vp; + + VFS_SMR_ASSERT_ENTERED(); + + fdp = curproc->p_fd; + fdt = fdp->fd_files; + if (__predict_false((u_int)fd >= fdt->fdt_nfiles)) + return (EBADF); + fp = fdt->fdt_ofiles[fd].fde_file; + if (__predict_false(fp == NULL)) + return (EAGAIN); + *fsearch = ((fp->f_flag & FSEARCH) != 0); + vp = fp->f_vnode; + if (__predict_false(vp == NULL || vp->v_type != VDIR)) { + return (EAGAIN); + } + /* + * Use an acquire barrier to force re-reading of fdt so it is + * refreshed for verification. + */ + atomic_thread_fence_acq(); + fdt = fdp->fd_files; + if (__predict_false(fp != fdt->fdt_ofiles[fd].fde_file)) + return (EAGAIN); + filecaps_fill(&ndp->ni_filecaps); + *vpp = vp; + return (0); +} +#endif + int fget_unlocked_seq(struct filedesc *fdp, int fd, cap_rights_t *needrightsp, struct file **fpp, seqc_t *seqp) Modified: head/sys/kern/vfs_cache.c ============================================================================== --- head/sys/kern/vfs_cache.c Sat Oct 10 01:13:14 2020 (r366596) +++ head/sys/kern/vfs_cache.c Sat Oct 10 03:48:17 2020 (r366597) @@ -3189,6 +3189,7 @@ struct cache_fpl { int line; enum cache_fpl_status status:8; bool in_smr; + bool fsearch; }; static void @@ -3346,10 +3347,6 @@ cache_can_fplookup(struct cache_fpl *fpl) cache_fpl_aborted(fpl); return (false); } - if (ndp->ni_dirfd != AT_FDCWD) { - cache_fpl_aborted(fpl); - return (false); - } if (IN_CAPABILITY_MODE(td)) { cache_fpl_aborted(fpl); return (false); @@ -3365,6 +3362,23 @@ cache_can_fplookup(struct cache_fpl *fpl) return (true); } +static int +cache_fplookup_dirfd(struct cache_fpl *fpl, struct vnode **vpp) +{ + struct nameidata *ndp; + int error; + bool fsearch; + + ndp = fpl->ndp; + error = fgetvp_lookup_smr(ndp->ni_dirfd, ndp, vpp, &fsearch); + if (__predict_false(error != 0)) { + cache_fpl_smr_exit(fpl); + return (cache_fpl_aborted(fpl)); + } + fpl->fsearch = fsearch; + return (0); +} + static bool cache_fplookup_vnode_supported(struct vnode *vp) { @@ -4046,9 +4060,11 @@ cache_fplookup_parse_advance(struct cache_fpl *fpl) static int __noinline cache_fplookup_failed_vexec(struct cache_fpl *fpl, int error) { + struct componentname *cnp; struct vnode *dvp; seqc_t dvp_seqc; + cnp = fpl->cnp; dvp = fpl->dvp; dvp_seqc = fpl->dvp_seqc; @@ -4070,6 +4086,32 @@ cache_fplookup_failed_vexec(struct cache_fpl *fpl, int error = ENOTDIR; } + /* + * Hack: handle O_SEARCH. + * + * Open Group Base Specifications Issue 7, 2018 edition states: + * If the access mode of the open file description associated with the + * file descriptor is not O_SEARCH, the function shall check whether + * directory searches are permitted using the current permissions of + * the directory underlying the file descriptor. If the access mode is + * O_SEARCH, the function shall not perform the check. + * + * Regular lookup tests for the NOEXECCHECK flag for every path + * component to decide whether to do the permission check. However, + * since most lookups never have the flag (and when they do it is only + * present for the first path component), lockless lookup only acts on + * it if there is a permission problem. Here the flag is represented + * with a boolean so that we don't have to clear it on the way out. + * + * For simplicity this always aborts. + * TODO: check if this is the first lookup and ignore the permission + * problem. Note the flag has to survive fallback (if it happens to be + * performed). + */ + if (fpl->fsearch) { + return (cache_fpl_aborted(fpl)); + } + switch (error) { case EAGAIN: if (!vn_seqc_consistent(dvp, dvp_seqc)) { @@ -4308,6 +4350,7 @@ cache_fplookup(struct nameidata *ndp, enum cache_fpl_s cache_fpl_checkpoint(&fpl, &orig); cache_fpl_smr_enter_initial(&fpl); + fpl.fsearch = false; pwd = pwd_get_smr(); fpl.pwd = pwd; ndp->ni_rootdir = pwd->pwd_rdir; @@ -4318,13 +4361,20 @@ cache_fplookup(struct nameidata *ndp, enum cache_fpl_s if (cnp->cn_pnbuf[0] == '/') { cache_fpl_handle_root(ndp, &dvp); } else { - MPASS(ndp->ni_dirfd == AT_FDCWD); - dvp = pwd->pwd_cdir; + if (ndp->ni_dirfd == AT_FDCWD) { + dvp = pwd->pwd_cdir; + } else { + error = cache_fplookup_dirfd(&fpl, &dvp); + if (__predict_false(error != 0)) { + goto out; + } + } } SDT_PROBE4(vfs, namei, lookup, entry, dvp, cnp->cn_pnbuf, cnp->cn_flags, true); error = cache_fplookup_impl(dvp, &fpl); +out: cache_fpl_smr_assert_not_entered(&fpl); SDT_PROBE3(vfs, fplookup, lookup, done, ndp, fpl.line, fpl.status); Modified: head/sys/sys/file.h ============================================================================== --- head/sys/sys/file.h Sat Oct 10 01:13:14 2020 (r366596) +++ head/sys/sys/file.h Sat Oct 10 03:48:17 2020 (r366597) @@ -52,6 +52,7 @@ struct thread; struct uio; struct knote; struct vnode; +struct nameidata; #endif /* _KERNEL */ @@ -279,6 +280,7 @@ int fgetvp_read(struct thread *td, int fd, cap_rights_ struct vnode **vpp); int fgetvp_write(struct thread *td, int fd, cap_rights_t *rightsp, struct vnode **vpp); +int fgetvp_lookup_smr(int fd, struct nameidata *ndp, struct vnode **vpp, bool *fsearch); static __inline __result_use_check bool fhold(struct file *fp) From owner-svn-src-all@freebsd.org Sat Oct 10 04:18:49 2020 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 B4FCA43B005; Sat, 10 Oct 2020 04:18:49 +0000 (UTC) (envelope-from mjg@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7WsP4LQRz49jG; Sat, 10 Oct 2020 04:18:49 +0000 (UTC) (envelope-from mjg@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 73C2E24F12; Sat, 10 Oct 2020 04:18:49 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A4InJm033578; Sat, 10 Oct 2020 04:18:49 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A4InV6033577; Sat, 10 Oct 2020 04:18:49 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010100418.09A4InV6033577@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Sat, 10 Oct 2020 04:18:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366598 - head/sys/contrib/openzfs/module/os/freebsd/zfs X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: head/sys/contrib/openzfs/module/os/freebsd/zfs X-SVN-Commit-Revision: 366598 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.33 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: Sat, 10 Oct 2020 04:18:49 -0000 Author: mjg Date: Sat Oct 10 04:18:49 2020 New Revision: 366598 URL: https://svnweb.freebsd.org/changeset/base/366598 Log: zfs: use cache_rename Modified: head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops.c Modified: head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops.c ============================================================================== --- head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops.c Sat Oct 10 03:48:17 2020 (r366597) +++ head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops.c Sat Oct 10 04:18:49 2020 (r366598) @@ -4165,10 +4165,7 @@ zfs_rename_(vnode_t *sdvp, vnode_t **svpp, struct comp } } if (error == 0) { - cache_purge(*svpp); - if (*tvpp != NULL) - cache_purge(*tvpp); - cache_purge_negative(tdvp); + cache_rename(sdvp, *svpp, tdvp, *tvpp, scnp, tcnp); } } From owner-svn-src-all@freebsd.org Sat Oct 10 07:18:52 2020 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 A091143E706; Sat, 10 Oct 2020 07:18:52 +0000 (UTC) (envelope-from manu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7bs83gRZz4KDk; Sat, 10 Oct 2020 07:18:52 +0000 (UTC) (envelope-from manu@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 6152526772; Sat, 10 Oct 2020 07:18:52 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A7Iqt8044200; Sat, 10 Oct 2020 07:18:52 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A7IpsX044196; Sat, 10 Oct 2020 07:18:51 GMT (envelope-from manu@FreeBSD.org) Message-Id: <202010100718.09A7IpsX044196@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Sat, 10 Oct 2020 07:18:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366599 - in head/sys: conf dts gnu/dts tools/fdt X-SVN-Group: head X-SVN-Commit-Author: manu X-SVN-Commit-Paths: in head/sys: conf dts gnu/dts tools/fdt X-SVN-Commit-Revision: 366599 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.33 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: Sat, 10 Oct 2020 07:18:52 -0000 Author: manu Date: Sat Oct 10 07:18:51 2020 New Revision: 366599 URL: https://svnweb.freebsd.org/changeset/base/366599 Log: Brand our DTS with the Linux version it was imported from DTS must be synced with the kernel, add a freebsd,dts-version string in the root node of each DTS that we compile so we can later in the kernel check that it contain a correct value. Reviewed by: imp, mmel Differential Revision: https://reviews.freebsd.org/D26724 Added: head/sys/dts/freebsd-compatible.dts (contents, props changed) head/sys/gnu/dts/Makefile (contents, props changed) Modified: head/sys/conf/Makefile.arm head/sys/tools/fdt/make_dtb.sh Modified: head/sys/conf/Makefile.arm ============================================================================== --- head/sys/conf/Makefile.arm Sat Oct 10 04:18:49 2020 (r366598) +++ head/sys/conf/Makefile.arm Sat Oct 10 07:18:51 2020 (r366599) @@ -32,6 +32,9 @@ S= ../../.. INCLUDES+= -I$S/contrib/libfdt -I$S/gnu/dts/include +LINUX_DTS_VERSION!= make -C $S/gnu/dts/ -V LINUX_DTS_VERSION +CFLAGS += -DLINUX_DTS_VERSION=\"${LINUX_DTS_VERSION}\" + .if !defined(DEBUG) && !defined(PROFLEVEL) STRIP_FLAGS = -S .endif Added: head/sys/dts/freebsd-compatible.dts ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/dts/freebsd-compatible.dts Sat Oct 10 07:18:51 2020 (r366599) @@ -0,0 +1,3 @@ +/ { + freebsd,dts-version = LINUX_DTS_VERSION; +}; Added: head/sys/gnu/dts/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/gnu/dts/Makefile Sat Oct 10 07:18:51 2020 (r366599) @@ -0,0 +1,3 @@ +# $FreeBSD$ + +LINUX_DTS_VERSION=5.8 Modified: head/sys/tools/fdt/make_dtb.sh ============================================================================== --- head/sys/tools/fdt/make_dtb.sh Sat Oct 10 04:18:49 2020 (r366598) +++ head/sys/tools/fdt/make_dtb.sh Sat Oct 10 07:18:51 2020 (r366599) @@ -20,9 +20,11 @@ fi : "${ECHO:=echo}" : "${CPP:=cpp}" +LINUX_DTS_VERSION=$(make -C $S/gnu/dts -V LINUX_DTS_VERSION) + for d in ${dts}; do dtb="${dtb_path}/$(basename "$d" .dts).dtb" ${ECHO} "converting $d -> $dtb" - ${CPP} -P -x assembler-with-cpp -I "$S/gnu/dts/include" -I "$S/dts/${MACHINE}" -I "$S/gnu/dts/${MACHINE}" -I "$S/gnu/dts/" -include "$d" /dev/null | + ${CPP} -DLINUX_DTS_VERSION=\"${LINUX_DTS_VERSION}\" -P -x assembler-with-cpp -I "$S/gnu/dts/include" -I "$S/dts/${MACHINE}" -I "$S/gnu/dts/${MACHINE}" -I "$S/gnu/dts/" -include "$d" -include "$S/dts/freebsd-compatible.dts" /dev/null | ${DTC} -@ -O dtb -o "$dtb" -b 0 -p 1024 -i "$S/dts/${MACHINE}" -i "$S/gnu/dts/${MACHINE}" -i "$S/gnu/dts/" done From owner-svn-src-all@freebsd.org Sat Oct 10 07:21:00 2020 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 54E1E43E2FB; Sat, 10 Oct 2020 07:21:00 +0000 (UTC) (envelope-from manu@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7bvc1c6yz4KQX; Sat, 10 Oct 2020 07:21:00 +0000 (UTC) (envelope-from manu@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 1A08E27112; Sat, 10 Oct 2020 07:21:00 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A7KxrN048651; Sat, 10 Oct 2020 07:20:59 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A7KxE1048650; Sat, 10 Oct 2020 07:20:59 GMT (envelope-from manu@FreeBSD.org) Message-Id: <202010100720.09A7KxE1048650@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Sat, 10 Oct 2020 07:20:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366600 - head/sys/arm/arm X-SVN-Group: head X-SVN-Commit-Author: manu X-SVN-Commit-Paths: head/sys/arm/arm X-SVN-Commit-Revision: 366600 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.33 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: Sat, 10 Oct 2020 07:21:00 -0000 Author: manu Date: Sat Oct 10 07:20:59 2020 New Revision: 366600 URL: https://svnweb.freebsd.org/changeset/base/366600 Log: arm: Check dtb version against the one we're expecting to find Reviewed by: imp, emaste, mmel Differential Revision: https://reviews.freebsd.org/D26725 Modified: head/sys/arm/arm/machdep.c Modified: head/sys/arm/arm/machdep.c ============================================================================== --- head/sys/arm/arm/machdep.c Sat Oct 10 07:18:51 2020 (r366599) +++ head/sys/arm/arm/machdep.c Sat Oct 10 07:20:59 2020 (r366600) @@ -1111,6 +1111,8 @@ initarm(struct arm_boot_params *abp) char *env; void *kmdp; int err_devmap, mem_regions_sz; + phandle_t root; + char dts_version[255]; #ifdef EFI struct efi_map_header *efihdr; #endif @@ -1272,6 +1274,18 @@ initarm(struct arm_boot_params *abp) err_devmap); platform_late_init(); + + root = OF_finddevice("/"); + if (OF_getprop(root, "freebsd,dts-version", dts_version, sizeof(dts_version)) > 0) { + if (strcmp(LINUX_DTS_VERSION, dts_version) != 0) + printf("WARNING: DTB version is %s while kernel expects %s, " + "please update the DTB in the ESP\n", + dts_version, + LINUX_DTS_VERSION); + } else { + printf("WARNING: Cannot find freebsd,dts-version property, " + "cannot check DTB compliance\n"); + } /* * We must now clean the cache again.... From owner-svn-src-all@freebsd.org Sat Oct 10 09:40:03 2020 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 E83314418C6; Sat, 10 Oct 2020 09:40:03 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7g035j0Hz4VnM; Sat, 10 Oct 2020 09:40:03 +0000 (UTC) (envelope-from gbe@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 A79DB865D; Sat, 10 Oct 2020 09:40:03 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A9e3es036629; Sat, 10 Oct 2020 09:40:03 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A9e3E1036628; Sat, 10 Oct 2020 09:40:03 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010100940.09A9e3E1036628@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 09:40:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366602 - stable/12/usr.bin/cpuset X-SVN-Group: stable-12 X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: stable/12/usr.bin/cpuset X-SVN-Commit-Revision: 366602 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.33 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: Sat, 10 Oct 2020 09:40:04 -0000 Author: gbe (doc committer) Date: Sat Oct 10 09:40:03 2020 New Revision: 366602 URL: https://svnweb.freebsd.org/changeset/base/366602 Log: MFC r366414: cpuset(1): Fix some issues reported by mandoc - whitespace at end of input line - new sentence, new line Modified: stable/12/usr.bin/cpuset/cpuset.1 Directory Properties: stable/12/ (props changed) Modified: stable/12/usr.bin/cpuset/cpuset.1 ============================================================================== --- stable/12/usr.bin/cpuset/cpuset.1 Sat Oct 10 08:02:23 2020 (r366601) +++ stable/12/usr.bin/cpuset/cpuset.1 Sat Oct 10 09:40:03 2020 (r366602) @@ -34,24 +34,24 @@ .Sh SYNOPSIS .Nm .Op Fl l Ar cpu-list -.Op Fl n Ar policy:domain-list +.Op Fl n Ar policy:domain-list .Op Fl s Ar setid .Ar cmd ... .Nm .Op Fl l Ar cpu-list -.Op Fl n Ar policy:domain-list +.Op Fl n Ar policy:domain-list .Op Fl s Ar setid .Fl p Ar pid .Nm .Op Fl c .Op Fl l Ar cpu-list -.Op Fl n Ar policy:domain-list +.Op Fl n Ar policy:domain-list .Fl C .Fl p Ar pid .Nm .Op Fl c .Op Fl l Ar cpu-list -.Op Fl n Ar policy:domain-list +.Op Fl n Ar policy:domain-list .Op Fl j Ar jail | Fl p Ar pid | Fl t Ar tid | Fl s Ar setid | Fl x Ar irq .Nm .Fl g @@ -97,8 +97,8 @@ This last set is the list of all possible CPUs in the queried using .Fl r . .Pp -Most sets include NUMA memory domain and policy information. This can be -inspected with +Most sets include NUMA memory domain and policy information. +This can be inspected with .Fl g and set with .Fl n . @@ -124,8 +124,8 @@ Create a new cpuset and assign the target process to t The requested operation should reference the cpuset available via the target specifier. .It Fl d Ar domain -Specifies a NUMA domain id as the target of the operation. This can only -be used to query the cpus visible in each numberd domain. +Specifies a NUMA domain id as the target of the operation. +This can only be used to query the cpus visible in each numberd domain. .It Fl g Causes .Nm @@ -146,8 +146,8 @@ A special list of .Dq all may be specified in which case the list includes all CPUs from the root set. .It Fl n Ar policy:domain-list -Specifies a list of domains and allocation policy to apply to a target. Ranges -may be specified as in +Specifies a list of domains and allocation policy to apply to a target. +Ranges may be specified as in .Fl l . Valid policies include first-touch (ft), round-robin (rr), prefer and interleave (il). From owner-svn-src-all@freebsd.org Sat Oct 10 09:41:21 2020 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 655FC4418E2; Sat, 10 Oct 2020 09:41:21 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7g1Y24nsz4W5Z; Sat, 10 Oct 2020 09:41:21 +0000 (UTC) (envelope-from gbe@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 2A9E58EA6; Sat, 10 Oct 2020 09:41:21 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A9fLIg041749; Sat, 10 Oct 2020 09:41:21 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A9fLrN041748; Sat, 10 Oct 2020 09:41:21 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010100941.09A9fLrN041748@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 09:41:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366603 - stable/12/sbin/camcontrol X-SVN-Group: stable-12 X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: stable/12/sbin/camcontrol X-SVN-Commit-Revision: 366603 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.33 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: Sat, 10 Oct 2020 09:41:21 -0000 Author: gbe (doc committer) Date: Sat Oct 10 09:41:20 2020 New Revision: 366603 URL: https://svnweb.freebsd.org/changeset/base/366603 Log: MFC r366406: camcontrol(8): Bugfixes for some issues reported by mandoc - new sentence, new line Modified: stable/12/sbin/camcontrol/camcontrol.8 Directory Properties: stable/12/ (props changed) Modified: stable/12/sbin/camcontrol/camcontrol.8 ============================================================================== --- stable/12/sbin/camcontrol/camcontrol.8 Sat Oct 10 09:40:03 2020 (r366602) +++ stable/12/sbin/camcontrol/camcontrol.8 Sat Oct 10 09:41:20 2020 (r366603) @@ -1511,10 +1511,10 @@ user. This option can be combined with other options such as .Fl e Em pwd .Pp -A master password may be set in a addition to the user password. The purpose of -the master password is to allow an administrator to establish a password that -is kept secret from the user, and which may be used to unlock the device if the -user password is lost. +A master password may be set in a addition to the user password. +The purpose of the master password is to allow an administrator to establish +a password that is kept secret from the user, and which may be used to unlock +the device if the user password is lost. .Pp .Em Note: Setting the master password does not enable device security. @@ -2528,7 +2528,8 @@ whether it is enabled and what the timer value is. .It Ic timestamp Issue REPORT TIMESTAMP or SET TIMESTAMP .Tn SCSI -commands. Either the +commands. +Either the .Fl r option or the .Fl s @@ -2552,7 +2553,8 @@ time, but override the system time zone and use UTC in .El .Bl -tag -width 6n .It Fl s -Set the device's timestamp. Either the +Set the device's timestamp. +Either the .Fl f and .Fl T From owner-svn-src-all@freebsd.org Sat Oct 10 09:42:24 2020 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 D8DE54418F7; Sat, 10 Oct 2020 09:42:24 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7g2m5Vddz4WHF; Sat, 10 Oct 2020 09:42:24 +0000 (UTC) (envelope-from gbe@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 A0F7E8C2A; Sat, 10 Oct 2020 09:42:24 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A9gO0x042537; Sat, 10 Oct 2020 09:42:24 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A9gOYA042536; Sat, 10 Oct 2020 09:42:24 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010100942.09A9gOYA042536@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 09:42:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366604 - stable/12/sbin/veriexec X-SVN-Group: stable-12 X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: stable/12/sbin/veriexec X-SVN-Commit-Revision: 366604 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.33 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: Sat, 10 Oct 2020 09:42:24 -0000 Author: gbe (doc committer) Date: Sat Oct 10 09:42:24 2020 New Revision: 366604 URL: https://svnweb.freebsd.org/changeset/base/366604 Log: MFC r366409: veriexec(8): Bugfix for an issue reported by mandoc - consider using OS macro: Nx Modified: stable/12/sbin/veriexec/veriexec.8 Directory Properties: stable/12/ (props changed) Modified: stable/12/sbin/veriexec/veriexec.8 ============================================================================== --- stable/12/sbin/veriexec/veriexec.8 Sat Oct 10 09:41:20 2020 (r366603) +++ stable/12/sbin/veriexec/veriexec.8 Sat Oct 10 09:42:24 2020 (r366604) @@ -138,9 +138,8 @@ they are provided for the use of other .Xr mac 4 modules. .Sh HISTORY -The Verified Exec system first appeared in NetBSD. +The Verified Exec system first appeared in +.Nx . This utility derrives from the one found in Junos. The key difference is the requirement that manifest files be digitally signed. - - From owner-svn-src-all@freebsd.org Sat Oct 10 09:43:36 2020 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 570E5441F0C; Sat, 10 Oct 2020 09:43:36 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7g481dhvz4WQn; Sat, 10 Oct 2020 09:43:36 +0000 (UTC) (envelope-from gbe@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 1C0F78D31; Sat, 10 Oct 2020 09:43:36 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A9hZ0J042645; Sat, 10 Oct 2020 09:43:35 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A9hZXQ042644; Sat, 10 Oct 2020 09:43:35 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010100943.09A9hZXQ042644@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 09:43:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366605 - stable/12/bin/cp X-SVN-Group: stable-12 X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: stable/12/bin/cp X-SVN-Commit-Revision: 366605 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.33 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: Sat, 10 Oct 2020 09:43:36 -0000 Author: gbe (doc committer) Date: Sat Oct 10 09:43:35 2020 New Revision: 366605 URL: https://svnweb.freebsd.org/changeset/base/366605 Log: MFC 366404: cp(1): Bugfixes for some issues reported by mandoc - no blank before trailing delimiter Modified: stable/12/bin/cp/cp.1 Directory Properties: stable/12/ (props changed) Modified: stable/12/bin/cp/cp.1 ============================================================================== --- stable/12/bin/cp/cp.1 Sat Oct 10 09:42:24 2020 (r366604) +++ stable/12/bin/cp/cp.1 Sat Oct 10 09:43:35 2020 (r366605) @@ -300,9 +300,9 @@ differ as they copy special files as normal files while recreating a hierarchy. .Pp The -.Fl l, -.Fl s, -.Fl v, +.Fl l , +.Fl s , +.Fl v , .Fl x and .Fl n From owner-svn-src-all@freebsd.org Sat Oct 10 09:44:57 2020 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 9A102441F83; Sat, 10 Oct 2020 09:44:57 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7g5j3gt5z4Wcn; Sat, 10 Oct 2020 09:44:57 +0000 (UTC) (envelope-from gbe@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 618F3867C; Sat, 10 Oct 2020 09:44:57 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A9ivMZ042790; Sat, 10 Oct 2020 09:44:57 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A9ivog042789; Sat, 10 Oct 2020 09:44:57 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010100944.09A9ivog042789@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 09:44:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366606 - stable/12/sbin/gvinum X-SVN-Group: stable-12 X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: stable/12/sbin/gvinum X-SVN-Commit-Revision: 366606 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.33 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: Sat, 10 Oct 2020 09:44:57 -0000 Author: gbe (doc committer) Date: Sat Oct 10 09:44:56 2020 New Revision: 366606 URL: https://svnweb.freebsd.org/changeset/base/366606 Log: MFC r366411: gvinum(8): Fix an issue reported by mandoc - new sentence, new line Modified: stable/12/sbin/gvinum/gvinum.8 Directory Properties: stable/12/ (props changed) Modified: stable/12/sbin/gvinum/gvinum.8 ============================================================================== --- stable/12/sbin/gvinum/gvinum.8 Sat Oct 10 09:43:35 2020 (r366605) +++ stable/12/sbin/gvinum/gvinum.8 Sat Oct 10 09:44:56 2020 (r366606) @@ -202,8 +202,8 @@ Terminate access to the objects, or stop .Nm if no parameters are specified. .It Ic stripe Oo Fl fv Oc Oo Fl n Ar name Oc Ar drives -Create a striped volume from the specified drives. If no name is specified, -a unique name will be set by +Create a striped volume from the specified drives. +If no name is specified, a unique name will be set by .Ic gvinum . This organization requires at least two drives. .El From owner-svn-src-all@freebsd.org Sat Oct 10 09:50:10 2020 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 9119C441F9B; Sat, 10 Oct 2020 09:50:10 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7gCk3KSnz4WXv; Sat, 10 Oct 2020 09:50:10 +0000 (UTC) (envelope-from gbe@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 556A58EB8; Sat, 10 Oct 2020 09:50:10 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A9oAOh043192; Sat, 10 Oct 2020 09:50:10 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A9o9KF043190; Sat, 10 Oct 2020 09:50:09 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010100950.09A9o9KF043190@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 09:50:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366607 - in stable/12/sbin: devd fsdb mdmfs X-SVN-Group: stable-12 X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: in stable/12/sbin: devd fsdb mdmfs X-SVN-Commit-Revision: 366607 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.33 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: Sat, 10 Oct 2020 09:50:10 -0000 Author: gbe (doc committer) Date: Sat Oct 10 09:50:09 2020 New Revision: 366607 URL: https://svnweb.freebsd.org/changeset/base/366607 Log: MFC r366408, r366410, r366405 fsdb(8): Fix an issue reported by mandoc mdmfs(8): Fix an issue reported by mandoc devd.conf(5): Bugfix for an issue reported by mandoc - whitespace at end of input line Modified: stable/12/sbin/devd/devd.conf.5 stable/12/sbin/fsdb/fsdb.8 stable/12/sbin/mdmfs/mdmfs.8 Directory Properties: stable/12/ (props changed) Modified: stable/12/sbin/devd/devd.conf.5 ============================================================================== --- stable/12/sbin/devd/devd.conf.5 Sat Oct 10 09:44:56 2020 (r366606) +++ stable/12/sbin/devd/devd.conf.5 Sat Oct 10 09:50:09 2020 (r366607) @@ -532,7 +532,7 @@ keyboard has been pressed. A brightness level change has been requested. Direction is in the $notify variable. .It Li PMU Ta Li keys Ta mute Ta -The mute key +The mute key .It Li PMU Ta Li keys Ta volume Ta A volume level change has been requested. Direction is in the $notify variable. Modified: stable/12/sbin/fsdb/fsdb.8 ============================================================================== --- stable/12/sbin/fsdb/fsdb.8 Sat Oct 10 09:44:56 2020 (r366606) +++ stable/12/sbin/fsdb/fsdb.8 Sat Oct 10 09:50:09 2020 (r366607) @@ -251,7 +251,7 @@ appeared in written by .An John T. Kohl . It first appeared in -.Fx 2.1.5 +.Fx 2.1.5 ported by Peter Wemm. .Sh BUGS Manipulation of ``short'' symlinks has no effect. Modified: stable/12/sbin/mdmfs/mdmfs.8 ============================================================================== --- stable/12/sbin/mdmfs/mdmfs.8 Sat Oct 10 09:44:56 2020 (r366606) +++ stable/12/sbin/mdmfs/mdmfs.8 Sat Oct 10 09:50:09 2020 (r366607) @@ -70,7 +70,7 @@ Based on .Ar md-device , the .Nm -utility either creates a +utility either creates a .Xr tmpfs 5 filesystem, or it configures an .Xr md 4 From owner-svn-src-all@freebsd.org Sat Oct 10 09:52:42 2020 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 A7DCE442312; Sat, 10 Oct 2020 09:52:42 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7gGf3wnzz4Wt4; Sat, 10 Oct 2020 09:52:42 +0000 (UTC) (envelope-from gbe@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 4FF638F3B; Sat, 10 Oct 2020 09:52:42 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09A9qgiu048714; Sat, 10 Oct 2020 09:52:42 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09A9qfvc048712; Sat, 10 Oct 2020 09:52:41 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010100952.09A9qfvc048712@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 09:52:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366608 - in stable/12: bin/ls sbin/dhclient X-SVN-Group: stable-12 X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: in stable/12: bin/ls sbin/dhclient X-SVN-Commit-Revision: 366608 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.33 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: Sat, 10 Oct 2020 09:52:42 -0000 Author: gbe (doc committer) Date: Sat Oct 10 09:52:41 2020 New Revision: 366608 URL: https://svnweb.freebsd.org/changeset/base/366608 Log: MFC r366407, r366403 ls(1): Bugfix for an issue reported by mandoc dhclient(8): Bugfixes for some issues reported by mandoc - no blank before trailing delimiter - new sentence, new line Modified: stable/12/bin/ls/ls.1 stable/12/sbin/dhclient/dhclient.leases.5 stable/12/sbin/dhclient/dhcp-options.5 Directory Properties: stable/12/ (props changed) Modified: stable/12/bin/ls/ls.1 ============================================================================== --- stable/12/bin/ls/ls.1 Sat Oct 10 09:50:09 2020 (r366607) +++ stable/12/bin/ls/ls.1 Sat Oct 10 09:52:41 2020 (r366608) @@ -40,7 +40,7 @@ .Nd list directory contents .Sh SYNOPSIS .Nm -.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, +.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1 , .Op Fl -color Ns = Ns Ar when .Op Fl D Ar format .Op Ar Modified: stable/12/sbin/dhclient/dhclient.leases.5 ============================================================================== --- stable/12/sbin/dhclient/dhclient.leases.5 Sat Oct 10 09:50:09 2020 (r366607) +++ stable/12/sbin/dhclient/dhclient.leases.5 Sat Oct 10 09:52:41 2020 (r366608) @@ -54,7 +54,7 @@ the last one in the file is used. The file is written as a log, so this is not an unusual occurrence. .Pp The lease file is named -.Pa dhclient.leases. Ns Ar IFNAME , +.Pa dhclient.leases . Ns Ar IFNAME , where .Ar IFNAME represents the network interface the DHCP client acquired the lease on. @@ -70,7 +70,7 @@ The format of the lease declarations is described in .Xr dhclient.conf 5 . .Sh FILES .Bl -tag -width ".Pa /var/db/dhclient.leases. Ns Ar IFNAME" -.It Pa /var/db/dhclient.leases. Ns Ar IFNAME +.It Pa /var/db/dhclient.leases . Ns Ar IFNAME Current lease file. .El .Sh SEE ALSO Modified: stable/12/sbin/dhclient/dhcp-options.5 ============================================================================== --- stable/12/sbin/dhclient/dhcp-options.5 Sat Oct 10 09:50:09 2020 (r366607) +++ stable/12/sbin/dhclient/dhcp-options.5 Sat Oct 10 09:52:41 2020 (r366608) @@ -267,8 +267,8 @@ This option specifies the domain name that the client resolving hostnames via the Domain Name System. .It Ic option domain-search Ar string ; This option specifies a list of domain names that the client should use -when resolving hostnames via the Domain Name System. This option is -defined in RFC 3397. +when resolving hostnames via the Domain Name System. +This option is defined in RFC 3397. .It Ic option swap-server Ar ip-address ; This specifies the IP address of the client's swap server. .It Ic option root-path Ar string ; From owner-svn-src-all@freebsd.org Sat Oct 10 12:05:54 2020 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 D15CB445C0C; Sat, 10 Oct 2020 12:05:54 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7kDL57b4z4djM; Sat, 10 Oct 2020 12:05:54 +0000 (UTC) (envelope-from gbe@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 94ADCA984; Sat, 10 Oct 2020 12:05:54 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AC5sA5029201; Sat, 10 Oct 2020 12:05:54 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AC5sZb029200; Sat, 10 Oct 2020 12:05:54 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010101205.09AC5sZb029200@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 12:05:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366609 - head/share/man/man4 X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/share/man/man4 X-SVN-Commit-Revision: 366609 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.33 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: Sat, 10 Oct 2020 12:05:54 -0000 Author: gbe (doc committer) Date: Sat Oct 10 12:05:54 2020 New Revision: 366609 URL: https://svnweb.freebsd.org/changeset/base/366609 Log: dtrace_audit(4): Fix a typo - asynchonously -> asynchronously MFC after: 1 week Modified: head/share/man/man4/dtrace_audit.4 Modified: head/share/man/man4/dtrace_audit.4 ============================================================================== --- head/share/man/man4/dtrace_audit.4 Sat Oct 10 09:52:41 2020 (r366608) +++ head/share/man/man4/dtrace_audit.4 Sat Oct 10 12:05:54 2020 (r366609) @@ -119,7 +119,7 @@ remains available for capture by the script. .Pp The .Fn audit:event:aue_*:bsm -probes fire asynchonously from system-call return, following BSM conversion +probes fire asynchronously from system-call return, following BSM conversion and just prior to being written to disk, giving access to four arguments: a .Vt char * audit event name, the From owner-svn-src-all@freebsd.org Sat Oct 10 12:06:40 2020 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 96263445C16; Sat, 10 Oct 2020 12:06:40 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7kFD3QrBz4fGx; Sat, 10 Oct 2020 12:06:40 +0000 (UTC) (envelope-from gbe@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 58C7AAA02; Sat, 10 Oct 2020 12:06:40 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AC6eep029279; Sat, 10 Oct 2020 12:06:40 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AC6e6e029278; Sat, 10 Oct 2020 12:06:40 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010101206.09AC6e6e029278@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 12:06:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366610 - head/share/man/man3 X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/share/man/man3 X-SVN-Commit-Revision: 366610 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.33 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: Sat, 10 Oct 2020 12:06:40 -0000 Author: gbe (doc committer) Date: Sat Oct 10 12:06:39 2020 New Revision: 366610 URL: https://svnweb.freebsd.org/changeset/base/366610 Log: sigevent(3): Fix a typo - asychronous -> asynchronous MFC after: 1 week Modified: head/share/man/man3/sigevent.3 Modified: head/share/man/man3/sigevent.3 ============================================================================== --- head/share/man/man3/sigevent.3 Sat Oct 10 12:05:54 2020 (r366609) +++ head/share/man/man3/sigevent.3 Sat Oct 10 12:06:39 2020 (r366610) @@ -34,7 +34,7 @@ .Sh SYNOPSIS .In signal.h .Sh DESCRIPTION -Some operations permit threads to request asychronous notification of events +Some operations permit threads to request asynchronous notification of events via a .Vt struct sigevent structure. From owner-svn-src-all@freebsd.org Sat Oct 10 13:01:05 2020 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 88E1F446BFA; Sat, 10 Oct 2020 13:01:05 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7lS137R3z3TQl; Sat, 10 Oct 2020 13:01:05 +0000 (UTC) (envelope-from gbe@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 4EC83B444; Sat, 10 Oct 2020 13:01:05 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AD15ad061531; Sat, 10 Oct 2020 13:01:05 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AD15Do061530; Sat, 10 Oct 2020 13:01:05 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010101301.09AD15Do061530@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 13:01:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366611 - head/usr.bin/cpuset X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/usr.bin/cpuset X-SVN-Commit-Revision: 366611 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.33 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: Sat, 10 Oct 2020 13:01:05 -0000 Author: gbe (doc committer) Date: Sat Oct 10 13:01:04 2020 New Revision: 366611 URL: https://svnweb.freebsd.org/changeset/base/366611 Log: cpuset(1): Fix a typo - 'at at' -> 'at a' MFC after: 1 week Modified: head/usr.bin/cpuset/cpuset.1 Modified: head/usr.bin/cpuset/cpuset.1 ============================================================================== --- head/usr.bin/cpuset/cpuset.1 Sat Oct 10 12:06:39 2020 (r366610) +++ head/usr.bin/cpuset/cpuset.1 Sat Oct 10 13:01:04 2020 (r366611) @@ -152,7 +152,7 @@ Ranges may be specified as in Valid policies include first-touch (ft), round-robin (rr), prefer and interleave (il). First-touch allocates on the local domain when memory is available. -Round-robin alternates between every possible domain page at at time. +Round-robin alternates between every possible domain page at a time. The prefer policy accepts only a single domain in the set. The parent of the set is consulted if the preferred domain is unavailable. Interleave operates like round-robin with an implementation defined stripe From owner-svn-src-all@freebsd.org Sat Oct 10 13:12:45 2020 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 C6E49447562; Sat, 10 Oct 2020 13:12:45 +0000 (UTC) (envelope-from mike@karels.net) Received: from mail.karels.net (mail.karels.net [216.160.39.52]) by mx1.freebsd.org (Postfix) with ESMTP id 4C7ljS6kDfz3VDR; Sat, 10 Oct 2020 13:12:43 +0000 (UTC) (envelope-from mike@karels.net) Received: from mail.karels.net (localhost [127.0.0.1]) by mail.karels.net (8.15.2/8.15.2) with ESMTP id 09ADChZi001500; Sat, 10 Oct 2020 08:12:43 -0500 (CDT) (envelope-from mike@karels.net) Message-Id: <202010101312.09ADChZi001500@mail.karels.net> To: Gordon Bergling cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org From: Mike Karels Reply-to: mike@karels.net Subject: Re: svn commit: r366608 - in stable/12: bin/ls sbin/dhclient In-reply-to: Your message of Sat, 10 Oct 2020 09:52:41 -0000. <202010100952.09A9qfvc048712@repo.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: <1498.1602335563.1@mail.karels.net> Content-Transfer-Encoding: quoted-printable Date: Sat, 10 Oct 2020 08:12:43 -0500 X-Rspamd-Queue-Id: 4C7ljS6kDfz3VDR X-Spamd-Bar: - Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=none; spf=pass (mx1.freebsd.org: domain of mike@karels.net designates 216.160.39.52 as permitted sender) smtp.mailfrom=mike@karels.net X-Spamd-Result: default: False [-1.86 / 15.00]; ARC_NA(0.00)[]; HAS_REPLYTO(0.00)[mike@karels.net]; FREEFALL_USER(0.00)[mike]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(-0.20)[+ip4:216.160.39.52:c]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MIME_GOOD(-0.10)[text/plain]; REPLYTO_ADDR_EQ_FROM(0.00)[]; DMARC_NA(0.00)[karels.net]; RCPT_COUNT_FIVE(0.00)[5]; NEURAL_HAM_LONG(-0.95)[-0.951]; NEURAL_HAM_MEDIUM(-0.76)[-0.760]; NEURAL_SPAM_SHORT(0.05)[0.052]; RCVD_NO_TLS_LAST(0.10)[]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+]; ASN(0.00)[asn:209, ipnet:216.160.36.0/22, country:US]; RCVD_COUNT_TWO(0.00)[2]; MAILMAN_DEST(0.00)[svn-src-stable-12,svn-src-stable,svn-src-all] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Sat, 10 Oct 2020 13:12:45 -0000 > Author: gbe (doc committer) > Date: Sat Oct 10 09:52:41 2020 > New Revision: 366608 > URL: https://svnweb.freebsd.org/changeset/base/366608 > Log: > MFC r366407, r366403 > = > ls(1): Bugfix for an issue reported by mandoc > dhclient(8): Bugfixes for some issues reported by mandoc > = > - no blank before trailing delimiter > - new sentence, new line > Modified: > stable/12/bin/ls/ls.1 > stable/12/sbin/dhclient/dhclient.leases.5 > stable/12/sbin/dhclient/dhcp-options.5 > Directory Properties: > stable/12/ (props changed) > Modified: stable/12/bin/ls/ls.1 > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- stable/12/bin/ls/ls.1 Sat Oct 10 09:50:09 2020 (r366607) > +++ stable/12/bin/ls/ls.1 Sat Oct 10 09:52:41 2020 (r366608) > @@ -40,7 +40,7 @@ > .Nd list directory contents > .Sh SYNOPSIS > .Nm > -.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, > +.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1 , > .Op Fl -color Ns =3D Ns Ar when > .Op Fl D Ar format > .Op Ar This change is wrong, and should not have been MFC'd. It should be fixed correctly instead. The comma is not a delimiter, it is an option; it shou= ld appear inside the brackets, not after. The warning can be fixed by adding \& after the comma rather than inserting a space. Mike From owner-svn-src-all@freebsd.org Sat Oct 10 13:28:32 2020 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 9E7AA44791A; Sat, 10 Oct 2020 13:28:32 +0000 (UTC) (envelope-from gbe@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7m3h3fR5z3VkP; Sat, 10 Oct 2020 13:28:32 +0000 (UTC) (envelope-from gbe@freebsd.org) Received: from localhost (p4fd3acce.dip0.t-ipconnect.de [79.211.172.206]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: gbe) by smtp.freebsd.org (Postfix) with ESMTPSA id 1F5FC16123; Sat, 10 Oct 2020 13:28:32 +0000 (UTC) (envelope-from gbe@freebsd.org) Date: Sat, 10 Oct 2020 15:28:29 +0200 From: Gordon Bergling To: Mike Karels Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: Re: svn commit: r366608 - in stable/12: bin/ls sbin/dhclient Message-ID: <20201010132829.GA68899@lion.0xfce3.net> References: <202010100952.09A9qfvc048712@repo.freebsd.org> <202010101312.09ADChZi001500@mail.karels.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <202010101312.09ADChZi001500@mail.karels.net> X-Url: X-Operating-System: FreeBSD 12.2-STABLE amd64 X-Host-Uptime: 3:24PM up 1 day, 2:46, 3 users, load averages: 0.29, 0.25, 0.25 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Sat, 10 Oct 2020 13:28:32 -0000 On Sat, Oct 10, 2020 at 08:12:43AM -0500, Mike Karels wrote: > > Author: gbe (doc committer) > > Date: Sat Oct 10 09:52:41 2020 > > New Revision: 366608 > > URL: https://svnweb.freebsd.org/changeset/base/366608 > > > Log: > > MFC r366407, r366403 > > > > ls(1): Bugfix for an issue reported by mandoc > > dhclient(8): Bugfixes for some issues reported by mandoc > > > > - no blank before trailing delimiter > > - new sentence, new line > > > Modified: > > stable/12/bin/ls/ls.1 > > stable/12/sbin/dhclient/dhclient.leases.5 > > stable/12/sbin/dhclient/dhcp-options.5 > > Directory Properties: > > stable/12/ (props changed) > > > Modified: stable/12/bin/ls/ls.1 > > ============================================================================== > > --- stable/12/bin/ls/ls.1 Sat Oct 10 09:50:09 2020 (r366607) > > +++ stable/12/bin/ls/ls.1 Sat Oct 10 09:52:41 2020 (r366608) > > @@ -40,7 +40,7 @@ > > .Nd list directory contents > > .Sh SYNOPSIS > > .Nm > > -.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, > > +.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1 , > > .Op Fl -color Ns = Ns Ar when > > .Op Fl D Ar format > > .Op Ar > > This change is wrong, and should not have been MFC'd. It should be fixed > correctly instead. The comma is not a delimiter, it is an option; it should > appear inside the brackets, not after. The warning can be fixed by adding > \& after the comma rather than inserting a space. > > Mike Hello Mike, if this change is wrong I'll correct it in head and MFC it afterwards. The output of ls(1) is still the same as it was before, checked via mandoc and man. --Gordon From owner-svn-src-all@freebsd.org Sat Oct 10 13:33:58 2020 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 44E8F447B2B; Sat, 10 Oct 2020 13:33:58 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7m9y15HLz3W26; Sat, 10 Oct 2020 13:33:58 +0000 (UTC) (envelope-from kib@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 087FCB543; Sat, 10 Oct 2020 13:33:58 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09ADXvIK085342; Sat, 10 Oct 2020 13:33:57 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09ADXvq5085341; Sat, 10 Oct 2020 13:33:57 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010101333.09ADXvq5085341@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Sat, 10 Oct 2020 13:33:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366612 - stable/12/sys/net X-SVN-Group: stable-12 X-SVN-Commit-Author: kib X-SVN-Commit-Paths: stable/12/sys/net X-SVN-Commit-Revision: 366612 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.33 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: Sat, 10 Oct 2020 13:33:58 -0000 Author: kib Date: Sat Oct 10 13:33:57 2020 New Revision: 366612 URL: https://svnweb.freebsd.org/changeset/base/366612 Log: MFC r366514: Fix typo. Modified: stable/12/sys/net/if.h Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/net/if.h ============================================================================== --- stable/12/sys/net/if.h Sat Oct 10 13:01:04 2020 (r366611) +++ stable/12/sys/net/if.h Sat Oct 10 13:33:57 2020 (r366612) @@ -210,7 +210,7 @@ struct if_data { * contains the enabled optional feature & capabilites that can be used * individually per packet and are specified in the mbuf pkthdr.csum_flags * field. IFCAP_* and CSUM_* do not match one to one and CSUM_* may be - * more detailed or differenciated than IFCAP_*. + * more detailed or differentiated than IFCAP_*. * Hwassist features are defined CSUM_* in sys/mbuf.h * * Capabilities that cannot be arbitrarily changed with ifconfig/ioctl From owner-svn-src-all@freebsd.org Sat Oct 10 13:39:14 2020 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 14631447E8A; Sat, 10 Oct 2020 13:39:14 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7mJ16lsgz3WF4; Sat, 10 Oct 2020 13:39:13 +0000 (UTC) (envelope-from gbe@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 C6C57B544; Sat, 10 Oct 2020 13:39:13 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09ADdDjN085653; Sat, 10 Oct 2020 13:39:13 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09ADdDL6085652; Sat, 10 Oct 2020 13:39:13 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010101339.09ADdDL6085652@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 13:39:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366613 - head/bin/ls X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/bin/ls X-SVN-Commit-Revision: 366613 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.33 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: Sat, 10 Oct 2020 13:39:14 -0000 Author: gbe (doc committer) Date: Sat Oct 10 13:39:13 2020 New Revision: 366613 URL: https://svnweb.freebsd.org/changeset/base/366613 Log: ls(1): Use \& as an escape character for the ',' option Reported by: karels@, xtouqh at hotmail dot com MFC after: 1 day Modified: head/bin/ls/ls.1 Modified: head/bin/ls/ls.1 ============================================================================== --- head/bin/ls/ls.1 Sat Oct 10 13:33:57 2020 (r366612) +++ head/bin/ls/ls.1 Sat Oct 10 13:39:13 2020 (r366613) @@ -40,7 +40,7 @@ .Nd list directory contents .Sh SYNOPSIS .Nm -.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1 , +.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1\&, .Op Fl -color Ns = Ns Ar when .Op Fl D Ar format .Op Ar From owner-svn-src-all@freebsd.org Sat Oct 10 13:46:49 2020 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 2662B3F8103; Sat, 10 Oct 2020 13:46:49 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7mSn06zwz3WjH; Sat, 10 Oct 2020 13:46:49 +0000 (UTC) (envelope-from kib@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 DAD82BA22; Sat, 10 Oct 2020 13:46:48 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09ADkmun091719; Sat, 10 Oct 2020 13:46:48 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09ADkmB8091716; Sat, 10 Oct 2020 13:46:48 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010101346.09ADkmB8091716@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Sat, 10 Oct 2020 13:46:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r366614 - in stable/12/sys/amd64: amd64 include X-SVN-Group: stable-12 X-SVN-Commit-Author: kib X-SVN-Commit-Paths: in stable/12/sys/amd64: amd64 include X-SVN-Commit-Revision: 366614 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.33 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: Sat, 10 Oct 2020 13:46:49 -0000 Author: kib Date: Sat Oct 10 13:46:48 2020 New Revision: 366614 URL: https://svnweb.freebsd.org/changeset/base/366614 Log: MFC r366417: amd64: Store full 64bit of FIP/FDP for 64bit processes when using XSAVE. PR: 250043 Modified: stable/12/sys/amd64/amd64/cpu_switch.S stable/12/sys/amd64/amd64/fpu.c stable/12/sys/amd64/include/md_var.h Directory Properties: stable/12/ (props changed) Modified: stable/12/sys/amd64/amd64/cpu_switch.S ============================================================================== --- stable/12/sys/amd64/amd64/cpu_switch.S Sat Oct 10 13:39:13 2020 (r366613) +++ stable/12/sys/amd64/amd64/cpu_switch.S Sat Oct 10 13:46:48 2020 (r366614) @@ -128,22 +128,25 @@ done_store_dr: /* have we used fp, and need a save? */ cmpq %rdi,PCPU(FPCURTHREAD) - jne 2f - movq PCB_SAVEFPU(%r8),%r8 + jne ctx_switch_fpusave_done + movq PCB_SAVEFPU(%r8),%r9 clts cmpl $0,use_xsave(%rip) jne 1f - fxsave (%r8) - jmp 2f + fxsave (%r9) + jmp ctx_switch_fpusave_done 1: movq %rdx,%rcx movl xsave_mask,%eax movl xsave_mask+4,%edx + testl $PCB_32BIT,PCB_FLAGS(%r8) + jne ctx_switch_xsave32 .globl ctx_switch_xsave ctx_switch_xsave: /* This is patched to xsaveopt if supported, see fpuinit_bsp1() */ - xsave (%r8) + xsave64 (%r9) +ctx_switch_xsave_done: movq %rcx,%rdx -2: +ctx_switch_fpusave_done: /* Save is done. Now fire up new thread. Leave old vmspace. */ movq %rsi,%r12 movq %rdi,%r13 @@ -306,6 +309,11 @@ do_ldt: movq PCPU(LDT),%rax movq %rdx,8(%rax) movl $LDTSEL,%eax jmp ld_ldt + + .globl ctx_switch_xsave32 +ctx_switch_xsave32: + xsave (%r9) + jmp ctx_switch_xsave_done END(cpu_switch) /* Modified: stable/12/sys/amd64/amd64/fpu.c ============================================================================== --- stable/12/sys/amd64/amd64/fpu.c Sat Oct 10 13:39:13 2020 (r366613) +++ stable/12/sys/amd64/amd64/fpu.c Sat Oct 10 13:46:48 2020 (r366614) @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -80,7 +81,7 @@ __FBSDID("$FreeBSD$"); #define stmxcsr(addr) __asm __volatile("stmxcsr %0" : : "m" (*(addr))) static __inline void -xrstor(char *addr, uint64_t mask) +xrstor32(char *addr, uint64_t mask) { uint32_t low, hi; @@ -90,27 +91,59 @@ xrstor(char *addr, uint64_t mask) } static __inline void -xsave(char *addr, uint64_t mask) +xrstor64(char *addr, uint64_t mask) { uint32_t low, hi; low = mask; hi = mask >> 32; + __asm __volatile("xrstor64 %0" : : "m" (*addr), "a" (low), "d" (hi)); +} + +static __inline void +xsave32(char *addr, uint64_t mask) +{ + uint32_t low, hi; + + low = mask; + hi = mask >> 32; __asm __volatile("xsave %0" : "=m" (*addr) : "a" (low), "d" (hi) : "memory"); } static __inline void -xsaveopt(char *addr, uint64_t mask) +xsave64(char *addr, uint64_t mask) { uint32_t low, hi; low = mask; hi = mask >> 32; + __asm __volatile("xsave64 %0" : "=m" (*addr) : "a" (low), "d" (hi) : + "memory"); +} + +static __inline void +xsaveopt32(char *addr, uint64_t mask) +{ + uint32_t low, hi; + + low = mask; + hi = mask >> 32; __asm __volatile("xsaveopt %0" : "=m" (*addr) : "a" (low), "d" (hi) : "memory"); } +static __inline void +xsaveopt64(char *addr, uint64_t mask) +{ + uint32_t low, hi; + + low = mask; + hi = mask >> 32; + __asm __volatile("xsaveopt64 %0" : "=m" (*addr) : "a" (low), "d" (hi) : + "memory"); +} + #else /* !(__GNUCLIKE_ASM && !lint) */ void fldcw(u_short cw); @@ -122,9 +155,12 @@ void fxsave(caddr_t addr); void fxrstor(caddr_t addr); void ldmxcsr(u_int csr); void stmxcsr(u_int *csr); -void xrstor(char *addr, uint64_t mask); -void xsave(char *addr, uint64_t mask); -void xsaveopt(char *addr, uint64_t mask); +void xrstor32(char *addr, uint64_t mask); +void xrstor64(char *addr, uint64_t mask); +void xsave32(char *addr, uint64_t mask); +void xsave64(char *addr, uint64_t mask); +void xsaveopt32(char *addr, uint64_t mask); +void xsaveopt64(char *addr, uint64_t mask); #endif /* __GNUCLIKE_ASM && !lint */ @@ -170,24 +206,48 @@ struct xsave_area_elm_descr { } *xsave_area_desc; static void -fpusave_xsaveopt(void *addr) +fpusave_xsaveopt64(void *addr) { + xsaveopt64((char *)addr, xsave_mask); +} - xsaveopt((char *)addr, xsave_mask); +static void +fpusave_xsaveopt3264(void *addr) +{ + if (SV_CURPROC_FLAG(SV_ILP32)) + xsaveopt32((char *)addr, xsave_mask); + else + xsaveopt64((char *)addr, xsave_mask); } static void -fpusave_xsave(void *addr) +fpusave_xsave64(void *addr) { + xsave64((char *)addr, xsave_mask); +} - xsave((char *)addr, xsave_mask); +static void +fpusave_xsave3264(void *addr) +{ + if (SV_CURPROC_FLAG(SV_ILP32)) + xsave32((char *)addr, xsave_mask); + else + xsave64((char *)addr, xsave_mask); } static void -fpurestore_xrstor(void *addr) +fpurestore_xrstor64(void *addr) { + xrstor64((char *)addr, xsave_mask); +} - xrstor((char *)addr, xsave_mask); +static void +fpurestore_xrstor3264(void *addr) +{ + if (SV_CURPROC_FLAG(SV_ILP32)) + xrstor32((char *)addr, xsave_mask); + else + xrstor64((char *)addr, xsave_mask); } static void @@ -220,17 +280,24 @@ DEFINE_IFUNC(, void, fpusave, (void *), static) { init_xsave(); - if (use_xsave) - return ((cpu_stdext_feature & CPUID_EXTSTATE_XSAVEOPT) != 0 ? - fpusave_xsaveopt : fpusave_xsave); - return (fpusave_fxsave); + if (!use_xsave) + return (fpusave_fxsave); + if ((cpu_stdext_feature & CPUID_EXTSTATE_XSAVEOPT) != 0) { + return ((cpu_stdext_feature & CPUID_STDEXT_NFPUSG) != 0 ? + fpusave_xsaveopt64 : fpusave_xsaveopt3264); + } + return ((cpu_stdext_feature & CPUID_STDEXT_NFPUSG) != 0 ? + fpusave_xsave64 : fpusave_xsave3264); } DEFINE_IFUNC(, void, fpurestore, (void *), static) { init_xsave(); - return (use_xsave ? fpurestore_xrstor : fpurestore_fxrstor); + if (!use_xsave) + return (fpurestore_fxrstor); + return ((cpu_stdext_feature & CPUID_STDEXT_NFPUSG) != 0 ? + fpurestore_xrstor64 : fpurestore_xrstor3264); } void @@ -297,6 +364,7 @@ fpuinit_bsp1(void) * read-only before cpu_startup(). */ old_wp = disable_wp(); + ctx_switch_xsave32[3] |= 0x10; ctx_switch_xsave[3] |= 0x10; restore_wp(old_wp); } Modified: stable/12/sys/amd64/include/md_var.h ============================================================================== --- stable/12/sys/amd64/include/md_var.h Sat Oct 10 13:39:13 2020 (r366613) +++ stable/12/sys/amd64/include/md_var.h Sat Oct 10 13:46:48 2020 (r366614) @@ -38,6 +38,7 @@ extern uint64_t *vm_page_dump; extern char ctx_switch_xsave[]; +extern char ctx_switch_xsave32[]; extern int hw_lower_amd64_sharedpage; extern int hw_ibrs_disable; extern int hw_ssb_disable; From owner-svn-src-all@freebsd.org Sat Oct 10 14:02:53 2020 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 C110C3F825E; Sat, 10 Oct 2020 14:02:53 +0000 (UTC) (envelope-from mike@karels.net) Received: from mail.karels.net (mail.karels.net [216.160.39.52]) by mx1.freebsd.org (Postfix) with ESMTP id 4C7mqJ3yShz3XPQ; Sat, 10 Oct 2020 14:02:52 +0000 (UTC) (envelope-from mike@karels.net) Received: from mail.karels.net (localhost [127.0.0.1]) by mail.karels.net (8.15.2/8.15.2) with ESMTP id 09AE2o7j001646; Sat, 10 Oct 2020 09:02:50 -0500 (CDT) (envelope-from mike@karels.net) Message-Id: <202010101402.09AE2o7j001646@mail.karels.net> To: Gordon Bergling cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org From: Mike Karels Reply-to: mike@karels.net Subject: Re: svn commit: r366608 - in stable/12: bin/ls sbin/dhclient In-reply-to: Your message of Sat, 10 Oct 2020 15:28:29 +0200. <20201010132829.GA68899@lion.0xfce3.net> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: <1644.1602338570.1@mail.karels.net> Content-Transfer-Encoding: quoted-printable Date: Sat, 10 Oct 2020 09:02:50 -0500 X-Rspamd-Queue-Id: 4C7mqJ3yShz3XPQ X-Spamd-Bar: - Authentication-Results: mx1.freebsd.org; dkim=none; dmarc=none; spf=pass (mx1.freebsd.org: domain of mike@karels.net designates 216.160.39.52 as permitted sender) smtp.mailfrom=mike@karels.net X-Spamd-Result: default: False [-1.82 / 15.00]; HAS_REPLYTO(0.00)[mike@karels.net]; ARC_NA(0.00)[]; FREEFALL_USER(0.00)[mike]; FROM_HAS_DN(0.00)[]; TO_DN_SOME(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; R_SPF_ALLOW(-0.20)[+ip4:216.160.39.52]; MIME_GOOD(-0.10)[text/plain]; REPLYTO_ADDR_EQ_FROM(0.00)[]; DMARC_NA(0.00)[karels.net]; RCPT_COUNT_FIVE(0.00)[5]; NEURAL_HAM_LONG(-0.91)[-0.914]; NEURAL_HAM_MEDIUM(-0.72)[-0.724]; NEURAL_SPAM_SHORT(0.02)[0.016]; RCVD_NO_TLS_LAST(0.10)[]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+]; ASN(0.00)[asn:209, ipnet:216.160.36.0/22, country:US]; RCVD_COUNT_TWO(0.00)[2]; MAILMAN_DEST(0.00)[svn-src-stable-12,svn-src-stable,svn-src-all] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Sat, 10 Oct 2020 14:02:53 -0000 > Date: Sat, 10 Oct 2020 15:28:29 +0200 > From: Gordon Bergling > On Sat, Oct 10, 2020 at 08:12:43AM -0500, Mike Karels wrote: > > > Author: gbe (doc committer) > > > Date: Sat Oct 10 09:52:41 2020 > > > New Revision: 366608 > > > URL: https://svnweb.freebsd.org/changeset/base/366608 > > = > > > Log: > > > MFC r366407, r366403 > > > = > > > ls(1): Bugfix for an issue reported by mandoc > > > dhclient(8): Bugfixes for some issues reported by mandoc > > > = > > > - no blank before trailing delimiter > > > - new sentence, new line > > = > > > Modified: > > > stable/12/bin/ls/ls.1 > > > stable/12/sbin/dhclient/dhclient.leases.5 > > > stable/12/sbin/dhclient/dhcp-options.5 > > > Directory Properties: > > > stable/12/ (props changed) > > = > > > Modified: stable/12/bin/ls/ls.1 > > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D > > > --- stable/12/bin/ls/ls.1 Sat Oct 10 09:50:09 2020 (r366607) > > > +++ stable/12/bin/ls/ls.1 Sat Oct 10 09:52:41 2020 (r366608) > > > @@ -40,7 +40,7 @@ > > > .Nd list directory contents > > > .Sh SYNOPSIS > > > .Nm > > > -.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, > > > +.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1 , > > > .Op Fl -color Ns =3D Ns Ar when > > > .Op Fl D Ar format > > > .Op Ar > > = > > This change is wrong, and should not have been MFC'd. It should be fi= xed > > correctly instead. The comma is not a delimiter, it is an option; it = should > > appear inside the brackets, not after. The warning can be fixed by ad= ding > > \& after the comma rather than inserting a space. > > = > > Mike > Hello Mike, > if this change is wrong I'll correct it in head and MFC it afterwards. > The output of ls(1) is still the same as it was before, checked via mand= oc and > man. > --Gordon In my testing, the comma is inside the brackets in the original version: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [--color=3Dwhen] [-D fo= rmat] [file ...] It is outside the brackets with this change: ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1], [--color=3Dwhen] [-D fo= rmat] [file ...] The former is correct. Caveat, I'm running mandoc on 12.1. Mike From owner-svn-src-all@freebsd.org Sat Oct 10 14:20:08 2020 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 8B3193F85F2; Sat, 10 Oct 2020 14:20:08 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7nCD3BFjz3YKk; Sat, 10 Oct 2020 14:20:08 +0000 (UTC) (envelope-from gbe@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 500E0BD5C; Sat, 10 Oct 2020 14:20:08 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AEK8pF015045; Sat, 10 Oct 2020 14:20:08 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AEK72M015043; Sat, 10 Oct 2020 14:20:07 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010101420.09AEK72M015043@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 14:20:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366615 - head/share/man/man5 X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/share/man/man5 X-SVN-Commit-Revision: 366615 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.33 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: Sat, 10 Oct 2020 14:20:08 -0000 Author: gbe (doc committer) Date: Sat Oct 10 14:20:07 2020 New Revision: 366615 URL: https://svnweb.freebsd.org/changeset/base/366615 Log: man5: Fix a few typos spotted by igor - fstab(5): conjuction -> conjunction - mount.conf(5): repeated 'the' - periodic.conf(5): Partion -> Partition MFC after: 1 week Modified: head/share/man/man5/fstab.5 head/share/man/man5/mount.conf.5 head/share/man/man5/periodic.conf.5 Modified: head/share/man/man5/fstab.5 ============================================================================== --- head/share/man/man5/fstab.5 Sat Oct 10 13:46:48 2020 (r366614) +++ head/share/man/man5/fstab.5 Sat Oct 10 14:20:07 2020 (r366615) @@ -205,7 +205,7 @@ is applied automatically. .Pp The .Dq update -option is typically used in conjuction with two +option is typically used in conjunction with two .Nm files. The first Modified: head/share/man/man5/mount.conf.5 ============================================================================== --- head/share/man/man5/mount.conf.5 Sat Oct 10 13:46:48 2020 (r366614) +++ head/share/man/man5/mount.conf.5 Sat Oct 10 14:20:07 2020 (r366615) @@ -123,8 +123,7 @@ is performed. When the kernel processes this line, a .Li mountroot> command-line prompt is displayed. -At this prompt, the operator can enter the -the root mount. +At this prompt, the operator can enter the root mount. .It Ic .md Ar file Create a memory backed .Xr md 4 Modified: head/share/man/man5/periodic.conf.5 ============================================================================== --- head/share/man/man5/periodic.conf.5 Sat Oct 10 13:46:48 2020 (r366614) +++ head/share/man/man5/periodic.conf.5 Sat Oct 10 14:20:07 2020 (r366615) @@ -256,7 +256,7 @@ as configured in .Pq Vt bool Set to .Dq Li YES -to create backup of EFI System Partion (ESP). +to create backup of EFI System Partition (ESP). .It Va daily_backup_gpart_enable .Pq Vt bool Set to From owner-svn-src-all@freebsd.org Sat Oct 10 14:36:17 2020 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 636F03F8FDD; Sat, 10 Oct 2020 14:36:17 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7nYs21Zvz3Z2c; Sat, 10 Oct 2020 14:36:17 +0000 (UTC) (envelope-from gbe@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 28C10C39C; Sat, 10 Oct 2020 14:36:17 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AEaHsh026773; Sat, 10 Oct 2020 14:36:17 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AEaHjQ026772; Sat, 10 Oct 2020 14:36:17 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010101436.09AEaHjQ026772@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 14:36:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366616 - head/usr.sbin/cxgbetool X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/usr.sbin/cxgbetool X-SVN-Commit-Revision: 366616 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.33 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: Sat, 10 Oct 2020 14:36:17 -0000 Author: gbe (doc committer) Date: Sat Oct 10 14:36:16 2020 New Revision: 366616 URL: https://svnweb.freebsd.org/changeset/base/366616 Log: cxgbetool(8): Remove dublicate word 'whether' MFC after: 1 week Modified: head/usr.sbin/cxgbetool/cxgbetool.8 Modified: head/usr.sbin/cxgbetool/cxgbetool.8 ============================================================================== --- head/usr.sbin/cxgbetool/cxgbetool.8 Sat Oct 10 14:20:07 2020 (r366615) +++ head/usr.sbin/cxgbetool/cxgbetool.8 Sat Oct 10 14:36:16 2020 (r366616) @@ -547,7 +547,7 @@ There is an implicit rule that disables offload for co match anything in the policy. .Pp Each rule consists of a filter part, which determines what connections the -rule applies to, and a settings part, which determines whether whether matching +rule applies to, and a settings part, which determines whether matching connections will be offloaded and, if so, with what settings. The general form of a rule is .Bl -ohang -offset indent From owner-svn-src-all@freebsd.org Sat Oct 10 14:38:02 2020 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 8F7273F961B; Sat, 10 Oct 2020 14:38:02 +0000 (UTC) (envelope-from gbe@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7nbt3MRPz3ZDn; Sat, 10 Oct 2020 14:38:02 +0000 (UTC) (envelope-from gbe@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 399F8C22A; Sat, 10 Oct 2020 14:38:02 +0000 (UTC) (envelope-from gbe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AEc2cT026885; Sat, 10 Oct 2020 14:38:02 GMT (envelope-from gbe@FreeBSD.org) Received: (from gbe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AEc22u026884; Sat, 10 Oct 2020 14:38:02 GMT (envelope-from gbe@FreeBSD.org) Message-Id: <202010101438.09AEc22u026884@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gbe set sender to gbe@FreeBSD.org using -f From: Gordon Bergling Date: Sat, 10 Oct 2020 14:38:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366617 - head/usr.sbin/pnfsdsfile X-SVN-Group: head X-SVN-Commit-Author: gbe X-SVN-Commit-Paths: head/usr.sbin/pnfsdsfile X-SVN-Commit-Revision: 366617 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.33 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: Sat, 10 Oct 2020 14:38:02 -0000 Author: gbe (doc committer) Date: Sat Oct 10 14:38:01 2020 New Revision: 366617 URL: https://svnweb.freebsd.org/changeset/base/366617 Log: pnfsdsfile(8): Remove dublicate word 'the' MFC after: 1 week Modified: head/usr.sbin/pnfsdsfile/pnfsdsfile.8 Modified: head/usr.sbin/pnfsdsfile/pnfsdsfile.8 ============================================================================== --- head/usr.sbin/pnfsdsfile/pnfsdsfile.8 Sat Oct 10 14:36:16 2020 (r366616) +++ head/usr.sbin/pnfsdsfile/pnfsdsfile.8 Sat Oct 10 14:38:01 2020 (r366617) @@ -117,7 +117,7 @@ After being re-enabled, the command with the .Dq -r option -will be used to copy the the file's data to this repaired DS and then update the +will be used to copy the file's data to this repaired DS and then update the extended attribute to use it. .Pp A typical use of this will be within a From owner-svn-src-all@freebsd.org Sat Oct 10 14:48:59 2020 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 8541E3F9D92; Sat, 10 Oct 2020 14:48:59 +0000 (UTC) (envelope-from gbe@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C7nrW2z15z3ZgM; Sat, 10 Oct 2020 14:48:59 +0000 (UTC) (envelope-from gbe@freebsd.org) Received: from localhost (p4fd3acce.dip0.t-ipconnect.de [79.211.172.206]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: gbe) by smtp.freebsd.org (Postfix) with ESMTPSA id E7997165C8; Sat, 10 Oct 2020 14:48:58 +0000 (UTC) (envelope-from gbe@freebsd.org) Date: Sat, 10 Oct 2020 16:48:56 +0200 From: Gordon Bergling To: Mike Karels Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: Re: svn commit: r366608 - in stable/12: bin/ls sbin/dhclient Message-ID: <20201010144856.GA16865@lion.0xfce3.net> References: <20201010132829.GA68899@lion.0xfce3.net> <202010101402.09AE2o7j001646@mail.karels.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <202010101402.09AE2o7j001646@mail.karels.net> X-Url: X-Operating-System: FreeBSD 12.2-STABLE amd64 X-Host-Uptime: 4:39PM up 1 day, 4:01, 4 users, load averages: 0.20, 0.34, 0.30 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 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: Sat, 10 Oct 2020 14:48:59 -0000 On Sat, Oct 10, 2020 at 09:02:50AM -0500, Mike Karels wrote: > > Date: Sat, 10 Oct 2020 15:28:29 +0200 > > From: Gordon Bergling > > On Sat, Oct 10, 2020 at 08:12:43AM -0500, Mike Karels wrote: > > > > Author: gbe (doc committer) > > > > Date: Sat Oct 10 09:52:41 2020 > > > > New Revision: 366608 > > > > URL: https://svnweb.freebsd.org/changeset/base/366608 > > > > > > > Log: > > > > MFC r366407, r366403 > > > > > > > > ls(1): Bugfix for an issue reported by mandoc > > > > dhclient(8): Bugfixes for some issues reported by mandoc > > > > > > > > - no blank before trailing delimiter > > > > - new sentence, new line > > > > > > > Modified: > > > > stable/12/bin/ls/ls.1 > > > > stable/12/sbin/dhclient/dhclient.leases.5 > > > > stable/12/sbin/dhclient/dhcp-options.5 > > > > Directory Properties: > > > > stable/12/ (props changed) > > > > > > > Modified: stable/12/bin/ls/ls.1 > > > > ============================================================================== > > > > --- stable/12/bin/ls/ls.1 Sat Oct 10 09:50:09 2020 (r366607) > > > > +++ stable/12/bin/ls/ls.1 Sat Oct 10 09:52:41 2020 (r366608) > > > > @@ -40,7 +40,7 @@ > > > > .Nd list directory contents > > > > .Sh SYNOPSIS > > > > .Nm > > > > -.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, > > > > +.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1 , > > > > .Op Fl -color Ns = Ns Ar when > > > > .Op Fl D Ar format > > > > .Op Ar > > > > > > This change is wrong, and should not have been MFC'd. It should be fixed > > > correctly instead. The comma is not a delimiter, it is an option; it should > > > appear inside the brackets, not after. The warning can be fixed by adding > > > \& after the comma rather than inserting a space. > > > > > > Mike > > > Hello Mike, > > > if this change is wrong I'll correct it in head and MFC it afterwards. > > The output of ls(1) is still the same as it was before, checked via mandoc and > > man. > > > --Gordon > > In my testing, the comma is inside the brackets in the original version: > > ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [--color=when] [-D format] > [file ...] > > > It is outside the brackets with this change: > > ls [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1], [--color=when] [-D format] > [file ...] > > The former is correct. Caveat, I'm running mandoc on 12.1. > > Mike That is strange, maybe an localisation problem. I am also running my local tests on 12.2-STABLE. I followed your suggestion in r366613 [1] and MFC it tomorrow. --Gordon [1] https://svnweb.freebsd.org/base?view=revision&revision=366613 From owner-svn-src-all@freebsd.org Sat Oct 10 18:18:09 2020 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 9F1923FF7F1; Sat, 10 Oct 2020 18:18:09 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7tTs3lWWz47sS; Sat, 10 Oct 2020 18:18:09 +0000 (UTC) (envelope-from kib@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 63E28E8E7; Sat, 10 Oct 2020 18:18:09 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AII99p070030; Sat, 10 Oct 2020 18:18:09 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AII9Uf070029; Sat, 10 Oct 2020 18:18:09 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010101818.09AII9Uf070029@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Sat, 10 Oct 2020 18:18:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r366618 - stable/11/sys/net X-SVN-Group: stable-11 X-SVN-Commit-Author: kib X-SVN-Commit-Paths: stable/11/sys/net X-SVN-Commit-Revision: 366618 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.33 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: Sat, 10 Oct 2020 18:18:09 -0000 Author: kib Date: Sat Oct 10 18:18:08 2020 New Revision: 366618 URL: https://svnweb.freebsd.org/changeset/base/366618 Log: MFC r366514: Fix typo. Modified: stable/11/sys/net/if.h Directory Properties: stable/11/ (props changed) Modified: stable/11/sys/net/if.h ============================================================================== --- stable/11/sys/net/if.h Sat Oct 10 14:38:01 2020 (r366617) +++ stable/11/sys/net/if.h Sat Oct 10 18:18:08 2020 (r366618) @@ -205,7 +205,7 @@ struct if_data { * contains the enabled optional feature & capabilites that can be used * individually per packet and are specified in the mbuf pkthdr.csum_flags * field. IFCAP_* and CSUM_* do not match one to one and CSUM_* may be - * more detailed or differenciated than IFCAP_*. + * more detailed or differentiated than IFCAP_*. * Hwassist features are defined CSUM_* in sys/mbuf.h * * Capabilities that cannot be arbitrarily changed with ifconfig/ioctl From owner-svn-src-all@freebsd.org Sat Oct 10 18:22:13 2020 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 CE70E3FFD7D; Sat, 10 Oct 2020 18:22:13 +0000 (UTC) (envelope-from kib@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7tZY56Xzz48vR; Sat, 10 Oct 2020 18:22:13 +0000 (UTC) (envelope-from kib@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 92F9EEE52; Sat, 10 Oct 2020 18:22:13 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09AIMDFi075449; Sat, 10 Oct 2020 18:22:13 GMT (envelope-from kib@FreeBSD.org) Received: (from kib@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09AIMDuY075448; Sat, 10 Oct 2020 18:22:13 GMT (envelope-from kib@FreeBSD.org) Message-Id: <202010101822.09AIMDuY075448@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kib set sender to kib@FreeBSD.org using -f From: Konstantin Belousov Date: Sat, 10 Oct 2020 18:22:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r366619 - in stable/11/sys: amd64/include x86/include X-SVN-Group: stable-11 X-SVN-Commit-Author: kib X-SVN-Commit-Paths: in stable/11/sys: amd64/include x86/include X-SVN-Commit-Revision: 366619 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.33 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: Sat, 10 Oct 2020 18:22:13 -0000 Author: kib Date: Sat Oct 10 18:22:12 2020 New Revision: 366619 URL: https://svnweb.freebsd.org/changeset/base/366619 Log: MFC r366415: Move ctx_switch_xsave declaration to amd64 md_var.h. Modified: stable/11/sys/amd64/include/md_var.h stable/11/sys/x86/include/x86_var.h Directory Properties: stable/11/ (props changed) Modified: stable/11/sys/amd64/include/md_var.h ============================================================================== --- stable/11/sys/amd64/include/md_var.h Sat Oct 10 18:18:08 2020 (r366618) +++ stable/11/sys/amd64/include/md_var.h Sat Oct 10 18:22:12 2020 (r366619) @@ -35,6 +35,7 @@ #include extern uint64_t *vm_page_dump; +extern char ctx_switch_xsave[]; extern int hw_lower_amd64_sharedpage; extern int hw_ibrs_disable; extern int hw_ssb_disable; Modified: stable/11/sys/x86/include/x86_var.h ============================================================================== --- stable/11/sys/x86/include/x86_var.h Sat Oct 10 18:18:08 2020 (r366618) +++ stable/11/sys/x86/include/x86_var.h Sat Oct 10 18:22:12 2020 (r366619) @@ -66,7 +66,6 @@ extern u_int cpu_mon_mwait_flags; extern u_int cpu_mon_min_size; extern u_int cpu_mon_max_size; extern u_int cpu_maxphyaddr; -extern char ctx_switch_xsave[]; extern u_int hv_high; extern char hv_vendor[]; extern char kstack[]; From owner-svn-src-all@freebsd.org Sat Oct 10 21:46:01 2020 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 960CB42B0E7; Sat, 10 Oct 2020 21:46:01 +0000 (UTC) (envelope-from cem@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7z5j3T2yz4K4g; Sat, 10 Oct 2020 21:46:01 +0000 (UTC) (envelope-from cem@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 56B20112C3; Sat, 10 Oct 2020 21:46:01 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09ALk1ep098651; Sat, 10 Oct 2020 21:46:01 GMT (envelope-from cem@FreeBSD.org) Received: (from cem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09ALjxbF098638; Sat, 10 Oct 2020 21:45:59 GMT (envelope-from cem@FreeBSD.org) Message-Id: <202010102145.09ALjxbF098638@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cem set sender to cem@FreeBSD.org using -f From: Conrad Meyer Date: Sat, 10 Oct 2020 21:45:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366620 - in head/sys: conf dev/random/fenestrasX X-SVN-Group: head X-SVN-Commit-Author: cem X-SVN-Commit-Paths: in head/sys: conf dev/random/fenestrasX X-SVN-Commit-Revision: 366620 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.33 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: Sat, 10 Oct 2020 21:46:01 -0000 Author: cem Date: Sat Oct 10 21:45:59 2020 New Revision: 366620 URL: https://svnweb.freebsd.org/changeset/base/366620 Log: Add "Fenestras X" alternative /dev/random implementation Fortuna remains the default; no functional change to GENERIC. Big picture: - Scalable entropy generation with per-CPU, buffered local generators. - "Push" system for reseeding child generators when root PRNG is reseeded. (Design can be extended to arc4random(9) and userspace generators.) - Similar entropy pooling system to Fortuna, but starts with a single pool to quickly bootstrap as much entropy as possible early on. - Reseeding from pooled entropy based on time schedule. The time interval starts small and grows exponentially until reaching a cap. Again, the goal is to have the RNG state depend on as much entropy as possible quickly, but still periodically incorporate new entropy for the same reasons as Fortuna. Notable design choices in this implementation that differ from those specified in the whitepaper: - Blake2B instead of SHA-2 512 for entropy pooling - Chacha20 instead of AES-CTR DRBG - Initial seeding. We support more platforms and not all of them use loader(8). So we have to grab the initial entropy sources in kernel mode instead, as much as possible. Fortuna didn't have any mechanism for this aside from the special case of loader-provided previous-boot entropy, so most of these sources remain TODO after this commit. Reviewed by: markm Approved by: csprng (markm) Differential Revision: https://reviews.freebsd.org/D22837 Added: head/sys/dev/random/fenestrasX/ head/sys/dev/random/fenestrasX/fx_brng.c (contents, props changed) head/sys/dev/random/fenestrasX/fx_brng.h (contents, props changed) head/sys/dev/random/fenestrasX/fx_hash.h (contents, props changed) head/sys/dev/random/fenestrasX/fx_main.c (contents, props changed) head/sys/dev/random/fenestrasX/fx_pool.c (contents, props changed) head/sys/dev/random/fenestrasX/fx_pool.h (contents, props changed) head/sys/dev/random/fenestrasX/fx_priv.h (contents, props changed) head/sys/dev/random/fenestrasX/fx_rng.c (contents, props changed) head/sys/dev/random/fenestrasX/fx_rng.h (contents, props changed) Modified: head/sys/conf/NOTES head/sys/conf/files head/sys/conf/options Modified: head/sys/conf/NOTES ============================================================================== --- head/sys/conf/NOTES Sat Oct 10 18:22:12 2020 (r366619) +++ head/sys/conf/NOTES Sat Oct 10 21:45:59 2020 (r366620) @@ -2772,6 +2772,8 @@ options RCTL options MAXFILES=999 # Random number generator +# Alternative algorithm. +#options RANDOM_FENESTRASX # Allow the CSPRNG algorithm to be loaded as a module. #options RANDOM_LOADABLE # Select this to allow high-rate but potentially expensive Modified: head/sys/conf/files ============================================================================== --- head/sys/conf/files Sat Oct 10 18:22:12 2020 (r366619) +++ head/sys/conf/files Sat Oct 10 21:45:59 2020 (r366620) @@ -722,7 +722,7 @@ contrib/zstd/lib/decompress/zstd_decompress_block.c op compile-with "${ZSTD_C} ${ZSTD_DECOMPRESS_BLOCK_FLAGS}" contrib/zstd/lib/decompress/huf_decompress.c optional zstdio compile-with ${ZSTD_C} # Blake 2 -contrib/libb2/blake2b-ref.c optional crypto | ipsec | ipsec_support \ +contrib/libb2/blake2b-ref.c optional crypto | ipsec | ipsec_support | !random_loadable random_fenestrasx \ compile-with "${NORMAL_C} -I$S/crypto/blake2 -Wno-cast-qual -DSUFFIX=_ref -Wno-unused-function" contrib/libb2/blake2s-ref.c optional crypto | ipsec | ipsec_support \ compile-with "${NORMAL_C} -I$S/crypto/blake2 -Wno-cast-qual -DSUFFIX=_ref -Wno-unused-function" @@ -2820,7 +2820,14 @@ rt2860.fw optional rt2860fw | ralfw \ dev/random/random_infra.c standard dev/random/random_harvestq.c standard dev/random/randomdev.c optional !random_loadable -dev/random/fortuna.c optional !random_loadable +dev/random/fenestrasX/fx_brng.c optional !random_loadable random_fenestrasx +dev/random/fenestrasX/fx_main.c optional !random_loadable random_fenestrasx \ + compile-with "${NORMAL_C} -I$S/crypto/blake2" +dev/random/fenestrasX/fx_pool.c optional !random_loadable random_fenestrasx \ + compile-with "${NORMAL_C} -I$S/crypto/blake2" +dev/random/fenestrasX/fx_rng.c optional !random_loadable random_fenestrasx \ + compile-with "${NORMAL_C} -I$S/crypto/blake2" +dev/random/fortuna.c optional !random_loadable !random_fenestrasx dev/random/hash.c optional !random_loadable dev/rccgpio/rccgpio.c optional rccgpio gpio dev/re/if_re.c optional re Modified: head/sys/conf/options ============================================================================== --- head/sys/conf/options Sat Oct 10 18:22:12 2020 (r366619) +++ head/sys/conf/options Sat Oct 10 21:45:59 2020 (r366620) @@ -966,6 +966,8 @@ RACCT_DEFAULT_TO_DISABLED opt_global.h RCTL opt_global.h # Random number generator(s) +# Alternative RNG algorithm. +RANDOM_FENESTRASX opt_global.h # With this, no entropy processor is loaded, but the entropy # harvesting infrastructure is present. This means an entropy # processor may be loaded as a module. Added: head/sys/dev/random/fenestrasX/fx_brng.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/dev/random/fenestrasX/fx_brng.c Sat Oct 10 21:45:59 2020 (r366620) @@ -0,0 +1,295 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2019 Conrad Meyer + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include + +/* + * Implementation of a buffered RNG, described in § 1.2-1.4 of the whitepaper. + */ + +/* + * Initialize a buffered rng instance (either the static root instance, or a + * per-cpu instance on the heap. Both should be zero initialized before this + * routine. + */ +void +fxrng_brng_init(struct fxrng_buffered_rng *rng) +{ + fxrng_rng_init(&rng->brng_rng, rng == &fxrng_root); + + /* I.e., the buffer is empty. */ + rng->brng_avail_idx = sizeof(rng->brng_buffer); + + /* + * It is fine and correct for brng_generation and brng_buffer to be + * zero values. + * + * brng_prf and brng_generation must be initialized later. + * Initialization is special for the root BRNG. PCPU child instances + * use fxrng_brng_produce_seed_data_internal() below. + */ +} + +/* + * Directly reseed the root BRNG from a first-time entropy source, + * incorporating the existing BRNG state. The main motivation for doing so "is + * to ensure that as soon as an entropy source produces data, PRNG output + * depends on the data from that source." (§ 3.1) + * + * The root BRNG is locked on entry and initial keying (brng_generation > 0) + * has already been performed. The root BRNG is unlocked on return. + */ +void +fxrng_brng_src_reseed(const struct harvest_event *event) +{ + struct fxrng_buffered_rng *rng; + + rng = &fxrng_root; + FXRNG_BRNG_ASSERT(rng); + ASSERT_DEBUG(rng->brng_generation > 0, "root RNG not seeded"); + + fxrng_rng_src_reseed(&rng->brng_rng, event); + FXRNG_BRNG_ASSERT(rng); + + /* + * Bump root generation (which is costly) to force downstream BRNGs to + * reseed and quickly incorporate the new entropy. The intuition is + * that this tradeoff is worth it because new sources show up extremely + * rarely (limiting cost) and if they can contribute any entropy to a + * weak state, we want to propagate it to all generators ASAP. + */ + rng->brng_generation++; + atomic_store_rel_64(&fxrng_root_generation, rng->brng_generation); + FXRNG_BRNG_UNLOCK(rng); +} + +/* + * Reseed a brng from some amount of pooled entropy (determined in fx_pool.c by + * fxent_timer_reseed_npools). For initial seeding, we pool entropy in a + * single pool and use this API as well (fxrng_alg_seeded). + */ +void +fxrng_brng_reseed(const void *entr, size_t sz) +{ + struct fxrng_buffered_rng *rng; + + rng = &fxrng_root; + FXRNG_BRNG_LOCK(rng); + + fxrng_rng_reseed(&rng->brng_rng, (rng->brng_generation > 0), entr, sz); + FXRNG_BRNG_ASSERT(rng); + + rng->brng_generation++; + atomic_store_rel_64(&fxrng_root_generation, rng->brng_generation); + FXRNG_BRNG_UNLOCK(rng); +} + +/* + * Grab some bytes off an initialized, current generation RNG. + * + * (Does not handle reseeding if our generation is stale.) + * + * Locking protocol is a bit odd. The RNG is locked on entrance, but the lock + * is dropped on exit. This avoids holding a lock during expensive and slow + * RNG generation. + */ +static void +fxrng_brng_getbytes_internal(struct fxrng_buffered_rng *rng, void *buf, + size_t nbytes) +{ + + FXRNG_BRNG_ASSERT(rng); + + /* Make the zero request impossible for the rest of the logic. */ + if (__predict_false(nbytes == 0)) { + FXRNG_BRNG_UNLOCK(rng); + goto out; + } + + /* Fast/easy case: Use some bytes from the buffer. */ + if (rng->brng_avail_idx + nbytes <= sizeof(rng->brng_buffer)) { + memcpy(buf, &rng->brng_buffer[rng->brng_avail_idx], nbytes); + explicit_bzero(&rng->brng_buffer[rng->brng_avail_idx], nbytes); + rng->brng_avail_idx += nbytes; + FXRNG_BRNG_UNLOCK(rng); + goto out; + } + + /* Buffer case: */ + if (nbytes < sizeof(rng->brng_buffer)) { + size_t rem; + + /* Drain anything left in the buffer first. */ + if (rng->brng_avail_idx < sizeof(rng->brng_buffer)) { + rem = sizeof(rng->brng_buffer) - rng->brng_avail_idx; + ASSERT_DEBUG(nbytes > rem, "invariant"); + + memcpy(buf, &rng->brng_buffer[rng->brng_avail_idx], rem); + + buf = (uint8_t*)buf + rem; + nbytes -= rem; + ASSERT_DEBUG(nbytes != 0, "invariant"); + } + + /* + * Partial fill from first buffer, have to rekey and generate a + * new buffer to do the rest. + */ + fxrng_rng_genrandom_internal(&rng->brng_rng, rng->brng_buffer, + sizeof(rng->brng_buffer), false); + FXRNG_BRNG_ASSERT(rng); + rng->brng_avail_idx = 0; + + memcpy(buf, &rng->brng_buffer[rng->brng_avail_idx], nbytes); + explicit_bzero(&rng->brng_buffer[rng->brng_avail_idx], nbytes); + rng->brng_avail_idx += nbytes; + FXRNG_BRNG_UNLOCK(rng); + goto out; + } + + /* Large request; skip the buffer. */ + fxrng_rng_genrandom_internal(&rng->brng_rng, buf, nbytes, true); + +out: + FXRNG_BRNG_ASSERT_NOT(rng); + return; +} + +/* + * API to get a new key for a downstream RNG. Returns the new key in 'buf', as + * well as the generator's reseed_generation. + * + * 'rng' is locked on entry and unlocked on return. + * + * Only valid after confirming the caller's seed version or reseed_generation + * matches roots (or we are root). (For now, this is only used to reseed the + * per-CPU generators from root.) + */ +void +fxrng_brng_produce_seed_data_internal(struct fxrng_buffered_rng *rng, + void *buf, size_t keysz, uint64_t *seed_generation) +{ + FXRNG_BRNG_ASSERT(rng); + ASSERT_DEBUG(keysz == FX_CHACHA20_KEYSIZE, "keysz: %zu", keysz); + + *seed_generation = rng->brng_generation; + fxrng_brng_getbytes_internal(rng, buf, keysz); + FXRNG_BRNG_ASSERT_NOT(rng); +} + +/* + * Read from an allocated and initialized buffered BRNG. This a high-level + * API, but doesn't handle PCPU BRNG allocation. + * + * BRNG is locked on entry. It is unlocked on return. + */ +void +fxrng_brng_read(struct fxrng_buffered_rng *rng, void *buf, size_t nbytes) +{ + uint8_t newkey[FX_CHACHA20_KEYSIZE]; + + FXRNG_BRNG_ASSERT(rng); + + /* Fast path: there hasn't been a global reseed since last read. */ + if (rng->brng_generation == atomic_load_acq_64(&fxrng_root_generation)) + goto done_reseeding; + + ASSERT(rng != &fxrng_root, "root rng inconsistent seed version"); + + /* + * Slow path: We need to rekey from the parent BRNG to incorporate new + * entropy material. + * + * Lock order is always root -> percpu. + */ + FXRNG_BRNG_UNLOCK(rng); + FXRNG_BRNG_LOCK(&fxrng_root); + FXRNG_BRNG_LOCK(rng); + + /* + * If we lost the reseeding race when the lock was dropped, don't + * duplicate work. + */ + if (__predict_false(rng->brng_generation == + atomic_load_acq_64(&fxrng_root_generation))) { + FXRNG_BRNG_UNLOCK(&fxrng_root); + goto done_reseeding; + } + + fxrng_brng_produce_seed_data_internal(&fxrng_root, newkey, + sizeof(newkey), &rng->brng_generation); + + FXRNG_BRNG_ASSERT_NOT(&fxrng_root); + FXRNG_BRNG_ASSERT(rng); + + fxrng_rng_setkey(&rng->brng_rng, newkey, sizeof(newkey)); + explicit_bzero(newkey, sizeof(newkey)); + + /* + * A reseed invalidates any previous buffered contents. Here, we + * forward the available index to the end of the buffer, i.e., empty. + * Requests that would use the buffer (< 128 bytes) will refill its + * contents on demand. + * + * It is explicitly ok that we do not zero out any remaining buffer + * bytes; they will never be handed out to callers, and they reveal + * nothing about the reseeded key (which came from the root BRNG). + * (§ 1.3) + */ + rng->brng_avail_idx = sizeof(rng->brng_buffer); + +done_reseeding: + if (rng != &fxrng_root) + FXRNG_BRNG_ASSERT_NOT(&fxrng_root); + FXRNG_BRNG_ASSERT(rng); + + fxrng_brng_getbytes_internal(rng, buf, nbytes); + FXRNG_BRNG_ASSERT_NOT(rng); +} Added: head/sys/dev/random/fenestrasX/fx_brng.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/dev/random/fenestrasX/fx_brng.h Sat Oct 10 21:45:59 2020 (r366620) @@ -0,0 +1,66 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2019 Conrad Meyer + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#pragma once + +#include + +#define FXRNG_BUFRNG_SZ 128 + +/* + * An object representing a buffered random number generator with forward + * secrecy (aka "fast-key-erasure"). + * + * There is a single static root instance of this object associated with the + * entropy harvester, as well as additional instances per CPU, lazily allocated + * in NUMA-local memory, seeded from output of the root generator. + */ +struct fxrng_buffered_rng { + struct fxrng_basic_rng brng_rng; +#define FXRNG_BRNG_LOCK(brng) mtx_lock(&(brng)->brng_rng.rng_lk) +#define FXRNG_BRNG_UNLOCK(brng) mtx_unlock(&(brng)->brng_rng.rng_lk) +#define FXRNG_BRNG_ASSERT(brng) mtx_assert(&(brng)->brng_rng.rng_lk, MA_OWNED) +#define FXRNG_BRNG_ASSERT_NOT(brng) \ + mtx_assert(&(brng)->brng_rng.rng_lk, MA_NOTOWNED) + + /* Entropy reseed generation ("seed version"). */ + uint64_t brng_generation; + + /* Buffered output for quick access by small requests. */ + uint8_t brng_buffer[FXRNG_BUFRNG_SZ]; + uint8_t brng_avail_idx; +}; + +void fxrng_brng_init(struct fxrng_buffered_rng *); +void fxrng_brng_produce_seed_data_internal(struct fxrng_buffered_rng *, void *, + size_t, uint64_t *seed_generation); +void fxrng_brng_read(struct fxrng_buffered_rng *, void *, size_t); + +void fxrng_brng_reseed(const void *, size_t); +struct harvest_event; +void fxrng_brng_src_reseed(const struct harvest_event *); Added: head/sys/dev/random/fenestrasX/fx_hash.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/dev/random/fenestrasX/fx_hash.h Sat Oct 10 21:45:59 2020 (r366620) @@ -0,0 +1,72 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2019 Conrad Meyer + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#pragma once + +#include +#define blake2b_init blake2b_init_ref +#define blake2b_update blake2b_update_ref +#define blake2b_final blake2b_final_ref +#include + +#define FXRNG_HASH_SZ BLAKE2B_OUTBYTES /* 64 */ + +/* + * Wrappers for hash function abstraction. + */ +struct fxrng_hash { + blake2b_state state; +}; + +static inline void +fxrng_hash_init(struct fxrng_hash *h) +{ + int rc; + + rc = blake2b_init(&h->state, FXRNG_HASH_SZ); + ASSERT(rc == 0, "blake2b_init"); +} + +static inline void +fxrng_hash_update(struct fxrng_hash *h, const void *buf, size_t sz) +{ + int rc; + + rc = blake2b_update(&h->state, buf, sz); + ASSERT(rc == 0, "blake2b_update"); +} + +static inline void +fxrng_hash_finish(struct fxrng_hash *h, uint8_t buf[static FXRNG_HASH_SZ], size_t sz) +{ + int rc; + + rc = blake2b_final(&h->state, buf, sz); + ASSERT(rc == 0, "blake2b_final(sz=%zu)", sz); + explicit_bzero(h, sizeof(*h)); +} Added: head/sys/dev/random/fenestrasX/fx_main.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/dev/random/fenestrasX/fx_main.c Sat Oct 10 21:45:59 2020 (r366620) @@ -0,0 +1,274 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2019 Conrad Meyer + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * This random algorithm is derived in part from the "Windows 10 random number + * generation infrastructure" whitepaper published by Niels Ferguson and + * Microsoft: https://aka.ms/win10rng + * + * It is also inspired by DJB's writing on buffered key-erasure PRNGs: + * https://blog.cr.yp.to/20170723-random.html + * + * The Windows 10 RNG bears some similarity to Fortuna, which Ferguson was also + * involved with. Notable differences include: + * - Extended to multi-CPU design + * - Extended to pre-buffer some PRNG output + * - Pool-based reseeding is solely time-based (rather than on-access w/ + * pacing) + * - Extended to specify efficient userspace design + * - Always-available design (requires the equivalent of loader(8) for all + * boots; probably relatively easy given the limited platforms Windows 10 + * supports) + * + * Some aspects of the design document I found confusing and may have + * misinterpreted: + * - Relationship between root PRNG seed version and periodic reseed pool use. + * I interpreted these as separate sequences. The root PRNG seed version is + * bumped both by the periodic pool based reseed, and also special + * conditions such as the first time an entropy source provides entropy. I + * don't think first-time entropy sources should cause us to skip an entropy + * pool reseed. + * - Initial seeding. The paper is pretty terse on the subject. My + * interpretation of the document is that the Windows RNG infrastructure + * relies on the loader(8)-provided material for initial seeding and either + * ignores or doesn't start entropy sources until after that time. So when + * the paper says that first-time entropy source material "bypasses the + * pools," the root PRNG state already has been keyed for the first time and + * can generate 256 bits, mix it with the first-time entropy, and reseed + * immediately. + * + * Some notable design choices in this implementation divergent from that + * specified in the document above: + * - Blake2b instead of SHA-2 512 for entropy pooling + * - Chacha20 instead of AES-CTR DRBG for PRF + * - Initial seeding. We treat the 0->1 seed version (brng_generation) edge + * as the transition from blocked to unblocked. That edge is also the first + * time the key of the root BRNG's PRF is set. We perform initial seeding + * when the first request for entropy arrives. + * • As a result: Entropy callbacks prior to this edge do not have a keyed + * root PRNG, so bypassing the pools is kind of meaningless. Instead, + * they feed into pool0. (They also do not set the root PRNG key or bump + * the root PRNG seed version.) + * • Entropy callbacks after the edge behave like the specification. + * • All one-off sources are fed into pool0 and the result used to seed the + * root BRNG during the initial seed step. + * • All memory needed for initial seeding must be preallocated or static or + * fit on the stack; random reads can occur in nonsleepable contexts and + * we cannot allocate M_WAITOK. (We also cannot fail to incorporate any + * present one-off source, to the extent it is in the control of + * software.) + * - Timer interval reseeding. We also start the timer-based reseeding at + * initial seed, but unlike the design, our initial seed is some time after + * load (usually within the order of micro- or milliseconds due to + * stack_guard on x86, but conceivably later if nothing reads from random for + * a while). + * + * Not yet implemented, not in scope, or todo: + * - arc4random(9) injection/replacement + * - Userspace portions -- shared page, like timehands vdso? + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +struct fxrng_buffered_rng fxrng_root; +uint64_t __read_mostly fxrng_root_generation; +DPCPU_DEFINE_STATIC(struct fxrng_buffered_rng *, fxrng_brng); + +/* + * Top-level read API from randomdev. Responsible for NOWAIT-allocating + * per-cpu NUMA-local BRNGs, if needed and satisfiable; subroutines handle + * reseeding if the local BRNG is stale and rekeying when necessary. In + * low-memory conditions when a local BRNG cannot be allocated, the request is + * simply forwarded to the root BRNG. + * + * It is a precondition is that the root BRNG initial seeding has completed and + * the root generation number >0. + */ +static void +fxrng_alg_read(uint8_t *output, size_t nbytes) +{ + struct fxrng_buffered_rng **pcpu_brng_p, *rng, *tmp; + struct pcpu *pcpu; + + pcpu = get_pcpu(); + + /* + * The following statement directly accesses an implementation detail + * of DPCPU, but the macros cater only to pinned threads; we want to + * operate on our initial CPU, without pinning, *even if* we migrate. + */ + pcpu_brng_p = _DPCPU_PTR(pcpu->pc_dynamic, fxrng_brng); + + rng = (void *)atomic_load_acq_ptr((uintptr_t *)pcpu_brng_p); + + /* + * Usually the pcpu BRNG has already been allocated, but we do it + * on-demand and need to check first. BRNGs are never deallocated and + * are valid as soon as the pointer is initialized. + */ + if (__predict_false(rng == NULL)) { + uint8_t newkey[FX_CHACHA20_KEYSIZE]; + struct domainset *ds; + int domain; + + domain = pcpu->pc_domain; + + /* + * Allocate pcpu BRNGs off-domain on weird NUMA machines like + * AMD Threadripper 2990WX, which has 2 NUMA nodes without + * local memory controllers. The PREF policy is automatically + * converted to something appropriate when domains are empty. + * (FIXED is not.) + * + * Otherwise, allocate strictly CPU-local memory. The + * rationale is this: if there is a memory shortage such that + * PREF policy would fallback to RR, we have no business + * wasting memory on a faster BRNG. So, use a FIXED domainset + * policy. If we cannot allocate, that's fine! We fall back + * to invoking the root BRNG. + */ + if (VM_DOMAIN_EMPTY(domain)) + ds = DOMAINSET_PREF(domain); + else + ds = DOMAINSET_FIXED(domain); + + rng = malloc_domainset(sizeof(*rng), M_ENTROPY, ds, + M_NOWAIT | M_ZERO); + if (rng == NULL) { + /* Relatively easy case: fall back to root BRNG. */ + rng = &fxrng_root; + goto have_valid_rng; + } + + fxrng_brng_init(rng); + + /* + * The root BRNG is always up and available. Requests are + * always satisfiable. This is a design invariant. + */ + ASSERT_DEBUG(atomic_load_acq_64(&fxrng_root_generation) != 0, + "%s: attempting to seed child BRNG when root hasn't " + "been initialized yet.", __func__); + + FXRNG_BRNG_LOCK(&fxrng_root); +#ifdef WITNESS + /* Establish lock order root->pcpu for WITNESS. */ + FXRNG_BRNG_LOCK(rng); + FXRNG_BRNG_UNLOCK(rng); +#endif + fxrng_brng_produce_seed_data_internal(&fxrng_root, newkey, + sizeof(newkey), &rng->brng_generation); + FXRNG_BRNG_ASSERT_NOT(&fxrng_root); + + fxrng_rng_setkey(&rng->brng_rng, newkey, sizeof(newkey)); + explicit_bzero(newkey, sizeof(newkey)); + + /* + * We have a valid RNG. Try to install it, or grab the other + * one if we lost the race. + */ + tmp = NULL; + while (tmp == NULL) + if (atomic_fcmpset_ptr((uintptr_t *)pcpu_brng_p, + (uintptr_t *)&tmp, (uintptr_t)rng)) + goto have_valid_rng; + + /* + * We lost the race. There's nothing sensitive about + * our BRNG's PRF state, because it will never be used + * for anything and the key doesn't expose any + * information about the parent (root) generator's + * state -- it has already rekeyed. The generation + * number is public, and a zero counter isn't sensitive. + */ + free(rng, M_ENTROPY); + /* + * Use the winner's PCPU BRNG. + */ + rng = tmp; + } + +have_valid_rng: + /* At this point we have a valid, initialized and seeded rng pointer. */ + FXRNG_BRNG_LOCK(rng); + fxrng_brng_read(rng, output, nbytes); + FXRNG_BRNG_ASSERT_NOT(rng); +} + +static void +fxrng_init_alg(void *dummy __unused) +{ + DPCPU_ZERO(fxrng_brng); + fxrng_brng_init(&fxrng_root); + fxrng_pools_init(); +} +SYSINIT(random_alg, SI_SUB_RANDOM, SI_ORDER_SECOND, fxrng_init_alg, NULL); + +/* + * Public visibility struct referenced directly by other parts of randomdev. + */ +const struct random_algorithm random_alg_context = { + .ra_ident = "fenestrasX", + .ra_pre_read = (void (*)(void))nullop, + .ra_read = fxrng_alg_read, + .ra_seeded = fxrng_alg_seeded, + .ra_event_processor = fxrng_event_processor, + .ra_poolcount = FXRNG_NPOOLS, +}; Added: head/sys/dev/random/fenestrasX/fx_pool.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/dev/random/fenestrasX/fx_pool.c Sat Oct 10 21:45:59 2020 (r366620) @@ -0,0 +1,615 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2019 Conrad Meyer + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +/* + * Timer-based reseed interval growth factor and limit in seconds. (§ 3.2) + */ +#define FXENT_RESSED_INTVL_GFACT 3 +#define FXENT_RESEED_INTVL_MAX 3600 + +/* + * Pool reseed schedule. Initially, only pool 0 is active. Until the timer + * interval reaches INTVL_MAX, only pool 0 is used. + * + * After reaching INTVL_MAX, pool k is either activated (if inactive) or used + * (if active) every 3^k timer reseeds. (§ 3.3) + * + * (Entropy harvesting only round robins across active pools.) + */ +#define FXENT_RESEED_BASE 3 + +/* + * Number of bytes from high quality sources to allocate to pool 0 before + * normal round-robin allocation after each timer reseed. (§ 3.4) + */ +#define FXENT_HI_SRC_POOL0_BYTES 32 + +/* + * § 3.1 + * + * Low sources provide unconditioned entropy, such as mouse movements; high + * sources are assumed to provide high-quality random bytes. Pull sources are + * those which can be polled, i.e., anything randomdev calls a "random_source." + * + * In the whitepaper, low sources are pull. For us, at least in the existing + * design, low-quality sources push into some global ring buffer and then get + * forwarded into the RNG by a thread that continually polls. Presumably their + * design batches low entopy signals in some way (SHA512?) and only requests + * them dynamically on reseed. I'm not sure what the benefit is vs feeding + * into the pools directly. + */ +enum fxrng_ent_access_cls { + FXRNG_PUSH, + FXRNG_PULL, +}; +enum fxrng_ent_source_cls { + FXRNG_HI, + FXRNG_LO, + FXRNG_GARBAGE, +}; +struct fxrng_ent_cls { + enum fxrng_ent_access_cls entc_axx_cls; + enum fxrng_ent_source_cls entc_src_cls; +}; + +static const struct fxrng_ent_cls fxrng_hi_pull = { + .entc_axx_cls = FXRNG_PULL, + .entc_src_cls = FXRNG_HI, +}; +static const struct fxrng_ent_cls fxrng_hi_push = { + .entc_axx_cls = FXRNG_PUSH, + .entc_src_cls = FXRNG_HI, +}; +static const struct fxrng_ent_cls fxrng_lo_push = { + .entc_axx_cls = FXRNG_PUSH, + .entc_src_cls = FXRNG_LO, +}; +static const struct fxrng_ent_cls fxrng_garbage = { + .entc_axx_cls = FXRNG_PUSH, + .entc_src_cls = FXRNG_GARBAGE, +}; + +/* + * This table is a mapping of randomdev's current source abstractions to the + * designations above; at some point, if the design seems reasonable, it would + * make more sense to pull this up into the abstraction layer instead. + */ +static const struct fxrng_ent_char { + const struct fxrng_ent_cls *entc_cls; +} fxrng_ent_char[ENTROPYSOURCE] = { + [RANDOM_CACHED] = { + .entc_cls = &fxrng_hi_push, + }, + [RANDOM_ATTACH] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_KEYBOARD] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_MOUSE] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_NET_TUN] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_NET_ETHER] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_NET_NG] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_INTERRUPT] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_SWI] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_FS_ATIME] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_UMA] = { + .entc_cls = &fxrng_lo_push, + }, + [RANDOM_PURE_OCTEON] = { + .entc_cls = &fxrng_hi_push, /* Could be made pull. */ + }, + [RANDOM_PURE_SAFE] = { + .entc_cls = &fxrng_hi_push, + }, + [RANDOM_PURE_GLXSB] = { + .entc_cls = &fxrng_hi_push, + }, + [RANDOM_PURE_HIFN] = { + .entc_cls = &fxrng_hi_push, + }, + [RANDOM_PURE_RDRAND] = { + .entc_cls = &fxrng_hi_pull, + }, + [RANDOM_PURE_NEHEMIAH] = { + .entc_cls = &fxrng_hi_pull, + }, + [RANDOM_PURE_RNDTEST] = { + .entc_cls = &fxrng_garbage, + }, + [RANDOM_PURE_VIRTIO] = { + .entc_cls = &fxrng_hi_pull, + }, + [RANDOM_PURE_BROADCOM] = { + .entc_cls = &fxrng_hi_push, + }, + [RANDOM_PURE_CCP] = { + .entc_cls = &fxrng_hi_pull, + }, + [RANDOM_PURE_DARN] = { + .entc_cls = &fxrng_hi_pull, + }, + [RANDOM_PURE_TPM] = { + .entc_cls = &fxrng_hi_push, + }, + [RANDOM_PURE_VMGENID] = { + .entc_cls = &fxrng_hi_push, + }, +}; + +/* Useful for single-bit-per-source state. */ +BITSET_DEFINE(fxrng_bits, ENTROPYSOURCE); + +/* XXX Borrowed from not-yet-committed D22702. */ +#ifndef BIT_TEST_SET_ATOMIC_ACQ +#define BIT_TEST_SET_ATOMIC_ACQ(_s, n, p) \ + (atomic_testandset_acq_long( \ + &(p)->__bits[__bitset_word((_s), (n))], (n)) != 0) +#endif +#define FXENT_TEST_SET_ATOMIC_ACQ(n, p) \ + BIT_TEST_SET_ATOMIC_ACQ(ENTROPYSOURCE, n, p) + +/* For special behavior on first-time entropy sources. (§ 3.1) */ +static struct fxrng_bits __read_mostly fxrng_seen; + +/* For special behavior for high-entropy sources after a reseed. (§ 3.4) */ +_Static_assert(FXENT_HI_SRC_POOL0_BYTES <= UINT8_MAX, ""); +static uint8_t __read_mostly fxrng_reseed_seen[ENTROPYSOURCE]; + +/* Entropy pools. Lock order is ENT -> RNG(root) -> RNG(leaf). */ +static struct mtx fxent_pool_lk; +MTX_SYSINIT(fx_pool, &fxent_pool_lk, "fx entropy pool lock", MTX_DEF); +#define FXENT_LOCK() mtx_lock(&fxent_pool_lk) *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-all@freebsd.org Sat Oct 10 21:48:08 2020 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 C63E842B3B4; Sat, 10 Oct 2020 21:48:08 +0000 (UTC) (envelope-from cem@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7z884q3kz4KXM; Sat, 10 Oct 2020 21:48:08 +0000 (UTC) (envelope-from cem@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 6F73F10C7F; Sat, 10 Oct 2020 21:48:08 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09ALm8Xt098787; Sat, 10 Oct 2020 21:48:08 GMT (envelope-from cem@FreeBSD.org) Received: (from cem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09ALm6Sm098779; Sat, 10 Oct 2020 21:48:06 GMT (envelope-from cem@FreeBSD.org) Message-Id: <202010102148.09ALm6Sm098779@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cem set sender to cem@FreeBSD.org using -f From: Conrad Meyer Date: Sat, 10 Oct 2020 21:48:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366621 - in head/sys: dev/random dev/random/fenestrasX libkern sys X-SVN-Group: head X-SVN-Commit-Author: cem X-SVN-Commit-Paths: in head/sys: dev/random dev/random/fenestrasX libkern sys X-SVN-Commit-Revision: 366621 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.33 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: Sat, 10 Oct 2020 21:48:08 -0000 Author: cem Date: Sat Oct 10 21:48:06 2020 New Revision: 366621 URL: https://svnweb.freebsd.org/changeset/base/366621 Log: arc4random(9): Integrate with RANDOM_FENESTRASX push-reseed There is no functional change for the existing Fortuna random(4) implementation, which remains the default in GENERIC. In the FenestrasX model, when the root CSPRNG is reseeded from pools due to an (infrequent) timer, child CSPRNGs can cheaply detect this condition and reseed. To do so, they just need to track an additional 64-bit value in the associated state, and compare it against the root seed version (generation) on random reads. This revision integrates arc4random(9) into that model without substantially changing the design or implementation of arc4random(9). The motivation is that arc4random(9) is immediately reseeded when the backing random(4) implementation has additional entropy. This is arguably most important during boot, when fenestrasX is reseeding at 1, 3, 9, 27, etc., second intervals. Today, arc4random(9) has a hardcoded 300 second reseed window. Without this mechanism, if arc4random(9) gets weak entropy during initial seed (and arc4random(9) is used early in boot, so this is quite possible), it may continue to emit poorly seeded output for 5 minutes. The FenestrasX push-reseed scheme corrects consumers, like arc4random(9), as soon as possible. Reviewed by: markm Approved by: csprng (markm) Differential Revision: https://reviews.freebsd.org/D22838 Added: head/sys/dev/random/fenestrasX/fx_pub.h (contents, props changed) Modified: head/sys/dev/random/fenestrasX/fx_brng.c head/sys/dev/random/fenestrasX/fx_main.c head/sys/dev/random/fenestrasX/fx_pool.c head/sys/dev/random/fenestrasX/fx_priv.h head/sys/dev/random/randomdev.c head/sys/libkern/arc4random.c head/sys/sys/libkern.h Modified: head/sys/dev/random/fenestrasX/fx_brng.c ============================================================================== --- head/sys/dev/random/fenestrasX/fx_brng.c Sat Oct 10 21:45:59 2020 (r366620) +++ head/sys/dev/random/fenestrasX/fx_brng.c Sat Oct 10 21:48:06 2020 (r366621) @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include /* Modified: head/sys/dev/random/fenestrasX/fx_main.c ============================================================================== --- head/sys/dev/random/fenestrasX/fx_main.c Sat Oct 10 21:45:59 2020 (r366620) +++ head/sys/dev/random/fenestrasX/fx_main.c Sat Oct 10 21:48:06 2020 (r366621) @@ -88,7 +88,6 @@ * a while). * * Not yet implemented, not in scope, or todo: - * - arc4random(9) injection/replacement * - Userspace portions -- shared page, like timehands vdso? */ @@ -125,6 +124,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include struct fxrng_buffered_rng fxrng_root; @@ -142,7 +142,7 @@ DPCPU_DEFINE_STATIC(struct fxrng_buffered_rng *, fxrng * the root generation number >0. */ static void -fxrng_alg_read(uint8_t *output, size_t nbytes) +_fxrng_alg_read(uint8_t *output, size_t nbytes, uint64_t *seed_version_out) { struct fxrng_buffered_rng **pcpu_brng_p, *rng, *tmp; struct pcpu *pcpu; @@ -248,8 +248,30 @@ fxrng_alg_read(uint8_t *output, size_t nbytes) have_valid_rng: /* At this point we have a valid, initialized and seeded rng pointer. */ FXRNG_BRNG_LOCK(rng); + if (seed_version_out != NULL) + *seed_version_out = rng->brng_generation; fxrng_brng_read(rng, output, nbytes); FXRNG_BRNG_ASSERT_NOT(rng); +} + +static void +fxrng_alg_read(uint8_t *output, size_t nbytes) +{ + _fxrng_alg_read(output, nbytes, NULL); +} + +/* + * External API for arc4random(9) to fetch new key material and associated seed + * version in chacha20_randomstir(). + */ +void +read_random_key(void *output, size_t nbytes, uint64_t *seed_version_out) +{ + /* Ensure _fxrng_alg_read invariant. */ + if (__predict_false(atomic_load_acq_64(&fxrng_root_generation) == 0)) + (void)fxrng_alg_seeded(); + + _fxrng_alg_read(output, nbytes, seed_version_out); } static void Modified: head/sys/dev/random/fenestrasX/fx_pool.c ============================================================================== --- head/sys/dev/random/fenestrasX/fx_pool.c Sat Oct 10 21:45:59 2020 (r366620) +++ head/sys/dev/random/fenestrasX/fx_pool.c Sat Oct 10 21:48:06 2020 (r366621) @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include /* * Timer-based reseed interval growth factor and limit in seconds. (§ 3.2) Modified: head/sys/dev/random/fenestrasX/fx_priv.h ============================================================================== --- head/sys/dev/random/fenestrasX/fx_priv.h Sat Oct 10 21:45:59 2020 (r366620) +++ head/sys/dev/random/fenestrasX/fx_priv.h Sat Oct 10 21:48:06 2020 (r366621) @@ -46,4 +46,3 @@ #endif extern struct fxrng_buffered_rng fxrng_root; -extern uint64_t __read_mostly fxrng_root_generation; Added: head/sys/dev/random/fenestrasX/fx_pub.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/dev/random/fenestrasX/fx_pub.h Sat Oct 10 21:48:06 2020 (r366621) @@ -0,0 +1,53 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2019 Conrad Meyer + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ +#pragma once + +#include + +/* + * The root BRNG seed version, or generation. + * + * FenestrasX-aware downstream CSPRNGs (i.e., arc4random(9)) should track the + * generation number they seeded from, using the read_random_key(9) API below. + * If their current seed version is older than the root generation, they should + * reseed before producing output. + * + * The variable is read-only outside of the fenestrasX implementation and + * should be accessed using 'atomic_load_acq_64(&fxrng_root_generation)'. + * Reseeds are extremely infrequent, so callers may wish to hint to the + * compiler that a matching generation is the expected case, with + * __predict_true() or __predict_false(). + */ +extern uint64_t __read_mostly fxrng_root_generation; + +/* + * A routine for generating seed/key material + * Bypasses random(4) for now, but conceivably could be incorporated into that. + */ +void read_random_key(void *buf, size_t nbytes, uint64_t *seed_version_out); Modified: head/sys/dev/random/randomdev.c ============================================================================== --- head/sys/dev/random/randomdev.c Sat Oct 10 21:45:59 2020 (r366620) +++ head/sys/dev/random/randomdev.c Sat Oct 10 21:48:06 2020 (r366621) @@ -373,8 +373,10 @@ randomdev_unblock(void) selwakeuppri(&rsel, PUSER); wakeup(p_random_alg_context); printf("random: unblocking device.\n"); +#ifndef RANDOM_FENESTRASX /* Do random(9) a favour while we are about it. */ (void)atomic_cmpset_int(&arc4rand_iniseed_state, ARC4_ENTR_NONE, ARC4_ENTR_HAVE); +#endif } /* ARGSUSED */ Modified: head/sys/libkern/arc4random.c ============================================================================== --- head/sys/libkern/arc4random.c Sat Oct 10 21:45:59 2020 (r366620) +++ head/sys/libkern/arc4random.c Sat Oct 10 21:48:06 2020 (r366621) @@ -40,10 +40,14 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include #include #include -#include +#ifdef RANDOM_FENESTRASX +#include +#endif #define CHACHA20_RESEED_BYTES 65536 #define CHACHA20_RESEED_SECONDS 300 @@ -52,7 +56,9 @@ __FBSDID("$FreeBSD$"); CTASSERT(CHACHA20_KEYBYTES*8 >= CHACHA_MINKEYLEN); +#ifndef RANDOM_FENESTRASX int arc4rand_iniseed_state = ARC4_ENTR_NONE; +#endif MALLOC_DEFINE(M_CHACHA20RANDOM, "chacha20random", "chacha20random structures"); @@ -62,6 +68,9 @@ struct chacha20_s { time_t t_reseed; u_int8_t m_buffer[CHACHA20_BUFFER_SIZE]; struct chacha_ctx ctx; +#ifdef RANDOM_FENESTRASX + uint64_t seed_version; +#endif } __aligned(CACHE_LINE_SIZE); static struct chacha20_s *chacha20inst = NULL; @@ -79,7 +88,10 @@ chacha20_randomstir(struct chacha20_s *chacha20) { struct timeval tv_now; u_int8_t key[CHACHA20_KEYBYTES]; +#ifdef RANDOM_FENESTRASX + uint64_t seed_version; +#else if (__predict_false(random_bypass_before_seeding && !is_random_seeded())) { SHA256_CTX ctx; uint64_t cc; @@ -106,6 +118,10 @@ chacha20_randomstir(struct chacha20_s *chacha20) "make sure 256 bits is still 256 bits"); SHA256_Final(key, &ctx); } else { +#endif +#ifdef RANDOM_FENESTRASX + read_random_key(key, CHACHA20_KEYBYTES, &seed_version); +#else /* * If the loader(8) did not have an entropy stash from the * previous shutdown to load, then we will block. The answer is @@ -117,6 +133,7 @@ chacha20_randomstir(struct chacha20_s *chacha20) */ read_random(key, CHACHA20_KEYBYTES); } +#endif getmicrouptime(&tv_now); mtx_lock(&chacha20->mtx); chacha_keysetup(&chacha20->ctx, key, CHACHA20_KEYBYTES*8); @@ -124,6 +141,9 @@ chacha20_randomstir(struct chacha20_s *chacha20) /* Reset for next reseed cycle. */ chacha20->t_reseed = tv_now.tv_sec + CHACHA20_RESEED_SECONDS; chacha20->numbytes = 0; +#ifdef RANDOM_FENESTRASX + chacha20->seed_version = seed_version; +#endif mtx_unlock(&chacha20->mtx); } @@ -173,9 +193,13 @@ arc4rand(void *ptr, u_int len, int reseed) u_int length; u_int8_t *p; +#ifdef RANDOM_FENESTRASX + if (__predict_false(reseed)) +#else if (__predict_false(reseed || (arc4rand_iniseed_state == ARC4_ENTR_HAVE && atomic_cmpset_int(&arc4rand_iniseed_state, ARC4_ENTR_HAVE, ARC4_ENTR_SEED)))) +#endif CHACHA20_FOREACH(chacha20) chacha20_randomstir(chacha20); @@ -185,8 +209,18 @@ arc4rand(void *ptr, u_int len, int reseed) if ((chacha20->numbytes > CHACHA20_RESEED_BYTES) || (tv.tv_sec > chacha20->t_reseed)) chacha20_randomstir(chacha20); - p = ptr; mtx_lock(&chacha20->mtx); +#ifdef RANDOM_FENESTRASX + if (__predict_false( + atomic_load_acq_64(&fxrng_root_generation) != chacha20->seed_version + )) { + mtx_unlock(&chacha20->mtx); + chacha20_randomstir(chacha20); + mtx_lock(&chacha20->mtx); + } +#endif + + p = ptr; while (len) { length = MIN(CHACHA20_BUFFER_SIZE, len); chacha_encrypt_bytes(&chacha20->ctx, chacha20->m_buffer, p, length); Modified: head/sys/sys/libkern.h ============================================================================== --- head/sys/sys/libkern.h Sat Oct 10 21:45:59 2020 (r366620) +++ head/sys/sys/libkern.h Sat Oct 10 21:48:06 2020 (r366621) @@ -116,10 +116,12 @@ static __inline int abs(int a) { return (a < 0 ? -a : static __inline long labs(long a) { return (a < 0 ? -a : a); } static __inline quad_t qabs(quad_t a) { return (a < 0 ? -a : a); } +#ifndef RANDOM_FENESTRASX #define ARC4_ENTR_NONE 0 /* Don't have entropy yet. */ #define ARC4_ENTR_HAVE 1 /* Have entropy. */ #define ARC4_ENTR_SEED 2 /* Reseeding. */ extern int arc4rand_iniseed_state; +#endif /* Prototypes for non-quad routines. */ struct malloc_type; From owner-svn-src-all@freebsd.org Sat Oct 10 21:52:05 2020 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 2AA1642B6A4; Sat, 10 Oct 2020 21:52:05 +0000 (UTC) (envelope-from cem@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) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 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 4C7zDj0bSrz4Kwm; Sat, 10 Oct 2020 21:52:05 +0000 (UTC) (envelope-from cem@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 D19BB11548; Sat, 10 Oct 2020 21:52:04 +0000 (UTC) (envelope-from cem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09ALq41s004261; Sat, 10 Oct 2020 21:52:04 GMT (envelope-from cem@FreeBSD.org) Received: (from cem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09ALq0js004240; Sat, 10 Oct 2020 21:52:00 GMT (envelope-from cem@FreeBSD.org) Message-Id: <202010102152.09ALq0js004240@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: cem set sender to cem@FreeBSD.org using -f From: Conrad Meyer Date: Sat, 10 Oct 2020 21:52:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366622 - in head: lib/libc/gen sys/amd64/amd64 sys/arm/arm sys/arm64/arm64 sys/compat/ia32 sys/dev/random/fenestrasX sys/i386/i386 sys/kern sys/mips/mips sys/powerpc/powerpc sys/riscv/... X-SVN-Group: head X-SVN-Commit-Author: cem X-SVN-Commit-Paths: in head: lib/libc/gen sys/amd64/amd64 sys/arm/arm sys/arm64/arm64 sys/compat/ia32 sys/dev/random/fenestrasX sys/i386/i386 sys/kern sys/mips/mips sys/powerpc/powerpc sys/riscv/riscv sys/sys X-SVN-Commit-Revision: 366622 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.33 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: Sat, 10 Oct 2020 21:52:05 -0000 Author: cem Date: Sat Oct 10 21:52:00 2020 New Revision: 366622 URL: https://svnweb.freebsd.org/changeset/base/366622 Log: random(4) FenestrasX: Push root seed version to arc4random(3) Push the root seed version to userspace through the VDSO page, if the RANDOM_FENESTRASX algorithm is enabled. Otherwise, there is no functional change. The mechanism can be disabled with debug.fxrng_vdso_enable=0. arc4random(3) obtains a pointer to the root seed version published by the kernel in the shared page at allocation time. Like arc4random(9), it maintains its own per-process copy of the seed version corresponding to the root seed version at the time it last rekeyed. On read requests, the process seed version is compared with the version published in the shared page; if they do not match, arc4random(3) reseeds from the kernel before providing generated output. This change does not implement the FenestrasX concept of PCPU userspace generators seeded from a per-process base generator. That change is left for future discussion/work. Reviewed by: kib (previous version) Approved by: csprng (me -- only touching FXRNG here) Differential Revision: https://reviews.freebsd.org/D22839 Modified: head/lib/libc/gen/arc4random.c head/lib/libc/gen/arc4random.h head/lib/libc/gen/auxv.c head/sys/amd64/amd64/elf_machdep.c head/sys/arm/arm/elf_machdep.c head/sys/arm64/arm64/elf32_machdep.c head/sys/arm64/arm64/elf_machdep.c head/sys/compat/ia32/ia32_sysvec.c head/sys/dev/random/fenestrasX/fx_brng.c head/sys/dev/random/fenestrasX/fx_main.c head/sys/i386/i386/elf_machdep.c head/sys/kern/imgact_elf.c head/sys/kern/kern_sharedpage.c head/sys/mips/mips/elf_machdep.c head/sys/mips/mips/freebsd32_machdep.c head/sys/powerpc/powerpc/elf32_machdep.c head/sys/powerpc/powerpc/elf64_machdep.c head/sys/riscv/riscv/elf_machdep.c head/sys/sys/elf_common.h head/sys/sys/sysent.h head/sys/sys/vdso.h Modified: head/lib/libc/gen/arc4random.c ============================================================================== --- head/lib/libc/gen/arc4random.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/lib/libc/gen/arc4random.c Sat Oct 10 21:52:00 2020 (r366622) @@ -27,6 +27,9 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" +#if defined(__FreeBSD__) +#include +#endif #include #include #include @@ -68,6 +71,9 @@ static struct _rs { static struct _rsx { chacha_ctx rs_chacha; /* chacha context for random keystream */ u_char rs_buf[RSBUFSZ]; /* keystream blocks */ +#ifdef __FreeBSD__ + uint32_t rs_seed_generation; /* 32-bit userspace RNG version */ +#endif } *rsx; static inline int _rs_allocate(struct _rs **, struct _rsx **); @@ -96,11 +102,43 @@ _rs_stir(void) { u_char rnd[KEYSZ + IVSZ]; +#if defined(__FreeBSD__) + bool need_init; + + /* + * De-couple allocation (which locates the vdso_fxrngp pointer in + * auxinfo) from initialization. This allows us to read the root seed + * version before we fetch system entropy, maintaining the invariant + * that the PRF was seeded with entropy from rs_seed_generation or a + * later generation. But never seeded from an earlier generation. + * This invariant prevents us from missing a root reseed event. + */ + need_init = false; + if (rs == NULL) { + if (_rs_allocate(&rs, &rsx) == -1) + abort(); + need_init = true; + } + /* + * Transition period: new userspace on old kernel. This should become + * a hard error at some point, if the scheme is adopted. + */ + if (vdso_fxrngp != NULL) + rsx->rs_seed_generation = + fxrng_load_acq_generation(&vdso_fxrngp->fx_generation32); +#endif + if (getentropy(rnd, sizeof rnd) == -1) _getentropy_fail(); +#if !defined(__FreeBSD__) if (!rs) _rs_init(rnd, sizeof(rnd)); +#else /* __FreeBSD__ */ + assert(rs != NULL); + if (need_init) + _rs_init(rnd, sizeof(rnd)); +#endif else _rs_rekey(rnd, sizeof(rnd)); explicit_bzero(rnd, sizeof(rnd)); /* discard source seed */ Modified: head/lib/libc/gen/arc4random.h ============================================================================== --- head/lib/libc/gen/arc4random.h Sat Oct 10 21:48:06 2020 (r366621) +++ head/lib/libc/gen/arc4random.h Sat Oct 10 21:52:00 2020 (r366622) @@ -24,10 +24,34 @@ /* * Stub functions for portability. */ +#include +#include #include +#include /* for sys/vdso.h only. */ +#include +#include +#include +#include #include +#include +#include +/* + * The kernel root seed version is a 64-bit counter, but we truncate it to a + * 32-bit value in userspace for the convenience of 32-bit platforms. 32-bit + * rollover is not possible with the current reseed interval (1 hour at limit) + * without dynamic addition of new random devices (which also force a reseed in + * the FXRNG design). We don't have any dynamic device mechanism at this + * time, and anyway something else is very wrong if billions of new devices are + * being added. + * + * As is, it takes roughly 456,000 years of runtime to overflow the 32-bit + * version. + */ +#define fxrng_load_acq_generation(x) atomic_load_acq_32(x) +static struct vdso_fxrng_generation_1 *vdso_fxrngp; + static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER; #define _ARC4_LOCK() \ do { \ @@ -47,6 +71,28 @@ _getentropy_fail(void) raise(SIGKILL); } +static inline void +_rs_initialize_fxrng(void) +{ + struct vdso_fxrng_generation_1 *fxrngp; + int error; + + error = _elf_aux_info(AT_FXRNG, &fxrngp, sizeof(fxrngp)); + if (error != 0) { + /* + * New userspace on an old or !RANDOM_FENESTRASX kernel; or an + * arch that does not have a VDSO page. + */ + return; + } + + /* Old userspace on newer kernel. */ + if (fxrngp->fx_vdso_version != VDSO_FXRNG_VER_1) + return; + + vdso_fxrngp = fxrngp; +} + static inline int _rs_allocate(struct _rs **rsp, struct _rsx **rsxp) { @@ -65,12 +111,33 @@ _rs_allocate(struct _rs **rsp, struct _rsx **rsxp) return (-1); } #endif + + _rs_initialize_fxrng(); + *rsp = &p->rs; *rsxp = &p->rsx; return (0); } +/* + * This isn't only detecting fork. We're also using the existing callback from + * _rs_stir_if_needed() to force arc4random(3) to reseed if the fenestrasX root + * seed version has changed. (That is, the root random(4) has reseeded from + * pooled entropy.) + */ static inline void _rs_forkdetect(void) { + /* Detect fork (minherit(2) INHERIT_ZERO). */ + if (__predict_false(rs == NULL || rsx == NULL)) + return; + /* If present, detect kernel FenestrasX seed version change. */ + if (vdso_fxrngp == NULL) + return; + if (__predict_true(rsx->rs_seed_generation == + fxrng_load_acq_generation(&vdso_fxrngp->fx_generation32))) + return; + + /* Invalidate rs_buf to force "stir" (reseed). */ + memset(rs, 0, sizeof(*rs)); } Modified: head/lib/libc/gen/auxv.c ============================================================================== --- head/lib/libc/gen/auxv.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/lib/libc/gen/auxv.c Sat Oct 10 21:52:00 2020 (r366622) @@ -72,6 +72,7 @@ static int hwcap_present, hwcap2_present; static char *canary, *pagesizes, *execpath; static void *ps_strings, *timekeep; static u_long hwcap, hwcap2; +static void *fxrng_seed_version; #ifdef __powerpc__ static int powerpc_new_auxv_format = 0; @@ -139,6 +140,10 @@ init_aux(void) case AT_PS_STRINGS: ps_strings = aux->a_un.a_ptr; break; + + case AT_FXRNG: + fxrng_seed_version = aux->a_un.a_ptr; + break; #ifdef __powerpc__ /* * Since AT_STACKPROT is always set, and the common @@ -349,6 +354,16 @@ _elf_aux_info(int aux, void *buf, int buflen) if (buflen == sizeof(void *)) { if (ps_strings != NULL) { *(void **)buf = ps_strings; + res = 0; + } else + res = ENOENT; + } else + res = EINVAL; + break; + case AT_FXRNG: + if (buflen == sizeof(void *)) { + if (fxrng_seed_version != NULL) { + *(void **)buf = fxrng_seed_version; res = 0; } else res = ENOENT; Modified: head/sys/amd64/amd64/elf_machdep.c ============================================================================== --- head/sys/amd64/amd64/elf_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/amd64/amd64/elf_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -72,7 +72,7 @@ struct sysentvec elf64_freebsd_sysvec_la48 = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_FREEBSD | SV_ASLR | SV_LP64 | SV_SHP | - SV_TIMEKEEP, + SV_TIMEKEEP | SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, @@ -107,7 +107,7 @@ struct sysentvec elf64_freebsd_sysvec_la57 = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_FREEBSD | SV_ASLR | SV_LP64 | SV_SHP | - SV_TIMEKEEP, + SV_TIMEKEEP | SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, Modified: head/sys/arm/arm/elf_machdep.c ============================================================================== --- head/sys/arm/arm/elf_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/arm/arm/elf_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -86,7 +86,7 @@ struct sysentvec elf32_freebsd_sysvec = { .sv_maxssiz = NULL, .sv_flags = #if __ARM_ARCH >= 6 - SV_ASLR | SV_SHP | SV_TIMEKEEP | + SV_ASLR | SV_SHP | SV_TIMEKEEP | SV_RNG_SEED_VER | #endif SV_ABI_FREEBSD | SV_ILP32 | SV_ASLR, .sv_set_syscall_retval = cpu_set_syscall_retval, Modified: head/sys/arm64/arm64/elf32_machdep.c ============================================================================== --- head/sys/arm64/arm64/elf32_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/arm64/arm64/elf32_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -96,7 +96,8 @@ static struct sysentvec elf32_freebsd_sysvec = { .sv_setregs = freebsd32_setregs, .sv_fixlimit = NULL, // XXX .sv_maxssiz = NULL, - .sv_flags = SV_ABI_FREEBSD | SV_ILP32 | SV_SHP | SV_TIMEKEEP, + .sv_flags = SV_ABI_FREEBSD | SV_ILP32 | SV_SHP | SV_TIMEKEEP | + SV_RNG_SEED_VER, .sv_set_syscall_retval = freebsd32_set_syscall_retval, .sv_fetch_syscall_args = freebsd32_fetch_syscall_args, .sv_syscallnames = freebsd32_syscallnames, Modified: head/sys/arm64/arm64/elf_machdep.c ============================================================================== --- head/sys/arm64/arm64/elf_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/arm64/arm64/elf_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -81,7 +81,7 @@ static struct sysentvec elf64_freebsd_sysvec = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_SHP | SV_TIMEKEEP | SV_ABI_FREEBSD | SV_LP64 | - SV_ASLR, + SV_ASLR | SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, Modified: head/sys/compat/ia32/ia32_sysvec.c ============================================================================== --- head/sys/compat/ia32/ia32_sysvec.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/compat/ia32/ia32_sysvec.c Sat Oct 10 21:52:00 2020 (r366622) @@ -118,7 +118,7 @@ struct sysentvec ia32_freebsd_sysvec = { .sv_fixlimit = ia32_fixlimit, .sv_maxssiz = &ia32_maxssiz, .sv_flags = SV_ABI_FREEBSD | SV_ASLR | SV_IA32 | SV_ILP32 | - SV_SHP | SV_TIMEKEEP, + SV_SHP | SV_TIMEKEEP | SV_RNG_SEED_VER, .sv_set_syscall_retval = ia32_set_syscall_retval, .sv_fetch_syscall_args = ia32_fetch_syscall_args, .sv_syscallnames = freebsd32_syscallnames, Modified: head/sys/dev/random/fenestrasX/fx_brng.c ============================================================================== --- head/sys/dev/random/fenestrasX/fx_brng.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/dev/random/fenestrasX/fx_brng.c Sat Oct 10 21:52:00 2020 (r366622) @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include @@ -108,6 +109,8 @@ fxrng_brng_src_reseed(const struct harvest_event *even */ rng->brng_generation++; atomic_store_rel_64(&fxrng_root_generation, rng->brng_generation); + /* Update VDSO version. */ + fxrng_push_seed_generation(rng->brng_generation); FXRNG_BRNG_UNLOCK(rng); } @@ -129,8 +132,25 @@ fxrng_brng_reseed(const void *entr, size_t sz) rng->brng_generation++; atomic_store_rel_64(&fxrng_root_generation, rng->brng_generation); + /* Update VDSO version. */ + fxrng_push_seed_generation(rng->brng_generation); FXRNG_BRNG_UNLOCK(rng); } + +/* + * Sysentvec and VDSO are initialized much later than SI_SUB_RANDOM. When + * they're online, go ahead and push an initial root seed version. + * INIT_SYSENTVEC runs at SI_SUB_EXEC:SI_ORDER_ANY, and SI_ORDER_ANY is the + * maximum value, so we must run at SI_SUB_EXEC+1. + */ +static void +fxrng_vdso_sysinit(void *dummy __unused) +{ + FXRNG_BRNG_LOCK(&fxrng_root); + fxrng_push_seed_generation(fxrng_root.brng_generation); + FXRNG_BRNG_UNLOCK(&fxrng_root); +} +SYSINIT(fxrng_vdso, SI_SUB_EXEC + 1, SI_ORDER_ANY, fxrng_vdso_sysinit, NULL); /* * Grab some bytes off an initialized, current generation RNG. Modified: head/sys/dev/random/fenestrasX/fx_main.c ============================================================================== --- head/sys/dev/random/fenestrasX/fx_main.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/dev/random/fenestrasX/fx_main.c Sat Oct 10 21:52:00 2020 (r366622) @@ -88,7 +88,8 @@ * a while). * * Not yet implemented, not in scope, or todo: - * - Userspace portions -- shared page, like timehands vdso? + * - Various initial seeding sources we don't have yet + * - In particular, VM migration/copy detection */ #include Modified: head/sys/i386/i386/elf_machdep.c ============================================================================== --- head/sys/i386/i386/elf_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/i386/i386/elf_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -74,7 +74,7 @@ struct sysentvec elf32_freebsd_sysvec = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_FREEBSD | SV_ASLR | SV_IA32 | SV_ILP32 | - SV_SHP | SV_TIMEKEEP, + SV_SHP | SV_TIMEKEEP | SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, Modified: head/sys/kern/imgact_elf.c ============================================================================== --- head/sys/kern/imgact_elf.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/kern/imgact_elf.c Sat Oct 10 21:52:00 2020 (r366622) @@ -1389,6 +1389,8 @@ __elfN(freebsd_copyout_auxargs)(struct image_params *i AUXARGS_ENTRY(pos, AT_ENVC, imgp->args->envc); AUXARGS_ENTRY_PTR(pos, AT_ENVV, imgp->envv); AUXARGS_ENTRY_PTR(pos, AT_PS_STRINGS, imgp->ps_strings); + if (imgp->sysent->sv_fxrng_gen_base != 0) + AUXARGS_ENTRY(pos, AT_FXRNG, imgp->sysent->sv_fxrng_gen_base); AUXARGS_ENTRY(pos, AT_NULL, 0); free(imgp->auxargs, M_TEMP); Modified: head/sys/kern/kern_sharedpage.c ============================================================================== --- head/sys/kern/kern_sharedpage.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/kern/kern_sharedpage.c Sat Oct 10 21:52:00 2020 (r366622) @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -60,6 +61,14 @@ static vm_object_t shared_page_obj; static int shared_page_free; char *shared_page_mapping; +#ifdef RANDOM_FENESTRASX +static struct vdso_fxrng_generation *fxrng_shpage_mapping; + +static bool fxrng_enabled = true; +SYSCTL_BOOL(_debug, OID_AUTO, fxrng_vdso_enable, CTLFLAG_RWTUN, &fxrng_enabled, + 0, "Enable FXRNG VDSO"); +#endif + void shared_page_write(int base, int size, const void *data) { @@ -256,10 +265,49 @@ alloc_sv_tk_compat32(void) } #endif +#ifdef RANDOM_FENESTRASX void +fxrng_push_seed_generation(uint64_t gen) +{ + if (fxrng_shpage_mapping == NULL || !fxrng_enabled) + return; + KASSERT(gen < INT32_MAX, + ("fxrng seed version shouldn't roll over a 32-bit counter " + "for approximately 456,000 years")); + atomic_store_rel_32(&fxrng_shpage_mapping->fx_generation32, + (uint32_t)gen); +} + +static void +alloc_sv_fxrng_generation(void) +{ + int base; + + /* + * Allocate a full cache line for the fxrng root generation (64-bit + * counter, or truncated 32-bit counter on ILP32 userspace). It is + * important that the line is not shared with frequently dirtied data, + * and the shared page allocator lacks a __read_mostly mechanism. + * However, PAGE_SIZE is typically large relative to the amount of + * stuff we've got in it so far, so maybe the possible waste isn't an + * issue. + */ + base = shared_page_alloc(CACHE_LINE_SIZE, CACHE_LINE_SIZE); + KASSERT(base != -1, ("%s: base allocation failed", __func__)); + fxrng_shpage_mapping = (void *)(shared_page_mapping + base); + *fxrng_shpage_mapping = (struct vdso_fxrng_generation) { + .fx_vdso_version = VDSO_FXRNG_VER_CURR, + }; +} +#endif /* RANDOM_FENESTRASX */ + +void exec_sysvec_init(void *param) { struct sysentvec *sv; +#ifdef RANDOM_FENESTRASX + ptrdiff_t base; +#endif sv = (struct sysentvec *)param; if ((sv->sv_flags & SV_SHP) == 0) @@ -287,6 +335,18 @@ exec_sysvec_init(void *param) } #endif } +#ifdef RANDOM_FENESTRASX + if ((sv->sv_flags & SV_RNG_SEED_VER) != 0) { + /* + * Only allocate a single VDSO entry for multiple sysentvecs, + * i.e., native and COMPAT32. + */ + if (fxrng_shpage_mapping == NULL) + alloc_sv_fxrng_generation(); + base = (char *)fxrng_shpage_mapping - shared_page_mapping; + sv->sv_fxrng_gen_base = sv->sv_shared_page_base + base; + } +#endif } void @@ -295,6 +355,8 @@ exec_sysvec_init_secondary(struct sysentvec *sv, struc MPASS((sv2->sv_flags & SV_ABI_MASK) == (sv->sv_flags & SV_ABI_MASK)); MPASS((sv2->sv_flags & SV_TIMEKEEP) == (sv->sv_flags & SV_TIMEKEEP)); MPASS((sv2->sv_flags & SV_SHP) != 0 && (sv->sv_flags & SV_SHP) != 0); + MPASS((sv2->sv_flags & SV_RNG_SEED_VER) == + (sv->sv_flags & SV_RNG_SEED_VER)); sv2->sv_shared_page_obj = sv->sv_shared_page_obj; sv2->sv_sigcode_base = sv2->sv_shared_page_base + @@ -304,5 +366,9 @@ exec_sysvec_init_secondary(struct sysentvec *sv, struc if ((sv2->sv_flags & SV_TIMEKEEP) != 0) { sv2->sv_timekeep_base = sv2->sv_shared_page_base + (sv->sv_timekeep_base - sv->sv_shared_page_base); + } + if ((sv2->sv_flags & SV_RNG_SEED_VER) != 0) { + sv2->sv_fxrng_gen_base = sv2->sv_shared_page_base + + (sv->sv_fxrng_gen_base - sv->sv_shared_page_base); } } Modified: head/sys/mips/mips/elf_machdep.c ============================================================================== --- head/sys/mips/mips/elf_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/mips/mips/elf_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -77,10 +77,11 @@ static struct sysentvec elf_freebsd_sysvec = { .sv_setregs = exec_setregs, .sv_fixlimit = NULL, .sv_maxssiz = NULL, + .sv_flags = SV_ABI_FREEBSD | SV_ASLR | SV_RNG_SEED_VER | #ifdef __mips_n64 - .sv_flags = SV_ABI_FREEBSD | SV_LP64 | SV_ASLR, + SV_LP64, #else - .sv_flags = SV_ABI_FREEBSD | SV_ILP32 | SV_ASLR, + SV_ILP32, #endif .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, Modified: head/sys/mips/mips/freebsd32_machdep.c ============================================================================== --- head/sys/mips/mips/freebsd32_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/mips/mips/freebsd32_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -97,7 +97,7 @@ struct sysentvec elf32_freebsd_sysvec = { .sv_setregs = exec_setregs, .sv_fixlimit = NULL, .sv_maxssiz = NULL, - .sv_flags = SV_ABI_FREEBSD | SV_ILP32, + .sv_flags = SV_ABI_FREEBSD | SV_ILP32 | SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = freebsd32_syscallnames, Modified: head/sys/powerpc/powerpc/elf32_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/elf32_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/powerpc/powerpc/elf32_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -121,7 +121,7 @@ struct sysentvec elf32_freebsd_sysvec = { #endif .sv_maxssiz = NULL, .sv_flags = SV_ABI_FREEBSD | SV_ILP32 | SV_SHP | SV_ASLR | - SV_TIMEKEEP, + SV_TIMEKEEP | SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_shared_page_base = FREEBSD32_SHAREDPAGE, Modified: head/sys/powerpc/powerpc/elf64_machdep.c ============================================================================== --- head/sys/powerpc/powerpc/elf64_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/powerpc/powerpc/elf64_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -82,7 +82,7 @@ struct sysentvec elf64_freebsd_sysvec_v1 = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_FREEBSD | SV_LP64 | SV_SHP | SV_ASLR | - SV_TIMEKEEP, + SV_TIMEKEEP | SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, @@ -118,7 +118,7 @@ struct sysentvec elf64_freebsd_sysvec_v2 = { .sv_fixlimit = NULL, .sv_maxssiz = NULL, .sv_flags = SV_ABI_FREEBSD | SV_LP64 | SV_SHP | - SV_TIMEKEEP, + SV_TIMEKEEP | SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, Modified: head/sys/riscv/riscv/elf_machdep.c ============================================================================== --- head/sys/riscv/riscv/elf_machdep.c Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/riscv/riscv/elf_machdep.c Sat Oct 10 21:52:00 2020 (r366622) @@ -84,7 +84,8 @@ struct sysentvec elf64_freebsd_sysvec = { .sv_setregs = exec_setregs, .sv_fixlimit = NULL, .sv_maxssiz = NULL, - .sv_flags = SV_ABI_FREEBSD | SV_LP64 | SV_SHP | SV_ASLR, + .sv_flags = SV_ABI_FREEBSD | SV_LP64 | SV_SHP | SV_ASLR | + SV_RNG_SEED_VER, .sv_set_syscall_retval = cpu_set_syscall_retval, .sv_fetch_syscall_args = cpu_fetch_syscall_args, .sv_syscallnames = syscallnames, Modified: head/sys/sys/elf_common.h ============================================================================== --- head/sys/sys/elf_common.h Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/sys/elf_common.h Sat Oct 10 21:52:00 2020 (r366622) @@ -967,8 +967,9 @@ typedef struct { #define AT_ENVC 30 /* Environment count */ #define AT_ENVV 31 /* Environment vector */ #define AT_PS_STRINGS 32 /* struct ps_strings */ +#define AT_FXRNG 33 /* Pointer to root RNG seed version. */ -#define AT_COUNT 33 /* Count of defined aux entry types. */ +#define AT_COUNT 34 /* Count of defined aux entry types. */ /* * Relocation types. Modified: head/sys/sys/sysent.h ============================================================================== --- head/sys/sys/sysent.h Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/sys/sysent.h Sat Oct 10 21:52:00 2020 (r366622) @@ -144,6 +144,7 @@ struct sysentvec { u_long *sv_hwcap; /* Value passed in AT_HWCAP. */ u_long *sv_hwcap2; /* Value passed in AT_HWCAP2. */ const char *(*sv_machine_arch)(struct proc *); + vm_offset_t sv_fxrng_gen_base; }; #define SV_ILP32 0x000100 /* 32-bit executable. */ @@ -154,6 +155,7 @@ struct sysentvec { #define SV_CAPSICUM 0x020000 /* Force cap_enter() on startup. */ #define SV_TIMEKEEP 0x040000 /* Shared page timehands. */ #define SV_ASLR 0x080000 /* ASLR allowed. */ +#define SV_RNG_SEED_VER 0x100000 /* random(4) reseed generation. */ #define SV_ABI_MASK 0xff #define SV_PROC_FLAG(p, x) ((p)->p_sysent->sv_flags & (x)) Modified: head/sys/sys/vdso.h ============================================================================== --- head/sys/sys/vdso.h Sat Oct 10 21:48:06 2020 (r366621) +++ head/sys/sys/vdso.h Sat Oct 10 21:52:00 2020 (r366622) @@ -59,6 +59,18 @@ struct vdso_timekeep { #define VDSO_TH_ALGO_3 0x3 #define VDSO_TH_ALGO_4 0x4 +struct vdso_fxrng_generation_1 { + uint32_t fx_vdso_version; /* 1 */ + uint32_t fx_generation32; + uint64_t _fx_reserved; +}; +_Static_assert(sizeof(struct vdso_fxrng_generation_1) == 16, ""); +#define vdso_fxrng_generation vdso_fxrng_generation_1 + +/* fx_vdso_version values: */ +#define VDSO_FXRNG_VER_1 0x1 +#define VDSO_FXRNG_VER_CURR VDSO_FXRNG_VER_1 + #ifndef _KERNEL struct timespec; @@ -82,6 +94,9 @@ struct vdso_sv_tk { uint32_t sv_timekeep_gen; }; +#ifdef RANDOM_FENESTRASX +void fxrng_push_seed_generation(uint64_t gen); +#endif void timekeep_push_vdso(void); uint32_t tc_fill_vdso_timehands(struct vdso_timehands *vdso_th);