All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH] iov_iter: Add extraction functions
@ 2022-09-09 23:18 David Howells
  2022-09-10 12:16 ` kernel test robot
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: David Howells @ 2022-09-09 23:18 UTC (permalink / raw)
  To: Alexander Viro, jlayton; +Cc: dhowells, smfrench, linux-fsdevel

Hi Al, Jeff,

Here's a replacement for the extract_iter_to_iter() patch I had previously.
It's a WIP, some bits aren't fully implemented, though some bits I have tested
and got to work, but if you could take a look and see if you're okay with the
interface.

I think I've addressed most of Al's comments.  The page-pinning is conditional
on certain types of iterator, and a number of the iterator types just extract
to the same thing.  It should now handle kvec-class iterators that refer to
vmalloc'd data.

I've also added extraction to scatterlist (which I'll need for doing various
crypto things) and extraction to ib_sge which could be used in cifs/smb RDMA,
bypassing the conversion-to-scatterlist step.

As mentioned, there are bits that aren't fully implemented, let alone tested.

David
---
iov_iter: Add extraction functions

Add extraction functions to extract the page content from an I/O iterator
to one of three destinations:

 (1) extract_iter_to_iter()

     Builds a new iterator from the source iterator such that the new
     iterator remains valid if the source iterator gets deallocated, such
     as can happen in asynchronous I/O when -EIOCBQUEUED is returned.

     For UBUF/IOVEC-class iterators the output iteratior will be BVEC-class
     and data/buffer pages are pinned to prevent them being moved, swapped
     out or discarded for the duration.

     For XARRAY-class iterators, the new iterator is copied and then
     trimmed; no page pinning is done.  For BVEC- and KVEC-class iterators,
     the bio_vec/kvec table is copied and trimmed; again no page pinning.

     KVEC-class iterators with vmalloc'd areas should work.

     DISCARD- and PIPE-class iterators are not currently supported and
     incur an error.

     The extraction function fills out a "cleanup" record that can then be
     passed to iov_iter_clean_up() once the I/O is complete.  This will
     undo any pinning and free any allocated bufferage.

     Tested with DIO read: IOVEC, UBUF.
     Tested just dumping iterator: BVEC, KVEC.
     Untested: XARRAY.

 (2) extract_iter_to_sg()

     Similar to above, but builds a scatterlist and attaches it to an
     sg_table instead of a new iterator.  Returns an indication if the
     pages were pinned.

     The caller is responsible for freeing the scatterlist and unpinning
     any pages.

     Tested to dump sglist: IOVEC, UBUF, KVEC.
     Untested: BVEC, XARRAY.

 (3) extract_iter_to_rdma()

     Similar again, but fills in an ib_sge struct array, mapping the pages
     to DMA addresses appropriate to the specified driver.

     The caller provides the ib_sge array, so it's up to the caller to
     clean that up.  No page-pinning is done as ib_sge does not provide a
     place to note the source page(s), so only BVEC-, KVEC- and
     XARRAY-class iterators are supported for now.  One possible solution
     to that is to pass the iterator through extract_iter_to_iter() first.

     Completely untested and needs more modification to deal with errors
     from ib_dma_map_page().

Note that for the moment, none of these advance the source iterator.

An additional function, iov_iter_flush_dcache(), is provided to do dcache
flushing over the source buffer, using the information provided in the
extracted iterator and the cleanup record.  This works for BVEC-class
iterators, but is incompletely implemented for KVEC-class and probably
wrong for XARRAY-class.

Signed-off-by: David Howells <dhowells@redhat.com>
---

diff --git a/include/linux/uio2.h b/include/linux/uio2.h
new file mode 100644
index 000000000000..bc3e5ea96de7
--- /dev/null
+++ b/include/linux/uio2.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* iov_iter extractors
+ *
+ * Copyright (C) 2022 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ */
+
+#ifndef _LINUX_UIO2_H
+#define _LINUX_UIO2_H
+
+#include <linux/uio.h>
+#include <linux/dma-direction.h>
+
+struct sg_table;
+struct ib_device;
+struct ib_sge;
+
+/*
+ * Cleanup information for an extracted iterator.
+ */
+struct iov_iter_cleanup {
+	union {
+		struct bio_vec	*bv;
+		struct kvec	*kv;
+	};
+	unsigned int	nr_segs;
+	bool		pages_pinned;
+	enum iter_type	type:8;
+};
+
+ssize_t extract_iter_to_iter(struct iov_iter *iter, size_t len,
+			     struct iov_iter *to,
+			     struct iov_iter_cleanup *cleanup);
+ssize_t extract_iter_to_sg(struct iov_iter *iter, size_t len,
+			   struct sg_table *sgtable, bool *pinned);
+ssize_t extract_iter_to_rdma(struct iov_iter *iter, size_t len,
+			     struct ib_device *device, u32 local_dma_lkey,
+			     enum dma_data_direction direction,
+			     struct ib_sge *sge, unsigned int max_sge,
+			     unsigned int *nr_sge);
+void iov_iter_flush_dcache(struct iov_iter *iter,
+			   struct iov_iter_cleanup *cleanup);
+void iov_iter_clean_up(struct iov_iter_cleanup *cleanup);
+
+#endif /* _LINUX_UIO2_H */
diff --git a/lib/Makefile b/lib/Makefile
index 5927d7fa0806..7d46c1a68322 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -44,7 +44,7 @@ obj-y	+= lockref.o
 
 obj-y += bcd.o sort.o parser.o debug_locks.o random32.o \
 	 bust_spinlocks.o kasprintf.o bitmap.o scatterlist.o \
-	 list_sort.o uuid.o iov_iter.o clz_ctz.o \
+	 list_sort.o uuid.o iov_iter.o iov_iter_extract.o clz_ctz.o \
 	 bsearch.o find_bit.o llist.o memweight.o kfifo.o \
 	 percpu-refcount.o rhashtable.o base64.o \
 	 once.o refcount.o usercopy.o errseq.o bucket_locks.o \
diff --git a/lib/iov_iter_extract.c b/lib/iov_iter_extract.c
new file mode 100644
index 000000000000..eec7287ce779
--- /dev/null
+++ b/lib/iov_iter_extract.c
@@ -0,0 +1,653 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Extract page list from an iterator and attach it to a scatter list, an RDMA
+ * SGE array or another iterator.
+ *
+ * Copyright (C) 2022 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ */
+
+#include <linux/export.h>
+#include <linux/bvec.h>
+#include <linux/uio.h>
+#include <linux/uio2.h>
+#include <linux/pagemap.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/scatterlist.h>
+#include <rdma/ib_verbs.h>
+
+enum iter_extract_dest {
+	EXTRACT_TO_BVEC,
+	EXTRACT_TO_SGLIST,
+	EXTRACT_TO_RDMA,
+};
+
+struct extract_to_rdma {
+	struct ib_sge		*sge;
+	unsigned int		*nr_sge;
+	struct ib_device	*device;
+	u32			local_dma_lkey;
+	enum dma_data_direction	direction;
+};
+
+/*
+ * When we're extracting lists of pages, we can avoid having to do a second
+ * allocation by putting the list of extracted pages overlapping the end of the
+ * array.  As long as the array elements are larger than page pointers, and as
+ * long as we work 0->last, the two shouldn't interfere.
+ */
+static struct page **locate_pages_array(void *array, unsigned int array_max,
+					enum iter_extract_dest dest)
+{
+	void *p;
+	size_t arr_size, pg_size;
+
+	switch (dest) {
+	case EXTRACT_TO_BVEC: {
+		struct iov_iter *to = array;
+
+		arr_size = array_size(array_max, sizeof(struct bio_vec));
+		p = (void *)to->bvec;
+		break;
+	}
+	case EXTRACT_TO_SGLIST: {
+		struct sg_table *sgtable = array;
+
+		arr_size = array_size(array_max, sizeof(struct scatterlist));
+		p = sgtable->sgl;
+		break;
+	}
+	case EXTRACT_TO_RDMA: {
+		struct extract_to_rdma *rdma = array;
+
+		arr_size = array_size(array_max, sizeof(struct ib_sge));
+		p = rdma->sge;
+		break;
+	}
+	}
+
+	pg_size = array_size(array_max, sizeof(struct page *));
+	return (void *)p + arr_size - pg_size;
+}
+
+/*
+ * Attach a segment of a contiguous span of pages to a single buffer segment.
+ */
+static int extract_contig_pages(void *array, struct page *lowest_page,
+				unsigned long off, size_t len,
+				enum iter_extract_dest dest)
+{
+	switch (dest) {
+	case EXTRACT_TO_BVEC: {
+		struct iov_iter *to = array;
+		struct bio_vec *bv = (struct bio_vec *)&to->bvec[to->nr_segs++];
+
+		bv->bv_page = lowest_page;
+		bv->bv_len = len;
+		bv->bv_offset = off;
+		to->count += len;
+		return to->nr_segs;
+	}
+	case EXTRACT_TO_SGLIST: {
+		struct sg_table *sgtable = array;
+		struct scatterlist *sg = &sgtable->sgl[sgtable->nents++];
+
+		sg_set_page(sg, lowest_page, len, off);
+		return sgtable->nents;
+	}
+	case EXTRACT_TO_RDMA: {
+		struct extract_to_rdma *rdma = array;
+		struct ib_sge *sge = &rdma->sge[*rdma->nr_sge];
+
+		sge->addr = ib_dma_map_page(rdma->device, lowest_page,
+					    off, len, rdma->direction);
+		if (ib_dma_mapping_error(rdma->device, sge->addr)) {
+			sge->addr = 0;
+			return -EIO;
+		}
+		sge->length = len;
+		sge->lkey   = rdma->local_dma_lkey;
+		*rdma->nr_sge += 1;
+		return *rdma->nr_sge;
+	}
+	}
+
+	BUG();
+}
+
+static unsigned int extract_page_list(void *array,
+				      struct page **pages, unsigned int nr_pages,
+				      unsigned long off, size_t len,
+				      enum iter_extract_dest dest)
+{
+	struct page *page;
+	unsigned int ret = 0;
+	size_t seg;
+	int i;
+
+	for (i = 0; i < nr_pages; i++) {
+		seg = min_t(size_t, PAGE_SIZE - off, len);
+		page = *pages;
+		*pages++ = NULL;
+		ret = extract_contig_pages(array, page, off, seg, dest);
+		len -= seg;
+		off = 0;
+	}
+
+	return ret;
+}
+
+static void terminate_array(void *array, enum iter_extract_dest dest)
+{
+	if (dest == EXTRACT_TO_SGLIST) {
+		struct sg_table *sgtable = array;
+		struct scatterlist *sg = sgtable->sgl + sgtable->nents - 1;
+
+		sgtable->orig_nents = sgtable->nents;
+		if (sgtable->nents)
+			sg_mark_end(sg);
+	}
+}
+
+/*
+ * Extract and pin the pages from UBUF- or IOVEC-class iterators and add them
+ * to the destination buffer.
+ */
+static ssize_t iov_iter_extract_user(struct iov_iter *iter,
+				     void *array, unsigned int array_max,
+				     ssize_t maxsize,
+				     enum iter_extract_dest dest)
+{
+	const struct iovec *iov;
+	struct iovec ubuf;
+	struct page **pages;
+	unsigned long uaddr, start = iter->iov_offset;
+	unsigned int i = 0, ix = 0, gup_flags = 0, nr_segs, n;
+	ssize_t ret = 0;
+	size_t len, off;
+	int res;
+
+	pages = locate_pages_array(array, array_max, dest);
+
+	if (iov_iter_rw(iter) != WRITE)
+		gup_flags |= FOLL_WRITE;
+	if (iter->nofault)
+		gup_flags |= FOLL_NOFAULT;
+
+	if (iter_is_ubuf(iter)) {
+		ubuf.iov_base = iter->ubuf;
+		ubuf.iov_len = iov_iter_count(iter);
+		iov = &ubuf;
+		nr_segs = 1;
+	} else {
+		iov = iter->iov;
+		nr_segs = iter->nr_segs;
+	}
+
+	do {
+		len = iov[i].iov_len;
+		if (start >= len) {
+			start -= len;
+			i++;
+			if (i >= nr_segs)
+				break;
+			continue;
+		}
+
+		uaddr = (unsigned long)iov[i].iov_base + start;
+		len = min_t(size_t, maxsize, len - start);
+		off = uaddr & ~PAGE_MASK;
+		uaddr &= PAGE_MASK;
+
+		n = DIV_ROUND_UP(len + off, PAGE_SIZE);
+		n = min(n, array_max - ix);
+
+		res = get_user_pages_fast(uaddr, n, gup_flags, pages + ix);
+		if (unlikely(res <= 0)) {
+			if (res < 0)
+				return res;
+			break;
+		}
+
+		len = min_t(size_t, len, res * PAGE_SIZE - off);
+		maxsize -= len;
+		start += len;
+		ret += len;
+		ix = extract_page_list(array, pages + ix, res, off, len, dest);
+	} while (maxsize > 0 && ix < array_max);
+
+	terminate_array(array, dest);
+	return ret;
+}
+
+/*
+ * Extract the pages from a BVEC-class iterator and add them to the destination
+ * buffer.  The pages are not pinned.
+ */
+static ssize_t iov_iter_extract_bvec(struct iov_iter *iter,
+				     void *array, unsigned int array_max,
+				     ssize_t maxsize,
+				     enum iter_extract_dest dest)
+{
+	const struct bio_vec *bv = iter->bvec;
+	unsigned long start = iter->iov_offset;
+	unsigned int i, ix;
+	ssize_t ret = 0;
+
+	for (i = 0; i < iter->nr_segs; i++) {
+		size_t off, len;
+
+		len = bv[i].bv_len;
+		if (start >= len) {
+			start -= len;
+			continue;
+		}
+
+		len = min_t(size_t, maxsize, len - start);
+		off = bv[i].bv_offset + start;
+
+		maxsize -= len;
+		ret += len;
+		ix = extract_contig_pages(array, bv[i].bv_page, off, len,
+					  dest);
+		if (maxsize <= 0 || ix >= array_max)
+			break;
+		start = 0;
+	}
+
+	terminate_array(array, dest);
+	return ret;
+}
+
+/*
+ * Extract the pages from a KVEC-class iterator and add them to the destination
+ * buffer.  This can deal with vmalloc'd buffers as well as kmalloc'd or static
+ * buffers.  The pages are not pinned.
+ */
+static ssize_t iov_iter_extract_kvec(struct iov_iter *iter,
+				     void *array, unsigned int array_max,
+				     ssize_t maxsize,
+				     enum iter_extract_dest dest)
+{
+	const struct kvec *kv = iter->kvec;
+	unsigned long start = iter->iov_offset;
+	unsigned int i, ix;
+	ssize_t ret = 0;
+
+	for (i = 0; i < iter->nr_segs; i++) {
+		struct page *page;
+		unsigned long kaddr;
+		size_t off, len, seg;
+
+		len = kv[i].iov_len;
+		if (start >= len) {
+			start -= len;
+			continue;
+		}
+
+		kaddr = (unsigned long)kv[i].iov_base + start;
+		off = kaddr & ~PAGE_MASK;
+		len = min_t(size_t, maxsize, len - start);
+		kaddr &= PAGE_MASK;
+
+		maxsize -= len;
+		ret += len;
+		do {
+			seg = min_t(size_t, len, PAGE_SIZE - off);
+			if (is_vmalloc_or_module_addr((void *)kaddr))
+				page = vmalloc_to_page((void *)kaddr);
+			else
+				page = virt_to_page(kaddr);
+			ix = extract_contig_pages(array, page, off, seg, dest);
+			len -= seg;
+			kaddr += PAGE_SIZE;
+			off = 0;
+		} while (len > 0 && ix <= array_max);
+		if (maxsize <= 0 || ix >= array_max)
+			break;
+		start = 0;
+	}
+
+	terminate_array(array, dest);
+	return ret;
+}
+
+/*
+ * Extract the pages from an XARRAY-class iterator and add them to the
+ * destination buffer.  The pages are not pinned.
+ */
+static ssize_t iov_iter_extract_xarray(struct iov_iter *iter,
+				       void *array, unsigned int array_max,
+				       ssize_t maxsize,
+				       enum iter_extract_dest dest)
+{
+	struct xarray *xa = iter->xarray;
+	struct folio *folio;
+	unsigned int ix;
+	loff_t start = iter->xarray_start + iter->iov_offset;
+	pgoff_t index = start / PAGE_SIZE;
+	ssize_t ret;
+	size_t offset, len;
+	XA_STATE(xas, xa, index);
+
+	rcu_read_lock();
+	xas_for_each(&xas, folio, ULONG_MAX) {
+		if (xas_retry(&xas, folio))
+			continue;
+		if (WARN_ON(xa_is_value(folio)))
+			break;
+		if (WARN_ON(folio_test_hugetlb(folio)))
+			break;
+
+		offset = offset_in_folio(folio, start);
+		len = min_t(size_t, maxsize, folio_size(folio) - offset);
+
+		ix = extract_contig_pages(array, folio_page(folio, 0),
+					  offset, len, dest);
+		maxsize -= len;
+		ret += len;
+		if (ix >= array_max) {
+			WARN_ON_ONCE(ix > array_max);
+			break;
+		}
+
+		if (maxsize <= 0)
+			break;
+	}
+
+	rcu_read_unlock();
+	terminate_array(array, dest);
+	return ret;
+}
+
+static ssize_t iov_iter_extract_pages(struct iov_iter *iter,
+				      void *array, unsigned int array_max,
+				      size_t maxsize,
+				      enum iter_extract_dest dest)
+{
+	if (likely(user_backed_iter(iter)))
+		return iov_iter_extract_user(iter, array, array_max, maxsize,
+					     dest);
+	if (iov_iter_is_bvec(iter))
+		return iov_iter_extract_bvec(iter, array, array_max, maxsize,
+					     dest);
+	if (iov_iter_is_kvec(iter))
+		return iov_iter_extract_kvec(iter, array, array_max, maxsize,
+					     dest);
+	if (iov_iter_is_xarray(iter))
+		return iov_iter_extract_xarray(iter, array, array_max, maxsize,
+					       dest);
+	if (iov_iter_is_pipe(iter)) {
+		pr_warn("extract pipe unsupported\n");
+		return -EIO;
+	}
+
+	pr_warn("extract other-type unsupported\n");
+	return -EFAULT;
+}
+
+/**
+ * extract_iter_to_iter - Extract the pages from an iterator into another iterator
+ * @iter: The iterator to extract from
+ * @len: The amount of iterator to copy
+ * @to: The iterator to fill in
+ * @cleanup: Information on how to clean up the resulting iterator
+ *
+ * Extract the page fragments from the given amount of the source iterator and
+ * build up an iterator that refers to all of those bits.  This allows the
+ * source iterator to disposed of.
+ *
+ * UBUF- and IOVEC-class iterators are extracted to BVEC-class iterators and
+ * the extracted pages are pinned; BVEC-, KVEC- and XARRAY-class are extracted
+ * as the same type and truncated with no pinning; PIPE- and DISCARD-class are
+ * not supported.
+ */
+ssize_t extract_iter_to_iter(struct iov_iter *iter, size_t len,
+			     struct iov_iter *to,
+			     struct iov_iter_cleanup *cleanup)
+{
+	struct bio_vec *bv;
+	unsigned int bv_max;
+	ssize_t ret;
+	size_t bv_size;
+
+	memset(cleanup, 0, sizeof(*cleanup));
+
+	cleanup->type = iov_iter_type(iter);
+	switch (iov_iter_type(iter)) {
+	case ITER_KVEC:
+		cleanup->kv = (void *)dup_iter(to, iter, GFP_KERNEL);
+		if (!cleanup->kv)
+			return -ENOMEM;
+		cleanup->nr_segs = to->nr_segs;
+		iov_iter_truncate(to, len);
+		return iov_iter_count(to);
+	case ITER_XARRAY:
+		*to = *iter;
+		iov_iter_truncate(to, len);
+		return iov_iter_count(to);
+
+	case ITER_UBUF:
+	case ITER_IOVEC:
+		cleanup->pages_pinned = true;
+		fallthrough;
+	case ITER_BVEC:
+		bv_max = iov_iter_npages(iter, INT_MAX);
+		bv_size = array_size(bv_max, sizeof(*bv));
+		bv = kvmalloc(bv_size, GFP_KERNEL);
+		if (!bv)
+			return -ENOMEM;
+
+		iov_iter_bvec(to, iov_iter_rw(iter), bv, 0, 0);
+		ret = iov_iter_extract_pages(iter, to, bv_max, len,
+					     EXTRACT_TO_BVEC);
+		if (ret < 0) {
+			iov_iter_clean_up(cleanup);
+			return ret;
+		}
+
+		cleanup->type = ITER_BVEC;
+		cleanup->bv = bv;
+		cleanup->nr_segs = to->nr_segs;
+		return ret;
+
+	case ITER_DISCARD:
+	case ITER_PIPE:
+	default:
+		WARN_ON_ONCE(1);
+		return -EIO;
+	}
+}
+EXPORT_SYMBOL(extract_iter_to_iter);
+
+/**
+ * extract_iter_to_sg - Extract the pages from an iterator into an sglist
+ * @iter: The iterator to extract from
+ * @len: The amount of iterator to copy
+ * @sgtable: The scatterlist table to fill in
+ * @pages_pinned: On return set to true if pages were pinned
+ *
+ * Extract the page fragments from the given amount of the source iterator and
+ * build up scatterlist that refers to all of those bits.
+ *
+ * The pages referred to by UBUF- and IOVEC-class iterators are extracted and
+ * pinned; BVEC-, KVEC- and XARRAY-class are extracted and aren't pinned; PIPE-
+ * and DISCARD-class are not supported
+ */
+ssize_t extract_iter_to_sg(struct iov_iter *iter, size_t len,
+			   struct sg_table *sgtable, bool *pages_pinned)
+{
+	struct scatterlist *sg = NULL;
+	unsigned int sg_max;
+	ssize_t ret;
+	size_t sg_size;
+
+	switch (iov_iter_type(iter)) {
+	case ITER_DISCARD:
+	case ITER_PIPE:
+		WARN_ON_ONCE(1);
+		return -EIO;
+	case ITER_UBUF:
+	case ITER_IOVEC:
+		*pages_pinned = true;
+		break;
+	case ITER_BVEC:
+	case ITER_KVEC:
+	case ITER_XARRAY:
+		*pages_pinned = false;
+		break;
+	}
+
+	sg_max = iov_iter_npages(iter, INT_MAX);
+	sg_size = array_size(sg_max, sizeof(*sg));
+	sg = kvmalloc(sg_size, GFP_KERNEL);
+	if (!sg)
+		return -ENOMEM;
+	memset(sg, 0, sg_size);
+
+	sgtable->sgl = sg;
+	sgtable->nents = 0;
+	sgtable->orig_nents = 0;
+	ret = iov_iter_extract_pages(iter, sgtable, sg_max, len,
+				     EXTRACT_TO_SGLIST);
+	if (ret < 0)
+		kvfree(sg);
+	return ret;
+}
+EXPORT_SYMBOL(extract_iter_to_sg);
+
+/**
+ * extract_iter_to_rdma - Extract the pages from an iterator into an rdma SGE list
+ * @iter: The iterator to extract from
+ * @len: The amount of iterator to copy
+ * @device: The RDMA device
+ * @local_dma_lkey: DMA keying
+ * @direction: The DMA direction
+ * @sge: The SGE array to fill
+ * @max_sge: The maximum size of SGE[].
+ * @nr_sge: On return set to the number of SGEs used
+ *
+ * Extract the page fragments from the given amount of the source iterator and
+ * build up an RDMA SGE list that refers to all of those bits.
+ *
+ * Only BVEC-, KVEC- and XARRAY-class iterators are supported and the extracted
+ * pages aren't pinned; UBUF-, IOVEC-, PIPE- and DISCARD-class are not
+ * supported.
+ */
+ssize_t extract_iter_to_rdma(struct iov_iter *iter, size_t len,
+			     struct ib_device *device, u32 local_dma_lkey,
+			     enum dma_data_direction direction,
+			     struct ib_sge *sge, unsigned int max_sge,
+			     unsigned int *nr_sge)
+{
+	struct extract_to_rdma rdma = {
+		.device		= device,
+		.local_dma_lkey	= local_dma_lkey,
+		.direction	= direction,
+		.sge		= sge,
+		.nr_sge		= nr_sge,
+	};
+
+	switch (iov_iter_type(iter)) {
+	case ITER_DISCARD:
+	case ITER_PIPE:
+		WARN_ON_ONCE(1);
+		return -EIO;
+	case ITER_UBUF:
+	case ITER_IOVEC:
+		WARN_ON_ONCE(1); /* Can't pin pages; extract to a bvec first. */
+		break;
+	case ITER_BVEC:
+	case ITER_KVEC:
+	case ITER_XARRAY:
+		break;
+	}
+
+	BUG(); // TODO: Implement handling of errors from ib_dma_map_page().
+	return iov_iter_extract_pages(iter, &rdma, max_sge, len,
+				      EXTRACT_TO_RDMA);
+}
+EXPORT_SYMBOL(extract_iter_to_rdma);
+
+/**
+ * iov_iter_flush_dcache - Flush the dcache extracted into an iterator
+ * @iter: The destination iterator
+ * @cleanup: The cleanup record produced by extract_iter_to_iter()
+ *
+ * Use the information stored in an extraction cleanup record to flush the
+ * cache.
+ */
+void iov_iter_flush_dcache(struct iov_iter *iter,
+			   struct iov_iter_cleanup *cleanup)
+{
+	int i;
+
+	switch (cleanup->type) {
+	case ITER_BVEC:
+		for (i = 0; i < cleanup->nr_segs; i++)
+			flush_dcache_page(cleanup->bv[i].bv_page);
+		break;
+	case ITER_KVEC:
+		BUG(); // TODO: Make this work.  Using bv is wrong.
+		//for (i = 0; i < cleanup->nr_segs; i++)
+		//	flush_dcache_page(cleanup->bv[i].bv_page);
+		break;
+	case ITER_XARRAY: {
+		struct page *page;
+		loff_t pos = iter->xarray_start + iter->iov_offset;
+		pgoff_t index = pos >> PAGE_SHIFT;
+		unsigned int offset = pos & ~PAGE_MASK;
+		int nr_pages = DIV_ROUND_UP(offset + iov_iter_count(iter), PAGE_SIZE);
+
+		XA_STATE(xas, iter->xarray, index);
+
+		rcu_read_lock();
+		for (page = xas_load(&xas); page; page = xas_next(&xas)) {
+			if (xas_retry(&xas, page))
+				continue;
+			if (unlikely(page != xas_reload(&xas))) {
+				xas_reset(&xas);
+				continue;
+			}
+
+			flush_dcache_page(find_subpage(page, xas.xa_index));
+			if (nr_pages <= 0)
+				break;
+		}
+		rcu_read_unlock();
+		break;
+	}
+	default:
+		BUG();
+	}
+}
+EXPORT_SYMBOL(iov_iter_flush_dcache);
+
+/**
+ * iov_iter_clean_up - Clean up segment list and unpin pages
+ * @cleanup: The cleanup information from extract_iter_to_iter()
+ */
+void iov_iter_clean_up(struct iov_iter_cleanup *cleanup)
+{
+	unsigned int i;
+
+	if (!cleanup->bv)
+		return;
+	switch (cleanup->type) {
+	case ITER_BVEC:
+		if (cleanup->pages_pinned) {
+			for (i = 0; i < cleanup->nr_segs; i++)
+				if (cleanup->bv[i].bv_page)
+					put_page(cleanup->bv[i].bv_page);
+		}
+		kvfree(cleanup->bv);
+		cleanup->bv = NULL;
+		break;
+	case ITER_KVEC:
+		kvfree(cleanup->kv);
+		cleanup->kv = NULL;
+		break;
+	default:
+		break;
+	}
+}


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
  2022-09-09 23:18 [RFC][PATCH] iov_iter: Add extraction functions David Howells
@ 2022-09-10 12:16 ` kernel test robot
  2022-09-24  2:22 ` Al Viro
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2022-09-10 12:16 UTC (permalink / raw)
  To: David Howells; +Cc: llvm, kbuild-all

Hi David,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on linus/master]
[also build test WARNING on v6.0-rc4 next-20220909]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/David-Howells/iov_iter-Add-extraction-functions/20220910-072102
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ce888220d5c7a805e0e155302a318d5d23e62950
config: s390-randconfig-r044-20220907 (https://download.01.org/0day-ci/archive/20220910/202209102009.ie6X2mlj-lkp@intel.com/config)
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 1546df49f5a6d09df78f569e4137ddb365a3e827)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install s390 cross compiling tool for clang build
        # apt-get install binutils-s390x-linux-gnu
        # https://github.com/intel-lab-lkp/linux/commit/a8df8a897880379087a0a9fc4f6fc1391e352217
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review David-Howells/iov_iter-Add-extraction-functions/20220910-072102
        git checkout a8df8a897880379087a0a9fc4f6fc1391e352217
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from lib/iov_iter_extract.c:16:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/s390/include/asm/io.h:75:
   include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __raw_readb(PCI_IOBASE + addr);
                             ~~~~~~~~~~ ^
   include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
                                                           ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/big_endian.h:37:59: note: expanded from macro '__le16_to_cpu'
   #define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x))
                                                             ^
   include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16'
   #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x))
                                                        ^
   In file included from lib/iov_iter_extract.c:16:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/s390/include/asm/io.h:75:
   include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
                                                           ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/big_endian.h:35:59: note: expanded from macro '__le32_to_cpu'
   #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x))
                                                             ^
   include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32'
   #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x))
                                                        ^
   In file included from lib/iov_iter_extract.c:16:
   In file included from include/linux/scatterlist.h:9:
   In file included from arch/s390/include/asm/io.h:75:
   include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writeb(value, PCI_IOBASE + addr);
                               ~~~~~~~~~~ ^
   include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
                                                         ~~~~~~~~~~ ^
   include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
                                                         ~~~~~~~~~~ ^
   include/asm-generic/io.h:692:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           readsb(PCI_IOBASE + addr, buffer, count);
                  ~~~~~~~~~~ ^
   include/asm-generic/io.h:700:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           readsw(PCI_IOBASE + addr, buffer, count);
                  ~~~~~~~~~~ ^
   include/asm-generic/io.h:708:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           readsl(PCI_IOBASE + addr, buffer, count);
                  ~~~~~~~~~~ ^
   include/asm-generic/io.h:717:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           writesb(PCI_IOBASE + addr, buffer, count);
                   ~~~~~~~~~~ ^
   include/asm-generic/io.h:726:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           writesw(PCI_IOBASE + addr, buffer, count);
                   ~~~~~~~~~~ ^
   include/asm-generic/io.h:735:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           writesl(PCI_IOBASE + addr, buffer, count);
                   ~~~~~~~~~~ ^
>> lib/iov_iter_extract.c:348:3: warning: variable 'ret' is uninitialized when used here [-Wuninitialized]
                   ret += len;
                   ^~~
   lib/iov_iter_extract.c:329:13: note: initialize the variable 'ret' to silence this warning
           ssize_t ret;
                      ^
                       = 0
   13 warnings generated.


vim +/ret +348 lib/iov_iter_extract.c

   314	
   315	/*
   316	 * Extract the pages from an XARRAY-class iterator and add them to the
   317	 * destination buffer.  The pages are not pinned.
   318	 */
   319	static ssize_t iov_iter_extract_xarray(struct iov_iter *iter,
   320					       void *array, unsigned int array_max,
   321					       ssize_t maxsize,
   322					       enum iter_extract_dest dest)
   323	{
   324		struct xarray *xa = iter->xarray;
   325		struct folio *folio;
   326		unsigned int ix;
   327		loff_t start = iter->xarray_start + iter->iov_offset;
   328		pgoff_t index = start / PAGE_SIZE;
   329		ssize_t ret;
   330		size_t offset, len;
   331		XA_STATE(xas, xa, index);
   332	
   333		rcu_read_lock();
   334		xas_for_each(&xas, folio, ULONG_MAX) {
   335			if (xas_retry(&xas, folio))
   336				continue;
   337			if (WARN_ON(xa_is_value(folio)))
   338				break;
   339			if (WARN_ON(folio_test_hugetlb(folio)))
   340				break;
   341	
   342			offset = offset_in_folio(folio, start);
   343			len = min_t(size_t, maxsize, folio_size(folio) - offset);
   344	
   345			ix = extract_contig_pages(array, folio_page(folio, 0),
   346						  offset, len, dest);
   347			maxsize -= len;
 > 348			ret += len;
   349			if (ix >= array_max) {
   350				WARN_ON_ONCE(ix > array_max);
   351				break;
   352			}
   353	
   354			if (maxsize <= 0)
   355				break;
   356		}
   357	
   358		rcu_read_unlock();
   359		terminate_array(array, dest);
   360		return ret;
   361	}
   362	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
  2022-09-09 23:18 [RFC][PATCH] iov_iter: Add extraction functions David Howells
@ 2022-09-13  9:21 ` Dan Carpenter
  2022-09-24  2:22 ` Al Viro
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2022-09-11  8:49 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 4875 bytes --]

BCC: lkp(a)intel.com
CC: kbuild-all(a)lists.01.org
In-Reply-To: <3750754.1662765490@warthog.procyon.org.uk>
References: <3750754.1662765490@warthog.procyon.org.uk>
TO: David Howells <dhowells@redhat.com>

Hi David,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on linus/master]
[also build test WARNING on v6.0-rc4 next-20220909]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/David-Howells/iov_iter-Add-extraction-functions/20220910-072102
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ce888220d5c7a805e0e155302a318d5d23e62950
:::::: branch date: 33 hours ago
:::::: commit date: 33 hours ago
config: x86_64-randconfig-m001 (https://download.01.org/0day-ci/archive/20220911/202209111623.oK8xGunY-lkp(a)intel.com/config)
compiler: gcc-11 (Debian 11.3.0-5) 11.3.0

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
lib/iov_iter_extract.c:360 iov_iter_extract_xarray() error: uninitialized symbol 'ret'.

vim +/ret +360 lib/iov_iter_extract.c

a8df8a89788037 David Howells 2022-09-10  314  
a8df8a89788037 David Howells 2022-09-10  315  /*
a8df8a89788037 David Howells 2022-09-10  316   * Extract the pages from an XARRAY-class iterator and add them to the
a8df8a89788037 David Howells 2022-09-10  317   * destination buffer.  The pages are not pinned.
a8df8a89788037 David Howells 2022-09-10  318   */
a8df8a89788037 David Howells 2022-09-10  319  static ssize_t iov_iter_extract_xarray(struct iov_iter *iter,
a8df8a89788037 David Howells 2022-09-10  320  				       void *array, unsigned int array_max,
a8df8a89788037 David Howells 2022-09-10  321  				       ssize_t maxsize,
a8df8a89788037 David Howells 2022-09-10  322  				       enum iter_extract_dest dest)
a8df8a89788037 David Howells 2022-09-10  323  {
a8df8a89788037 David Howells 2022-09-10  324  	struct xarray *xa = iter->xarray;
a8df8a89788037 David Howells 2022-09-10  325  	struct folio *folio;
a8df8a89788037 David Howells 2022-09-10  326  	unsigned int ix;
a8df8a89788037 David Howells 2022-09-10  327  	loff_t start = iter->xarray_start + iter->iov_offset;
a8df8a89788037 David Howells 2022-09-10  328  	pgoff_t index = start / PAGE_SIZE;
a8df8a89788037 David Howells 2022-09-10  329  	ssize_t ret;
a8df8a89788037 David Howells 2022-09-10  330  	size_t offset, len;
a8df8a89788037 David Howells 2022-09-10  331  	XA_STATE(xas, xa, index);
a8df8a89788037 David Howells 2022-09-10  332  
a8df8a89788037 David Howells 2022-09-10  333  	rcu_read_lock();
a8df8a89788037 David Howells 2022-09-10  334  	xas_for_each(&xas, folio, ULONG_MAX) {
a8df8a89788037 David Howells 2022-09-10  335  		if (xas_retry(&xas, folio))
a8df8a89788037 David Howells 2022-09-10  336  			continue;
a8df8a89788037 David Howells 2022-09-10  337  		if (WARN_ON(xa_is_value(folio)))
a8df8a89788037 David Howells 2022-09-10  338  			break;
a8df8a89788037 David Howells 2022-09-10  339  		if (WARN_ON(folio_test_hugetlb(folio)))
a8df8a89788037 David Howells 2022-09-10  340  			break;
a8df8a89788037 David Howells 2022-09-10  341  
a8df8a89788037 David Howells 2022-09-10  342  		offset = offset_in_folio(folio, start);
a8df8a89788037 David Howells 2022-09-10  343  		len = min_t(size_t, maxsize, folio_size(folio) - offset);
a8df8a89788037 David Howells 2022-09-10  344  
a8df8a89788037 David Howells 2022-09-10  345  		ix = extract_contig_pages(array, folio_page(folio, 0),
a8df8a89788037 David Howells 2022-09-10  346  					  offset, len, dest);
a8df8a89788037 David Howells 2022-09-10  347  		maxsize -= len;
a8df8a89788037 David Howells 2022-09-10  348  		ret += len;
a8df8a89788037 David Howells 2022-09-10  349  		if (ix >= array_max) {
a8df8a89788037 David Howells 2022-09-10  350  			WARN_ON_ONCE(ix > array_max);
a8df8a89788037 David Howells 2022-09-10  351  			break;
a8df8a89788037 David Howells 2022-09-10  352  		}
a8df8a89788037 David Howells 2022-09-10  353  
a8df8a89788037 David Howells 2022-09-10  354  		if (maxsize <= 0)
a8df8a89788037 David Howells 2022-09-10  355  			break;
a8df8a89788037 David Howells 2022-09-10  356  	}
a8df8a89788037 David Howells 2022-09-10  357  
a8df8a89788037 David Howells 2022-09-10  358  	rcu_read_unlock();
a8df8a89788037 David Howells 2022-09-10  359  	terminate_array(array, dest);
a8df8a89788037 David Howells 2022-09-10 @360  	return ret;
a8df8a89788037 David Howells 2022-09-10  361  }
a8df8a89788037 David Howells 2022-09-10  362  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
@ 2022-09-13  9:21 ` Dan Carpenter
  0 siblings, 0 replies; 10+ messages in thread
