From nobody Thu Jan 16 18:08:05 2025 X-Original-To: dev-commits-src-all@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 4YYrSj5lN2z5kkZM; Thu, 16 Jan 2025 18:08:05 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4YYrSj1jfzz3RKt; Thu, 16 Jan 2025 18:08:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737050885; 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=+IWgXEuPorjn7ZVBhA7gqH2wBKlNX8R9Ge8Okk/V4Y8=; b=G9piMxNB/EtK6B1KHIICV8ZjHig1Fp2jsc9F+MWmNFWNIH/wAujXNwfK7leyXdVrSkZJWM l5xlHqM1knzKO/iutfZIpRV5whtUlqmz9vNnpBuvOQLhe7WQ/jBjxn4ZRUzWwHJBqsGcx4 sudVOGgyOyEE+gC0OR3ruXLEMwveJzDWKLIN5gZtcihlgVrOpTwETgTcT9N3w8XCg90r7K Zoia1C5zgUEnimTh7dVmumhzq74v5bm6IlRwN4NAZkZ+AcaWjXWBKaXM0bAhFY9qXFvNob Ucc4sVNPjct2zsYtUfAy/RJPx+81v7tZ4bz87/XT/8dyHEzZt3X9as3rUihQOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1737050885; 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=+IWgXEuPorjn7ZVBhA7gqH2wBKlNX8R9Ge8Okk/V4Y8=; b=eeak7B5UEEj7dP/r6DZaZhU03VwhRmD7KaQim8ZdycvFtvdaOp6lgtTxEPszzru2F0H3hv jeLTSM5/Yt1yoYHMwrbyhugf1LiQ6/z+jAhLkjVgTZv8lexqDzy39dPGBDQgA23cxWFxPN zN8yA3QyyCWC8eNig6QH5GoUvARWjMV6M0L8o0oeKW3m+B2nQN6vgafB7BoPO1Tc/hg95j kbeiaIQ8eGz4I/aa4sVw11j64lQleZNXj+a5TVxnrk3Y+CqtXP0wDf88tBIuN2QFof8xYm 19wK1opQ42tPdULSmGNHdmeVC0lu1y1gvIZo2ifgTd3Co8A0+c8izrxXmmjb3w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1737050885; a=rsa-sha256; cv=none; b=E2tSMjRk9gL81s+RXUcrO33OEgyJVeRWjuVjOnk8zmlNVqkwf1s7dCiLl5NeVpOVN4oZlk Ym2N7m6qI9uNSidYOw8yg4t3SbP6r7RTFTmH2b1qPRwk0uFakG9tqmcWfg6BDA3hHjdRrC +hKcPU9bJeRNqJoD9hG8TnzaE1QDjO4aER7xzUz+GJpIK1x1SIXC96S1pBuuCd4n3GsXHQ Gv3zYB3P79ccvpQ/lxrIKHdkQKRC99DuHbwv5LLOuGP3LCHu9oeb6UfNFA8CWwaOI7bkqO T5bjKK3zRWnzEt5RNylsiVAgif9cBIPbkxrrMHnI0Oa+rkhu7HfRoKNSItmclg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4YYrSj0qf2zkKf; Thu, 16 Jan 2025 18:08:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 50GI85pP091254; Thu, 16 Jan 2025 18:08:05 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 50GI85rP091251; Thu, 16 Jan 2025 18:08:05 GMT (envelope-from git) Date: Thu, 16 Jan 2025 18:08:05 GMT Message-Id: <202501161808.50GI85rP091251@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Olivier Certner Subject: git: fa940dd2bf03 - stable/14 - queue: New debug macros for STAILQ List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: olce X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: fa940dd2bf034a294f6638bd0def2022c7746fd5 Auto-Submitted: auto-generated The branch stable/14 has been updated by olce: URL: https://cgit.FreeBSD.org/src/commit/?id=fa940dd2bf034a294f6638bd0def2022c7746fd5 commit fa940dd2bf034a294f6638bd0def2022c7746fd5 Author: Olivier Certner AuthorDate: 2024-07-08 16:15:49 +0000 Commit: Olivier Certner CommitDate: 2025-01-16 18:06:53 +0000 queue: New debug macros for STAILQ The new STAILQ_ASSERT_EMPTY() macro allows callers to assert that some STAILQ is empty. It leverages the new QMD_STAILQ_CHECK_EMPTY() internal macro. QMD_STAILQ_CHECK_EMPTY() is a check for empty STAILQ, where heads's 'stqh_last' field must point to the 'stqh_first' one. Use it in STAILQ_ASSERT_EMPTY(). QMD_STAILQ_CHECK_TAIL() checks that the tail pointed by 'head' does not have a next element. It is similar to the already existing QMD_TAILQ_CHECK_TAIL(), but without the superfluous 'field' argument and clearer documentation. Use it in STAILQ_INSERT_TAIL(). Approved by: markj (mentor) MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D46889 (cherry picked from commit 34740937f7a46c7475bb57e804701ba8830bf6ed) --- sys/sys/queue.h | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/sys/sys/queue.h b/sys/sys/queue.h index 9bdfd497b165..fee6618ee88c 100644 --- a/sys/sys/queue.h +++ b/sys/sys/queue.h @@ -341,6 +341,40 @@ struct { \ /* * Singly-linked Tail queue functions. */ +#if (defined(_KERNEL) && defined(INVARIANTS)) +/* + * QMD_STAILQ_CHECK_EMPTY(STAILQ_HEAD *head) + * + * Validates that the stailq head's pointer to the last element's next pointer + * actually points to the head's first element pointer field. + */ +#define QMD_STAILQ_CHECK_EMPTY(head) do { \ + if ((head)->stqh_last != &(head)->stqh_first) \ + panic("Empty stailq %p->stqh_last is %p, not head's " \ + "first field address", (head), (head)->stqh_last); \ +} while (0) + +#define STAILQ_ASSERT_EMPTY(head) do { \ + if (!STAILQ_EMPTY((head))) \ + panic("stailq %p is not empty", (head)); \ +} + +/* + * QMD_STAILQ_CHECK_TAIL(STAILQ_HEAD *head) + * + * Validates that the stailq's last element's next pointer is NULL. + */ +#define QMD_STAILQ_CHECK_TAIL(head) do { \ + if (*(head)->stqh_last != NULL) \ + panic("Stailq %p last element's next pointer is %p, " \ + "not NULL", (head), *(head)->stqh_last); \ +} while (0) +#else +#define QMD_STAILQ_CHECK_EMPTY(head) +#define STAILQ_ASSERT_EMPTY(head) +#define QMD_STAILQ_CHECK_TAIL(head) +#endif /* (_KERNEL && INVARIANTS) */ + #define STAILQ_CONCAT(head1, head2) do { \ if (!STAILQ_EMPTY((head2))) { \ *(head1)->stqh_last = (head2)->stqh_first; \ @@ -349,7 +383,11 @@ struct { \ } \ } while (0) -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) +#define STAILQ_EMPTY(head) ({ \ + if (STAILQ_FIRST(head) == NULL) \ + QMD_STAILQ_CHECK_EMPTY(head); \ + STAILQ_FIRST(head) == NULL; \ +}) #define STAILQ_FIRST(head) ((head)->stqh_first) @@ -391,6 +429,7 @@ struct { \ } while (0) #define STAILQ_INSERT_TAIL(head, elm, field) do { \ + QMD_STAILQ_CHECK_TAIL(head); \ STAILQ_NEXT((elm), field) = NULL; \ *(head)->stqh_last = (elm); \ (head)->stqh_last = &STAILQ_NEXT((elm), field); \