patches for DPDK stable branches
 help / color / mirror / Atom feed
From: christian.ehrhardt@canonical.com
To: David Marchand <david.marchand@redhat.com>
Cc: Maxime Coquelin <maxime.coquelin@redhat.com>,
	dpdk stable <stable@dpdk.org>
Subject: patch 'vhost/crypto: fix build with GCC 12' has been queued to stable release 19.11.13
Date: Thu,  7 Jul 2022 09:55:02 +0200	[thread overview]
Message-ID: <20220707075522.194223-67-christian.ehrhardt@canonical.com> (raw)
In-Reply-To: <20220707075522.194223-1-christian.ehrhardt@canonical.com>

Hi,

FYI, your patch has been queued to stable release 19.11.13

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 07/09/22. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/cpaelzer/dpdk-stable-queue

This queued commit can be viewed at:
https://github.com/cpaelzer/dpdk-stable-queue/commit/9a6f9e34878ae119598c794061f7988215b51732

Thanks.

Christian Ehrhardt <christian.ehrhardt@canonical.com>

---
From 9a6f9e34878ae119598c794061f7988215b51732 Mon Sep 17 00:00:00 2001
From: David Marchand <david.marchand@redhat.com>
Date: Thu, 16 Jun 2022 16:46:50 +0200
Subject: [PATCH] vhost/crypto: fix build with GCC 12
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

[ upstream commit 4414bb67010dfec2559af52efe8f479b26d55447 ]

GCC 12 raises the following warning:

In file included from ../lib/mempool/rte_mempool.h:46,
                 from ../lib/mbuf/rte_mbuf.h:38,
                 from ../lib/vhost/vhost_crypto.c:7:
../lib/vhost/vhost_crypto.c: In function ‘rte_vhost_crypto_fetch_requests’:
../lib/eal/x86/include/rte_memcpy.h:371:9: warning: array subscript 1 is
     outside array bounds of ‘struct virtio_crypto_op_data_req[1]’
     [-Warray-bounds]
  371 | rte_mov32((uint8_t *)dst + 3 * 32, (const uint8_t *)src + 3 * 32);
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../lib/vhost/vhost_crypto.c:1178:42: note: while referencing ‘req’
 1178 |         struct virtio_crypto_op_data_req req;
      |                                          ^~~

Split this function and separate the per descriptor copy.
This makes the code clearer, and the compiler happier.

Note: logs for errors have been moved to callers to avoid duplicates.

Fixes: 3c79609fda7c ("vhost/crypto: handle virtually non-contiguous buffers")

Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 lib/librte_vhost/vhost_crypto.c | 123 ++++++++++++--------------------
 1 file changed, 46 insertions(+), 77 deletions(-)

diff --git a/lib/librte_vhost/vhost_crypto.c b/lib/librte_vhost/vhost_crypto.c
index 0439b12bc7..b8bdfe4bc7 100644
--- a/lib/librte_vhost/vhost_crypto.c
+++ b/lib/librte_vhost/vhost_crypto.c
@@ -566,94 +566,58 @@ get_data_ptr(struct vhost_crypto_data_req *vc_req,
 	return data;
 }
 