From: Dan Carpenter @ 2022-09-13  9:21 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 4032 bytes --]

Hi David,

https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/David-Howells/iov_iter-Add-extraction-functions/20220910-072102
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ce888220d5c7a805e0e155302a318d5d23e62950
config: x86_64-randconfig-m001 (https://download.01.org/0day-ci/archive/20220911/202209111623.oK8xGunY-lkp(a)intel.com/config)
compiler: gcc-11 (Debian 11.3.0-5) 11.3.0

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
lib/iov_iter_extract.c:360 iov_iter_extract_xarray() error: uninitialized symbol 'ret'.

vim +/ret +360 lib/iov_iter_extract.c

a8df8a89788037 David Howells 2022-09-10  319  static ssize_t iov_iter_extract_xarray(struct iov_iter *iter,
a8df8a89788037 David Howells 2022-09-10  320  				       void *array, unsigned int array_max,
a8df8a89788037 David Howells 2022-09-10  321  				       ssize_t maxsize,
a8df8a89788037 David Howells 2022-09-10  322  				       enum iter_extract_dest dest)
a8df8a89788037 David Howells 2022-09-10  323  {
a8df8a89788037 David Howells 2022-09-10  324  	struct xarray *xa = iter->xarray;
a8df8a89788037 David Howells 2022-09-10  325  	struct folio *folio;
a8df8a89788037 David Howells 2022-09-10  326  	unsigned int ix;
a8df8a89788037 David Howells 2022-09-10  327  	loff_t start = iter->xarray_start + iter->iov_offset;
a8df8a89788037 David Howells 2022-09-10  328  	pgoff_t index = start / PAGE_SIZE;
a8df8a89788037 David Howells 2022-09-10  329  	ssize_t ret;
a8df8a89788037 David Howells 2022-09-10  330  	size_t offset, len;
a8df8a89788037 David Howells 2022-09-10  331  	XA_STATE(xas, xa, index);
a8df8a89788037 David Howells 2022-09-10  332  
a8df8a89788037 David Howells 2022-09-10  333  	rcu_read_lock();
a8df8a89788037 David Howells 2022-09-10  334  	xas_for_each(&xas, folio, ULONG_MAX) {
a8df8a89788037 David Howells 2022-09-10  335  		if (xas_retry(&xas, folio))
a8df8a89788037 David Howells 2022-09-10  336  			continue;
a8df8a89788037 David Howells 2022-09-10  337  		if (WARN_ON(xa_is_value(folio)))
a8df8a89788037 David Howells 2022-09-10  338  			break;
a8df8a89788037 David Howells 2022-09-10  339  		if (WARN_ON(folio_test_hugetlb(folio)))
a8df8a89788037 David Howells 2022-09-10  340  			break;

Can we hit these breaks on the first iteration through the loop?  Or
hit continue every time, I guess...

a8df8a89788037 David Howells 2022-09-10  341  
a8df8a89788037 David Howells 2022-09-10  342  		offset = offset_in_folio(folio, start);
a8df8a89788037 David Howells 2022-09-10  343  		len = min_t(size_t, maxsize, folio_size(folio) - offset);
a8df8a89788037 David Howells 2022-09-10  344  
a8df8a89788037 David Howells 2022-09-10  345  		ix = extract_contig_pages(array, folio_page(folio, 0),
a8df8a89788037 David Howells 2022-09-10  346  					  offset, len, dest);
a8df8a89788037 David Howells 2022-09-10  347  		maxsize -= len;
a8df8a89788037 David Howells 2022-09-10  348  		ret += len;

ret is never initialized.

a8df8a89788037 David Howells 2022-09-10  349  		if (ix >= array_max) {
a8df8a89788037 David Howells 2022-09-10  350  			WARN_ON_ONCE(ix > array_max);
a8df8a89788037 David Howells 2022-09-10  351  			break;
a8df8a89788037 David Howells 2022-09-10  352  		}
a8df8a89788037 David Howells 2022-09-10  353  
a8df8a89788037 David Howells 2022-09-10  354  		if (maxsize <= 0)
a8df8a89788037 David Howells 2022-09-10  355  			break;
a8df8a89788037 David Howells 2022-09-10  356  	}
a8df8a89788037 David Howells 2022-09-10  357  
a8df8a89788037 David Howells 2022-09-10  358  	rcu_read_unlock();
a8df8a89788037 David Howells 2022-09-10  359  	terminate_array(array, dest);
a8df8a89788037 David Howells 2022-09-10 @360  	return ret;
a8df8a89788037 David Howells 2022-09-10  361  }

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
  2022-09-09 23:18 [RFC][PATCH] iov_iter: Add extraction functions David Howells
  2022-09-10 12:16 ` kernel test robot
@ 2022-09-24  2:22 ` Al Viro
  2022-10-14 12:22 ` David Howells
  2022-10-18 14:29 ` David Howells
  3 siblings, 0 replies; 10+ messages in thread
From: Al Viro @ 2022-09-24  2:22 UTC (permalink / raw)
  To: David Howells; +Cc: jlayton, smfrench, linux-fsdevel

On Sat, Sep 10, 2022 at 12:18:10AM +0100, David Howells wrote:
> Hi Al, Jeff,
> 
> Here's a replacement for the extract_iter_to_iter() patch I had previously.
> It's a WIP, some bits aren't fully implemented, though some bits I have tested
> and got to work, but if you could take a look and see if you're okay with the
> interface.
> 
> I think I've addressed most of Al's comments.  The page-pinning is conditional
> on certain types of iterator, and a number of the iterator types just extract
> to the same thing.  It should now handle kvec-class iterators that refer to
> vmalloc'd data.
> 
> I've also added extraction to scatterlist (which I'll need for doing various
> crypto things) and extraction to ib_sge which could be used in cifs/smb RDMA,
> bypassing the conversion-to-scatterlist step.
> 
> As mentioned, there are bits that aren't fully implemented, let alone tested.

