* [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.