-static __rte_always_inline int
-copy_data(void *dst_data, struct vhost_crypto_data_req *vc_req,
-		struct vhost_crypto_desc *head,
-		struct vhost_crypto_desc **cur_desc,
-		uint32_t size, uint32_t max_n_descs)
+static __rte_always_inline uint32_t
+copy_data_from_desc(void *dst, struct vhost_crypto_data_req *vc_req,
+	struct vhost_crypto_desc *desc, uint32_t size)
 {
-	struct vhost_crypto_desc *desc = *cur_desc;
-	uint64_t remain, addr, dlen, len;
-	uint32_t to_copy;
-	uint8_t *data = dst_data;
-	uint8_t *src;
-	int left = size;
-
-	to_copy = RTE_MIN(desc->len, (uint32_t)left);
-	dlen = to_copy;
-	src = IOVA_TO_VVA(uint8_t *, vc_req, desc->addr, &dlen,
-			VHOST_ACCESS_RO);
-	if (unlikely(!src || !dlen))
-		return -1;
+	uint64_t remain;
+	uint64_t addr;
+
+	remain = RTE_MIN(desc->len, size);
+	addr = desc->addr;
+	do {
+		uint64_t len;
+		void *src;
+
+		len = remain;
+		src = IOVA_TO_VVA(void *, vc_req, addr, &len, VHOST_ACCESS_RO);
+		if (unlikely(src == NULL || len == 0))
+			return 0;
 
-	rte_memcpy((uint8_t *)data, src, dlen);
-	data += dlen;
+		rte_memcpy(dst, src, len);
+		remain -= len;
+		/* cast is needed for 32-bit architecture */
+		dst = RTE_PTR_ADD(dst, (size_t)len);
+		addr += len;
+	} while (unlikely(remain != 0));
 
-	if (unlikely(dlen < to_copy)) {
-		remain = to_copy - dlen;
-		addr = desc->addr + dlen;
+	return RTE_MIN(desc->len, size);
+}
 
-		while (remain) {
-			len = remain;
-			src = IOVA_TO_VVA(uint8_t *, vc_req, addr, &len,
-					VHOST_ACCESS_RO);
-			if (unlikely(!src || !len)) {
-				VC_LOG_ERR("Failed to map descriptor");
-				return -1;
-			}
 
-			rte_memcpy(data, src, len);
-			addr += len;
-			remain -= len;
-			data += len;
-		}
-	}
+static __rte_always_inline int
+copy_data(void *data, struct vhost_crypto_data_req *vc_req,
+	struct vhost_crypto_desc *head, struct vhost_crypto_desc **cur_desc,
+	uint32_t size, uint32_t max_n_descs)
+{
+	struct vhost_crypto_desc *desc = *cur_desc;
+	uint32_t left = size;
 
-	left -= to_copy;
+	do {
+		uint32_t copied;
 
-	while (desc >= head && desc - head < (int)max_n_descs && left) {
-		desc++;
-		to_copy = RTE_MIN(desc->len, (uint32_t)left);
-		dlen = to_copy;
-		src = IOVA_TO_VVA(uint8_t *, vc_req, desc->addr, &dlen,
-				VHOST_ACCESS_RO);
-		if (unlikely(!src || !dlen)) {
-			VC_LOG_ERR("Failed to map descriptor");
+		copied = copy_data_from_desc(data, vc_req, desc, left);
+		if (copied == 0)
 			return -1;
-		}
-
-		rte_memcpy(data, src, dlen);
-		data += dlen;
-
-		if (unlikely(dlen < to_copy)) {
-			remain = to_copy - dlen;
-			addr = desc->addr + dlen;
-
-			while (remain) {
-				len = remain;
-				src = IOVA_TO_VVA(uint8_t *, vc_req, addr, &len,
-						VHOST_ACCESS_RO);
-				if (unlikely(!src || !len)) {
-					VC_LOG_ERR("Failed to map descriptor");
-					return -1;
-				}
-
-				rte_memcpy(data, src, len);
-				addr += len;
-				remain -= len;
-				data += len;
-			}
-		}
-
-		left -= to_copy;
-	}
+		left -= copied;
+		data = RTE_PTR_ADD(data, copied);
+		desc++;
+	} while (desc < head + max_n_descs && left != 0);
 
-	if (unlikely(left > 0)) {
-		VC_LOG_ERR("Incorrect virtio descriptor");
+	if (unlikely(left != 0))
 		return -1;
-	}
 
-	if (unlikely(desc - head == (int)max_n_descs))
+	if (unlikely(desc == head + max_n_descs))
 		*cur_desc = NULL;
 	else
 		*cur_desc = desc + 1;
@@ -853,6 +817,7 @@ prepare_sym_cipher_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
 	/* iv */
 	if (unlikely(copy_data(iv_data, vc_req, head, &desc,
 			cipher->para.iv_len, max_n_descs))) {
+		VC_LOG_ERR("Incorrect virtio descriptor");
 		ret = VIRTIO_CRYPTO_BADMSG;
 		goto error_exit;
 	}
@@ -884,6 +849,7 @@ prepare_sym_cipher_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
 		if (unlikely(copy_data(rte_pktmbuf_mtod(m_src, uint8_t *),
 				vc_req, head, &desc, cipher->para.src_data_len,
 				max_n_descs) < 0)) {
+			VC_LOG_ERR("Incorrect virtio descriptor");
 			ret = VIRTIO_CRYPTO_BADMSG;
 			goto error_exit;
 		}
@@ -1007,6 +973,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
 	/* iv */
 	if (unlikely(copy_data(iv_data, vc_req, head, &desc,
 			chain->para.iv_len, max_n_descs) < 0)) {
+		VC_LOG_ERR("Incorrect virtio descriptor");
 		ret = VIRTIO_CRYPTO_BADMSG;
 		goto error_exit;
 	}
@@ -1038,6 +1005,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
 		if (unlikely(copy_data(rte_pktmbuf_mtod(m_src, uint8_t *),
 				vc_req, head, &desc, chain->para.src_data_len,
 				max_n_descs) < 0)) {
+			VC_LOG_ERR("Incorrect virtio descriptor");
 			ret = VIRTIO_CRYPTO_BADMSG;
 			goto error_exit;
 		}
@@ -1122,6 +1090,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
 		if (unlikely(copy_data(digest_addr, vc_req, head, &digest_desc,
 				chain->para.hash_result_len,
 				max_n_descs) < 0)) {
+			VC_LOG_ERR("Incorrect virtio descriptor");
 			ret = VIRTIO_CRYPTO_BADMSG;
 			goto error_exit;
 		}
-- 
2.37.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-07-07 09:54:13.938515549 +0200
+++ 0067-vhost-crypto-fix-build-with-GCC-12.patch	2022-07-07 09:54:10.981824716 +0200
@@ -1 +1 @@
-From 4414bb67010dfec2559af52efe8f479b26d55447 Mon Sep 17 00:00:00 2001
+From 9a6f9e34878ae119598c794061f7988215b51732 Mon Sep 17 00:00:00 2001
@@ -8,0 +9,2 @@
+[ upstream commit 4414bb67010dfec2559af52efe8f479b26d55447 ]
+
@@ -30 +31,0 @@
-Cc: stable@dpdk.org
@@ -35 +36 @@
- lib/vhost/vhost_crypto.c | 123 +++++++++++++++------------------------
+ lib/librte_vhost/vhost_crypto.c | 123 ++++++++++++--------------------
@@ -38,5 +39,5 @@
-diff --git a/lib/vhost/vhost_crypto.c b/lib/vhost/vhost_crypto.c
-index b1c0eb6a0f..96ffb82a5d 100644
---- a/lib/vhost/vhost_crypto.c
-+++ b/lib/vhost/vhost_crypto.c
-@@ -565,94 +565,58 @@ get_data_ptr(struct vhost_crypto_data_req *vc_req,
+diff --git a/lib/librte_vhost/vhost_crypto.c b/lib/librte_vhost/vhost_crypto.c
+index 0439b12bc7..b8bdfe4bc7 100644
+--- a/lib/librte_vhost/vhost_crypto.c
++++ b/lib/librte_vhost/vhost_crypto.c
+@@ -566,94 +566,58 @@ get_data_ptr(struct vhost_crypto_data_req *vc_req,
@@ -178 +179 @@
-@@ -852,6 +816,7 @@ prepare_sym_cipher_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
+@@ -853,6 +817,7 @@ prepare_sym_cipher_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
@@ -186 +187 @@
-@@ -883,6 +848,7 @@ prepare_sym_cipher_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
+@@ -884,6 +849,7 @@ prepare_sym_cipher_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
@@ -194 +195 @@
-@@ -1006,6 +972,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
+@@ -1007,6 +973,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
@@ -202 +203 @@
-@@ -1037,6 +1004,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
+@@ -1038,6 +1005,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
@@ -210 +211 @@
-@@ -1121,6 +1089,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,
+@@ -1122,6 +1090,7 @@ prepare_sym_chain_op(struct vhost_crypto *vcrypto, struct rte_crypto_op *op,

  parent reply	other threads:[~2022-07-07  7:58 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-07  7:53 patch 'eal/windows: fix data race when creating threads' " christian.ehrhardt
2022-07-07  7:53 ` patch 'examples/bond: fix invalid use of trylock' " christian.ehrhardt
2022-07-07  7:53 ` patch 'net/mlx5: fix Tx when inlining is impossible' " christian.ehrhardt
2022-07-07  7:53 ` patch 'net/mlx5: fix GTP handling in header modify action' " christian.ehrhardt
2022-07-07  7:54 ` patch 'test/table: fix buffer overflow on lpm entry' " christian.ehrhardt
2022-07-07  7:54 ` patch 'mem: skip attaching external memory in secondary process' " christian.ehrhardt
2022-07-07  7:54 ` patch 'eal: fix C++ include for device event and DMA' " christian.ehrhardt
2022-07-07  7:54 ` patch 'crypto/dpaa_sec: fix digest size' " christian.ehrhardt
2022-07-07  7:54 ` patch 'crypto/dpaa2_sec: fix buffer pool ID check' " christian.ehrhardt
2022-07-07  7:54 ` patch 'crypto/dpaa_sec: fix secondary process probing' " christian.ehrhardt
2022-07-07  7:54 ` patch 'crypto/dpaa2_sec: fix operation status for simple FD' " christian.ehrhardt
2022-07-07  7:54 ` patch 'common/dpaax: fix short MAC-I IV calculation for ZUC' " christian.ehrhardt
2022-07-07  7:54 ` patch 'examples/l2fwd-crypto: fix stats refresh rate' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/nfp: remove unneeded header inclusion' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/bonding: fix RSS key config with extended key length' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/cxgbe: fix port ID in Rx mbuf' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/vhost: fix access to freed memory' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/vhost: fix TSO feature default disablement' " christian.ehrhardt
2022-07-07  7:54 ` patch 'vhost: fix missing virtqueue lock protection' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/dpaa: fix event queue detach' " christian.ehrhardt
2022-07-07  7:54 ` patch 'app/testpmd: check statistics query before printing' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/bnxt: remove unused macro' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/bnxt: recheck FW readiness if in reset process' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/bnxt: fix freeing VNIC filters' " christian.ehrhardt
2022-07-07  7:54 ` patch 'eal/x86: fix unaligned access for small memcpy' " christian.ehrhardt
2022-07-07  7:54 ` patch 'test: avoid hang if queues are full and Tx fails' " christian.ehrhardt
2022-07-07  7:54 ` patch 'acl: fix rules with 8-byte field size' " christian.ehrhardt
2022-07-07  7:54 ` patch 'rib: fix traversal with /32 route' " christian.ehrhardt
2022-07-07  7:54 ` patch 'devtools: fix null test for NUMA systems' " christian.ehrhardt
2022-07-07  7:54 ` patch 'examples/ipsec-secgw: fix promiscuous mode option' " christian.ehrhardt
2022-07-07  7:54 ` patch 'test/crypto: fix null check for ZUC authentication' " christian.ehrhardt
2022-07-07  7:54 ` patch 'drivers/crypto: fix warnings for OpenSSL version' " christian.ehrhardt
2022-07-07  7:54 ` patch 'app/testpmd: remove useless pointer checks' " christian.ehrhardt
2022-07-07  7:54 ` patch 'ethdev: clarify null location case in xstats get' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/hns3: fix xstats get return if xstats is null' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/ipn3ke: " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/mvpp2: " christian.ehrhardt
2022-07-07  7:54 ` patch 'app/testpmd: replace hardcoded min mbuf number with macro' " christian.ehrhardt
2022-07-07  7:54 ` patch 'app/testpmd: fix metering and policing command for RFC4115' " christian.ehrhardt
2022-07-07  7:54 ` patch 'ethdev: prohibit polling stopped queue' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/bonding: fix mbuf fast free usage' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/memif: fix overwriting of head segment' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/bnxt: fix compatibility with some old firmwares' " christian.ehrhardt
2022-07-07  7:54 ` patch 'examples/vhost: fix crash when no VMDq' " christian.ehrhardt
2022-07-07  7:54 ` patch 'kni: fix build with Linux 5.18' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/ixgbe: add option for link up check on pin SDP3' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/ice/base: fix getting sched node from ID type' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/iavf: fix queue start exception handling' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/iavf: increase reset complete wait count' " christian.ehrhardt
2022-07-07  7:54 ` patch 'bus/fslmc: fix VFIO setup' " christian.ehrhardt
2022-07-07  7:54 ` patch 'kni: use dedicated function to set random MAC address' " christian.ehrhardt
2022-07-07  7:54 ` patch 'kni: use dedicated function to set " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/ice: fix build with GCC 12' " christian.ehrhardt
2022-07-07  7:54 ` patch 'vdpa/ifc: " christian.ehrhardt
2022-07-07  7:54 ` patch 'eal/x86: drop export of internal alignment macro' " christian.ehrhardt
2022-07-07  7:54 ` patch 'common/cpt: fix build with GCC 12' " christian.ehrhardt
2022-07-07  7:54 ` patch 'test/ipsec: " christian.ehrhardt
2022-07-07  7:54 ` patch 'crypto/scheduler: fix queue pair in scheduler failover' " christian.ehrhardt
2022-07-07  7:54 ` patch 'test/crypto: fix cipher offset for ZUC' " christian.ehrhardt
2022-07-07  7:54 ` patch 'eventdev/eth_tx: fix adapter creation' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/bonding: fix RSS inconsistency between ports' " christian.ehrhardt
2022-07-07  7:54 ` patch 'test/bonding: fix RSS test when disable RSS' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/hns3: remove duplicate definition' " christian.ehrhardt
2022-07-07  7:54 ` patch 'net/nfp: fix initialization' " christian.ehrhardt
2022-07-07  7:55 ` patch 'app/testpmd: revert MAC update in checksum forwarding' " christian.ehrhardt
2022-07-07  7:55 ` patch 'vhost: fix missing enqueue pseudo-header calculation' " christian.ehrhardt
2022-07-07  7:55 ` christian.ehrhardt [this message]
2022-07-07  7:55 ` patch 'vhost/crypto: fix descriptor processing' " christian.ehrhardt
2022-07-07  7:55 ` patch 'malloc: fix allocation of almost hugepage size' " christian.ehrhardt
2022-07-07  7:55 ` patch 'net/octeontx: fix port close' " christian.ehrhardt
2022-07-07  7:55 ` patch 'net/qede: fix build with GCC 12' " christian.ehrhardt
2022-07-07  7:55 ` patch 'test/hash: fix out of bound access' " christian.ehrhardt
2022-07-07  7:55 ` patch 'test: check memory allocation for CRC' " christian.ehrhardt
2022-07-07  7:55 ` patch 'examples/distributor: fix distributor on Rx core' " christian.ehrhardt
2022-07-07  7:55 ` patch 'net/bnxt: allow Tx only or Rx only' " christian.ehrhardt
2022-07-07  7:55 ` patch 'net/bnxt: cleanup MTU setting' " christian.ehrhardt
2022-07-07  7:55 ` patch 'test/crypto: fix authentication IV for ZUC SGL' " christian.ehrhardt
2022-07-07  7:55 ` patch 'test/crypto: fix ZUC vector IV format' " christian.ehrhardt
2022-07-07  7:55 ` patch 'test/crypto: fix SNOW3G " christian.ehrhardt
2022-07-07  7:55 ` patch 'examples/fips_validation: handle empty payload' " christian.ehrhardt
2022-07-07  7:55 ` patch 'crypto/qat: fix DOCSIS crash' " christian.ehrhardt
2022-07-07  7:55 ` patch 'doc: fix grammar and formatting in compressdev guide' " christian.ehrhardt
2022-07-07  7:55 ` patch 'eventdev/eth_tx: fix queue delete' " christian.ehrhardt
2022-07-07  7:55 ` patch 'net/vhost: fix deadlock on vring state change' " christian.ehrhardt
2022-07-07  7:55 ` patch 'vhost: add some trailing newline in log messages' " christian.ehrhardt
2022-07-07  7:55 ` patch 'service: fix lingering active status' " christian.ehrhardt
2022-07-07  7:55 ` patch 'kni: fix build' " christian.ehrhardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220707075522.194223-67-christian.ehrhardt@canonical.com \
    --to=christian.ehrhardt@canonical.com \
    --cc=david.marchand@redhat.com \
    --cc=maxime.coquelin@redhat.com \
    --cc=stable@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).