We must restore part->mmap_begin when poping memfds from the memfd-cache.
We rely on the memfds to be unsealed, so we can be sure that we own the
whole FD. Therefore, simply set part->mmap_begin to the same as
part->data.
This fixes test-bus-kernel-benchmark.
/* If we can reuse the memfd, try that. For that it
* can't be sealed yet. */
/* If we can reuse the memfd, try that. For that it
* can't be sealed yet. */
+ if (!part->sealed) {
+ assert(part->memfd_offset == 0);
+ assert(part->data == part->mmap_begin);
bus_kernel_push_memfd(m->bus, part->memfd, part->data, part->mapped, part->allocated);
bus_kernel_push_memfd(m->bus, part->memfd, part->data, part->mapped, part->allocated);
if (part->mapped > 0)
assert_se(munmap(part->mmap_begin, part->mapped) == 0);
if (part->mapped > 0)
assert_se(munmap(part->mmap_begin, part->mapped) == 0);
if (m->poisoned)
return -ENOMEM;
if (m->poisoned)
return -ENOMEM;
- if (!part->data && part->memfd < 0)
+ if (!part->data && part->memfd < 0) {
part->memfd = bus_kernel_pop_memfd(m->bus, &part->data, &part->mapped, &part->allocated);
part->memfd = bus_kernel_pop_memfd(m->bus, &part->data, &part->mapped, &part->allocated);
+ part->mmap_begin = part->data;
+ }