From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C9953EEB589 for ; Sat, 9 Sep 2023 11:30:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3FC8E6B011D; Sat, 9 Sep 2023 07:30:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3AC526B011E; Sat, 9 Sep 2023 07:30:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 29B0D6B011F; Sat, 9 Sep 2023 07:30:09 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 1BA416B011D for ; Sat, 9 Sep 2023 07:30:09 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id C67AC1405E1 for ; Sat, 9 Sep 2023 11:30:08 +0000 (UTC) X-FDA: 81216840096.20.4A9B283 Received: from verein.lst.de (verein.lst.de [213.95.11.211]) by imf21.hostedemail.com (Postfix) with ESMTP id AB1651C0020 for ; Sat, 9 Sep 2023 11:30:06 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=none; spf=none (imf21.hostedemail.com: domain of hch@lst.de has no SPF policy when checking 213.95.11.211) smtp.mailfrom=hch@lst.de; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1694259007; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aY0o6GYcvhgn1nQN+f0PdIkspT8SI1sUQTsBD7kEl6U=; b=FNJCUU39jSSGQkIB5F3bCA18HGjM+AYGtDtu2K8ap3O0nFMemIjDyI5AoH1vMKmjXINSbX 3mOlEKaPGIsl+k0RSywWpkaW6Qn+6VF89c/U8xoBosSG7O6HY+3xmmFXM30j7j7aaSC8Cu Jixk/GnrnURKqU9QMQvf08ztp6UtYZo= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694259007; a=rsa-sha256; cv=none; b=f1ENnn+9c+xLsFWww1x9rvOIWksILsroWbaUwu1Ig/1KT6kIpmQQdLK6HsNg3WHT6EBctW YkvoYDLKwJqTEUJIkr4H4NW6PKC2EA4A9Nvw/MS5xPvJgrPHBzgFfnXRuL/Mn4cjZCMvCa J0oUU0ZVg9yYeqWyhUQQZCeSGC84jpo= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=none; spf=none (imf21.hostedemail.com: domain of hch@lst.de has no SPF policy when checking 213.95.11.211) smtp.mailfrom=hch@lst.de; dmarc=none Received: by verein.lst.de (Postfix, from userid 2407) id 054DC68B05; Sat, 9 Sep 2023 13:30:01 +0200 (CEST) Date: Sat, 9 Sep 2023 13:30:00 +0200 From: Christoph Hellwig To: David Howells Cc: Jens Axboe , Al Viro , Christoph Hellwig , Matthew Wilcox , Christian Brauner , David Hildenbrand , John Hubbard , Jeff Layton , Linus Torvalds , linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 2/3] iov_iter: Kunit tests for copying to/from an iterator Message-ID: <20230909113000.GB12045@lst.de> References: <20230908160322.1714302-1-dhowells@redhat.com> <20230908160322.1714302-3-dhowells@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230908160322.1714302-3-dhowells@redhat.com> User-Agent: Mutt/1.5.17 (2007-11-01) X-Rspamd-Queue-Id: AB1651C0020 X-Rspam-User: X-Stat-Signature: jayrxcp1iuujwm6yfapayy3qqp7tktup X-Rspamd-Server: rspam03 X-HE-Tag: 1694259006-400362 X-HE-Meta: U2FsdGVkX18sN8wwuPD+u99nMN3zgQgWx/2Tja0bgt0OlBrSibjWDqSNhbKpVLmvL3IskB5WfBLE5HyQyqoZv0BPXB8dUKR3hIeK8tBwdUur0z1NgqCvNj2ivbRkMWpqoh6Tc6p4dgOPcXoHzf36rcYCwhdJ50xFfwZj7NUlLzDDl6FDLRc193bLckL25cDFtFZxns2vXm7csxPd1hX+kKJwCT8UMchk3Fw8mtWCEyVFuCP4jEuFn1DHmHEAsEnF9woJp3InEr5L2ml5ZdVQJOrLGURoHwUgqEWr0wkE2I4pO7QEM+dBgZcxp6vFgKBpnqUq941KSro+jcmX8iK/G//mtE8+F584DI6r8dGu5tJdsnu+8J9N5+2l3qHzYExwJYlXyxndkpDiOr5rl37mrU4K38baYZF668Xo4yk8Fv6FMsXa5/WLgaAcmYNsWvxlbNpYkMJxxfbf216rQl5KT5Qw0MxJtl2W2ecs8mBWixJg0i6k8RiT5RbvHXrM0z56NyTCTTr4IyV1R/Emrf4DSRFtG/UTPiCpNhFHDthkckcxRy2R3r0LJ8im/LWjE9xgIbi77Tw0+ZVXJ1iLHS7S9JB90cbFlSu9LtR7FKhNqpnRksGg21abe7Vx8gG4XBNn+Fua8h9HLd3Aq0gMp7gFjfnQOk/iGu4xQgaD4EhbtFqPQ3z20eQM2lJEllFWHJdm6QCyn5RJJYvHHwE5C5rXN3irz7B6sAqDa3GsaqkfPJw+S57uOIat5R2dmU0Mb7vEJElNOAjrdgCyYLVCyuSANCOUAnBNQgEQXnELJaA4/ZqmUq/5elkN++1Uz+uWi4cBJGF4iZna3+aXERr2/Ep/7OPHdZoAhjtJHGWH4LebzLuYX5aVMTIfcI/2wFk8946KhW18Sfv+bTLqLAlTnbnehl2AzLN+5/cSpHgbXusTXJLX3YnC8aLAh6RzaDmYq0H1eCqgRgZEt3kUHu9klQv eQzTsvqg Z0CucrSBYiFaVApgiHwlYM3pX4ju+QRlwPh8BefYMcP3Qi6D7o0LWbGi609kIYrggSFjUayLoY4eniQZLXQuUH0hnXAwuC9wk33fC+Oo8TpGhga4= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: > +/* I/O iterator tests. This can only test kernel-backed iterator types. kernel comments start with a: /* and nothing else on the line. (for brevity I'm not going to repeat the comment for the rest of this series) > +static const struct kvec_test_range kvec_test_ranges[] = { > + { 0x00002, 0x00002 }, > + { 0x00027, 0x03000 }, > + { 0x05193, 0x18794 }, > + { 0x20000, 0x20000 }, > + { 0x20000, 0x24000 }, > + { 0x24000, 0x27001 }, > + { 0x29000, 0xffffb }, > + { 0xffffd, 0xffffe }, How were these values picked? Should there be a comment explaining them? > + buffer = vmap(pages, npages, VM_MAP | VM_MAP_PUT_PAGES, PAGE_KERNEL); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buffer); The KUNIT_ASSERT_NOT_ERR_OR_NULL seems misindented. > + */ > +static void __init iov_kunit_copy_to_bvec(struct kunit *test) > +{ > + const struct bvec_test_range *pr; > + struct iov_iter iter; > + struct bio_vec bvec[8]; > + struct page **spages, **bpages; > + u8 *scratch, *buffer; > + size_t bufsize, npages, size, copied; > + int i, b, patt; > + > + bufsize = 0x100000; > + npages = bufsize / PAGE_SIZE; > + > + scratch = iov_kunit_create_buffer(test, &spages, npages); > + for (i = 0; i < bufsize; i++) > + scratch[i] = pattern(i); > + > + buffer = iov_kunit_create_buffer(test, &bpages, npages); > + memset(buffer, 0, bufsize); > + > + iov_kunit_load_bvec(test, &iter, READ, bvec, ARRAY_SIZE(bvec), > + bpages, npages, bufsize, bvec_test_ranges); > + size = iter.count; > + > + copied = copy_to_iter(scratch, size, &iter); > + > + KUNIT_EXPECT_EQ(test, copied, size); > + KUNIT_EXPECT_EQ(test, iter.count, 0); > + KUNIT_EXPECT_EQ(test, iter.nr_segs, 0); > + > + /* Build the expected image in the scratch buffer. */ > + b = 0; > + patt = 0; > + memset(scratch, 0, bufsize); > + for (pr = bvec_test_ranges; pr->from >= 0; pr++, b++) { > + u8 *p = scratch + pr->page * PAGE_SIZE; > + > + for (i = pr->from; i < pr->to; i++) > + p[i] = pattern(patt++); > + } > + > + /* Compare the images */ > + for (i = 0; i < bufsize; i++) { > + KUNIT_EXPECT_EQ_MSG(test, buffer[i], scratch[i], "at i=%x", i); > + if (buffer[i] != scratch[i]) > + return; > + } > + > + KUNIT_SUCCEED(); > +} > + > +/* > + * Test copying from a ITER_BVEC-type iterator. > + */ > +static void __init iov_kunit_copy_from_bvec(struct kunit *test) > +{ > + const struct bvec_test_range *pr; > + struct iov_iter iter; > + struct bio_vec bvec[8]; > + struct page **spages, **bpages; > + u8 *scratch, *buffer; > + size_t bufsize, npages, size, copied; > + int i, j; > + > + bufsize = 0x100000; > + npages = bufsize / PAGE_SIZE; > + > + buffer = iov_kunit_create_buffer(test, &bpages, npages); > + for (i = 0; i < bufsize; i++) > + buffer[i] = pattern(i); > + > + scratch = iov_kunit_create_buffer(test, &spages, npages); > + memset(scratch, 0, bufsize); > + > + iov_kunit_load_bvec(test, &iter, WRITE, bvec, ARRAY_SIZE(bvec), > + bpages, npages, bufsize, bvec_test_ranges); > + size = iter.count; > + > + copied = copy_from_iter(scratch, size, &iter); > + > + KUNIT_EXPECT_EQ(test, copied, size); > + KUNIT_EXPECT_EQ(test, iter.count, 0); > + KUNIT_EXPECT_EQ(test, iter.nr_segs, 0); > + > + /* Build the expected image in the main buffer. */ > + i = 0; > + memset(buffer, 0, bufsize); > + for (pr = bvec_test_ranges; pr->from >= 0; pr++) { > + size_t patt = pr->page * PAGE_SIZE; > + > + for (j = pr->from; j < pr->to; j++) { > + buffer[i++] = pattern(patt + j); > + if (i >= bufsize) > + goto stop; > + } > + } > +stop: > + > + /* Compare the images */ > + for (i = 0; i < bufsize; i++) { > + KUNIT_EXPECT_EQ_MSG(test, scratch[i], buffer[i], "at i=%x", i); > + if (scratch[i] != buffer[i]) > + return; > + } > + > + KUNIT_SUCCEED(); > +} > + > +static void iov_kunit_destroy_xarray(void *data) > +{ > + struct xarray *xarray = data; > + > + xa_destroy(xarray); > + kfree(xarray); > +} > + > +static void __init iov_kunit_load_xarray(struct kunit *test, > + struct iov_iter *iter, int dir, > + struct xarray *xarray, > + struct page **pages, size_t npages) > +{ > + size_t size = 0; > + int i; > + > + for (i = 0; i < npages; i++) { > + void *x = xa_store(xarray, i, pages[i], GFP_KERNEL); > + > + KUNIT_ASSERT_FALSE(test, xa_is_err(x)); > + size += PAGE_SIZE; > + } > + iov_iter_xarray(iter, dir, xarray, 0, size); > +} > + > +static struct xarray *iov_kunit_create_xarray(struct kunit *test) > +{ > + struct xarray *xarray; > + > + xarray = kzalloc(sizeof(struct xarray), GFP_KERNEL); > + xa_init(xarray); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xarray); > + kunit_add_action_or_reset(test, iov_kunit_destroy_xarray, xarray); > + return xarray; > +} > + > +/* > + * Test copying to a ITER_XARRAY-type iterator. > + */ > +static void __init iov_kunit_copy_to_xarray(struct kunit *test) > +{ > + const struct kvec_test_range *pr; > + struct iov_iter iter; > + struct xarray *xarray; > + struct page **spages, **bpages; > + u8 *scratch, *buffer; > + size_t bufsize, npages, size, copied; > + int i, patt; > + > + bufsize = 0x100000; > + npages = bufsize / PAGE_SIZE; > + > + xarray = iov_kunit_create_xarray(test); > + > + scratch = iov_kunit_create_buffer(test, &spages, npages); > + for (i = 0; i < bufsize; i++) > + scratch[i] = pattern(i); > + > + buffer = iov_kunit_create_buffer(test, &bpages, npages); > + memset(buffer, 0, bufsize); > + > + iov_kunit_load_xarray(test, &iter, READ, xarray, bpages, npages); > + > + i = 0; > + for (pr = kvec_test_ranges; pr->from >= 0; pr++) { > + size = pr->to - pr->from; > + KUNIT_ASSERT_LE(test, pr->to, bufsize); > + > + iov_iter_xarray(&iter, READ, xarray, pr->from, size); > + copied = copy_to_iter(scratch + i, size, &iter); > + > + KUNIT_EXPECT_EQ(test, copied, size); > + KUNIT_EXPECT_EQ(test, iter.count, 0); > + KUNIT_EXPECT_EQ(test, iter.iov_offset, size); > + i += size; > + } > + > + /* Build the expected image in the scratch buffer. */ > + patt = 0; > + memset(scratch, 0, bufsize); > + for (pr = kvec_test_ranges; pr->from >= 0; pr++) > + for (i = pr->from; i < pr->to; i++) > + scratch[i] = pattern(patt++); > + > + /* Compare the images */ > + for (i = 0; i < bufsize; i++) { > + KUNIT_EXPECT_EQ_MSG(test, buffer[i], scratch[i], "at i=%x", i); > + if (buffer[i] != scratch[i]) > + return; > + } > + > + KUNIT_SUCCEED(); > +} > + > +/* > + * Test copying from a ITER_XARRAY-type iterator. > + */ > +static void __init iov_kunit_copy_from_xarray(struct kunit *test) > +{ > + const struct kvec_test_range *pr; > + struct iov_iter iter; > + struct xarray *xarray; > + struct page **spages, **bpages; > + u8 *scratch, *buffer; > + size_t bufsize, npages, size, copied; > + int i, j; > + > + bufsize = 0x100000; > + npages = bufsize / PAGE_SIZE; > + > + xarray = iov_kunit_create_xarray(test); > + > + buffer = iov_kunit_create_buffer(test, &bpages, npages); > + for (i = 0; i < bufsize; i++) > + buffer[i] = pattern(i); > + > + scratch = iov_kunit_create_buffer(test, &spages, npages); > + memset(scratch, 0, bufsize); > + > + iov_kunit_load_xarray(test, &iter, READ, xarray, bpages, npages); > + > + i = 0; > + for (pr = kvec_test_ranges; pr->from >= 0; pr++) { > + size = pr->to - pr->from; > + KUNIT_ASSERT_LE(test, pr->to, bufsize); > + > + iov_iter_xarray(&iter, WRITE, xarray, pr->from, size); > + copied = copy_from_iter(scratch + i, size, &iter); > + > + KUNIT_EXPECT_EQ(test, copied, size); > + KUNIT_EXPECT_EQ(test, iter.count, 0); > + KUNIT_EXPECT_EQ(test, iter.iov_offset, size); > + i += size; > + } > + > + /* Build the expected image in the main buffer. */ > + i = 0; > + memset(buffer, 0, bufsize); > + for (pr = kvec_test_ranges; pr->from >= 0; pr++) { > + for (j = pr->from; j < pr->to; j++) { > + buffer[i++] = pattern(j); > + if (i >= bufsize) > + goto stop; > + } > + } > +stop: > + > + /* Compare the images */ > + for (i = 0; i < bufsize; i++) { > + KUNIT_EXPECT_EQ_MSG(test, scratch[i], buffer[i], "at i=%x", i); > + if (scratch[i] != buffer[i]) > + return; > + } > + > + KUNIT_SUCCEED(); > +} > + > +static struct kunit_case __refdata iov_kunit_cases[] = { > + KUNIT_CASE(iov_kunit_copy_to_kvec), > + KUNIT_CASE(iov_kunit_copy_from_kvec), > + KUNIT_CASE(iov_kunit_copy_to_bvec), > + KUNIT_CASE(iov_kunit_copy_from_bvec), > + KUNIT_CASE(iov_kunit_copy_to_xarray), > + KUNIT_CASE(iov_kunit_copy_from_xarray), > + {} > +}; > + > +static struct kunit_suite iov_kunit_suite = { > + .name = "iov_iter", > + .test_cases = iov_kunit_cases, > +}; > + > +kunit_test_suites(&iov_kunit_suite); ---end quoted text---