IDGI.  Essentially, you are passing a callback disguised as enum, only to lose
any type safety.  How is it better than "iov_iter_get_pages2() into a fixed-sized
array and handle the result" done in a loop?  No need to advance it (iov_iter_get_page2()
auto-advances), *way* fewer conditional branches and no need to share anything
between the 3 functions you are after...

> +ssize_t extract_iter_to_sg(struct iov_iter *iter, size_t len,
> +			   struct sg_table *sgtable, bool *pages_pinned)

Your *pages_pinned is user_backed_iter(iter), isn't it?

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
  2022-09-09 23:18 [RFC][PATCH] iov_iter: Add extraction functions David Howells
  2022-09-10 12:16 ` kernel test robot
  2022-09-24  2:22 ` Al Viro
@ 2022-10-14 12:22 ` David Howells
  2022-10-18 14:29 ` David Howells
  3 siblings, 0 replies; 10+ messages in thread
From: David Howells @ 2022-10-14 12:22 UTC (permalink / raw)
  To: Al Viro; +Cc: dhowells, jlayton, smfrench, linux-fsdevel

Al Viro <viro@zeniv.linux.org.uk> wrote:

> How is it better than "iov_iter_get_pages2() into a fixed-sized
> array and handle the result" done in a loop?

I did that first - and you objected on the basis that I shouldn't be taking
page refs if it's not necessary, and under some circumstances some of the
pages pointed to by the iterator might not be something that I should attempt
to take a ref on.

David


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
  2022-09-09 23:18 [RFC][PATCH] iov_iter: Add extraction functions David Howells
                   ` (2 preceding siblings ...)
  2022-10-14 12:22 ` David Howells
@ 2022-10-18 14:29 ` David Howells
  2022-10-18 14:48   ` Christoph Hellwig
  3 siblings, 1 reply; 10+ messages in thread
From: David Howells @ 2022-10-18 14:29 UTC (permalink / raw)
  To: Al Viro; +Cc: dhowells, jlayton, smfrench, hch, willy, linux-fsdevel

Al Viro <viro@zeniv.linux.org.uk> wrote:

> IDGI.  Essentially, you are passing a callback disguised as enum, only to
> lose any type safety.

Granted, but this is how struct iov_iter works.  I'm keeping the enum inside
the internal functions where it can't be got at by external code.

Now, I could just copy the code three times, once for iter=>bvec, once for
iter=>sg and once for iter=>rdma.  I can also grant that iter=>bvec is really
only needed for UBUF/IOVEC-class iterators; I think I can make the assumption
that kernel-supplied buffers are good for the lifetime of the operation.

> How is it better than "iov_iter_get_pages2() into a
> fixed-sized array and handle the result" done in a loop?

Note that iov_iter_get_pages2() doesn't handle KVEC-class iterators, which
this code does - for kmalloc'd, vmalloc'd and vmap'd memory and for global and
stack variables.  What I've written gets the physical addresses but
doesn't/can't pin it (which probably means I can't just move my code into
iov_iter_get_pages2()).

Further, my code also treats multipage folios as single units which
iov_iter_get_pages2() also doesn't - at least from XARRAY-class iterators.

The UBUF-/IOVEC-extraction code doesn't handle multipage folios because
get_user_pages_fast() doesn't - though perhaps it will need to at some point.

David


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
  2022-10-18 14:29 ` David Howells
@ 2022-10-18 14:48   ` Christoph Hellwig
  0 siblings, 0 replies; 10+ messages in thread
From: Christoph Hellwig @ 2022-10-18 14:48 UTC (permalink / raw)
  To: David Howells; +Cc: Al Viro, jlayton, smfrench, hch, willy, linux-fsdevel

On Tue, Oct 18, 2022 at 03:29:42PM +0100, David Howells wrote:
> Note that iov_iter_get_pages2() doesn't handle KVEC-class iterators, which
> this code does - for kmalloc'd, vmalloc'd and vmap'd memory and for global and
> stack variables.  What I've written gets the physical addresses but
> doesn't/can't pin it (which probably means I can't just move my code into
> iov_iter_get_pages2()).

Please look at the long discussion on Ira's patches for
iov_iter_pin_pages where we went through this over and over again.
We need to handle all of these in the common helper.

> Further, my code also treats multipage folios as single units which
> iov_iter_get_pages2() also doesn't - at least from XARRAY-class iterators.
> 
> The UBUF-/IOVEC-extraction code doesn't handle multipage folios because
> get_user_pages_fast() doesn't - though perhaps it will need to at some point.

Yes, we need to be smarter about folios.  But that is nothing magic
about network file systems.  I have old patches that added a (barely
working) variant of get_user_pages_fast that exported bio_vecs and I
think willy planned to look into a folio based version of get/pin
user pages.  But one thing at a time.  I think the work from Ira to
switch to proper pinning and sort out the weirdnesses for non-users
buffer types is the first priority.  After that proper folio or large
contiguous range support is another item.  But none of that is helped
by parallel infrastructure.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
@ 2022-09-12 14:57 kernel test robot
  0 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2022-09-12 14:57 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 24266 bytes --]

:::::: 
:::::: Manual check reason: "low confidence static check warning: lib/iov_iter_extract.c:348:7: warning: The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage [clang-analyzer-core.uninitialized.Assign]"
:::::: 

BCC: lkp(a)intel.com
CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
In-Reply-To: <3750754.1662765490@warthog.procyon.org.uk>
References: <3750754.1662765490@warthog.procyon.org.uk>
TO: David Howells <dhowells@redhat.com>

Hi David,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on linus/master]
[also build test WARNING on v6.0-rc5 next-20220912]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/David-Howells/iov_iter-Add-extraction-functions/20220910-072102
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ce888220d5c7a805e0e155302a318d5d23e62950
:::::: branch date: 3 days ago
:::::: commit date: 3 days ago
config: s390-randconfig-c005-20220911
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 1546df49f5a6d09df78f569e4137ddb365a3e827)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install s390 cross compiling tool for clang build
        # apt-get install binutils-s390x-linux-gnu
        # https://github.com/intel-lab-lkp/linux/commit/a8df8a897880379087a0a9fc4f6fc1391e352217
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review David-Howells/iov_iter-Add-extraction-functions/20220910-072102
        git checkout a8df8a897880379087a0a9fc4f6fc1391e352217
        # save the config file
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=s390 clang-analyzer 

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

