From nobody Fri Feb 11 13:57:59 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id AABB319B0517; Fri, 11 Feb 2022 13:57:59 +0000 (UTC) (envelope-from git@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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4JwFYz3JmMz3sjQ; Fri, 11 Feb 2022 13:57:59 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1644587879; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=r5n5Ryye8OJ8PvMXFk+tIB0cijSIbqf7T6Z23GONwQM=; b=XvGFeEPy932rZYQxZOg/4Gxw6kUvwhd3TeqQuq8itCcAA3zZiSPmZZ6cHo6FhEkDHI/AAC cY3LkLoBSKzcsoDa1HHboLZWcjEAdWKYjNzeXIv6O9zv2TIYMXuC7RZgRAsfKdSbmVv+Gs mpLEgtYLhlU6x5tJdP3A4/YUY4BDkzObRKHpSgDa7bNDy6u0FuxuwDHP3rhv0gH3evS+9b +xMXHaJFtrNbrrtN9RQxp/Qm5VIpGsJYTlBPLrLnTz7i/7X5IXzElftDtlr1k2+k3sp7UC FJRmExuYzg5Qx7PwdEwtEijKjSxBKMWuzems+i+uW9VB19CSYWC5upZhNAc62A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4AC7F15623; Fri, 11 Feb 2022 13:57:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 21BDvxlx093034; Fri, 11 Feb 2022 13:57:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 21BDvxhr093033; Fri, 11 Feb 2022 13:57:59 GMT (envelope-from git) Date: Fri, 11 Feb 2022 13:57:59 GMT Message-Id: <202202111357.21BDvxhr093033@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mateusz Guzik Subject: git: 32114b639fa1 - main - Add PROC_COW_CHANGECOUNT and thread_cow_synced List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mjg X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 32114b639fa1ad777312eebe14a9f677bd7be2ea Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1644587879; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=r5n5Ryye8OJ8PvMXFk+tIB0cijSIbqf7T6Z23GONwQM=; b=TtbpW+xzKkP0s901Ogp1B/+NNrKBhFuQcN1bfHZzbNZYvSOEstAZwTBnu/OBxpGhn+ftQl 9t40s5yjgAvgJWyG1M+CEkEGdCcjsigNzzp8P0NbPsST21EF9SM+wmvVs74Si6J++xteJu GxvyteO+4bQ2mWE8J5t57/nV2XZyFkLZzpZfEEWn82fjUIj4TtMWupQCPMH5ifmc68dsiW 8iTN034sTdv972V6isof7mESV1qutlLaFmR109GjdDtw4VDlJU7H6YMtrJFElHdu3bnx6x 3k9ngUVXO7OSKdZZambkG4Nz/ZxthLDpKcnii2cvNT+DARLooElmIHxwqDl+Xg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1644587879; a=rsa-sha256; cv=none; b=YInmgb6iPHF61S35fctLB7hvZoyGHay1O8vZzNx/mPx0hCDG2F29d946L4YZ7oNgUGH4YB dFrQ5qsCDhWzHvdkA1gGIBg5CXVwA7QUu2Kud+IulP4IZl9dsebwuYWpsN+SZjnlL/Y6bM KmQbIcXRoldQD1ZZGV2BEySKj2jrp1MgGaLPfC7jnBxt+NXIOzMm2LBnGU7Ah2zTg0HBnq 3Lo0s5JjGx+Tou6Xu8AhLEN80R4HmiN8VZgk7k+/s9Opf7esO9cIHdONx7hjyq/5SkLvD4 viuASxq3/eeiNfW0cIbmT2nYW7AaCpxulLXWJIKsPRtlB1MuQ9WxQ2w6czn16w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=32114b639fa1ad777312eebe14a9f677bd7be2ea commit 32114b639fa1ad777312eebe14a9f677bd7be2ea Author: Mateusz Guzik AuthorDate: 2022-02-01 13:13:13 +0000 Commit: Mateusz Guzik CommitDate: 2022-02-11 11:44:07 +0000 Add PROC_COW_CHANGECOUNT and thread_cow_synced Combined they can be used to avoid a proc lock/unlock cycle in the syscall handler for curthread, see upcoming examples. --- sys/kern/kern_thread.c | 13 +++++++++++++ sys/sys/proc.h | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index dcb52b137b58..bb724a17803e 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -868,6 +868,19 @@ thread_cow_update(struct thread *td) lim_free(oldlimit); } +void +thread_cow_synced(struct thread *td) +{ + struct proc *p; + + p = td->td_proc; + PROC_LOCK_ASSERT(p, MA_OWNED); + MPASS(td->td_cowgen != p->p_cowgen); + MPASS(td->td_ucred == p->p_ucred); + MPASS(td->td_limit == p->p_limit); + td->td_cowgen = p->p_cowgen; +} + /* * Discard the current thread and exit from its context. * Always called with scheduler locked. diff --git a/sys/sys/proc.h b/sys/sys/proc.h index ff97bfbd54a9..0e33192303f4 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1009,6 +1009,14 @@ extern pid_t pid_max; (p)->p_cowgen++; \ } while (0) +#define PROC_COW_CHANGECOUNT(td, p) ({ \ + struct thread *_td = (td); \ + struct proc *_p = (p); \ + MPASS(_td == curthread); \ + PROC_LOCK_ASSERT(_p, MA_OWNED); \ + _p->p_cowgen - _td->td_cowgen; \ +}) + /* Check whether a thread is safe to be swapped out. */ #define thread_safetoswapout(td) ((td)->td_flags & TDF_CANSWAP) @@ -1200,6 +1208,7 @@ void thread_cow_get_proc(struct thread *newtd, struct proc *p); void thread_cow_get(struct thread *newtd, struct thread *td); void thread_cow_free(struct thread *td); void thread_cow_update(struct thread *td); +void thread_cow_synced(struct thread *td); int thread_create(struct thread *td, struct rtprio *rtp, int (*initialize_thread)(struct thread *, void *), void *thunk); void thread_exit(void) __dead2;