parent
9bb27f4e4e
commit
ef8bf59b21
@ -1 +0,0 @@
|
||||
# Calculate append=skip merge(sys-kernel/calculate-sources)=>5.13,5.14
|
File diff suppressed because it is too large
Load Diff
@ -1,14 +0,0 @@
|
||||
# Calculate format=kernel name=.config merge(sys-kernel/calculate-sources[-desktop])!=
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_TABLET is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_MACINTOSH_DRIVERS is not set
|
||||
# CONFIG_MEDIA_SUPPORT is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_RC_CORE is not set
|
||||
# CONFIG_SOUND is not set
|
||||
# CONFIG_USB_GADGET is not set
|
File diff suppressed because it is too large
Load Diff
@ -1,482 +0,0 @@
|
||||
# Calculate format=diff merge(sys-kernel/calculate-sources[fsync])!=
|
||||
From 10b7488bd2e42b13f2c50b2051463726f041096b Mon Sep 17 00:00:00 2001
|
||||
From: Piotr Gorski <lucjan.lucjanov@gmail.com>
|
||||
Date: Tue, 29 Jun 2021 00:06:59 +0200
|
||||
Subject: [PATCH] futex: resync from gitlab.collabora.com
|
||||
|
||||
Signed-off-by: Piotr Gorski <lucjan.lucjanov@gmail.com>
|
||||
---
|
||||
include/uapi/linux/futex.h | 20 +++
|
||||
kernel/futex.c | 351 ++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 370 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/uapi/linux/futex.h b/include/uapi/linux/futex.h
|
||||
index a89eb0acc..a3e760886 100644
|
||||
--- a/include/uapi/linux/futex.h
|
||||
+++ b/include/uapi/linux/futex.h
|
||||
@@ -21,6 +21,7 @@
|
||||
#define FUTEX_WAKE_BITSET 10
|
||||
#define FUTEX_WAIT_REQUEUE_PI 11
|
||||
#define FUTEX_CMP_REQUEUE_PI 12
|
||||
+#define FUTEX_WAIT_MULTIPLE 31
|
||||
|
||||
#define FUTEX_PRIVATE_FLAG 128
|
||||
#define FUTEX_CLOCK_REALTIME 256
|
||||
@@ -40,6 +41,8 @@
|
||||
FUTEX_PRIVATE_FLAG)
|
||||
#define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | \
|
||||
FUTEX_PRIVATE_FLAG)
|
||||
+#define FUTEX_WAIT_MULTIPLE_PRIVATE (FUTEX_WAIT_MULTIPLE | \
|
||||
+ FUTEX_PRIVATE_FLAG)
|
||||
|
||||
/*
|
||||
* Support for robust futexes: the kernel cleans up held futexes at
|
||||
@@ -150,4 +153,21 @@ struct robust_list_head {
|
||||
(((op & 0xf) << 28) | ((cmp & 0xf) << 24) \
|
||||
| ((oparg & 0xfff) << 12) | (cmparg & 0xfff))
|
||||
|
||||
+/*
|
||||
+ * Maximum number of multiple futexes to wait for
|
||||
+ */
|
||||
+#define FUTEX_MULTIPLE_MAX_COUNT 128
|
||||
+
|
||||
+/**
|
||||
+ * struct futex_wait_block - Block of futexes to be waited for
|
||||
+ * @uaddr: User address of the futex
|
||||
+ * @val: Futex value expected by userspace
|
||||
+ * @bitset: Bitset for the optional bitmasked wakeup
|
||||
+ */
|
||||
+struct futex_wait_block {
|
||||
+ __u32 __user *uaddr;
|
||||
+ __u32 val;
|
||||
+ __u32 bitset;
|
||||
+};
|
||||
+
|
||||
#endif /* _UAPI_LINUX_FUTEX_H */
|
||||
diff --git a/kernel/futex.c b/kernel/futex.c
|
||||
index 408cad5e8..aa33e66df 100644
|
||||
--- a/kernel/futex.c
|
||||
+++ b/kernel/futex.c
|
||||
@@ -197,6 +197,8 @@ struct futex_pi_state {
|
||||
* @rt_waiter: rt_waiter storage for use with requeue_pi
|
||||
* @requeue_pi_key: the requeue_pi target futex key
|
||||
* @bitset: bitset for the optional bitmasked wakeup
|
||||
+ * @uaddr: userspace address of futex
|
||||
+ * @uval: expected futex's value
|
||||
*
|
||||
* We use this hashed waitqueue, instead of a normal wait_queue_entry_t, so
|
||||
* we can wake only the relevant ones (hashed queues may be shared).
|
||||
@@ -219,6 +221,8 @@ struct futex_q {
|
||||
struct rt_mutex_waiter *rt_waiter;
|
||||
union futex_key *requeue_pi_key;
|
||||
u32 bitset;
|
||||
+ u32 __user *uaddr;
|
||||
+ u32 uval;
|
||||
} __randomize_layout;
|
||||
|
||||
static const struct futex_q futex_q_init = {
|
||||
@@ -2316,6 +2320,29 @@ static int unqueue_me(struct futex_q *q)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * unqueue_multiple() - Remove several futexes from their futex_hash_bucket
|
||||
+ * @q: The list of futexes to unqueue
|
||||
+ * @count: Number of futexes in the list
|
||||
+ *
|
||||
+ * Helper to unqueue a list of futexes. This can't fail.
|
||||
+ *
|
||||
+ * Return:
|
||||
+ * - >=0 - Index of the last futex that was awoken;
|
||||
+ * - -1 - If no futex was awoken
|
||||
+ */
|
||||
+static int unqueue_multiple(struct futex_q *q, int count)
|
||||
+{
|
||||
+ int ret = -1;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (!unqueue_me(&q[i]))
|
||||
+ ret = i;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* PI futexes can not be requeued and must remove themself from the
|
||||
* hash bucket. The hash bucket lock (i.e. lock_ptr) is held.
|
||||
@@ -2679,6 +2706,205 @@ static int futex_wait_setup(u32 __user *uaddr, u32 val, unsigned int flags,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * futex_wait_multiple_setup() - Prepare to wait and enqueue multiple futexes
|
||||
+ * @qs: The corresponding futex list
|
||||
+ * @count: The size of the lists
|
||||
+ * @flags: Futex flags (FLAGS_SHARED, etc.)
|
||||
+ * @awaken: Index of the last awoken futex
|
||||
+ *
|
||||
+ * Prepare multiple futexes in a single step and enqueue them. This may fail if
|
||||
+ * the futex list is invalid or if any futex was already awoken. On success the
|
||||
+ * task is ready to interruptible sleep.
|
||||
+ *
|
||||
+ * Return:
|
||||
+ * - 1 - One of the futexes was awaken by another thread
|
||||
+ * - 0 - Success
|
||||
+ * - <0 - -EFAULT, -EWOULDBLOCK or -EINVAL
|
||||
+ */
|
||||
+static int futex_wait_multiple_setup(struct futex_q *qs, int count,
|
||||
+ unsigned int flags, int *awaken)
|
||||
+{
|
||||
+ struct futex_hash_bucket *hb;
|
||||
+ int ret, i;
|
||||
+ u32 uval;
|
||||
+
|
||||
+ /*
|
||||
+ * Enqueuing multiple futexes is tricky, because we need to
|
||||
+ * enqueue each futex in the list before dealing with the next
|
||||
+ * one to avoid deadlocking on the hash bucket. But, before
|
||||
+ * enqueuing, we need to make sure that current->state is
|
||||
+ * TASK_INTERRUPTIBLE, so we don't absorb any awake events, which
|
||||
+ * cannot be done before the get_futex_key of the next key,
|
||||
+ * because it calls get_user_pages, which can sleep. Thus, we
|
||||
+ * fetch the list of futexes keys in two steps, by first pinning
|
||||
+ * all the memory keys in the futex key, and only then we read
|
||||
+ * each key and queue the corresponding futex.
|
||||
+ */
|
||||
+retry:
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ qs[i].key = FUTEX_KEY_INIT;
|
||||
+ ret = get_futex_key(qs[i].uaddr, flags & FLAGS_SHARED,
|
||||
+ &qs[i].key, FUTEX_READ);
|
||||
+ if (unlikely(ret)) {
|
||||
+ return ret;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ set_current_state(TASK_INTERRUPTIBLE);
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ struct futex_q *q = &qs[i];
|
||||
+
|
||||
+ hb = queue_lock(q);
|
||||
+
|
||||
+ ret = get_futex_value_locked(&uval, q->uaddr);
|
||||
+ if (ret) {
|
||||
+ /*
|
||||
+ * We need to try to handle the fault, which
|
||||
+ * cannot be done without sleep, so we need to
|
||||
+ * undo all the work already done, to make sure
|
||||
+ * we don't miss any wake ups. Therefore, clean
|
||||
+ * up, handle the fault and retry from the
|
||||
+ * beginning.
|
||||
+ */
|
||||
+ queue_unlock(hb);
|
||||
+
|
||||
+ /*
|
||||
+ * Keys 0..(i-1) are implicitly put
|
||||
+ * on unqueue_multiple.
|
||||
+ */
|
||||
+ *awaken = unqueue_multiple(qs, i);
|
||||
+
|
||||
+ __set_current_state(TASK_RUNNING);
|
||||
+
|
||||
+ /*
|
||||
+ * On a real fault, prioritize the error even if
|
||||
+ * some other futex was awoken. Userspace gave
|
||||
+ * us a bad address, -EFAULT them.
|
||||
+ */
|
||||
+ ret = get_user(uval, q->uaddr);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /*
|
||||
+ * Even if the page fault was handled, If
|
||||
+ * something was already awaken, we can safely
|
||||
+ * give up and succeed to give a hint for userspace to
|
||||
+ * acquire the right futex faster.
|
||||
+ */
|
||||
+ if (*awaken >= 0)
|
||||
+ return 1;
|
||||
+
|
||||
+ goto retry;
|
||||
+ }
|
||||
+
|
||||
+ if (uval != q->uval) {
|
||||
+ queue_unlock(hb);
|
||||
+
|
||||
+ /*
|
||||
+ * If something was already awaken, we can
|
||||
+ * safely ignore the error and succeed.
|
||||
+ */
|
||||
+ *awaken = unqueue_multiple(qs, i);
|
||||
+ __set_current_state(TASK_RUNNING);
|
||||
+ if (*awaken >= 0)
|
||||
+ return 1;
|
||||
+
|
||||
+ return -EWOULDBLOCK;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * The bucket lock can't be held while dealing with the
|
||||
+ * next futex. Queue each futex at this moment so hb can
|
||||
+ * be unlocked.
|
||||
+ */
|
||||
+ queue_me(&qs[i], hb);
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * futex_wait_multiple() - Prepare to wait on and enqueue several futexes
|
||||
+ * @qs: The list of futexes to wait on
|
||||
+ * @op: Operation code from futex's syscall
|
||||
+ * @count: The number of objects
|
||||
+ * @abs_time: Timeout before giving up and returning to userspace
|
||||
+ *
|
||||
+ * Entry point for the FUTEX_WAIT_MULTIPLE futex operation, this function
|
||||
+ * sleeps on a group of futexes and returns on the first futex that
|
||||
+ * triggered, or after the timeout has elapsed.
|
||||
+ *
|
||||
+ * Return:
|
||||
+ * - >=0 - Hint to the futex that was awoken
|
||||
+ * - <0 - On error
|
||||
+ */
|
||||
+static int futex_wait_multiple(struct futex_q *qs, int op,
|
||||
+ u32 count, ktime_t *abs_time)
|
||||
+{
|
||||
+ struct hrtimer_sleeper timeout, *to;
|
||||
+ int ret, flags = 0, hint = 0;
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ if (!(op & FUTEX_PRIVATE_FLAG))
|
||||
+ flags |= FLAGS_SHARED;
|
||||
+
|
||||
+ if (op & FUTEX_CLOCK_REALTIME)
|
||||
+ flags |= FLAGS_CLOCKRT;
|
||||
+
|
||||
+ to = futex_setup_timer(abs_time, &timeout, flags, 0);
|
||||
+ while (1) {
|
||||
+ ret = futex_wait_multiple_setup(qs, count, flags, &hint);
|
||||
+ if (ret) {
|
||||
+ if (ret > 0) {
|
||||
+ /* A futex was awaken during setup */
|
||||
+ ret = hint;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (to)
|
||||
+ hrtimer_start_expires(&to->timer, HRTIMER_MODE_ABS);
|
||||
+
|
||||
+ /*
|
||||
+ * Avoid sleeping if another thread already tried to
|
||||
+ * wake us.
|
||||
+ */
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (plist_node_empty(&qs[i].list))
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ if (i == count && (!to || to->task))
|
||||
+ freezable_schedule();
|
||||
+
|
||||
+ ret = unqueue_multiple(qs, count);
|
||||
+
|
||||
+ __set_current_state(TASK_RUNNING);
|
||||
+
|
||||
+ if (ret >= 0)
|
||||
+ break;
|
||||
+ if (to && !to->task) {
|
||||
+ ret = -ETIMEDOUT;
|
||||
+ break;
|
||||
+ } else if (signal_pending(current)) {
|
||||
+ ret = -ERESTARTSYS;
|
||||
+ break;
|
||||
+ }
|
||||
+ /*
|
||||
+ * The final case is a spurious wakeup, for
|
||||
+ * which just retry.
|
||||
+ */
|
||||
+ }
|
||||
+
|
||||
+ if (to) {
|
||||
+ hrtimer_cancel(&to->timer);
|
||||
+ destroy_hrtimer_on_stack(&to->timer);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val,
|
||||
ktime_t *abs_time, u32 bitset)
|
||||
{
|
||||
@@ -3763,6 +3989,7 @@ static __always_inline bool futex_cmd_has_timeout(u32 cmd)
|
||||
case FUTEX_LOCK_PI:
|
||||
case FUTEX_WAIT_BITSET:
|
||||
case FUTEX_WAIT_REQUEUE_PI:
|
||||
+ case FUTEX_WAIT_MULTIPLE:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -3775,13 +4002,51 @@ futex_init_timeout(u32 cmd, u32 op, struct timespec64 *ts, ktime_t *t)
|
||||
return -EINVAL;
|
||||
|
||||
*t = timespec64_to_ktime(*ts);
|
||||
- if (cmd == FUTEX_WAIT)
|
||||
+ if (cmd == FUTEX_WAIT || cmd == FUTEX_WAIT_MULTIPLE)
|
||||
*t = ktime_add_safe(ktime_get(), *t);
|
||||
else if (cmd != FUTEX_LOCK_PI && !(op & FUTEX_CLOCK_REALTIME))
|
||||
*t = timens_ktime_to_host(CLOCK_MONOTONIC, *t);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * futex_read_wait_block - Read an array of futex_wait_block from userspace
|
||||
+ * @uaddr: Userspace address of the block
|
||||
+ * @count: Number of blocks to be read
|
||||
+ *
|
||||
+ * This function creates and allocate an array of futex_q (we zero it to
|
||||
+ * initialize the fields) and then, for each futex_wait_block element from
|
||||
+ * userspace, fill a futex_q element with proper values.
|
||||
+ */
|
||||
+inline struct futex_q *futex_read_wait_block(u32 __user *uaddr, u32 count)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+ struct futex_q *qs;
|
||||
+ struct futex_wait_block fwb;
|
||||
+ struct futex_wait_block __user *entry =
|
||||
+ (struct futex_wait_block __user *)uaddr;
|
||||
+
|
||||
+ if (!count || count > FUTEX_MULTIPLE_MAX_COUNT)
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
+ qs = kcalloc(count, sizeof(*qs), GFP_KERNEL);
|
||||
+ if (!qs)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (copy_from_user(&fwb, &entry[i], sizeof(fwb))) {
|
||||
+ kfree(qs);
|
||||
+ return ERR_PTR(-EFAULT);
|
||||
+ }
|
||||
+
|
||||
+ qs[i].uaddr = fwb.uaddr;
|
||||
+ qs[i].uval = fwb.val;
|
||||
+ qs[i].bitset = fwb.bitset;
|
||||
+ }
|
||||
+
|
||||
+ return qs;
|
||||
+}
|
||||
+
|
||||
SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
|
||||
const struct __kernel_timespec __user *, utime,
|
||||
u32 __user *, uaddr2, u32, val3)
|
||||
@@ -3801,6 +4066,25 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
|
||||
tp = &t;
|
||||
}
|
||||
|
||||
+ if (cmd == FUTEX_WAIT_MULTIPLE) {
|
||||
+ int ret;
|
||||
+ struct futex_q *qs;
|
||||
+
|
||||
+#ifdef CONFIG_X86_X32
|
||||
+ if (unlikely(in_x32_syscall()))
|
||||
+ return -ENOSYS;
|
||||
+#endif
|
||||
+ qs = futex_read_wait_block(uaddr, val);
|
||||
+
|
||||
+ if (IS_ERR(qs))
|
||||
+ return PTR_ERR(qs);
|
||||
+
|
||||
+ ret = futex_wait_multiple(qs, op, val, tp);
|
||||
+ kfree(qs);
|
||||
+
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
return do_futex(uaddr, op, val, tp, uaddr2, (unsigned long)utime, val3);
|
||||
}
|
||||
|
||||
@@ -3963,6 +4247,58 @@ COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid,
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
+/**
|
||||
+ * struct compat_futex_wait_block - Block of futexes to be waited for
|
||||
+ * @uaddr: User address of the futex (compatible pointer)
|
||||
+ * @val: Futex value expected by userspace
|
||||
+ * @bitset: Bitset for the optional bitmasked wakeup
|
||||
+ */
|
||||
+struct compat_futex_wait_block {
|
||||
+ compat_uptr_t uaddr;
|
||||
+ __u32 pad;
|
||||
+ __u32 val;
|
||||
+ __u32 bitset;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * compat_futex_read_wait_block - Read an array of futex_wait_block from
|
||||
+ * userspace
|
||||
+ * @uaddr: Userspace address of the block
|
||||
+ * @count: Number of blocks to be read
|
||||
+ *
|
||||
+ * This function does the same as futex_read_wait_block(), except that it
|
||||
+ * converts the pointer to the futex from the compat version to the regular one.
|
||||
+ */
|
||||
+inline struct futex_q *compat_futex_read_wait_block(u32 __user *uaddr,
|
||||
+ u32 count)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+ struct futex_q *qs;
|
||||
+ struct compat_futex_wait_block fwb;
|
||||
+ struct compat_futex_wait_block __user *entry =
|
||||
+ (struct compat_futex_wait_block __user *)uaddr;
|
||||
+
|
||||
+ if (!count || count > FUTEX_MULTIPLE_MAX_COUNT)
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
+ qs = kcalloc(count, sizeof(*qs), GFP_KERNEL);
|
||||
+ if (!qs)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ for (i = 0; i < count; i++) {
|
||||
+ if (copy_from_user(&fwb, &entry[i], sizeof(fwb))) {
|
||||
+ kfree(qs);
|
||||
+ return ERR_PTR(-EFAULT);
|
||||
+ }
|
||||
+
|
||||
+ qs[i].uaddr = compat_ptr(fwb.uaddr);
|
||||
+ qs[i].uval = fwb.val;
|
||||
+ qs[i].bitset = fwb.bitset;
|
||||
+ }
|
||||
+
|
||||
+ return qs;
|
||||
+}
|
||||
+
|
||||
SYSCALL_DEFINE6(futex_time32, u32 __user *, uaddr, int, op, u32, val,
|
||||
const struct old_timespec32 __user *, utime, u32 __user *, uaddr2,
|
||||
u32, val3)
|
||||
@@ -3980,6 +4316,19 @@ SYSCALL_DEFINE6(futex_time32, u32 __user *, uaddr, int, op, u32, val,
|
||||
tp = &t;
|
||||
}
|
||||
|
||||
+ if (cmd == FUTEX_WAIT_MULTIPLE) {
|
||||
+ int ret;
|
||||
+ struct futex_q *qs = compat_futex_read_wait_block(uaddr, val);
|
||||
+
|
||||
+ if (IS_ERR(qs))
|
||||
+ return PTR_ERR(qs);
|
||||
+
|
||||
+ ret = futex_wait_multiple(qs, op, val, tp);
|
||||
+ kfree(qs);
|
||||
+
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
return do_futex(uaddr, op, val, tp, uaddr2, (unsigned long)utime, val3);
|
||||
}
|
||||
#endif /* CONFIG_COMPAT_32BIT_TIME */
|
||||
--
|
||||
2.32.0.93.g670b81a890
|
||||
|
@ -0,0 +1,20 @@
|
||||
# Calculate format=kernel name=.config
|
||||
CONFIG_ACPI_HOTPLUG_MEMORY=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
|
||||
# CONFIG_ARCH_MEMORY_PROBE is not set
|
||||
# CONFIG_DEVICE_PRIVATE is not set
|
||||
CONFIG_DEV_PAGEMAP_OPS=y
|
||||
CONFIG_HAVE_BOOTMEM_INFO_NODE=y
|
||||
CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE=y
|
||||
CONFIG_MEMORY_HOTPLUG_SPARSE=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_MEMORY_HOTREMOVE=y
|
||||
CONFIG_MEMORY_ISOLATION=y
|
||||
CONFIG_ND_PFN=m
|
||||
CONFIG_NVDIMM_DAX=y
|
||||
CONFIG_NVDIMM_PFN=y
|
||||
CONFIG_PCI_HYPERV_INTERFACE=m
|
||||
CONFIG_PCI_HYPERV=m
|
||||
# CONFIG_PCI_P2PDMA is not set
|
||||
CONFIG_XARRAY_MULTI=y
|
||||
CONFIG_ZONE_DEVICE=y
|
@ -1,10 +1,8 @@
|
||||
DIST linux-5.10.tar.xz 116606704 BLAKE2B b923d7b66309224f42f35f8a5fa219421b0a9362d2adacdadd8d96251f61f7230878ea297a269a7f3b3c56830f0b177e068691e1d7f88501a05653b0a13274d1 SHA512 95bc137d0cf9148da6a9d1f1a878698dc27b40f68e22c597544010a6c591ce1b256f083489d3ff45ff77753289b535135590194d88ef9f007d0ddab3d74de70e
|
||||
DIST linux-5.13.tar.xz 119297284 BLAKE2B 9c4c12e2394dec064adff51f7ccdf389192eb27ba7906db5eda543afe3d04afca6b9ea0848a057571bf2534eeb98e1e3a67734deff82c0d3731be205ad995668 SHA512 a8edf97e9d38a49f1be2bde1e29ad96274bb2c6f7e8a2bebaa1161dd4df9cabcbaec4ff644c45bee94f86ae47725087d6deed0cd954209cec717621d137db85e
|
||||
DIST linux-5.14.tar.xz 120669872 BLAKE2B 0047f5aaa3940dff97f4055ef544faafbbb5282128e6afe21d2f47d8dc8c395806a17016febfa050117d16f59e74b882cb8b9c5011d68f119c230d0a4d120524 SHA512 8e4f3ec3d36f774280f75dc7b004a43e09417af58f12e9c9f8348976659d4cfda7ad905f306f43fed66a27922e5c45db22e46bbfa7a0b9f365012380de3b6f64
|
||||
DIST linux-5.4.tar.xz 109441440 BLAKE2B 193bc4a3147e147d5529956164ec4912fad5d5c6fb07f909ff1056e57235834173194afc686993ccd785c1ff15804de0961b625f3008cca0e27493efc8f27b13 SHA512 9f60f77e8ab972b9438ac648bed17551c8491d6585a5e85f694b2eaa4c623fbc61eb18419b2656b6795eac5deec0edaa04547fc6723fbda52256bd7f3486898f
|
||||
DIST patch-5.10.53.xz 1821644 BLAKE2B af0e6aa0eb611e5ea81c6fb72525449e5619a519ab435d7d11b7ccc1253cbd63528a3dc314135aba0421e1fd48c5814a53aeaf5dda82bb2231b2e979f9c2211f SHA512 e0ab035f34ec7bfaec547c123efa6aa80ca3147b864cfd0bb46bdce95356dd076a75d22128cc0f78818ac5db24f2e64a2fe15c0ff1df4b040ac4d068354f10d9
|
||||
DIST patch-5.10.67.xz 2109232 BLAKE2B 78e3e1c7612058564b89d3787c17a25da12d92749a789cfc80e7981b4f4015b5e129c2692f78b208afcbcf01fafb1e107d8b71384e65edee0b82319f0debf6e4 SHA512 22f0833cfa60b47378bbb4422b36566adcb71085f61a6bbd5eabdd1cd0ab5db31821071591e92e057fc0f9fe46c7c1596d0ee2e9212a490eb6881ed534f3d703
|
||||
DIST patch-5.13.19.xz 917200 BLAKE2B 5f467e1bd880708e82971b6b1b586baab8b2fe77639a29df1a256317d6b894ea8cd78cb2b72da96e5fabf8bc96bf39dcdb366360af3586336ffcaf0aa57970c7 SHA512 1d3695ee5f623a0b27c4c9682541bf096a75310a4fb3a3d76b3c513f95b244679b4950040e9f1261dabfdd5cc908ba37a639556974f634fd4476f52ce5e5a573
|
||||
DIST patch-5.14.6.xz 262092 BLAKE2B 06c3b6c194d67e5a2c39c9b97799fb2f4e76071e058d62f29c1d2aa049980719bcc27deba445081b0e3d5fc6fc476ac722945214baf60fed672c417bd837a31c SHA512 9270e911d2a71dc9c284f95217c10fc3b3666d7e6c54ce3bb1b1d4f3c081d7ea5449e7ac645c60c18986531b4675291ba3808367f5630eb15adaee3de4e63d46
|
||||
DIST patch-5.10.68.xz 2132136 BLAKE2B e024d65db658ad254cad9e23df51e875cf3846f0c5743636ffdb0d8015e9e5ada58f9af041c0f234565f08b7ae79151632019e996f385b3bc46e9dd91f6b57fb SHA512 7112d28cb463b141ac4aa43555cb3f263aeab8436c72a502b6b513b5232c639ea644ce5f76d7d33264cc4092d34ac265ca4cf82e1b5f4b921ff311ca95289de7
|
||||
DIST patch-5.14.7.xz 308020 BLAKE2B 5c7c2c4552a70c249ae7b9bfccb2c9361bbc30189a402b9c9224b217bbaadf0f1cdc0fc24eb27701487cc2c5b0b77c9a5c789107a278df6135026d662da201ed SHA512 15ef2d99e132f44f825788dcddbab7fa9ea54185ccf605b85d892b66b4b5c4044e35618dad902d6c49b73ee3af2a7ca0a155f7550dfc1f8a420e3942a984ae2b
|
||||
DIST patch-5.4.124.xz 3006220 BLAKE2B 394645f0cf7898c98d416e93858b3effe171d5bdbc968bccd876c41de527ce0221331a06744cc081a05407d3b539d7ab83ae526ff1cc99e9e17629af7b968932 SHA512 9a8a5388d921c55a6f620f2da0528c4d0ed4487cfa58ac876b7b9625247860e3b25bbfcd39b4ae73f34c2d2b8a45b155a149613a650a1306bdab4bad57f8f9e9
|
||||
DIST patch-5.4.147.xz 3317496 BLAKE2B 61ece5ad65483e0e0ce5d92de8c465aad0b02a3ca2a51eb6e71ee84de90bf8d0490566539479f6bf458b012a9cfb8e2443cd901caa6cddb2468f0d401e80d1b9 SHA512 27b760758d605dccd7e2d9162d54dbd825c7a205a3b922a4343d6f4ed538b47a978a6244374e1308b151cc85aeeac2e6a9c5c8194d874fd2f3c39893f5afe1f4
|
||||
DIST patch-5.4.148.xz 3364936 BLAKE2B 9bdb44b36b1a2f53f23fb72c4740c1593200179fab0b0d22671be8661cbff73310891cb6b9d9488e1ce3d0f91733354f576b853bfad95d8360eef6d1fb902a00 SHA512 927ef1c41346c65bdfee4ed2de55a72407f5a13ecbc1cd571213000dd7aa4df6d2be294cf2f56cb4a1df613e9f274675b053c4a73b59ac069160f4403a246726
|
||||
|
@ -1,24 +0,0 @@
|
||||
# Copyright 1999-2015 Gentoo Foundation
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
# $Header: $
|
||||
|
||||
EAPI=7
|
||||
ETYPE="sources"
|
||||
|
||||
inherit calculate-kernel-8 eutils
|
||||
|
||||
DESCRIPTION="Calculate Linux kernel image"
|
||||
KEYWORDS="~amd64"
|
||||
HOMEPAGE="http://www.calculate-linux.org"
|
||||
|
||||
SRC_URI="${KERNEL_URI} ${ARCH_URI}"
|
||||
|
||||
IUSE="fsync uksm"
|
||||
|
||||
src_unpack() {
|
||||
calculate-kernel-8_src_unpack
|
||||
}
|
||||
|
||||
pkg_postinst() {
|
||||
calculate-kernel-8_pkg_postinst
|
||||
}
|
Loading…
Reference in new issue