clang_analyzer warnings: (new ones prefixed by >>)
                                   ^
   arch/s390/include/asm/current.h:17:45: note: expanded from macro 'current'
   #define current ((struct task_struct *const)S390_lowcore.current_task)
                                               ^
   arch/s390/include/asm/lowcore.h:213:22: note: expanded from macro 'S390_lowcore'
   #define S390_lowcore (*((struct lowcore *) 0))
                        ^
   drivers/mtd/lpddr/lpddr_cmds.c:758:9: note: Calling 'do_xxlock'
           return do_xxlock(mtd, ofs, len, DO_XXLOCK_UNLOCK);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/mtd/lpddr/lpddr_cmds.c:725:8: note: Calling 'get_chip'
           ret = get_chip(map, chip, FL_LOCKING);
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/mtd/lpddr/lpddr_cmds.c:201:26: note: Dereference of null pointer
           DECLARE_WAITQUEUE(wait, current);
                                   ^
   arch/s390/include/asm/current.h:17:45: note: expanded from macro 'current'
   #define current ((struct task_struct *const)S390_lowcore.current_task)
                                               ^
   arch/s390/include/asm/lowcore.h:213:22: note: expanded from macro 'S390_lowcore'
   #define S390_lowcore (*((struct lowcore *) 0))
                        ^
   include/linux/wait.h:55:63: note: expanded from macro 'DECLARE_WAITQUEUE'
           struct wait_queue_entry name = __WAITQUEUE_INITIALIZER(name, tsk)
                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
   include/linux/wait.h:50:13: note: expanded from macro '__WAITQUEUE_INITIALIZER'
           .private        = tsk,                                                  \
                             ^~~
   drivers/mtd/lpddr/lpddr_cmds.c:298:26: warning: Dereference of null pointer [clang-analyzer-core.NullDereference]
           DECLARE_WAITQUEUE(wait, current);
                                   ^
   arch/s390/include/asm/current.h:17:45: note: expanded from macro 'current'
   #define current ((struct task_struct *const)S390_lowcore.current_task)
                                               ^
   arch/s390/include/asm/lowcore.h:213:22: note: expanded from macro 'S390_lowcore'
   #define S390_lowcore (*((struct lowcore *) 0))
                        ^
   include/linux/wait.h:55:63: note: expanded from macro 'DECLARE_WAITQUEUE'
           struct wait_queue_entry name = __WAITQUEUE_INITIALIZER(name, tsk)
                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
   include/linux/wait.h:50:13: note: expanded from macro '__WAITQUEUE_INITIALIZER'
           .private        = tsk,                                                  \
                             ^~~
   drivers/mtd/lpddr/lpddr_cmds.c:298:26: note: Dereference of null pointer
           DECLARE_WAITQUEUE(wait, current);
                                   ^
   arch/s390/include/asm/current.h:17:45: note: expanded from macro 'current'
   #define current ((struct task_struct *const)S390_lowcore.current_task)
                                               ^
   arch/s390/include/asm/lowcore.h:213:22: note: expanded from macro 'S390_lowcore'
   #define S390_lowcore (*((struct lowcore *) 0))
                        ^
   include/linux/wait.h:55:63: note: expanded from macro 'DECLARE_WAITQUEUE'
           struct wait_queue_entry name = __WAITQUEUE_INITIALIZER(name, tsk)
                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
   include/linux/wait.h:50:13: note: expanded from macro '__WAITQUEUE_INITIALIZER'
           .private        = tsk,                                                  \
                             ^~~
   Suppressed 21 warnings (8 in non-user code, 13 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   21 warnings generated.
   include/linux/uaccess.h:179:2: warning: Dereference of null pointer [clang-analyzer-core.NullDereference]
           current->pagefault_disabled++;
           ^
   arch/s390/include/asm/current.h:17:45: note: expanded from macro 'current'
   #define current ((struct task_struct *const)S390_lowcore.current_task)
                                               ^
   arch/s390/include/asm/lowcore.h:213:22: note: expanded from macro 'S390_lowcore'
   #define S390_lowcore (*((struct lowcore *) 0))
                        ^
   lib/iov_iter.c:807:16: note: Calling 'kmap_atomic'
           char *kaddr = kmap_atomic(page), *p = kaddr + offset;
                         ^~~~~~~~~~~~~~~~~
   include/linux/highmem-internal.h:209:2: note: Taking false branch
           if (IS_ENABLED(CONFIG_PREEMPT_RT))
           ^
   include/linux/highmem-internal.h:212:3: note: Loop condition is false.  Exiting loop
                   preempt_disable();
                   ^
   include/linux/preempt.h:201:27: note: expanded from macro 'preempt_disable'
   #define preempt_disable() \
                             ^
   include/linux/highmem-internal.h:213:2: note: Calling 'pagefault_disable'
           pagefault_disable();
           ^~~~~~~~~~~~~~~~~~~
   include/linux/uaccess.h:196:2: note: Calling 'pagefault_disabled_inc'
           pagefault_disabled_inc();
           ^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/uaccess.h:179:2: note: Dereference of null pointer
           current->pagefault_disabled++;
           ^
   arch/s390/include/asm/current.h:17:45: note: expanded from macro 'current'
   #define current ((struct task_struct *const)S390_lowcore.current_task)
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~
   arch/s390/include/asm/lowcore.h:213:22: note: expanded from macro 'S390_lowcore'
   #define S390_lowcore (*((struct lowcore *) 0))
                        ^
   Suppressed 20 warnings (8 in non-user code, 12 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   31 warnings generated.
>> lib/iov_iter_extract.c:348:7: warning: The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage [clang-analyzer-core.uninitialized.Assign]
                   ret += len;
                       ^
   lib/iov_iter_extract.c:485:2: note: Control jumps to 'case ITER_XARRAY:'  at line 496
           switch (iov_iter_type(iter)) {
           ^
   lib/iov_iter_extract.c:498:3: note:  Execution continues on line 501
                   break;
                   ^
   lib/iov_iter_extract.c:504:6: note: Assuming 'sg' is non-null
           if (!sg)
               ^~~
   lib/iov_iter_extract.c:504:2: note: Taking false branch
           if (!sg)
           ^
   lib/iov_iter_extract.c:511:8: note: Calling 'iov_iter_extract_pages'
           ret = iov_iter_extract_pages(iter, sgtable, sg_max, len,
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/iov_iter_extract.c:368:6: note: Assuming the condition is true
           if (likely(user_backed_iter(iter)))
               ^
   include/linux/compiler.h:77:38: note: expanded from macro 'likely'
   # define likely(x)      __builtin_expect(!!(x), 1)
                                             ^~~~
   lib/iov_iter_extract.c:368:2: note: Taking false branch
           if (likely(user_backed_iter(iter)))
           ^
   lib/iov_iter_extract.c:371:2: note: Taking false branch
           if (iov_iter_is_bvec(iter))
           ^
   lib/iov_iter_extract.c:374:2: note: Taking false branch
           if (iov_iter_is_kvec(iter))
           ^
   lib/iov_iter_extract.c:377:2: note: Taking true branch
           if (iov_iter_is_xarray(iter))
           ^
   lib/iov_iter_extract.c:378:10: note: Calling 'iov_iter_extract_xarray'
                   return iov_iter_extract_xarray(iter, array, array_max, maxsize,
                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/iov_iter_extract.c:329:2: note: 'ret' declared without an initial value
           ssize_t ret;
           ^~~~~~~~~~~
   lib/iov_iter_extract.c:334:2: note: Loop condition is true.  Entering loop body
           xas_for_each(&xas, folio, ULONG_MAX) {
           ^
   include/linux/xarray.h:1770:2: note: expanded from macro 'xas_for_each'
           for (entry = xas_find(xas, max); entry; \
           ^
   lib/iov_iter_extract.c:335:3: note: Taking true branch
                   if (xas_retry(&xas, folio))
                   ^
   lib/iov_iter_extract.c:336:4: note:  Execution continues on line 334
                           continue;
                           ^
   lib/iov_iter_extract.c:334:2: note: Loop condition is true.  Entering loop body
           xas_for_each(&xas, folio, ULONG_MAX) {
           ^
   include/linux/xarray.h:1770:2: note: expanded from macro 'xas_for_each'
           for (entry = xas_find(xas, max); entry; \
           ^
   lib/iov_iter_extract.c:335:3: note: Taking false branch
                   if (xas_retry(&xas, folio))
                   ^
   lib/iov_iter_extract.c:337:7: note: Taking false branch
                   if (WARN_ON(xa_is_value(folio)))
                       ^
   arch/s390/include/asm/bug.h:55:2: note: expanded from macro 'WARN_ON'
           if (__builtin_constant_p(__ret_warn_on)) {      \
           ^
   lib/iov_iter_extract.c:337:7: note: Assuming '__ret_warn_on' is 0
                   if (WARN_ON(xa_is_value(folio)))
                       ^
   arch/s390/include/asm/bug.h:59:7: note: expanded from macro 'WARN_ON'
                   if (unlikely(__ret_warn_on))            \
                       ^~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:78:40: note: expanded from macro 'unlikely'
   # define unlikely(x)    __builtin_expect(!!(x), 0)
                                             ^~~~
   lib/iov_iter_extract.c:337:7: note: Taking false branch
                   if (WARN_ON(xa_is_value(folio)))
                       ^
   arch/s390/include/asm/bug.h:59:3: note: expanded from macro 'WARN_ON'
                   if (unlikely(__ret_warn_on))            \
                   ^
   lib/iov_iter_extract.c:337:3: note: Taking false branch
                   if (WARN_ON(xa_is_value(folio)))
                   ^
   lib/iov_iter_extract.c:339:7: note: Taking false branch
                   if (WARN_ON(folio_test_hugetlb(folio)))
                       ^
   arch/s390/include/asm/bug.h:55:2: note: expanded from macro 'WARN_ON'
           if (__builtin_constant_p(__ret_warn_on)) {      \
           ^
   lib/iov_iter_extract.c:339:7: note: Taking false branch
                   if (WARN_ON(folio_test_hugetlb(folio)))
                       ^
   arch/s390/include/asm/bug.h:59:3: note: expanded from macro 'WARN_ON'
                   if (unlikely(__ret_warn_on))            \
                   ^
   lib/iov_iter_extract.c:339:3: note: Taking false branch
                   if (WARN_ON(folio_test_hugetlb(folio)))
                   ^
   lib/iov_iter_extract.c:343:9: note: Assuming '__UNIQUE_ID___x503' is >= '__UNIQUE_ID___y504'
                   len = min_t(size_t, maxsize, folio_size(folio) - offset);
                         ^
   include/linux/minmax.h:104:27: note: expanded from macro 'min_t'
   #define min_t(type, x, y)       __careful_cmp((type)(x), (type)(y), <)
                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
                   __cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
                   __cmp(unique_x, unique_y, op); })
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
   #define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
                            ^~~~~~~~~~
   lib/iov_iter_extract.c:343:9: note: '?' condition is false
                   len = min_t(size_t, maxsize, folio_size(folio) - offset);
                         ^
   include/linux/minmax.h:104:27: note: expanded from macro 'min_t'
   #define min_t(type, x, y)       __careful_cmp((type)(x), (type)(y), <)
                                   ^
   include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
                   __cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
                   ^
   include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
                   __cmp(unique_x, unique_y, op); })
                   ^
   include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
   #define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
                            ^
   lib/iov_iter_extract.c:348:7: note: The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage
                   ret += len;
                   ~~~ ^
>> lib/iov_iter_extract.c:360:2: warning: Undefined or garbage value returned to caller [clang-analyzer-core.uninitialized.UndefReturn]
           return ret;
           ^
   lib/iov_iter_extract.c:485:2: note: Control jumps to 'case ITER_XARRAY:'  at line 496
           switch (iov_iter_type(iter)) {
           ^
   lib/iov_iter_extract.c:498:3: note:  Execution continues on line 501
                   break;
                   ^
   lib/iov_iter_extract.c:504:6: note: Assuming 'sg' is non-null
           if (!sg)
               ^~~
   lib/iov_iter_extract.c:504:2: note: Taking false branch
           if (!sg)
           ^
   lib/iov_iter_extract.c:511:8: note: Calling 'iov_iter_extract_pages'
           ret = iov_iter_extract_pages(iter, sgtable, sg_max, len,
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/iov_iter_extract.c:368:6: note: Assuming the condition is true
           if (likely(user_backed_iter(iter)))
               ^
   include/linux/compiler.h:77:38: note: expanded from macro 'likely'
   # define likely(x)      __builtin_expect(!!(x), 1)
                                             ^~~~
   lib/iov_iter_extract.c:368:2: note: Taking false branch
           if (likely(user_backed_iter(iter)))
           ^
   lib/iov_iter_extract.c:371:2: note: Taking false branch
           if (iov_iter_is_bvec(iter))
           ^
   lib/iov_iter_extract.c:374:2: note: Taking false branch
           if (iov_iter_is_kvec(iter))
           ^
   lib/iov_iter_extract.c:377:2: note: Taking true branch
           if (iov_iter_is_xarray(iter))
           ^
   lib/iov_iter_extract.c:378:10: note: Calling 'iov_iter_extract_xarray'
                   return iov_iter_extract_xarray(iter, array, array_max, maxsize,
                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   lib/iov_iter_extract.c:329:2: note: 'ret' declared without an initial value
           ssize_t ret;
           ^~~~~~~~~~~
   lib/iov_iter_extract.c:334:2: note: Loop condition is false. Execution continues on line 358
           xas_for_each(&xas, folio, ULONG_MAX) {
           ^
   include/linux/xarray.h:1770:2: note: expanded from macro 'xas_for_each'
           for (entry = xas_find(xas, max); entry; \
           ^
   lib/iov_iter_extract.c:360:2: note: Undefined or garbage value returned to caller
           return ret;
           ^      ~~~
   Suppressed 29 warnings (16 in non-user code, 13 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   8 warnings generated.
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   8 warnings generated.
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   arch/s390/include/asm/pgtable.h:1645:7: warning: Dereference of null pointer [clang-analyzer-core.NullDereference]
           if (!MACHINE_HAS_NX)
                ^
   arch/s390/include/asm/setup.h:94:26: note: expanded from macro 'MACHINE_HAS_NX'
   #define MACHINE_HAS_NX          (S390_lowcore.machine_flags & MACHINE_FLAG_NX)
                                    ^
   arch/s390/include/asm/lowcore.h:213:22: note: expanded from macro 'S390_lowcore'
   #define S390_lowcore (*((struct lowcore *) 0))
                        ^
   mm/rmap.c:1083:2: note: Taking false branch
           if (invalid_mkclean_vma(vma, NULL))
           ^
   mm/rmap.c:1087:16: note: Assuming the condition is false
           VM_BUG_ON_VMA(pvmw.address == -EFAULT, vma);
                         ^
   include/linux/mmdebug.h:34:16: note: expanded from macro 'VM_BUG_ON_VMA'
                   if (unlikely(cond)) {                                   \
                       ~~~~~~~~~^~~~~
   include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
   # define unlikely(x)    __builtin_expect(!!(x), 0)
                                               ^
   mm/rmap.c:1087:2: note: Taking false branch
           VM_BUG_ON_VMA(pvmw.address == -EFAULT, vma);
           ^
   include/linux/mmdebug.h:34:3: note: expanded from macro 'VM_BUG_ON_VMA'
                   if (unlikely(cond)) {                                   \
                   ^
   mm/rmap.c:1087:2: note: Loop condition is false.  Exiting loop
           VM_BUG_ON_VMA(pvmw.address == -EFAULT, vma);
           ^
   include/linux/mmdebug.h:33:2: note: expanded from macro 'VM_BUG_ON_VMA'
           do {                                                            \
           ^
   mm/rmap.c:1089:9: note: Calling 'page_vma_mkclean_one'
           return page_vma_mkclean_one(&pvmw);
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
   mm/rmap.c:962:2: note: Loop condition is true.  Entering loop body
           while (page_vma_mapped_walk(pvmw)) {
           ^
   mm/rmap.c:966:7: note: Assuming field 'pte' is null
                   if (pvmw->pte) {

vim +348 lib/iov_iter_extract.c

a8df8a89788037 David Howells 2022-09-10  314  
a8df8a89788037 David Howells 2022-09-10  315  /*
a8df8a89788037 David Howells 2022-09-10  316   * Extract the pages from an XARRAY-class iterator and add them to the
a8df8a89788037 David Howells 2022-09-10  317   * destination buffer.  The pages are not pinned.
a8df8a89788037 David Howells 2022-09-10  318   */
a8df8a89788037 David Howells 2022-09-10  319  static ssize_t iov_iter_extract_xarray(struct iov_iter *iter,
a8df8a89788037 David Howells 2022-09-10  320  				       void *array, unsigned int array_max,
a8df8a89788037 David Howells 2022-09-10  321  				       ssize_t maxsize,
a8df8a89788037 David Howells 2022-09-10  322  				       enum iter_extract_dest dest)
a8df8a89788037 David Howells 2022-09-10  323  {
a8df8a89788037 David Howells 2022-09-10  324  	struct xarray *xa = iter->xarray;
a8df8a89788037 David Howells 2022-09-10  325  	struct folio *folio;
a8df8a89788037 David Howells 2022-09-10  326  	unsigned int ix;
a8df8a89788037 David Howells 2022-09-10  327  	loff_t start = iter->xarray_start + iter->iov_offset;
a8df8a89788037 David Howells 2022-09-10  328  	pgoff_t index = start / PAGE_SIZE;
a8df8a89788037 David Howells 2022-09-10  329  	ssize_t ret;
a8df8a89788037 David Howells 2022-09-10  330  	size_t offset, len;
a8df8a89788037 David Howells 2022-09-10  331  	XA_STATE(xas, xa, index);
a8df8a89788037 David Howells 2022-09-10  332  
a8df8a89788037 David Howells 2022-09-10  333  	rcu_read_lock();
a8df8a89788037 David Howells 2022-09-10  334  	xas_for_each(&xas, folio, ULONG_MAX) {
a8df8a89788037 David Howells 2022-09-10  335  		if (xas_retry(&xas, folio))
a8df8a89788037 David Howells 2022-09-10  336  			continue;
a8df8a89788037 David Howells 2022-09-10  337  		if (WARN_ON(xa_is_value(folio)))
a8df8a89788037 David Howells 2022-09-10  338  			break;
a8df8a89788037 David Howells 2022-09-10  339  		if (WARN_ON(folio_test_hugetlb(folio)))
a8df8a89788037 David Howells 2022-09-10  340  			break;
a8df8a89788037 David Howells 2022-09-10  341  
a8df8a89788037 David Howells 2022-09-10  342  		offset = offset_in_folio(folio, start);
a8df8a89788037 David Howells 2022-09-10  343  		len = min_t(size_t, maxsize, folio_size(folio) - offset);
a8df8a89788037 David Howells 2022-09-10  344  
a8df8a89788037 David Howells 2022-09-10  345  		ix = extract_contig_pages(array, folio_page(folio, 0),
a8df8a89788037 David Howells 2022-09-10  346  					  offset, len, dest);
a8df8a89788037 David Howells 2022-09-10  347  		maxsize -= len;
a8df8a89788037 David Howells 2022-09-10 @348  		ret += len;
a8df8a89788037 David Howells 2022-09-10  349  		if (ix >= array_max) {
a8df8a89788037 David Howells 2022-09-10  350  			WARN_ON_ONCE(ix > array_max);
a8df8a89788037 David Howells 2022-09-10  351  			break;
a8df8a89788037 David Howells 2022-09-10  352  		}
a8df8a89788037 David Howells 2022-09-10  353  
a8df8a89788037 David Howells 2022-09-10  354  		if (maxsize <= 0)
a8df8a89788037 David Howells 2022-09-10  355  			break;
a8df8a89788037 David Howells 2022-09-10  356  	}
a8df8a89788037 David Howells 2022-09-10  357  
a8df8a89788037 David Howells 2022-09-10  358  	rcu_read_unlock();
a8df8a89788037 David Howells 2022-09-10  359  	terminate_array(array, dest);
a8df8a89788037 David Howells 2022-09-10 @360  	return ret;
a8df8a89788037 David Howells 2022-09-10  361  }
a8df8a89788037 David Howells 2022-09-10  362  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

[-- Attachment #2: config.ksh --]
[-- Type: text/plain, Size: 50884 bytes --]

#
# Automatically generated file; DO NOT EDIT.
# Linux/s390 6.0.0-rc4 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="clang version 16.0.0 (git://gitmirror/llvm_project 1546df49f5a6d09df78f569e4137ddb365a3e827)"
CONFIG_GCC_VERSION=0
CONFIG_CC_IS_CLANG=y
CONFIG_CLANG_VERSION=160000
CONFIG_AS_IS_LLVM=y
CONFIG_AS_VERSION=160000
CONFIG_LD_IS_BFD=y
CONFIG_LD_VERSION=23800
CONFIG_LLD_VERSION=0
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
CONFIG_PAHOLE_VERSION=123
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_TABLE_SORT=y
CONFIG_THREAD_INFO_IN_TASK=y

#
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
# CONFIG_WERROR is not set
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_BUILD_SALT=""
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_LZ4=y
CONFIG_HAVE_KERNEL_ZSTD=y
CONFIG_HAVE_KERNEL_UNCOMPRESSED=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not set
# CONFIG_KERNEL_ZSTD is not set
# CONFIG_KERNEL_UNCOMPRESSED is not set
CONFIG_DEFAULT_INIT=""
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SYSVIPC=y
CONFIG_WATCH_QUEUE=y
CONFIG_CROSS_MEMORY_ATTACH=y
# CONFIG_USELIB is not set
CONFIG_HAVE_ARCH_AUDITSYSCALL=y

#
# IRQ subsystem
#
CONFIG_GENERIC_IRQ_INJECTION=y
CONFIG_GENERIC_IRQ_CHIP=y
CONFIG_IRQ_DOMAIN=y
CONFIG_SPARSE_IRQ=y
CONFIG_GENERIC_IRQ_DEBUGFS=y
# end of IRQ subsystem

CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_CONTEXT_TRACKING=y
CONFIG_CONTEXT_TRACKING_IDLE=y

#
# Timers subsystem
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
CONFIG_NO_HZ_IDLE=y
# CONFIG_NO_HZ is not set
# CONFIG_HIGH_RES_TIMERS is not set
# end of Timers subsystem

CONFIG_HAVE_EBPF_JIT=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y

#
# BPF subsystem
#
# CONFIG_BPF_SYSCALL is not set
# end of BPF subsystem

CONFIG_PREEMPT_VOLUNTARY_BUILD=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
CONFIG_PREEMPT_COUNT=y

#
# CPU/Task time and stats accounting
#
CONFIG_VIRT_CPU_ACCOUNTING=y
CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_PSI=y
CONFIG_PSI_DEFAULT_DISABLED=y
# end of CPU/Task time and stats accounting

# CONFIG_CPU_ISOLATION is not set

#
# RCU Subsystem
#
CONFIG_TREE_RCU=y
CONFIG_RCU_EXPERT=y
CONFIG_SRCU=y
CONFIG_TREE_SRCU=y
CONFIG_TASKS_RCU_GENERIC=y
# CONFIG_FORCE_TASKS_RCU is not set
CONFIG_FORCE_TASKS_RUDE_RCU=y
CONFIG_TASKS_RUDE_RCU=y
CONFIG_FORCE_TASKS_TRACE_RCU=y
CONFIG_TASKS_TRACE_RCU=y
CONFIG_RCU_STALL_COMMON=y
CONFIG_RCU_NEED_SEGCBLIST=y
CONFIG_RCU_FANOUT=64
CONFIG_RCU_FANOUT_LEAF=16
CONFIG_RCU_NOCB_CPU=y
CONFIG_RCU_NOCB_CPU_DEFAULT_ALL=y
CONFIG_TASKS_TRACE_RCU_READ_MB=y
# end of RCU Subsystem

CONFIG_IKCONFIG=m
# CONFIG_IKCONFIG_PROC is not set
# CONFIG_IKHEADERS is not set
CONFIG_LOG_BUF_SHIFT=17
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
CONFIG_PRINTK_INDEX=y

#
# Scheduler features
#
# end of Scheduler features

CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
CONFIG_CC_HAS_INT128=y
CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough"
CONFIG_GCC12_NO_ARRAY_BOUNDS=y
CONFIG_CGROUPS=y
CONFIG_PAGE_COUNTER=y
# CONFIG_CGROUP_FAVOR_DYNMODS is not set
CONFIG_MEMCG=y
CONFIG_MEMCG_KMEM=y
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_CFS_BANDWIDTH=y
# CONFIG_RT_GROUP_SCHED is not set
# CONFIG_CGROUP_PIDS is not set
CONFIG_CGROUP_RDMA=y
# CONFIG_CGROUP_FREEZER is not set
# CONFIG_CPUSETS is not set
# CONFIG_CGROUP_DEVICE is not set
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
# CONFIG_CGROUP_MISC is not set
CONFIG_CGROUP_DEBUG=y
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
# CONFIG_TIME_NS is not set
CONFIG_IPC_NS=y
# CONFIG_USER_NS is not set
# CONFIG_PID_NS is not set
CONFIG_CHECKPOINT_RESTORE=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_SYSFS_DEPRECATED=y
# CONFIG_SYSFS_DEPRECATED_V2 is not set
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_RD_GZIP is not set
# CONFIG_RD_BZIP2 is not set
CONFIG_RD_LZMA=y
# CONFIG_RD_XZ is not set
CONFIG_RD_LZO=y
CONFIG_RD_LZ4=y
CONFIG_RD_ZSTD=y
CONFIG_BOOT_CONFIG=y
# CONFIG_BOOT_CONFIG_EMBED is not set
# CONFIG_INITRAMFS_PRESERVE_MTIME is not set
# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL_EXCEPTION_TRACE=y
CONFIG_EXPERT=y
CONFIG_MULTIUSER=y
CONFIG_SGETMASK_SYSCALL=y
CONFIG_SYSFS_SYSCALL=y
CONFIG_FHANDLE=y
CONFIG_POSIX_TIMERS=y
CONFIG_PRINTK=y
CONFIG_BUG=y
# CONFIG_ELF_CORE is not set
# CONFIG_BASE_FULL is not set
# CONFIG_FUTEX is not set
# CONFIG_EPOLL is not set
# CONFIG_SIGNALFD is not set
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
# CONFIG_SHMEM is not set
CONFIG_AIO=y
# CONFIG_IO_URING is not set
# CONFIG_ADVISE_SYSCALLS is not set
CONFIG_MEMBARRIER=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_BASE_RELATIVE=y
CONFIG_KCMP=y
CONFIG_RSEQ=y
CONFIG_DEBUG_RSEQ=y
# CONFIG_EMBEDDED is not set
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_USE_VMALLOC=y
# CONFIG_PC104 is not set

#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
CONFIG_DEBUG_PERF_USE_VMALLOC=y
# end of Kernel Performance Events And Counters

CONFIG_SYSTEM_DATA_VERIFICATION=y
CONFIG_PROFILING=y
# end of General setup

CONFIG_MMU=y
CONFIG_CPU_BIG_ENDIAN=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_PGSTE=y
CONFIG_AUDIT_ARCH=y
CONFIG_NO_IOPORT_MAP=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_S390=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_PGTABLE_LEVELS=5
CONFIG_HAVE_LIVEPATCH=y

#
# Processor type and features
#
CONFIG_HAVE_MARCH_Z10_FEATURES=y
CONFIG_HAVE_MARCH_Z196_FEATURES=y
CONFIG_HAVE_MARCH_ZEC12_FEATURES=y
CONFIG_HAVE_MARCH_Z13_FEATURES=y
# CONFIG_MARCH_Z10 is not set
# CONFIG_MARCH_Z196 is not set
# CONFIG_MARCH_ZEC12 is not set
CONFIG_MARCH_Z13=y
# CONFIG_MARCH_Z14 is not set
# CONFIG_MARCH_Z15 is not set
# CONFIG_MARCH_Z16 is not set
CONFIG_MARCH_Z15_TUNE=y
# CONFIG_TUNE_DEFAULT is not set
# CONFIG_TUNE_Z10 is not set
# CONFIG_TUNE_Z196 is not set
# CONFIG_TUNE_ZEC12 is not set
# CONFIG_TUNE_Z13 is not set
# CONFIG_TUNE_Z14 is not set
CONFIG_TUNE_Z15=y
# CONFIG_TUNE_Z16 is not set
CONFIG_64BIT=y
CONFIG_COMMAND_LINE_SIZE=4096
CONFIG_SMP=y
CONFIG_NR_CPUS=64
CONFIG_HOTPLUG_CPU=y
# CONFIG_SCHED_TOPOLOGY is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
CONFIG_KEXEC=y
CONFIG_KERNEL_NOBP=y
# CONFIG_RELOCATABLE is not set
# end of Processor type and features

#
# Memory setup
#
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_MAX_PHYSMEM_BITS=46
# end of Memory setup

#
# I/O subsystem
#
CONFIG_QDIO=y
CONFIG_CHSC_SCH=m
CONFIG_SCM_BUS=y
# CONFIG_EADM_SCH is not set
# end of I/O subsystem

#
# Dump support
#
CONFIG_CRASH_DUMP=y
# end of Dump support

CONFIG_CCW=y

#
# Virtualization
#
# CONFIG_PROTECTED_VIRTUALIZATION_GUEST is not set
# CONFIG_PFAULT is not set
CONFIG_CMM=y
CONFIG_S390_HYPFS_FS=y
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQFD=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_KVM_ASYNC_PF_SYNC=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_KVM_VFIO=y
CONFIG_HAVE_KVM_INVALID_WAKEUPS=y
CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL=y
CONFIG_HAVE_KVM_NO_POLL=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=m
CONFIG_KVM_S390_UCONTROL=y
# CONFIG_S390_GUEST is not set
# end of Virtualization

#
# Selftests
#
# end of Selftests

#
# General architecture-dependent options
#
CONFIG_CRASH_CORE=y
CONFIG_KEXEC_CORE=y
CONFIG_GENERIC_ENTRY=y
CONFIG_KPROBES=y
# CONFIG_JUMP_LABEL is not set
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_ARCH_USE_BUILTIN_BSWAP=y
CONFIG_KRETPROBES=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_KPROBES_ON_FTRACE=y
CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
CONFIG_HAVE_NMI=y
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_CONTIGUOUS=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
CONFIG_ARCH_HAS_SET_MEMORY=y
CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y
CONFIG_ARCH_WANTS_NO_INSTR=y
CONFIG_ARCH_32BIT_USTAT_F_TINODE=y
CONFIG_HAVE_ASM_MODVERSIONS=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_RSEQ=y
CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
CONFIG_HAVE_PERF_REGS=y
CONFIG_HAVE_PERF_USER_STACK_DUMP=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
CONFIG_MMU_GATHER_TABLE_FREE=y
CONFIG_MMU_GATHER_RCU_TABLE_FREE=y
CONFIG_MMU_GATHER_MERGE_VMAS=y
CONFIG_MMU_GATHER_NO_GATHER=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
CONFIG_HAVE_CMPXCHG_LOCAL=y
CONFIG_HAVE_CMPXCHG_DOUBLE=y
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
CONFIG_HAVE_ARCH_SECCOMP=y
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
# CONFIG_SECCOMP is not set
CONFIG_LTO_NONE=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_IDLE=y
CONFIG_ARCH_HAS_SCALED_CPUTIME=y
CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
CONFIG_HAVE_ARCH_SOFT_DIRTY=y
CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
CONFIG_MODULES_USE_ELF_RELA=y
CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y
CONFIG_SOFTIRQ_ON_OWN_STACK=y
CONFIG_ALTERNATE_USER_ADDRESS_SPACE=y
CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
CONFIG_HAVE_RELIABLE_STACKTRACE=y
CONFIG_CLONE_BACKWARDS2=y
CONFIG_OLD_SIGSUSPEND3=y
CONFIG_OLD_SIGACTION=y
# CONFIG_COMPAT_32BIT_TIME is not set
CONFIG_HAVE_ARCH_VMAP_STACK=y
CONFIG_VMAP_STACK=y
CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
CONFIG_RANDOMIZE_KSTACK_OFFSET=y
# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set
CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
CONFIG_STRICT_KERNEL_RWX=y
CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
CONFIG_STRICT_MODULE_RWX=y
# CONFIG_LOCK_EVENT_COUNTS is not set
CONFIG_ARCH_HAS_MEM_ENCRYPT=y
CONFIG_ARCH_HAS_VDSO_DATA=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y

#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
# end of GCOV-based kernel profiling

CONFIG_HAVE_GCC_PLUGINS=y
# end of General architecture-dependent options

CONFIG_BASE_SMALL=1
CONFIG_MODULE_SIG_FORMAT=y
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set
CONFIG_MODVERSIONS=y
CONFIG_ASM_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_MODULE_SIG=y
# CONFIG_MODULE_SIG_FORCE is not set
CONFIG_MODULE_SIG_ALL=y
# CONFIG_MODULE_SIG_SHA1 is not set
# CONFIG_MODULE_SIG_SHA224 is not set
# CONFIG_MODULE_SIG_SHA256 is not set
# CONFIG_MODULE_SIG_SHA384 is not set
CONFIG_MODULE_SIG_SHA512=y
CONFIG_MODULE_SIG_HASH="sha512"
CONFIG_MODULE_COMPRESS_NONE=y
# CONFIG_MODULE_COMPRESS_GZIP is not set
# CONFIG_MODULE_COMPRESS_XZ is not set
# CONFIG_MODULE_COMPRESS_ZSTD is not set
CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y
CONFIG_MODPROBE_PATH="/sbin/modprobe"
CONFIG_TRIM_UNUSED_KSYMS=y
CONFIG_UNUSED_KSYMS_WHITELIST=""
CONFIG_MODULES_TREE_LOOKUP=y
# CONFIG_BLOCK is not set
CONFIG_PREEMPT_NOTIFIERS=y
CONFIG_ASN1=y
CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y
CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y
CONFIG_ARCH_INLINE_SPIN_LOCK=y
CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y
CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y
CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y
CONFIG_ARCH_INLINE_SPIN_UNLOCK=y
CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y
CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y
CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y
CONFIG_ARCH_INLINE_READ_TRYLOCK=y
CONFIG_ARCH_INLINE_READ_LOCK=y
CONFIG_ARCH_INLINE_READ_LOCK_BH=y
CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y
CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y
CONFIG_ARCH_INLINE_READ_UNLOCK=y
CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y
CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y
CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y
CONFIG_ARCH_INLINE_WRITE_TRYLOCK=y
CONFIG_ARCH_INLINE_WRITE_LOCK=y
CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y
CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y
CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y
CONFIG_ARCH_INLINE_WRITE_UNLOCK=y
CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y
CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y
CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y
CONFIG_UNINLINE_SPIN_UNLOCK=y
CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
CONFIG_MUTEX_SPIN_ON_OWNER=y
CONFIG_RWSEM_SPIN_ON_OWNER=y
CONFIG_LOCK_SPIN_ON_OWNER=y
CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y

#
# Executable file formats
#
CONFIG_BINFMT_ELF=y
CONFIG_ARCH_BINFMT_ELF_STATE=y
CONFIG_ELFCORE=y
CONFIG_BINFMT_SCRIPT=m
CONFIG_BINFMT_MISC=m
CONFIG_COREDUMP=y
# end of Executable file formats

#
# Memory Management options
#

#
# SLAB allocator options
#
# CONFIG_SLAB is not set
CONFIG_SLUB=y
# CONFIG_SLOB is not set
# CONFIG_SLAB_MERGE_DEFAULT is not set
# CONFIG_SLAB_FREELIST_RANDOM is not set
# CONFIG_SLAB_FREELIST_HARDENED is not set
# CONFIG_SLUB_STATS is not set
CONFIG_SLUB_CPU_PARTIAL=y
# end of SLAB allocator options

# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
# CONFIG_COMPAT_BRK is not set
CONFIG_SPARSEMEM=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK_PHYS_MAP=y
CONFIG_HAVE_FAST_GUP=y
CONFIG_MEMORY_ISOLATION=y
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
CONFIG_COMPACTION=y
CONFIG_PAGE_REPORTING=y
CONFIG_MIGRATION=y
CONFIG_CONTIG_ALLOC=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_MMU_NOTIFIER=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set
CONFIG_CMA=y
CONFIG_CMA_DEBUG=y
# CONFIG_CMA_DEBUGFS is not set
# CONFIG_CMA_SYSFS is not set
CONFIG_CMA_AREAS=7
CONFIG_MEM_SOFT_DIRTY=y
# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
CONFIG_PAGE_IDLE_FLAG=y
CONFIG_IDLE_PAGE_TRACKING=y
CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
CONFIG_ZONE_DMA=y
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_PERCPU_STATS=y
# CONFIG_GUP_TEST is not set
CONFIG_ARCH_HAS_PTE_SPECIAL=y
# CONFIG_USERFAULTFD is not set

#
# Data Access Monitoring
#
CONFIG_DAMON=y
# CONFIG_DAMON_VADDR is not set
# CONFIG_DAMON_PADDR is not set
CONFIG_DAMON_SYSFS=y
# end of Data Access Monitoring
# end of Memory Management options

# CONFIG_NET is not set

#
# Device Drivers
#
CONFIG_HAVE_PCI=y
# CONFIG_PCI is not set
CONFIG_PCCARD=y
CONFIG_PCMCIA=y
# CONFIG_PCMCIA_LOAD_CIS is not set

#
# PC-card bridges
#

#
# Generic Driver Options
#
CONFIG_AUXILIARY_BUS=y
CONFIG_UEVENT_HELPER=y
CONFIG_UEVENT_HELPER_PATH=""
# CONFIG_DEVTMPFS is not set
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y

#
# Firmware loader
#
CONFIG_FW_LOADER=y
CONFIG_FW_LOADER_PAGED_BUF=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_FW_LOADER_USER_HELPER is not set
CONFIG_FW_LOADER_COMPRESS=y
CONFIG_FW_LOADER_COMPRESS_XZ=y
CONFIG_FW_LOADER_COMPRESS_ZSTD=y
# CONFIG_FW_UPLOAD is not set
# end of Firmware loader

CONFIG_WANT_DEV_COREDUMP=y
CONFIG_ALLOW_DEV_COREDUMP=y
CONFIG_DEV_COREDUMP=y
CONFIG_DEBUG_DRIVER=y
# CONFIG_DEBUG_DEVRES is not set
CONFIG_DEBUG_TEST_DRIVER_REMOVE=y
# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
CONFIG_SYS_HYPERVISOR=y
CONFIG_GENERIC_CPU_AUTOPROBE=y
CONFIG_GENERIC_CPU_VULNERABILITIES=y
CONFIG_REGMAP=y
CONFIG_REGMAP_SPMI=m
CONFIG_REGMAP_MMIO=y
# end of Generic Driver Options

#
# Bus devices
#
# CONFIG_MHI_BUS is not set
# CONFIG_MHI_BUS_EP is not set
# end of Bus devices

#
# Firmware Drivers
#

#
# ARM System Control and Management Interface Protocol
#
# end of ARM System Control and Management Interface Protocol

CONFIG_FIRMWARE_MEMMAP=y
# CONFIG_GOOGLE_FIRMWARE is not set

#
# Tegra firmware driver
#
# end of Tegra firmware driver
# end of Firmware Drivers

CONFIG_GNSS=y
CONFIG_MTD=m
# CONFIG_MTD_TESTS is not set

#
# Partition parsers
#
CONFIG_MTD_AR7_PARTS=m
# CONFIG_MTD_CMDLINE_PARTS is not set
# CONFIG_MTD_OF_PARTS is not set
CONFIG_MTD_REDBOOT_PARTS=m
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
# end of Partition parsers

#
# User Modules And Translation Layers
#
# CONFIG_MTD_OOPS is not set
CONFIG_MTD_PARTITIONED_MASTER=y

#
# RAM/ROM/Flash chip drivers
#
# CONFIG_MTD_CFI is not set
CONFIG_MTD_JEDECPROBE=m
CONFIG_MTD_GEN_PROBE=m
CONFIG_MTD_CFI_ADV_OPTIONS=y
# CONFIG_MTD_CFI_NOSWAP is not set
CONFIG_MTD_CFI_BE_BYTE_SWAP=y
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
CONFIG_MTD_CFI_GEOMETRY=y
CONFIG_MTD_MAP_BANK_WIDTH_1=y
# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
CONFIG_MTD_MAP_BANK_WIDTH_32=y
CONFIG_MTD_CFI_I1=y
# CONFIG_MTD_CFI_I2 is not set
# CONFIG_MTD_CFI_I4 is not set
# CONFIG_MTD_CFI_I8 is not set
CONFIG_MTD_OTP=y
CONFIG_MTD_CFI_INTELEXT=m
CONFIG_MTD_CFI_AMDSTD=m
CONFIG_MTD_CFI_STAA=m
CONFIG_MTD_CFI_UTIL=m
CONFIG_MTD_RAM=m
# CONFIG_MTD_ROM is not set
CONFIG_MTD_ABSENT=m
# end of RAM/ROM/Flash chip drivers

#
# NAND
#
CONFIG_MTD_NAND_CORE=m
CONFIG_MTD_RAW_NAND=m

#
# Raw/parallel NAND flash controllers
#

#
# Misc
#
CONFIG_MTD_NAND_NANDSIM=m

#
# ECC engine support
#
CONFIG_MTD_NAND_ECC=y
CONFIG_MTD_NAND_ECC_SW_HAMMING=y
CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC=y
CONFIG_MTD_NAND_ECC_SW_BCH=y
# end of ECC engine support
# end of NAND

#
# LPDDR & LPDDR2 PCM memory drivers
#
CONFIG_MTD_LPDDR=m
CONFIG_MTD_QINFO_PROBE=m
# end of LPDDR & LPDDR2 PCM memory drivers

CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
CONFIG_MTD_UBI_GLUEBI=m
CONFIG_OF=y
# CONFIG_OF_UNITTEST is not set
CONFIG_OF_KOBJ=y
CONFIG_OF_IRQ=y
# CONFIG_OF_OVERLAY is not set

#
# NVME Support
#
# end of NVME Support

#
# Misc devices
#
CONFIG_DUMMY_IRQ=y
CONFIG_ENCLOSURE_SERVICES=y
# CONFIG_C2PORT is not set

#
# EEPROM support
#
# CONFIG_EEPROM_93CX6 is not set
# end of EEPROM support

#
# Texas Instruments shared transport line discipline
#
# end of Texas Instruments shared transport line discipline

#
# Altera FPGA firmware download module (requires I2C)
#
# CONFIG_ECHO is not set
CONFIG_UACCE=m
# CONFIG_PVPANIC is not set
# end of Misc devices

#
# SCSI device support
#
CONFIG_SCSI_MOD=y
# end of SCSI device support

#
# Input device support
#
CONFIG_INPUT=m
CONFIG_INPUT_FF_MEMLESS=m
CONFIG_INPUT_SPARSEKMAP=m
CONFIG_INPUT_MATRIXKMAP=m

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=m
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_INPUT_JOYDEV=m
CONFIG_INPUT_EVDEV=m
CONFIG_INPUT_EVBUG=m

#
# Input Device Drivers
#
# CONFIG_INPUT_KEYBOARD is not set
CONFIG_INPUT_MOUSE=y
# CONFIG_MOUSE_PS2 is not set
CONFIG_MOUSE_SERIAL=m
CONFIG_MOUSE_VSXXXAA=m
CONFIG_MOUSE_GPIO=m
CONFIG_INPUT_JOYSTICK=y
# CONFIG_JOYSTICK_ANALOG is not set
CONFIG_JOYSTICK_A3D=m
CONFIG_JOYSTICK_ADC=m
# CONFIG_JOYSTICK_ADI is not set
CONFIG_JOYSTICK_COBRA=m
CONFIG_JOYSTICK_GF2K=m
CONFIG_JOYSTICK_GRIP=m
# CONFIG_JOYSTICK_GRIP_MP is not set
CONFIG_JOYSTICK_GUILLEMOT=m
CONFIG_JOYSTICK_INTERACT=m
CONFIG_JOYSTICK_SIDEWINDER=m
CONFIG_JOYSTICK_TMDC=m
CONFIG_JOYSTICK_IFORCE=m
CONFIG_JOYSTICK_IFORCE_232=m
# CONFIG_JOYSTICK_WARRIOR is not set
CONFIG_JOYSTICK_MAGELLAN=m
CONFIG_JOYSTICK_SPACEORB=m
CONFIG_JOYSTICK_SPACEBALL=m
CONFIG_JOYSTICK_STINGER=m
# CONFIG_JOYSTICK_TWIDJOY is not set
CONFIG_JOYSTICK_ZHENHUA=m
CONFIG_JOYSTICK_JOYDUMP=m
# CONFIG_JOYSTICK_FSIA6B is not set
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_SERIAL_WACOM4=m
# CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y
CONFIG_INPUT_AD714X=m
CONFIG_INPUT_E3X0_BUTTON=m
CONFIG_INPUT_GPIO_BEEPER=m
# CONFIG_INPUT_GPIO_DECODER is not set
CONFIG_INPUT_GPIO_VIBRA=m
CONFIG_INPUT_UINPUT=m
CONFIG_INPUT_PWM_BEEPER=m
# CONFIG_INPUT_PWM_VIBRA is not set
CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
# CONFIG_INPUT_ADXL34X is not set
# CONFIG_INPUT_CMA3000 is not set
# CONFIG_RMI4_CORE is not set

#
# Hardware I/O ports
#
CONFIG_SERIO=m
CONFIG_SERIO_SERPORT=m
CONFIG_SERIO_LIBPS2=m
CONFIG_SERIO_RAW=m
# CONFIG_SERIO_PS2MULT is not set
CONFIG_SERIO_GPIO_PS2=m
CONFIG_USERIO=m
CONFIG_GAMEPORT=m
CONFIG_GAMEPORT_NS558=m
CONFIG_GAMEPORT_L4=m
# end of Hardware I/O ports
# end of Input device support

#
# Character devices
#
CONFIG_TTY=y
# CONFIG_VT is not set
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
# CONFIG_LDISC_AUTOLOAD is not set
# CONFIG_NULL_TTY is not set
CONFIG_HVC_DRIVER=y
# CONFIG_RPMSG_TTY is not set
# CONFIG_SERIAL_DEV_BUS is not set
# CONFIG_TTY_PRINTK is not set
CONFIG_VIRTIO_CONSOLE=y
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_HW_RANDOM_S390=y

#
# PCMCIA character devices
#
CONFIG_SYNCLINK_CS=y
CONFIG_CARDMAN_4000=m
CONFIG_CARDMAN_4040=y
# CONFIG_SCR24X is not set
# end of PCMCIA character devices

CONFIG_DEVMEM=y
# CONFIG_HANGCHECK_TIMER is not set

#
# S/390 character device drivers
#
CONFIG_TN3270=y
CONFIG_TN3270_TTY=y
# CONFIG_TN3270_FS is not set
# CONFIG_TN3270_CONSOLE is not set
CONFIG_TN3215=y
# CONFIG_TN3215_CONSOLE is not set
CONFIG_SCLP_TTY=y
# CONFIG_SCLP_CONSOLE is not set
CONFIG_SCLP_VT220_TTY=y
# CONFIG_SCLP_VT220_CONSOLE is not set
# CONFIG_HMC_DRV is not set
# CONFIG_SCLP_OFB is not set
CONFIG_S390_UV_UAPI=y
CONFIG_S390_TAPE=y

#
# S/390 tape hardware support
#
CONFIG_S390_TAPE_34XX=m
CONFIG_S390_TAPE_3590=m
# CONFIG_VMCP is not set
# CONFIG_MONWRITER is not set
CONFIG_S390_VMUR=y
# CONFIG_XILLYBUS is not set
CONFIG_RANDOM_TRUST_CPU=y
CONFIG_RANDOM_TRUST_BOOTLOADER=y
# end of Character devices

#
# I2C support
#
# CONFIG_I2C is not set
# end of I2C support

# CONFIG_I3C is not set
CONFIG_SPMI=y
# CONFIG_HSI is not set
CONFIG_PPS=m
# CONFIG_PPS_DEBUG is not set

#
# PPS clients support
#
CONFIG_PPS_CLIENT_KTIMER=m
CONFIG_PPS_CLIENT_LDISC=m
# CONFIG_PPS_CLIENT_GPIO is not set

#
# PPS generators support
#

#
# PTP clock support
#
CONFIG_PTP_1588_CLOCK_OPTIONAL=y

#
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
#
# end of PTP clock support

CONFIG_PINCTRL=y
# CONFIG_DEBUG_PINCTRL is not set

#
# Renesas pinctrl drivers
#
# end of Renesas pinctrl drivers

CONFIG_GPIOLIB=y
CONFIG_GPIOLIB_FASTPATH_LIMIT=512
CONFIG_DEBUG_GPIO=y
# CONFIG_GPIO_SYSFS is not set
CONFIG_GPIO_CDEV=y
# CONFIG_GPIO_CDEV_V1 is not set

#
# MFD GPIO expanders
#
# end of MFD GPIO expanders

#
# Virtual GPIO drivers
#
CONFIG_GPIO_AGGREGATOR=y
# CONFIG_GPIO_MOCKUP is not set
# CONFIG_GPIO_VIRTIO is not set
# CONFIG_GPIO_SIM is not set
# end of Virtual GPIO drivers

# CONFIG_POWER_RESET is not set
# CONFIG_POWER_SUPPLY is not set
CONFIG_THERMAL=y
CONFIG_THERMAL_STATISTICS=y
CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
CONFIG_THERMAL_OF=y
CONFIG_THERMAL_WRITABLE_TRIPS=y
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
CONFIG_THERMAL_GOV_FAIR_SHARE=y
CONFIG_THERMAL_GOV_STEP_WISE=y
# CONFIG_THERMAL_GOV_BANG_BANG is not set
CONFIG_THERMAL_GOV_USER_SPACE=y
# CONFIG_CPU_THERMAL is not set
# CONFIG_DEVFREQ_THERMAL is not set
# CONFIG_THERMAL_EMULATION is not set
# CONFIG_GENERIC_ADC_THERMAL is not set
# CONFIG_WATCHDOG is not set
# CONFIG_REGULATOR is not set
CONFIG_RC_CORE=m
CONFIG_LIRC=y
CONFIG_RC_MAP=m
CONFIG_RC_DECODERS=y
# CONFIG_IR_IMON_DECODER is not set
# CONFIG_IR_JVC_DECODER is not set
CONFIG_IR_MCE_KBD_DECODER=m
CONFIG_IR_NEC_DECODER=m
CONFIG_IR_RC5_DECODER=m
CONFIG_IR_RC6_DECODER=m
# CONFIG_IR_RCMM_DECODER is not set
# CONFIG_IR_SANYO_DECODER is not set
CONFIG_IR_SHARP_DECODER=m
CONFIG_IR_SONY_DECODER=m
CONFIG_IR_XMP_DECODER=m
# CONFIG_RC_DEVICES is not set

#
# CEC support
#
# CONFIG_MEDIA_CEC_SUPPORT is not set
# end of CEC support

#
# Graphics support
#
# end of Graphics support

#
# HID support
#
# CONFIG_HID is not set
# end of HID support

CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_MEMSTICK=y
# CONFIG_MEMSTICK_DEBUG is not set

#
# MemoryStick drivers
#
CONFIG_MEMSTICK_UNSAFE_RESUME=y

#
# MemoryStick Host Controller Drivers
#
CONFIG_NEW_LEDS=y
# CONFIG_LEDS_CLASS is not set

#
# LED drivers
#

#
# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
#

#
# Flash and Torch LED drivers
#

#
# RGB LED drivers
#

#
# LED Triggers
#

#
# Simple LED drivers
#
CONFIG_ACCESSIBILITY=y

#
# Speakup console speech
#
# end of Speakup console speech

CONFIG_DMADEVICES=y
CONFIG_DMADEVICES_DEBUG=y
CONFIG_DMADEVICES_VDEBUG=y

#
# DMA Devices
#
CONFIG_DMA_ENGINE=y
CONFIG_DMA_VIRTUAL_CHANNELS=m
CONFIG_DMA_OF=y
CONFIG_FSL_EDMA=m
CONFIG_INTEL_IDMA64=m
# CONFIG_QCOM_HIDMA is not set

#
# DMA Clients
#
# CONFIG_ASYNC_TX_DMA is not set
CONFIG_DMATEST=y
CONFIG_DMA_ENGINE_RAID=y

#
# DMABUF options
#
# CONFIG_SYNC_FILE is not set
# CONFIG_DMABUF_HEAPS is not set
# end of DMABUF options

# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set
CONFIG_VFIO=y
CONFIG_VFIO_IOMMU_TYPE1=y
# CONFIG_VFIO_NOIOMMU is not set
# CONFIG_VFIO_MDEV is not set
CONFIG_VIRT_DRIVERS=y
CONFIG_VIRTIO_ANCHOR=y
CONFIG_VIRTIO=y
# CONFIG_VIRTIO_MENU is not set
# CONFIG_VHOST_MENU is not set

#
# Microsoft Hyper-V guest support
#
# end of Microsoft Hyper-V guest support

# CONFIG_GREYBUS is not set
# CONFIG_COMEDI is not set
CONFIG_STAGING=y

#
# IIO staging drivers
#

#
# Accelerometers
#
# end of Accelerometers

#
# Analog to digital converters
#
# end of Analog to digital converters

#
# Analog digital bi-direction converters
#
CONFIG_ADT7316=m
# end of Analog digital bi-direction converters

#
# Capacitance to digital converters
#
# end of Capacitance to digital converters

#
# Direct Digital Synthesis
#
# end of Direct Digital Synthesis

#
# Network Analyzer, Impedance Converters
#
# end of Network Analyzer, Impedance Converters

#
# Active energy metering IC
#
# end of Active energy metering IC

#
# Resolver to digital converters
#
# end of Resolver to digital converters
# end of IIO staging drivers

CONFIG_STAGING_MEDIA=y
# CONFIG_MOST_COMPONENTS is not set
# CONFIG_FIELDBUS_DEV is not set
# CONFIG_COMMON_CLK is not set
# CONFIG_HWSPINLOCK is not set

#
# Clock Source drivers
#
CONFIG_TIMER_OF=y
CONFIG_TIMER_PROBE=y
CONFIG_MICROCHIP_PIT64B=y
# end of Clock Source drivers

CONFIG_MAILBOX=y
CONFIG_IOMMU_API=y
CONFIG_IOMMU_SUPPORT=y

#
# Generic IOMMU Pagetable Support
#
# end of Generic IOMMU Pagetable Support

# CONFIG_IOMMU_DEBUGFS is not set
CONFIG_IOMMU_DEFAULT_DMA_STRICT=y
# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set
# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
CONFIG_OF_IOMMU=y
CONFIG_S390_CCW_IOMMU=y
# CONFIG_S390_AP_IOMMU is not set

#
# Remoteproc drivers
#
CONFIG_REMOTEPROC=y
# CONFIG_REMOTEPROC_CDEV is not set
# end of Remoteproc drivers

#
# Rpmsg drivers
#
CONFIG_RPMSG=y
CONFIG_RPMSG_CTRL=y
CONFIG_RPMSG_NS=y
CONFIG_RPMSG_VIRTIO=y
# end of Rpmsg drivers

CONFIG_SOUNDWIRE=y

#
# SoundWire Devices
#

#
# SOC (System On Chip) specific Drivers
#

#
# Amlogic SoC drivers
#
# end of Amlogic SoC drivers

#
# Broadcom SoC drivers
#
# end of Broadcom SoC drivers

#
# NXP/Freescale QorIQ SoC drivers
#
# end of NXP/Freescale QorIQ SoC drivers

#
# fujitsu SoC drivers
#
# end of fujitsu SoC drivers

#
# i.MX SoC drivers
#
# end of i.MX SoC drivers

#
# Enable LiteX SoC Builder specific drivers
#
# end of Enable LiteX SoC Builder specific drivers

#
# Qualcomm SoC drivers
#
# end of Qualcomm SoC drivers

CONFIG_SOC_TI=y

#
# Xilinx SoC drivers
#
# end of Xilinx SoC drivers
# end of SOC (System On Chip) specific Drivers

CONFIG_PM_DEVFREQ=y

#
# DEVFREQ Governors
#
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
CONFIG_DEVFREQ_GOV_PERFORMANCE=m
CONFIG_DEVFREQ_GOV_POWERSAVE=m
CONFIG_DEVFREQ_GOV_USERSPACE=y
# CONFIG_DEVFREQ_GOV_PASSIVE is not set

#
# DEVFREQ Drivers
#
CONFIG_PM_DEVFREQ_EVENT=y
CONFIG_EXTCON=m

#
# Extcon Device Drivers
#
# CONFIG_EXTCON_ADC_JACK is not set
CONFIG_EXTCON_GPIO=m
CONFIG_EXTCON_MAX3355=m
# CONFIG_EXTCON_USB_GPIO is not set
# CONFIG_MEMORY is not set
CONFIG_IIO=m
CONFIG_IIO_BUFFER=y
CONFIG_IIO_BUFFER_CB=m
CONFIG_IIO_BUFFER_DMA=m
CONFIG_IIO_BUFFER_DMAENGINE=m
CONFIG_IIO_BUFFER_HW_CONSUMER=m
CONFIG_IIO_KFIFO_BUF=m
CONFIG_IIO_TRIGGERED_BUFFER=m
CONFIG_IIO_CONFIGFS=m
CONFIG_IIO_TRIGGER=y
CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
# CONFIG_IIO_SW_DEVICE is not set
CONFIG_IIO_SW_TRIGGER=m
CONFIG_IIO_TRIGGERED_EVENT=m

#
# Accelerometers
#
CONFIG_BMA400=m
CONFIG_BMC150_ACCEL=m
CONFIG_KXSD9=m
# end of Accelerometers

#
# Analog to digital converters
#
# CONFIG_ENVELOPE_DETECTOR is not set
# CONFIG_HX711 is not set
CONFIG_QCOM_VADC_COMMON=m
CONFIG_QCOM_SPMI_IADC=m
CONFIG_QCOM_SPMI_VADC=m
CONFIG_QCOM_SPMI_ADC5=m
# CONFIG_SD_ADC_MODULATOR is not set
# end of Analog to digital converters

#
# Analog to digital and digital to analog converters
#
# end of Analog to digital and digital to analog converters

#
# Analog Front Ends
#
# CONFIG_IIO_RESCALE is not set
# end of Analog Front Ends

#
# Amplifiers
#
CONFIG_HMC425=m
# end of Amplifiers

#
# Capacitance to digital converters
#
# end of Capacitance to digital converters

#
# Chemical Sensors
#
# CONFIG_SCD30_CORE is not set
# end of Chemical Sensors

#
# Hid Sensor IIO Common
#
# end of Hid Sensor IIO Common

#
# IIO SCMI Sensors
#
# end of IIO SCMI Sensors

#
# SSP Sensor Common
#
# end of SSP Sensor Common

#
# Digital to analog converters
#
CONFIG_DPOT_DAC=m
# end of Digital to analog converters

#
# IIO dummy driver
#
# end of IIO dummy driver

#
# Filters
#
# end of Filters

#
# Frequency Synthesizers DDS/PLL
#

#
# Clock Generator/Distribution
#
# end of Clock Generator/Distribution

#
# Phase-Locked Loop (PLL) frequency synthesizers
#
# end of Phase-Locked Loop (PLL) frequency synthesizers
# end of Frequency Synthesizers DDS/PLL

#
# Digital gyroscope sensors
#
# end of Digital gyroscope sensors

#
# Health Sensors
#

#
# Heart Rate Monitors
#
# end of Heart Rate Monitors
# end of Health Sensors

#
# Humidity sensors
#
# CONFIG_DHT11 is not set
# end of Humidity sensors

#
# Inertial measurement units
#
# end of Inertial measurement units

#
# Light sensors
#
# CONFIG_CM3605 is not set
# end of Light sensors

#
# Magnetometer sensors
#
# end of Magnetometer sensors

#
# Multiplexers
#
# CONFIG_IIO_MUX is not set
# end of Multiplexers

#
# Inclinometer sensors
#
# end of Inclinometer sensors

#
# Triggers - standalone
#
CONFIG_IIO_HRTIMER_TRIGGER=m
CONFIG_IIO_INTERRUPT_TRIGGER=m
# CONFIG_IIO_TIGHTLOOP_TRIGGER is not set
# CONFIG_IIO_SYSFS_TRIGGER is not set
# end of Triggers - standalone

#
# Linear and angular position sensors
#
# end of Linear and angular position sensors

#
# Digital potentiometers
#
# end of Digital potentiometers

#
# Digital potentiostats
#
# end of Digital potentiostats

#
# Pressure sensors
#
CONFIG_MS5611=m
CONFIG_ZPA2326=m
# end of Pressure sensors

#
# Lightning sensors
#
# end of Lightning sensors

#
# Proximity and distance sensors
#
CONFIG_PING=m
CONFIG_SRF04=m
# end of Proximity and distance sensors

#
# Resolver to digital converters
#
# end of Resolver to digital converters

#
# Temperature sensors
#
# end of Temperature sensors

CONFIG_PWM=y
CONFIG_PWM_SYSFS=y
# CONFIG_PWM_DEBUG is not set
CONFIG_PWM_ATMEL_TCB=y

#
# IRQ chip support
#
CONFIG_IRQCHIP=y
CONFIG_AL_FIC=y
# end of IRQ chip support

CONFIG_RESET_CONTROLLER=y
CONFIG_RESET_TI_TPS380X=y

#
# PHY Subsystem
#
CONFIG_GENERIC_PHY=y
CONFIG_PHY_CAN_TRANSCEIVER=y

#
# PHY drivers for Broadcom platforms
#
# end of PHY drivers for Broadcom platforms
# end of PHY Subsystem

# CONFIG_POWERCAP is not set

#
# Performance monitor support
#
# end of Performance monitor support

# CONFIG_RAS is not set

#
# Android
#
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
CONFIG_ANDROID_BINDER_IPC_SELFTEST=y
# end of Android

# CONFIG_DAX is not set
CONFIG_NVMEM=y
# CONFIG_NVMEM_SYSFS is not set
CONFIG_NVMEM_SPMI_SDAM=m

#
# HW tracing support
#
# CONFIG_STM is not set
# end of HW tracing support

CONFIG_FPGA=y
CONFIG_ALTERA_PR_IP_CORE=m
CONFIG_FPGA_BRIDGE=y
CONFIG_FPGA_REGION=y
# CONFIG_OF_FPGA_REGION is not set
CONFIG_FSI=m
CONFIG_FSI_NEW_DEV_NODE=y
CONFIG_FSI_MASTER_GPIO=m
# CONFIG_FSI_MASTER_HUB is not set
CONFIG_FSI_SCOM=m
CONFIG_MULTIPLEXER=y

#
# Multiplexer drivers
#
# CONFIG_MUX_GPIO is not set
# CONFIG_MUX_MMIO is not set
# end of Multiplexer drivers

CONFIG_PM_OPP=y
CONFIG_SIOX=y
CONFIG_SIOX_BUS_GPIO=m
# CONFIG_SLIMBUS is not set
CONFIG_INTERCONNECT=y
CONFIG_COUNTER=y
CONFIG_INTERRUPT_CNT=m
CONFIG_MOST=m
# CONFIG_MOST_CDEV is not set
CONFIG_PECI=y
CONFIG_PECI_CPU=y
# CONFIG_HTE is not set
# end of Device Drivers

#
# File systems
#
# CONFIG_VALIDATE_FS_PARSER is not set
CONFIG_EXPORTFS=y
CONFIG_EXPORTFS_BLOCK_OPS=y
# CONFIG_FILE_LOCKING is not set
# CONFIG_FS_ENCRYPTION is not set
# CONFIG_FS_VERITY is not set
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
# CONFIG_FANOTIFY is not set
CONFIG_QUOTA=y
# CONFIG_PRINT_QUOTA_WARNING is not set
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=m
# CONFIG_QFMT_V1 is not set
CONFIG_QFMT_V2=m
CONFIG_QUOTACTL=y
# CONFIG_AUTOFS4_FS is not set
CONFIG_AUTOFS_FS=m
# CONFIG_FUSE_FS is not set
# CONFIG_OVERLAY_FS is not set

#
# Caches
#
CONFIG_NETFS_SUPPORT=y
CONFIG_NETFS_STATS=y
CONFIG_FSCACHE=y
CONFIG_FSCACHE_STATS=y
# CONFIG_FSCACHE_DEBUG is not set
# end of Caches

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
# CONFIG_PROC_VMCORE is not set
# CONFIG_PROC_SYSCTL is not set
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_PROC_CHILDREN=y
CONFIG_KERNFS=y
CONFIG_SYSFS=y
CONFIG_ARCH_SUPPORTS_HUGETLBFS=y
# CONFIG_HUGETLBFS is not set
CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
CONFIG_CONFIGFS_FS=m
# end of Pseudo filesystems

# CONFIG_MISC_FILESYSTEMS is not set
CONFIG_NLS=m
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_NLS_CODEPAGE_437=m
# CONFIG_NLS_CODEPAGE_737 is not set
CONFIG_NLS_CODEPAGE_775=m
CONFIG_NLS_CODEPAGE_850=m
CONFIG_NLS_CODEPAGE_852=m
CONFIG_NLS_CODEPAGE_855=m
CONFIG_NLS_CODEPAGE_857=m
CONFIG_NLS_CODEPAGE_860=m
CONFIG_NLS_CODEPAGE_861=m
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
CONFIG_NLS_CODEPAGE_864=m
CONFIG_NLS_CODEPAGE_865=m
CONFIG_NLS_CODEPAGE_866=m
CONFIG_NLS_CODEPAGE_869=m
CONFIG_NLS_CODEPAGE_936=m
CONFIG_NLS_CODEPAGE_950=m
CONFIG_NLS_CODEPAGE_932=m
CONFIG_NLS_CODEPAGE_949=m
CONFIG_NLS_CODEPAGE_874=m
# CONFIG_NLS_ISO8859_8 is not set
CONFIG_NLS_CODEPAGE_1250=m
CONFIG_NLS_CODEPAGE_1251=m
CONFIG_NLS_ASCII=m
# CONFIG_NLS_ISO8859_1 is not set
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_ISO8859_3=m
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
CONFIG_NLS_ISO8859_7=m
CONFIG_NLS_ISO8859_9=m
CONFIG_NLS_ISO8859_13=m
CONFIG_NLS_ISO8859_14=m
CONFIG_NLS_ISO8859_15=m
# CONFIG_NLS_KOI8_R is not set
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_MAC_ROMAN=m
CONFIG_NLS_MAC_CELTIC=m
CONFIG_NLS_MAC_CENTEURO=m
CONFIG_NLS_MAC_CROATIAN=m
CONFIG_NLS_MAC_CYRILLIC=m
# CONFIG_NLS_MAC_GAELIC is not set
CONFIG_NLS_MAC_GREEK=m
# CONFIG_NLS_MAC_ICELAND is not set
# CONFIG_NLS_MAC_INUIT is not set
# CONFIG_NLS_MAC_ROMANIAN is not set
CONFIG_NLS_MAC_TURKISH=m
CONFIG_NLS_UTF8=m
CONFIG_UNICODE=m
CONFIG_UNICODE_NORMALIZATION_SELFTEST=m
# end of File systems

#
# Security options
#
CONFIG_KEYS=y
# CONFIG_KEYS_REQUEST_CACHE is not set
CONFIG_PERSISTENT_KEYRINGS=y
# CONFIG_TRUSTED_KEYS is not set
# CONFIG_ENCRYPTED_KEYS is not set
CONFIG_KEY_DH_OPERATIONS=y
CONFIG_KEY_NOTIFICATIONS=y
CONFIG_SECURITY_DMESG_RESTRICT=y
# CONFIG_SECURITY is not set
CONFIG_SECURITYFS=y
CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
# CONFIG_HARDENED_USERCOPY is not set
# CONFIG_FORTIFY_SOURCE is not set
# CONFIG_STATIC_USERMODEHELPER is not set
# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set
CONFIG_DEFAULT_SECURITY_DAC=y
CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,integrity,bpf"

#
# Kernel hardening options
#

#
# Memory initialization
#
CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y
CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y
CONFIG_INIT_STACK_NONE=y
# CONFIG_INIT_STACK_ALL_PATTERN is not set
# CONFIG_INIT_STACK_ALL_ZERO is not set
CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
CONFIG_INIT_ON_FREE_DEFAULT_ON=y
# end of Memory initialization

CONFIG_CC_HAS_RANDSTRUCT=y
# CONFIG_RANDSTRUCT_NONE is not set
CONFIG_RANDSTRUCT_FULL=y
CONFIG_RANDSTRUCT=y
# end of Kernel hardening options
# end of Security options

CONFIG_CRYPTO=y

#
# Crypto core or helper
#
# CONFIG_CRYPTO_FIPS is not set
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_SKCIPHER=y
CONFIG_CRYPTO_SKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG=y
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_RNG_DEFAULT=y
CONFIG_CRYPTO_AKCIPHER2=y
CONFIG_CRYPTO_AKCIPHER=y
CONFIG_CRYPTO_KPP2=y
CONFIG_CRYPTO_KPP=y
CONFIG_CRYPTO_ACOMP2=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
# CONFIG_CRYPTO_MANAGER_EXTRA_TESTS is not set
CONFIG_CRYPTO_GF128MUL=m
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_NULL2=y
# CONFIG_CRYPTO_PCRYPT is not set
CONFIG_CRYPTO_CRYPTD=m
CONFIG_CRYPTO_AUTHENC=y
# CONFIG_CRYPTO_TEST is not set
CONFIG_CRYPTO_ENGINE=y

#
# Public-key cryptography
#
CONFIG_CRYPTO_RSA=y
CONFIG_CRYPTO_DH=y
# CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set
CONFIG_CRYPTO_ECC=y
CONFIG_CRYPTO_ECDH=m
CONFIG_CRYPTO_ECDSA=m
CONFIG_CRYPTO_ECRDSA=y
# CONFIG_CRYPTO_SM2 is not set
# CONFIG_CRYPTO_CURVE25519 is not set

#
# Authenticated Encryption with Associated Data
#
CONFIG_CRYPTO_CCM=m
# CONFIG_CRYPTO_GCM is not set
CONFIG_CRYPTO_CHACHA20POLY1305=m
CONFIG_CRYPTO_AEGIS128=m
CONFIG_CRYPTO_SEQIV=m
CONFIG_CRYPTO_ECHAINIV=m

#
# Block modes
#
CONFIG_CRYPTO_CBC=y
# CONFIG_CRYPTO_CFB is not set
CONFIG_CRYPTO_CTR=y
CONFIG_CRYPTO_CTS=y
CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_OFB=y
# CONFIG_CRYPTO_PCBC is not set
CONFIG_CRYPTO_XTS=y
CONFIG_CRYPTO_KEYWRAP=m
CONFIG_CRYPTO_NHPOLY1305=m
CONFIG_CRYPTO_ADIANTUM=m
# CONFIG_CRYPTO_HCTR2 is not set
CONFIG_CRYPTO_ESSIV=y

#
# Hash modes
#
CONFIG_CRYPTO_CMAC=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_XCBC=m
# CONFIG_CRYPTO_VMAC is not set

#
# Digest
#
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_CRC32 is not set
CONFIG_CRYPTO_CRC32_S390=m
# CONFIG_CRYPTO_XXHASH is not set
CONFIG_CRYPTO_BLAKE2B=y
# CONFIG_CRYPTO_CRCT10DIF is not set
CONFIG_CRYPTO_CRC64_ROCKSOFT=m
# CONFIG_CRYPTO_GHASH is not set
CONFIG_CRYPTO_POLY1305=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_RMD160=y
CONFIG_CRYPTO_SHA1=y
# CONFIG_CRYPTO_SHA512_S390 is not set
# CONFIG_CRYPTO_SHA1_S390 is not set
CONFIG_CRYPTO_SHA256=y
# CONFIG_CRYPTO_SHA256_S390 is not set
CONFIG_CRYPTO_SHA512=y
CONFIG_CRYPTO_SHA3=y
CONFIG_CRYPTO_SHA3_256_S390=m
CONFIG_CRYPTO_SHA3_512_S390=y
CONFIG_CRYPTO_SM3=y
CONFIG_CRYPTO_SM3_GENERIC=y
CONFIG_CRYPTO_STREEBOG=y
# CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_GHASH_S390 is not set

#
# Ciphers
#
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_AES_TI=m
CONFIG_CRYPTO_AES_S390=y
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_BLOWFISH_COMMON=m
CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAST_COMMON=m
CONFIG_CRYPTO_CAST5=m
# CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_DES is not set
CONFIG_CRYPTO_DES_S390=m
CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_CHACHA20=y
CONFIG_CRYPTO_CHACHA_S390=m
CONFIG_CRYPTO_ARIA=y
CONFIG_CRYPTO_SERPENT=y
CONFIG_CRYPTO_SM4=y
# CONFIG_CRYPTO_SM4_GENERIC is not set
CONFIG_CRYPTO_TWOFISH=y
CONFIG_CRYPTO_TWOFISH_COMMON=y

#
# Compression
#
CONFIG_CRYPTO_DEFLATE=m
# CONFIG_CRYPTO_LZO is not set
CONFIG_CRYPTO_842=y
CONFIG_CRYPTO_LZ4=m
CONFIG_CRYPTO_LZ4HC=y
# CONFIG_CRYPTO_ZSTD is not set

#
# Random Number Generation
#
# CONFIG_CRYPTO_ANSI_CPRNG is not set
CONFIG_CRYPTO_DRBG_MENU=y
CONFIG_CRYPTO_DRBG_HMAC=y
# CONFIG_CRYPTO_DRBG_HASH is not set
CONFIG_CRYPTO_DRBG_CTR=y
CONFIG_CRYPTO_DRBG=y
CONFIG_CRYPTO_JITTERENTROPY=y
CONFIG_CRYPTO_KDF800108_CTR=y
CONFIG_CRYPTO_HASH_INFO=y
CONFIG_CRYPTO_HW=y
CONFIG_ZCRYPT=y
# CONFIG_ZCRYPT_DEBUG is not set
CONFIG_ZCRYPT_MULTIDEVNODES=y
CONFIG_PKEY=m
# CONFIG_CRYPTO_PAES_S390 is not set
CONFIG_S390_PRNG=y
CONFIG_CRYPTO_DEV_VIRTIO=y
CONFIG_CRYPTO_DEV_CCREE=y
CONFIG_ASYMMETRIC_KEY_TYPE=y
CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
CONFIG_X509_CERTIFICATE_PARSER=y
CONFIG_PKCS8_PRIVATE_KEY_PARSER=y
CONFIG_PKCS7_MESSAGE_PARSER=y
CONFIG_PKCS7_TEST_KEY=y
# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
CONFIG_FIPS_SIGNATURE_SELFTEST=y

#
# Certificates for signature checking
#
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
# CONFIG_MODULE_SIG_KEY_TYPE_ECDSA is not set
CONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=4096
CONFIG_SECONDARY_TRUSTED_KEYRING=y
# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
# end of Certificates for signature checking

#
# Library routines
#
# CONFIG_PACKING is not set
CONFIG_BITREVERSE=y
CONFIG_GENERIC_STRNCPY_FROM_USER=y
CONFIG_GENERIC_STRNLEN_USER=y
CONFIG_CORDIC=m
# CONFIG_PRIME_NUMBERS is not set
CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y

#
# Crypto library routines
#
CONFIG_CRYPTO_LIB_AES=y
CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m
CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y
CONFIG_CRYPTO_LIB_CHACHA=m
CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m
CONFIG_CRYPTO_LIB_CURVE25519=m
CONFIG_CRYPTO_LIB_DES=y
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1
CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
CONFIG_CRYPTO_LIB_POLY1305=y
# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set
CONFIG_CRYPTO_LIB_SHA1=y
CONFIG_CRYPTO_LIB_SHA256=y
# end of Crypto library routines

CONFIG_LIB_MEMNEQ=y
CONFIG_CRC_CCITT=y
CONFIG_CRC16=m
# CONFIG_CRC_T10DIF is not set
CONFIG_CRC64_ROCKSOFT=m
CONFIG_CRC_ITU_T=y
CONFIG_CRC32=y
# CONFIG_CRC32_SELFTEST is not set
# CONFIG_CRC32_SLICEBY8 is not set
# CONFIG_CRC32_SLICEBY4 is not set
# CONFIG_CRC32_SARWATE is not set
CONFIG_CRC32_BIT=y
CONFIG_CRC64=m
CONFIG_CRC4=y
CONFIG_CRC7=m
# CONFIG_LIBCRC32C is not set
# CONFIG_CRC8 is not set
CONFIG_XXHASH=y
# CONFIG_RANDOM32_SELFTEST is not set
CONFIG_842_COMPRESS=y
CONFIG_842_DECOMPRESS=y
CONFIG_ZLIB_INFLATE=m
CONFIG_ZLIB_DEFLATE=m
# CONFIG_ZLIB_DFLTCC is not set
CONFIG_LZO_DECOMPRESS=y
CONFIG_LZ4_COMPRESS=m
CONFIG_LZ4HC_COMPRESS=y
CONFIG_LZ4_DECOMPRESS=y
CONFIG_ZSTD_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
CONFIG_XZ_DEC_POWERPC=y
# CONFIG_XZ_DEC_IA64 is not set
# CONFIG_XZ_DEC_ARM is not set
CONFIG_XZ_DEC_ARMTHUMB=y
CONFIG_XZ_DEC_SPARC=y
# CONFIG_XZ_DEC_MICROLZMA is not set
CONFIG_XZ_DEC_BCJ=y
CONFIG_XZ_DEC_TEST=y
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DECOMPRESS_LZO=y
CONFIG_DECOMPRESS_LZ4=y
CONFIG_DECOMPRESS_ZSTD=y
CONFIG_GENERIC_ALLOCATOR=y
CONFIG_BCH=m
CONFIG_INTERVAL_TREE=y
CONFIG_XARRAY_MULTI=y
CONFIG_ASSOCIATIVE_ARRAY=y
CONFIG_HAS_DMA=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_ARCH_HAS_FORCE_DMA_UNENCRYPTED=y
CONFIG_SWIOTLB=y
CONFIG_DMA_CMA=y
# CONFIG_DMA_PERNUMA_CMA is not set

#
# Default contiguous memory area size:
#
CONFIG_CMA_SIZE_MBYTES=16
CONFIG_CMA_SIZE_PERCENTAGE=10
# CONFIG_CMA_SIZE_SEL_MBYTES is not set
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
# CONFIG_CMA_SIZE_SEL_MIN is not set
CONFIG_CMA_SIZE_SEL_MAX=y
CONFIG_CMA_ALIGNMENT=8
CONFIG_DMA_API_DEBUG=y
# CONFIG_DMA_API_DEBUG_SG is not set
CONFIG_DMA_MAP_BENCHMARK=y
CONFIG_SGL_ALLOC=y
# CONFIG_CPUMASK_OFFSTACK is not set
CONFIG_CLZ_TAB=y
# CONFIG_IRQ_POLL is not set
CONFIG_MPILIB=y
CONFIG_OID_REGISTRY=y
CONFIG_HAVE_GENERIC_VDSO=y
CONFIG_GENERIC_GETTIMEOFDAY=y
CONFIG_GENERIC_VDSO_TIME_NS=y
CONFIG_ARCH_STACKWALK=y
CONFIG_STACKDEPOT=y
CONFIG_STACKDEPOT_ALWAYS_INIT=y
CONFIG_REF_TRACKER=y
# end of Library routines

#
# Kernel hacking
#

#
# printk and dmesg options
#
CONFIG_PRINTK_TIME=y
CONFIG_PRINTK_CALLER=y
# CONFIG_STACKTRACE_BUILD_ID is not set
CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
CONFIG_CONSOLE_LOGLEVEL_QUIET=4
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
CONFIG_DYNAMIC_DEBUG=y
CONFIG_DYNAMIC_DEBUG_CORE=y
CONFIG_SYMBOLIC_ERRNAME=y
# CONFIG_DEBUG_BUGVERBOSE is not set
# end of printk and dmesg options

CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_MISC is not set

#
# Compile-time checks and compiler options
#
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_NONE is not set
# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set
CONFIG_DEBUG_INFO_DWARF4=y
# CONFIG_DEBUG_INFO_DWARF5 is not set
# CONFIG_DEBUG_INFO_REDUCED is not set
CONFIG_DEBUG_INFO_SPLIT=y
CONFIG_PAHOLE_HAS_SPLIT_BTF=y
CONFIG_PAHOLE_HAS_BTF_TAG=y
# CONFIG_GDB_SCRIPTS is not set
CONFIG_FRAME_WARN=2048
# CONFIG_STRIP_ASM_SYMS is not set
CONFIG_HEADERS_INSTALL=y
CONFIG_SECTION_MISMATCH_WARN_ONLY=y
# CONFIG_VMLINUX_MAP is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# end of Compile-time checks and compiler options

#
# Generic Kernel Debugging Instruments
#
# CONFIG_MAGIC_SYSRQ is not set
CONFIG_DEBUG_FS=y
# CONFIG_DEBUG_FS_ALLOW_ALL is not set
# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set
CONFIG_DEBUG_FS_ALLOW_NONE=y
CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y
CONFIG_UBSAN=y
# CONFIG_UBSAN_TRAP is not set
CONFIG_CC_HAS_UBSAN_BOUNDS=y
CONFIG_CC_HAS_UBSAN_ARRAY_BOUNDS=y
CONFIG_UBSAN_BOUNDS=y
CONFIG_UBSAN_ARRAY_BOUNDS=y
# CONFIG_UBSAN_SHIFT is not set
# CONFIG_UBSAN_UNREACHABLE is not set
# CONFIG_UBSAN_BOOL is not set
CONFIG_UBSAN_ENUM=y
CONFIG_UBSAN_ALIGNMENT=y
CONFIG_UBSAN_SANITIZE_ALL=y
CONFIG_TEST_UBSAN=m
CONFIG_HAVE_ARCH_KCSAN=y
CONFIG_HAVE_KCSAN_COMPILER=y
# CONFIG_KCSAN is not set
# end of Generic Kernel Debugging Instruments

#
# Networking Debugging
#
CONFIG_NET_DEV_REFCNT_TRACKER=y
CONFIG_NET_NS_REFCNT_TRACKER=y
# end of Networking Debugging

#
# Memory Debugging
#
# CONFIG_PAGE_EXTENSION is not set
CONFIG_DEBUG_PAGEALLOC=y
# CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT is not set
CONFIG_SLUB_DEBUG=y
CONFIG_SLUB_DEBUG_ON=y
# CONFIG_PAGE_OWNER is not set
# CONFIG_PAGE_POISONING is not set
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_ARCH_HAS_DEBUG_WX=y
CONFIG_DEBUG_WX=y
CONFIG_GENERIC_PTDUMP=y
CONFIG_PTDUMP_CORE=y
# CONFIG_PTDUMP_DEBUGFS is not set
CONFIG_DEBUG_OBJECTS=y
CONFIG_DEBUG_OBJECTS_SELFTEST=y
# CONFIG_DEBUG_OBJECTS_FREE is not set
# CONFIG_DEBUG_OBJECTS_TIMERS is not set
CONFIG_DEBUG_OBJECTS_WORK=y
CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
# CONFIG_SHRINKER_DEBUG is not set
CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=16000
CONFIG_DEBUG_KMEMLEAK_TEST=m
# CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF is not set
# CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN is not set
# CONFIG_DEBUG_STACK_USAGE is not set
CONFIG_SCHED_STACK_END_CHECK=y
CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
CONFIG_DEBUG_VM=y
# CONFIG_DEBUG_VM_VMACACHE is not set
CONFIG_DEBUG_VM_RB=y
CONFIG_DEBUG_VM_PGFLAGS=y
CONFIG_DEBUG_VM_PGTABLE=y
CONFIG_DEBUG_MEMORY_INIT=y
CONFIG_DEBUG_PER_CPU_MAPS=y
CONFIG_HAVE_ARCH_KASAN=y
CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
CONFIG_CC_HAS_KASAN_GENERIC=y
CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
# CONFIG_KASAN is not set
CONFIG_HAVE_ARCH_KFENCE=y
# CONFIG_KFENCE is not set
# end of Memory Debugging

CONFIG_DEBUG_SHIRQ=y

#
# Debug Oops, Lockups and Hangs
#
CONFIG_PANIC_ON_OOPS=y
CONFIG_PANIC_ON_OOPS_VALUE=1
CONFIG_PANIC_TIMEOUT=0
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
CONFIG_WQ_WATCHDOG=y
CONFIG_TEST_LOCKUP=m
# end of Debug Oops, Lockups and Hangs

#
# Scheduler Debugging
#
CONFIG_SCHED_DEBUG=y
CONFIG_SCHED_INFO=y
CONFIG_SCHEDSTATS=y
# end of Scheduler Debugging

CONFIG_DEBUG_TIMEKEEPING=y

#
# Lock Debugging (spinlocks, mutexes, etc...)
#
CONFIG_LOCK_DEBUGGING_SUPPORT=y
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
CONFIG_DEBUG_RWSEMS=y
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_LOCKDEP=y
CONFIG_LOCKDEP_BITS=15
CONFIG_LOCKDEP_CHAINS_BITS=16
CONFIG_LOCKDEP_STACK_TRACE_BITS=19
CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14
CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12
# CONFIG_DEBUG_LOCKDEP is not set
CONFIG_DEBUG_ATOMIC_SLEEP=y
CONFIG_DEBUG_LOCKING_API_SELFTESTS=y
CONFIG_LOCK_TORTURE_TEST=y
CONFIG_WW_MUTEX_SELFTEST=m
CONFIG_SCF_TORTURE_TEST=y
CONFIG_CSD_LOCK_WAIT_DEBUG=y
# end of Lock Debugging (spinlocks, mutexes, etc...)

CONFIG_DEBUG_IRQFLAGS=y
CONFIG_STACKTRACE=y
CONFIG_WARN_ALL_UNSEEDED_RANDOM=y
CONFIG_DEBUG_KOBJECT=y

#
# Debug kernel data structures
#
# CONFIG_DEBUG_LIST is not set
CONFIG_DEBUG_PLIST=y
CONFIG_DEBUG_SG=y
CONFIG_DEBUG_NOTIFIERS=y
# CONFIG_BUG_ON_DATA_CORRUPTION is not set
# end of Debug kernel data structures

CONFIG_DEBUG_CREDENTIALS=y

#
# RCU Debugging
#
CONFIG_TORTURE_TEST=y
CONFIG_RCU_SCALE_TEST=y
# CONFIG_RCU_TORTURE_TEST is not set
CONFIG_RCU_REF_SCALE_TEST=m
CONFIG_RCU_CPU_STALL_TIMEOUT=21
CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0
CONFIG_RCU_TRACE=y
# CONFIG_RCU_EQS_DEBUG is not set
# end of RCU Debugging

CONFIG_DEBUG_WQ_FORCE_RR_CPU=y
# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
CONFIG_LATENCYTOP=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_FENTRY=y
CONFIG_HAVE_NOP_MCOUNT=y
CONFIG_TRACE_CLOCK=y
CONFIG_TRACING_SUPPORT=y
# CONFIG_FTRACE is not set
# CONFIG_SAMPLES is not set
CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y
CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y
CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
CONFIG_STRICT_DEVMEM=y
CONFIG_IO_STRICT_DEVMEM=y

#
# s390 Debugging
#
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_ENTRY=y
CONFIG_CIO_INJECT=y
# end of s390 Debugging

#
# Kernel Testing and Coverage
#
# CONFIG_KUNIT is not set
CONFIG_NOTIFIER_ERROR_INJECTION=m
CONFIG_FUNCTION_ERROR_INJECTION=y
# CONFIG_FAULT_INJECTION is not set
CONFIG_ARCH_HAS_KCOV=y
CONFIG_CC_HAS_SANCOV_TRACE_PC=y
CONFIG_KCOV=y
CONFIG_KCOV_ENABLE_COMPARISONS=y
# CONFIG_KCOV_INSTRUMENT_ALL is not set
CONFIG_KCOV_IRQ_AREA_SIZE=0x40000
CONFIG_RUNTIME_TESTING_MENU=y
CONFIG_LKDTM=m
CONFIG_TEST_MIN_HEAP=y
# CONFIG_TEST_DIV64 is not set
CONFIG_BACKTRACE_SELF_TEST=y
# CONFIG_TEST_REF_TRACKER is not set
CONFIG_RBTREE_TEST=m
# CONFIG_REED_SOLOMON_TEST is not set
CONFIG_INTERVAL_TREE_TEST=y
CONFIG_PERCPU_TEST=m
CONFIG_ATOMIC64_SELFTEST=y
CONFIG_TEST_HEXDUMP=m
# CONFIG_STRING_SELFTEST is not set
CONFIG_TEST_STRING_HELPERS=y
# CONFIG_TEST_STRSCPY is not set
# CONFIG_TEST_KSTRTOX is not set
CONFIG_TEST_PRINTF=y
CONFIG_TEST_SCANF=y
CONFIG_TEST_BITMAP=m
# CONFIG_TEST_UUID is not set
CONFIG_TEST_XARRAY=y
# CONFIG_TEST_RHASHTABLE is not set
# CONFIG_TEST_SIPHASH is not set
# CONFIG_TEST_IDA is not set
# CONFIG_TEST_LKM is not set
CONFIG_TEST_BITOPS=m
CONFIG_TEST_VMALLOC=m
CONFIG_TEST_USER_COPY=m
# CONFIG_FIND_BIT_BENCHMARK is not set
CONFIG_TEST_FIRMWARE=m
CONFIG_TEST_UDELAY=m
CONFIG_TEST_STATIC_KEYS=m
CONFIG_TEST_MEMCAT_P=y
# CONFIG_TEST_MEMINIT is not set
CONFIG_TEST_FREE_PAGES=y
# end of Kernel Testing and Coverage
# end of Kernel hacking

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC][PATCH] iov_iter: Add extraction functions
@ 2022-09-12  0:44 kernel test robot
  0 siblings, 0 replies; 10+ messages in thread
From: kernel test robot @ 2022-09-12  0:44 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 17535 bytes --]

:::::: 
:::::: Manual check reason: "low confidence bisect report"
:::::: Manual check reason: "low confidence static check warning: lib/iov_iter_extract.c:348:21: warning: use of uninitialized value 'ret' [CWE-457] [-Wanalyzer-use-of-uninitialized-value]"
:::::: 

BCC: lkp(a)intel.com
CC: kbuild-all(a)lists.01.org
In-Reply-To: <3750754.1662765490@warthog.procyon.org.uk>
References: <3750754.1662765490@warthog.procyon.org.uk>
TO: David Howells <dhowells@redhat.com>

Hi David,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on linus/master]
[also build test WARNING on v6.0-rc5 next-20220909]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/David-Howells/iov_iter-Add-extraction-functions/20220910-072102
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ce888220d5c7a805e0e155302a318d5d23e62950
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: arm-randconfig-c002-20220911 (https://download.01.org/0day-ci/archive/20220912/202209120843.RvCuk9sv-lkp(a)intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/a8df8a897880379087a0a9fc4f6fc1391e352217
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review David-Howells/iov_iter-Add-extraction-functions/20220910-072102
        git checkout a8df8a897880379087a0a9fc4f6fc1391e352217
        # save the config file
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross ARCH=arm KBUILD_USERCFLAGS='-fanalyzer -Wno-error' 

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

gcc_analyzer warnings: (new ones prefixed by >>)
   lib/iov_iter_extract.c: In function 'iov_iter_extract_xarray':
>> lib/iov_iter_extract.c:348:21: warning: use of uninitialized value 'ret' [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
     348 |                 ret += len;
         |                     ^~
     'iov_iter_extract_pages.part.0': events 1-8
       |
       |  363 | static ssize_t iov_iter_extract_pages(struct iov_iter *iter,
       |      |                ^~~~~~~~~~~~~~~~~~~~~~
       |      |                |
       |      |                (1) entry to 'iov_iter_extract_pages.part.0'
       |......
       |  371 |         if (iov_iter_is_bvec(iter))
       |      |            ~    
       |      |            |
       |      |            (2) following 'false' branch...
       |......
       |  374 |         if (iov_iter_is_kvec(iter))
       |      |            ~    
       |      |            |
       |      |            (3) ...to here
       |      |            (4) following 'false' branch...
       |......
       |  377 |         if (iov_iter_is_xarray(iter))
       |      |            ~    
       |      |            |
       |      |            (5) ...to here
       |      |            (6) following 'true' branch...
       |  378 |                 return iov_iter_extract_xarray(iter, array, array_max, maxsize,
       |      |                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       |      |                        |
       |      |                        (7) ...to here
       |      |                        (8) calling 'iov_iter_extract_xarray' from 'iov_iter_extract_pages.part.0'
       |  379 |                                                dest);
       |      |                                                ~~~~~
       |
       +--> 'iov_iter_extract_xarray': events 9-10
              |
              |  319 | static ssize_t iov_iter_extract_xarray(struct iov_iter *iter,
              |      |                ^~~~~~~~~~~~~~~~~~~~~~~
              |      |                |
              |      |                (9) entry to 'iov_iter_extract_xarray'
              |......
              |  329 |         ssize_t ret;
              |      |                 ~~~
              |      |                 |
              |      |                 (10) region created on stack here
              |
            'iov_iter_extract_xarray': event 11
              |
              |  334 |         xas_for_each(&xas, folio, ULONG_MAX) {
              |      |                            ^~~~~
              |      |                            |
              |      |                            (11) following 'true' branch (when 'folio' is non-NULL)...
   include/linux/xarray.h:1770:42: note: in definition of macro 'xas_for_each'
              | 1770 |         for (entry = xas_find(xas, max); entry; \
              |      |                                          ^~~~~
              |
            'iov_iter_extract_xarray': event 12
              |
              |include/linux/compiler.h:78:42:
              |   78 | # define unlikely(x)    __builtin_expect(!!(x), 0)
              |      |                                          ^~~~~
              |      |                                          |
              |      |                                          (12) ...to here
   include/linux/xarray.h:187:16: note: in expansion of macro 'unlikely'
              |  187 |         return unlikely(entry == XA_ZERO_ENTRY);
              |      |                ^~~~~~~~
              |
            'iov_iter_extract_xarray': event 13
              |
              | 1506 |         if (xa_is_zero(entry))
              |      |            ^
              |      |            |
              |      |            (13) following 'false' branch...
              |
            'iov_iter_extract_xarray': event 14
              |
              |include/linux/compiler.h:78:42:
              |   78 | # define unlikely(x)    __builtin_expect(!!(x), 0)
              |      |                                          ^~~~~
              |      |                                          |
              |      |                                          (14) ...to here
   include/linux/xarray.h:1279:16: note: in expansion of macro 'unlikely'
              | 1279 |         return unlikely(entry == XA_RETRY_ENTRY);
              |      |                ^~~~~~~~
              |
            'iov_iter_extract_xarray': events 15-16
              |
              |   81 |         return (unsigned long)entry & 1;
              |      |                ~~~~~~~~~~~~~~~~~~~~
              |      |                |
              |      |                (16) ...to here
              |......
              | 1508 |         if (!xa_is_retry(entry))
              |      |            ^
              |      |            |
              |      |            (15) following 'true' branch...
              |
            'iov_iter_extract_xarray': event 17
              |
              |lib/iov_iter_extract.c:337:20:
              |  337 |                 if (WARN_ON(xa_is_value(folio)))
              |      |                    ^
              |      |                    |
              |      |                    (17) following 'false' branch...
              |
            'iov_iter_extract_xarray': event 18
              |
              |include/linux/mm.h:1771:36:
              | 1771 | #define offset_in_folio(folio, p) ((unsigned long)(p) & (folio_size(folio) - 1))
              |      |                                    ^~~~~~~~~~~~~~~~~~
              |      |                                    |
              |      |                                    (18) ...to here
   lib/iov_iter_extract.c:342:26: note: in expansion of macro 'offset_in_folio'
              |  342 |                 offset = offset_in_folio(folio, start);
              |      |                          ^~~~~~~~~~~~~~~
              |
            'iov_iter_extract_xarray': event 19
              |
              |  348 |                 ret += len;
              |      |                     ^~
              |      |                     |
              |      |                     (19) use of uninitialized value 'ret' here
              |
>> lib/iov_iter_extract.c:348:21: warning: use of uninitialized value 'ret' [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
     'extract_iter_to_sg': events 1-2
       |
       |  477 | ssize_t extract_iter_to_sg(struct iov_iter *iter, size_t len,
       |      |         ^~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (1) entry to 'extract_iter_to_sg'
       |......
       |  504 |         if (!sg)
       |      |            ~
       |      |            |
       |      |            (2) following 'false' branch...
       |
     'extract_iter_to_sg': event 3
       |
       |include/linux/fortify-string.h:280:9:
       |  280 |         fortify_memset_chk(__fortify_size, p_size, p_size_field),       \
       |      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       |      |         |
       |      |         (3) ...to here
   include/linux/fortify-string.h:288:25: note: in expansion of macro '__fortify_memset_chk'
       |  288 | #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
       |      |                         ^~~~~~~~~~~~~~~~~~~~
   lib/iov_iter_extract.c:506:9: note: in expansion of macro 'memset'
       |  506 |         memset(sg, 0, sg_size);
       |      |         ^~~~~~
       |
     'extract_iter_to_sg': event 4
       |
       |  511 |         ret = iov_iter_extract_pages(iter, sgtable, sg_max, len,
       |      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       |      |               |
       |      |               (4) calling 'iov_iter_extract_pages' from 'extract_iter_to_sg'
       |  512 |                                      EXTRACT_TO_SGLIST);
       |      |                                      ~~~~~~~~~~~~~~~~~~
       |
       +--> 'iov_iter_extract_pages': events 5-6
              |
              |  363 | static ssize_t iov_iter_extract_pages(struct iov_iter *iter,
              |      |                ^~~~~~~~~~~~~~~~~~~~~~
              |      |                |
              |      |                (5) entry to 'iov_iter_extract_pages'
              |......
              |  368 |         if (likely(user_backed_iter(iter)))
              |      |            ~    
              |      |            |
              |      |            (6) following 'false' branch...
              |
            'iov_iter_extract_pages': event 7
              |
              |cc1:
              | (7): ...to here
              |
            'iov_iter_extract_pages': event 8
              |
              |cc1:
              | (8): calling 'iov_iter_extract_pages.part.0' from 'iov_iter_extract_pages'
              |
              +--> 'iov_iter_extract_pages.part.0': events 9-16
                     |
                     |  363 | static ssize_t iov_iter_extract_pages(struct iov_iter *iter,
                     |      |                ^~~~~~~~~~~~~~~~~~~~~~
                     |      |                |
                     |      |                (9) entry to 'iov_iter_extract_pages.part.0'
                     |......
                     |  371 |         if (iov_iter_is_bvec(iter))
                     |      |            ~    
                     |      |            |
                     |      |            (10) following 'false' branch...
                     |......
                     |  374 |         if (iov_iter_is_kvec(iter))
                     |      |            ~    
                     |      |            |
                     |      |            (11) ...to here
                     |      |            (12) following 'false' branch...
                     |......
                     |  377 |         if (iov_iter_is_xarray(iter))
                     |      |            ~    
                     |      |            |
                     |      |            (13) ...to here
                     |      |            (14) following 'true' branch...
                     |  378 |                 return iov_iter_extract_xarray(iter, array, array_max, maxsize,
                     |      |                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                     |      |                        |
                     |      |                        (15) ...to here
                     |      |                        (16) calling 'iov_iter_extract_xarray' from 'iov_iter_extract_pages.part.0'
                     |  379 |                                                dest);
                     |      |                                                ~~~~~
                     |
                     +--> 'iov_iter_extract_xarray': events 17-18
                            |
                            |  319 | static ssize_t iov_iter_extract_xarray(struct iov_iter *iter,
                            |      |                ^~~~~~~~~~~~~~~~~~~~~~~
                            |      |                |
                            |      |                (17) entry to 'iov_iter_extract_xarray'
                            |......
                            |  329 |         ssize_t ret;
                            |      |                 ~~~
                            |      |                 |
                            |      |                 (18) region created on stack here
                            |

vim +/ret +348 lib/iov_iter_extract.c

a8df8a89788037 David Howells 2022-09-10  314  
a8df8a89788037 David Howells 2022-09-10  315  /*
a8df8a89788037 David Howells 2022-09-10  316   * Extract the pages from an XARRAY-class iterator and add them to the
a8df8a89788037 David Howells 2022-09-10  317   * destination buffer.  The pages are not pinned.
a8df8a89788037 David Howells 2022-09-10  318   */
a8df8a89788037 David Howells 2022-09-10  319  static ssize_t iov_iter_extract_xarray(struct iov_iter *iter,
a8df8a89788037 David Howells 2022-09-10  320  				       void *array, unsigned int array_max,
a8df8a89788037 David Howells 2022-09-10  321  				       ssize_t maxsize,
a8df8a89788037 David Howells 2022-09-10  322  				       enum iter_extract_dest dest)
a8df8a89788037 David Howells 2022-09-10  323  {
a8df8a89788037 David Howells 2022-09-10  324  	struct xarray *xa = iter->xarray;
a8df8a89788037 David Howells 2022-09-10  325  	struct folio *folio;
a8df8a89788037 David Howells 2022-09-10  326  	unsigned int ix;
a8df8a89788037 David Howells 2022-09-10  327  	loff_t start = iter->xarray_start + iter->iov_offset;
a8df8a89788037 David Howells 2022-09-10  328  	pgoff_t index = start / PAGE_SIZE;
a8df8a89788037 David Howells 2022-09-10  329  	ssize_t ret;
a8df8a89788037 David Howells 2022-09-10  330  	size_t offset, len;
a8df8a89788037 David Howells 2022-09-10  331  	XA_STATE(xas, xa, index);
a8df8a89788037 David Howells 2022-09-10  332  
a8df8a89788037 David Howells 2022-09-10  333  	rcu_read_lock();
a8df8a89788037 David Howells 2022-09-10  334  	xas_for_each(&xas, folio, ULONG_MAX) {
a8df8a89788037 David Howells 2022-09-10  335  		if (xas_retry(&xas, folio))
a8df8a89788037 David Howells 2022-09-10  336  			continue;
a8df8a89788037 David Howells 2022-09-10  337  		if (WARN_ON(xa_is_value(folio)))
a8df8a89788037 David Howells 2022-09-10  338  			break;
a8df8a89788037 David Howells 2022-09-10  339  		if (WARN_ON(folio_test_hugetlb(folio)))
a8df8a89788037 David Howells 2022-09-10  340  			break;
a8df8a89788037 David Howells 2022-09-10  341  
a8df8a89788037 David Howells 2022-09-10  342  		offset = offset_in_folio(folio, start);
a8df8a89788037 David Howells 2022-09-10  343  		len = min_t(size_t, maxsize, folio_size(folio) - offset);
a8df8a89788037 David Howells 2022-09-10  344  
a8df8a89788037 David Howells 2022-09-10  345  		ix = extract_contig_pages(array, folio_page(folio, 0),
a8df8a89788037 David Howells 2022-09-10  346  					  offset, len, dest);
a8df8a89788037 David Howells 2022-09-10  347  		maxsize -= len;
a8df8a89788037 David Howells 2022-09-10 @348  		ret += len;
a8df8a89788037 David Howells 2022-09-10  349  		if (ix >= array_max) {
a8df8a89788037 David Howells 2022-09-10  350  			WARN_ON_ONCE(ix > array_max);
a8df8a89788037 David Howells 2022-09-10  351  			break;
a8df8a89788037 David Howells 2022-09-10  352  		}
a8df8a89788037 David Howells 2022-09-10  353  
a8df8a89788037 David Howells 2022-09-10  354  		if (maxsize <= 0)
a8df8a89788037 David Howells 2022-09-10  355  			break;
a8df8a89788037 David Howells 2022-09-10  356  	}
a8df8a89788037 David Howells 2022-09-10  357  
a8df8a89788037 David Howells 2022-09-10  358  	rcu_read_unlock();
a8df8a89788037 David Howells 2022-09-10  359  	terminate_array(array, dest);
a8df8a89788037 David Howells 2022-09-10  360  	return ret;
a8df8a89788037 David Howells 2022-09-10  361  }
a8df8a89788037 David Howells 2022-09-10  362  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-10-18 14:48 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-09 23:18 [RFC][PATCH] iov_iter: Add extraction functions David Howells
2022-09-10 12:16 ` kernel test robot
2022-09-24  2:22 ` Al Viro
2022-10-14 12:22 ` David Howells
2022-10-18 14:29 ` David Howells
2022-10-18 14:48   ` Christoph Hellwig
2022-09-11  8:49 kernel test robot
2022-09-13  9:21 ` Dan Carpenter
2022-09-12  0:44 kernel test robot
2022-09-12 14:57 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.