/buildid.c~lib-buildid-use-__kernel_read-for-sleepable-context +++ a/lib/buildid.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #define BUILD_ID 3 @@ -37,6 +38,29 @@ static void freader_put_folio(struct fre r->folio = NULL; } +/* + * Data is read directly into r->buf. Returns pointer to the buffer + * on success, NULL on failure with r->err set. + */ +static const void *freader_fetch_sync(struct freader *r, loff_t file_off, size_t sz) +{ + ssize_t ret; + loff_t pos = file_off; + char *buf = r->buf; + + do { + ret = __kernel_read(r->file, buf, sz, &pos); + if (ret <= 0) { + r->err = ret ?: -EIO; + return NULL; + } + buf += ret; + sz -= ret; + } while (sz > 0); + + return r->buf; +} + static int freader_get_folio(struct freader *r, loff_t file_off) { /* check if we can just reuse current folio */ @@ -46,20 +70,9 @@ static int freader_get_folio(struct frea freader_put_folio(r); - /* reject secretmem folios created with memfd_secret() */ - if (secretmem_mapping(r->file->f_mapping)) - return -EFAULT; - + /* only use page cache lookup - fail if not already cached */ r->folio = filemap_get_folio(r->file->f_mapping, file_off >> PAGE_SHIFT); - /* if sleeping is allowed, wait for the page, if necessary */ - if (r->may_fault && (IS_ERR(r->folio) || !folio_test_uptodate(r->folio))) { - filemap_invalidate_lock_shared(r->file->f_mapping); - r->folio = read_cache_folio(r->file->f_mapping, file_off >> PAGE_SHIFT, - NULL, r->file); - filemap_invalidate_unlock_shared(r->file->f_mapping); - } - if (IS_ERR(r->folio) || !folio_test_uptodate(r->folio)) { if (!IS_ERR(r->folio)) folio_put(r->folio); @@ -97,6 +110,16 @@ const void *freader_fetch(struct freader return r->data + file_off; } + /* reject secretmem folios created with memfd_secret() */ + if (secretmem_mapping(r->file->f_mapping)) { + r->err = -EFAULT; + return NULL; + } + + /* use __kernel_read() for sleepable context */ + if (r->may_fault) + return freader_fetch_sync(r, file_off, sz); + /* fetch or reuse folio for given file offset */ r->err = freader_get_folio(r, file_off); if (r->err) _ Patches currently in -mm which might be from shakeel.butt@linux.dev are mm-memcg-fix-unit-conversion-for-k-macro-in-oom-log.patch lib-buildid-use-__kernel_read-for-sleepable-context.patch+ lib-buildid-use-__kernel_read-for-sleepable-context.patch added to mm-nonmm-unstable branchAndrew Morton undefinedmm-commits@vger.kernel.org,willy@infradead.org,stable@vger.kernel.org,hch@lst.de,djwong@kernel.org,daniel@iogearbox.net,ast@kernel.org,andrii@kernel.org,shakeel.butt@linux.dev,akpm@linux-foundation.org undefined undefined undefined undefined undefined undefined undefined undefined undefined©Q„ŃY