2024-05-22 13:55:19

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 0/6] rds: rdma: Add ability to force GFP_NOIO

This series enables RDS and the RDMA stack to be used as a block I/O
device. This to support a filesystem on top of a raw block device
which uses RDS and the RDMA stack as the network transport layer.

Under intense memory pressure, we get memory reclaims. Assume the
filesystem reclaims memory, goes to the raw block device, which calls
into RDS, which calls the RDMA stack. Now, if regular GFP_KERNEL
allocations in RDS or the RDMA stack require reclaims to be fulfilled,
we end up in a circular dependency.

We break this circular dependency by:

1. Force all allocations in RDS and the relevant RDMA stack to use
GFP_NOIO, by means of a parenthetic use of
memalloc_noio_{save,restore} on all relevant entry points.

2. Make sure work-queues inherits current->flags
wrt. PF_MEMALLOC*, such that work executed on the
work-queue inherits the same flag(s).


Håkon Bugge (6):
workqueue: Inherit per-process allocation flags
rds: Brute force GFP_NOIO
RDMA/cma: Brute force GFP_NOIO
RDMA/cm: Brute force GFP_NOIO
RDMA/mlx5: Brute force GFP_NOIO
net/mlx5: Brute force GFP_NOIO

drivers/infiniband/core/cm.c | 15 ++++-
drivers/infiniband/core/cma.c | 20 ++++++-
drivers/infiniband/hw/mlx5/main.c | 22 +++++--
.../net/ethernet/mellanox/mlx5/core/main.c | 14 ++++-
include/linux/workqueue.h | 9 +++
kernel/workqueue.c | 60 +++++++++++++++++++
net/rds/af_rds.c | 59 +++++++++++++++++-
7 files changed, 187 insertions(+), 12 deletions(-)

--
2.31.1



2024-05-22 13:55:39

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 1/6] workqueue: Inherit per-process allocation flags

For drivers/modules running inside a memalloc_flags_{save,restore}
region, if a work-queue is created, we make sure work executed on the
work-queue inherits the same flag(s).

This in order to conditionally enable drivers to work aligned with
block I/O devices. This commit makes sure that any work queued later
on work-queues created during module initialization, when current's
flags has any of the PF_MEMALLOC* set, will inherit the same flags.

We do this in order to enable drivers to be used as a network block
I/O device. This in order to support XFS or other file-systems on top
of a raw block device which uses said drivers as the network transport
layer.

Under intense memory pressure, we get memory reclaims. Assume the
file-system reclaims memory, goes to the raw block device, which calls
into said drivers. Now, if regular GFP_KERNEL allocations in the
drivers require reclaims to be fulfilled, we end up in a circular
dependency.

We break this circular dependency by:

1. Force all allocations in the drivers to use GFP_NOIO, by means of a
parenthetic use of memalloc_flags_{save,restore} on all relevant
entry points, setting/clearing the PF_MEMALLOC_NOIO bit.

2. Make sure work-queues inherits current->flags
wrt. PF_MEMALLOC_NOIO, such that work executed on the
work-queue inherits the same flag(s). That is what this commit
contributes with.

Signed-off-by: Håkon Bugge <[email protected]>

---

v2 -> v3:
* Add support for all PF_MEMALLOC* flags
* Re-worded commit message

v1 -> v2:
* Added missing hunk in alloc_workqueue()
---
include/linux/workqueue.h | 9 ++++++
kernel/workqueue.c | 60 +++++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+)

diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
index fb39938945365..f8c87f824272b 100644
--- a/include/linux/workqueue.h
+++ b/include/linux/workqueue.h
@@ -406,9 +406,18 @@ enum wq_flags {
__WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */
__WQ_ORDERED = 1 << 17, /* internal: workqueue is ordered */
__WQ_LEGACY = 1 << 18, /* internal: create*_workqueue() */
+ __WQ_MEMALLOC = 1 << 19, /* internal: execute work with MEMALLOC */
+ __WQ_MEMALLOC_NOFS = 1 << 20, /* internal: execute work with MEMALLOC_NOFS */
+ __WQ_MEMALLOC_NOIO = 1 << 21, /* internal: execute work with MEMALLOC_NOIO */
+ __WQ_MEMALLOC_NORECLAIM = 1 << 22, /* internal: execute work with MEMALLOC_NORECLAIM */
+ __WQ_MEMALLOC_NOWARN = 1 << 23, /* internal: execute work with MEMALLOC_NOWARN */
+ __WQ_MEMALLOC_PIN = 1 << 24, /* internal: execute work with MEMALLOC_PIN */

/* BH wq only allows the following flags */
__WQ_BH_ALLOWS = WQ_BH | WQ_HIGHPRI,
+
+ __WQ_PF_MEMALLOC_MASK = PF_MEMALLOC | PF_MEMALLOC_NOFS | PF_MEMALLOC_NOIO |
+ PF_MEMALLOC_NORECLAIM | PF_MEMALLOC_NOWARN | PF_MEMALLOC_PIN,
};

enum wq_consts {
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 003474c9a77d0..28ed6b9556e91 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -51,6 +51,7 @@
#include <linux/uaccess.h>
#include <linux/sched/isolation.h>
#include <linux/sched/debug.h>
+#include <linux/sched/mm.h>
#include <linux/nmi.h>
#include <linux/kvm_para.h>
#include <linux/delay.h>
@@ -3113,6 +3114,28 @@ static bool manage_workers(struct worker *worker)
return true;
}

+static unsigned int wq_build_memalloc_flags(struct pool_workqueue *pwq)
+{
+ unsigned int pf_flags = 0;
+
+#define BUILD_PF_FLAGS_FROM_WQ(name) \
+ do { \
+ if (pwq->wq->flags & __WQ_ ## name) \
+ pf_flags |= PF_ ## name; \
+ } while (0)
+
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_NOFS);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_NOIO);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_NORECLAIM);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_NOWARN);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_PIN);
+
+#undef BUILD_PF_FLAGS_FROM_WQ
+
+ return pf_flags;
+}
+
/**
* process_one_work - process single work
* @worker: self
@@ -3136,6 +3159,8 @@ __acquires(&pool->lock)
unsigned long work_data;
int lockdep_start_depth, rcu_start_depth;
bool bh_draining = pool->flags & POOL_BH_DRAINING;
+ unsigned int memalloc_flags = wq_build_memalloc_flags(pwq);
+ unsigned int memalloc_flags_old;
#ifdef CONFIG_LOCKDEP
/*
* It is permissible to free the struct work_struct from
@@ -3148,6 +3173,10 @@ __acquires(&pool->lock)

lockdep_copy_map(&lockdep_map, &work->lockdep_map);
#endif
+ /* Set inherited alloc flags */
+ if (memalloc_flags)
+ memalloc_flags_old = memalloc_flags_save(memalloc_flags);
+
/* ensure we're on the correct CPU */
WARN_ON_ONCE(!(pool->flags & POOL_DISASSOCIATED) &&
raw_smp_processor_id() != pool->cpu);
@@ -3284,6 +3313,10 @@ __acquires(&pool->lock)

/* must be the last step, see the function comment */
pwq_dec_nr_in_flight(pwq, work_data);
+
+ /* Restore alloc flags */
+ if (memalloc_flags)
+ memalloc_flags_restore(memalloc_flags_old);
}

/**
@@ -5637,6 +5670,30 @@ static void wq_adjust_max_active(struct workqueue_struct *wq)
} while (activated);
}

+/**
+ * wq_set_memalloc_flags - Test current->flags for PF_MEMALLOC_FOO_BAR
+ * flag bits and set the corresponding __WQ_MEMALLOC_FOO_BAR in the
+ * WQ's flags variable.
+ * @flags_ptr: Pointer to wq->flags
+ */
+static void wq_set_memalloc_flags(unsigned int *flags_ptr)
+{
+#define TEST_PF_SET_WQ(name) \
+ do { \
+ if (current->flags & PF_ ## name) \
+ *flags_ptr |= __WQ_ ## name; \
+ } while (0)
+
+ TEST_PF_SET_WQ(MEMALLOC);
+ TEST_PF_SET_WQ(MEMALLOC_NOFS);
+ TEST_PF_SET_WQ(MEMALLOC_NOIO);
+ TEST_PF_SET_WQ(MEMALLOC_NORECLAIM);
+ TEST_PF_SET_WQ(MEMALLOC_NOWARN);
+ TEST_PF_SET_WQ(MEMALLOC_PIN);
+
+#undef TEST_PF_SET_WQ
+}
+
__printf(1, 4)
struct workqueue_struct *alloc_workqueue(const char *fmt,
unsigned int flags,
@@ -5695,6 +5752,9 @@ struct workqueue_struct *alloc_workqueue(const char *fmt,

/* init wq */
wq->flags = flags;
+ if (current->flags & __WQ_PF_MEMALLOC_MASK)
+ wq_set_memalloc_flags(&wq->flags);
+
wq->max_active = max_active;
wq->min_active = min(max_active, WQ_DFL_MIN_ACTIVE);
wq->saved_max_active = wq->max_active;
--
2.31.1


2024-05-22 13:56:04

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 3/6] RDMA/cma: Brute force GFP_NOIO

In cma_init(), we call memalloc_noio_{save,restore} in a parenthetic
fashion when enabled by the module parameter force_noio.

This in order to conditionally enable rdma_cm to work aligned with
block I/O devices. Any work queued later on work-queues created during
module initialization will inherit the PF_MEMALLOC_{NOIO,NOFS}
flag(s), due to commit ("workqueue: Inherit NOIO and NOFS alloc
flags").

We do this in order to enable ULPs using the RDMA stack to be used as
a network block I/O device. This to support a filesystem on top of a
raw block device which uses said ULP(s) and the RDMA stack as the
network transport layer.

Under intense memory pressure, we get memory reclaims. Assume the
filesystem reclaims memory, goes to the raw block device, which calls
into the ULP in question, which calls the RDMA stack. Now, if
regular GFP_KERNEL allocations in the ULP or the RDMA stack require
reclaims to be fulfilled, we end up in a circular dependency.

We break this circular dependency by:

1. Force all allocations in the ULP and the relevant RDMA stack to use
GFP_NOIO, by means of a parenthetic use of
memalloc_noio_{save,restore} on all relevant entry points.

2. Make sure work-queues inherits current->flags
wrt. PF_MEMALLOC_{NOIO,NOFS}, such that work executed on the
work-queue inherits the same flag(s).

Signed-off-by: Håkon Bugge <[email protected]>
---
drivers/infiniband/core/cma.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 64ace0b968f07..6e82c18aeebb8 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -50,6 +50,10 @@ MODULE_LICENSE("Dual BSD/GPL");
#define CMA_IBOE_PACKET_LIFETIME 16
#define CMA_PREFERRED_ROCE_GID_TYPE IB_GID_TYPE_ROCE_UDP_ENCAP

+static bool cma_force_noio;
+module_param_named(force_noio, cma_force_noio, bool, 0444);
+MODULE_PARM_DESC(force_noio, "Force the use of GFP_NOIO (Y/N)");
+
static const char * const cma_events[] = {
[RDMA_CM_EVENT_ADDR_RESOLVED] = "address resolved",
[RDMA_CM_EVENT_ADDR_ERROR] = "address error",
@@ -5426,6 +5430,10 @@ static struct pernet_operations cma_pernet_operations = {
static int __init cma_init(void)
{
int ret;
+ unsigned int noio_flags;
+
+ if (cma_force_noio)
+ noio_flags = memalloc_noio_save();

/*
* There is a rare lock ordering dependency in cma_netdev_callback()
@@ -5441,8 +5449,10 @@ static int __init cma_init(void)
}

cma_wq = alloc_ordered_workqueue("rdma_cm", WQ_MEM_RECLAIM);
- if (!cma_wq)
- return -ENOMEM;
+ if (!cma_wq) {
+ ret = -ENOMEM;
+ goto out;
+ }

ret = register_pernet_subsys(&cma_pernet_operations);
if (ret)
@@ -5460,7 +5470,8 @@ static int __init cma_init(void)
if (ret)
goto err_ib;

- return 0;
+ ret = 0;
+ goto out;

err_ib:
ib_unregister_client(&cma_client);
@@ -5471,6 +5482,9 @@ static int __init cma_init(void)
unregister_pernet_subsys(&cma_pernet_operations);
err_wq:
destroy_workqueue(cma_wq);
+out:
+ if (cma_force_noio)
+ memalloc_noio_restore(noio_flags);
return ret;
}

--
2.31.1


2024-05-22 13:56:08

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 2/6] rds: Brute force GFP_NOIO

For most entry points to RDS, we call memalloc_noio_{save,restore} in
a parenthetic fashion when enabled by the module parameter force_noio.

We skip the calls to memalloc_noio_{save,restore} in rds_ioctl(), as
no memory allocations are executed in this function or its callees.

The reason we execute memalloc_noio_{save,restore} in rds_poll(), is
due to the following call chain:

rds_poll()
poll_wait()
__pollwait()
poll_get_entry()
__get_free_page(GFP_KERNEL)

The function rds_setsockopt() allocates memory in its callee's
rds_get_mr() and rds_get_mr_for_dest(). Hence, we need
memalloc_noio_{save,restore} in rds_setsockopt().

In rds_getsockopt(), we have rds_info_getsockopt() that allocates
memory. Hence, we need memalloc_noio_{save,restore} in
rds_getsockopt().

All the above, in order to conditionally enable RDS to become a block I/O
device.

Signed-off-by: Håkon Bugge <[email protected]>

---

v1 -> v2:
* s/EXPORT_SYMBOL/static/ for the rds_force_noio variable as
pin-pointed by Simon
* Straightened the reverse xmas tree two places
* Fixed C/P error in rds_cancel_sent_to() where I had two _save()s
and no _restore() as reported by Simon
---
net/rds/af_rds.c | 59 +++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 56 insertions(+), 3 deletions(-)

diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c
index 8435a20968ef5..846ad20b3783a 100644
--- a/net/rds/af_rds.c
+++ b/net/rds/af_rds.c
@@ -37,10 +37,15 @@
#include <linux/in.h>
#include <linux/ipv6.h>
#include <linux/poll.h>
+#include <linux/sched/mm.h>
#include <net/sock.h>

#include "rds.h"

+static bool rds_force_noio;
+module_param_named(force_noio, rds_force_noio, bool, 0444);
+MODULE_PARM_DESC(force_noio, "Force the use of GFP_NOIO (Y/N)");
+
/* this is just used for stats gathering :/ */
static DEFINE_SPINLOCK(rds_sock_lock);
static unsigned long rds_sock_count;
@@ -59,8 +64,12 @@ DECLARE_WAIT_QUEUE_HEAD(rds_poll_waitq);
static int rds_release(struct socket *sock)
{
struct sock *sk = sock->sk;
+ unsigned int noio_flags;
struct rds_sock *rs;

+ if (rds_force_noio)
+ noio_flags = memalloc_noio_save();
+
if (!sk)
goto out;

@@ -90,6 +99,8 @@ static int rds_release(struct socket *sock)
sock->sk = NULL;
sock_put(sk);
out:
+ if (rds_force_noio)
+ memalloc_noio_restore(noio_flags);
return 0;
}

@@ -214,9 +225,13 @@ static __poll_t rds_poll(struct file *file, struct socket *sock,
{
struct sock *sk = sock->sk;
struct rds_sock *rs = rds_sk_to_rs(sk);
+ unsigned int noio_flags;
__poll_t mask = 0;
unsigned long flags;

+ if (rds_force_noio)
+ noio_flags = memalloc_noio_save();
+
poll_wait(file, sk_sleep(sk), wait);

if (rs->rs_seen_congestion)
@@ -249,6 +264,8 @@ static __poll_t rds_poll(struct file *file, struct socket *sock,
if (mask)
rs->rs_seen_congestion = 0;

+ if (rds_force_noio)
+ memalloc_noio_restore(noio_flags);
return mask;
}

@@ -293,9 +310,13 @@ static int rds_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
static int rds_cancel_sent_to(struct rds_sock *rs, sockptr_t optval, int len)
{
struct sockaddr_in6 sin6;
+ unsigned int noio_flags;
struct sockaddr_in sin;
int ret = 0;

+ if (rds_force_noio)
+ noio_flags = memalloc_noio_save();
+
/* racing with another thread binding seems ok here */
if (ipv6_addr_any(&rs->rs_bound_addr)) {
ret = -ENOTCONN; /* XXX not a great errno */
@@ -324,6 +345,8 @@ static int rds_cancel_sent_to(struct rds_sock *rs, sockptr_t optval, int len)

rds_send_drop_to(rs, &sin6);
out:
+ if (rds_force_noio)
+ memalloc_noio_restore(noio_flags);
return ret;
}

@@ -485,8 +508,12 @@ static int rds_getsockopt(struct socket *sock, int level, int optname,
{
struct rds_sock *rs = rds_sk_to_rs(sock->sk);
int ret = -ENOPROTOOPT, len;
+ unsigned int noio_flags;
int trans;

+ if (rds_force_noio)
+ noio_flags = memalloc_noio_save();
+
if (level != SOL_RDS)
goto out;

@@ -529,6 +556,8 @@ static int rds_getsockopt(struct socket *sock, int level, int optname,
}

out:
+ if (rds_force_noio)
+ memalloc_noio_restore(noio_flags);
return ret;

}
@@ -538,12 +567,16 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
{
struct sock *sk = sock->sk;
struct sockaddr_in *sin;
+ unsigned int noio_flags;
struct rds_sock *rs = rds_sk_to_rs(sk);
int ret = 0;

if (addr_len < offsetofend(struct sockaddr, sa_family))
return -EINVAL;

+ if (rds_force_noio)
+ noio_flags = memalloc_noio_save();
+
lock_sock(sk);

switch (uaddr->sa_family) {
@@ -626,6 +659,8 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
}

release_sock(sk);
+ if (rds_force_noio)
+ memalloc_noio_restore(noio_flags);
return ret;
}

@@ -697,16 +732,28 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol)
static int rds_create(struct net *net, struct socket *sock, int protocol,
int kern)
{
+ unsigned int noio_flags;
struct sock *sk;
+ int ret;

if (sock->type != SOCK_SEQPACKET || protocol)
return -ESOCKTNOSUPPORT;

+ if (rds_force_noio)
+ noio_flags = memalloc_noio_save();
+
sk = sk_alloc(net, AF_RDS, GFP_KERNEL, &rds_proto, kern);
- if (!sk)
- return -ENOMEM;
+ if (!sk) {
+ ret = -ENOMEM;
+ goto out;
+ }

- return __rds_create(sock, sk, protocol);
+ ret = __rds_create(sock, sk, protocol);
+out:
+ if (rds_force_noio)
+ memalloc_noio_restore(noio_flags);
+
+ return ret;
}

void rds_sock_addref(struct rds_sock *rs)
@@ -895,8 +942,12 @@ u32 rds_gen_num;

static int __init rds_init(void)
{
+ unsigned int noio_flags;
int ret;

+ if (rds_force_noio)
+ noio_flags = memalloc_noio_save();
+
net_get_random_once(&rds_gen_num, sizeof(rds_gen_num));

ret = rds_bind_lock_init();
@@ -947,6 +998,8 @@ static int __init rds_init(void)
out_bind:
rds_bind_lock_destroy();
out:
+ if (rds_force_noio)
+ memalloc_noio_restore(noio_flags);
return ret;
}
module_init(rds_init);
--
2.31.1


2024-05-22 13:56:20

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 3/6] ml: adjusting build metadata to reflect mainline

From: Luci Bot <[email protected]>

Updating defaults to reflect that this is a mainline build

Signed-off-by: Luci Bot <[email protected]>
Reviewed-by: Mark Nicholson <[email protected]>
---
ml-rpm/ol8/{kernel-uek.spec => kernel-mainline.spec} | 2 +-
ml-rpm/ol9/{kernel-uek.spec => kernel-mainline.spec} | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
rename ml-rpm/ol8/{kernel-uek.spec => kernel-mainline.spec} (99%)
rename ml-rpm/ol9/{kernel-uek.spec => kernel-mainline.spec} (99%)

diff --git a/ml-rpm/ol8/kernel-uek.spec b/ml-rpm/ol8/kernel-mainline.spec
similarity index 99%
rename from ml-rpm/ol8/kernel-uek.spec
rename to ml-rpm/ol8/kernel-mainline.spec
index e9a4e07f43fe7..ed47eb0706a87 100644
--- a/ml-rpm/ol8/kernel-uek.spec
+++ b/ml-rpm/ol8/kernel-mainline.spec
@@ -388,7 +388,7 @@ Summary: Oracle Unbreakable Enterprise Kernel Release 8
%define kernel_prereq coreutils, systemd >= 203-2, /usr/bin/kernel-install
%define initrd_prereq dracut >= 027

-%define variant %{?build_variant:%{build_variant}}%{!?build_variant:-luci}
+%define variant %{?build_variant:%{build_variant}}%{!?build_variant:-mainline}

%define installonly_variant_name kernel%{?build_variant:%{build_variant}}%{!?build_variant:-luci}

diff --git a/ml-rpm/ol9/kernel-uek.spec b/ml-rpm/ol9/kernel-mainline.spec
similarity index 99%
rename from ml-rpm/ol9/kernel-uek.spec
rename to ml-rpm/ol9/kernel-mainline.spec
index 0b494c7cf567c..0eb7d20043ed0 100644
--- a/ml-rpm/ol9/kernel-uek.spec
+++ b/ml-rpm/ol9/kernel-mainline.spec
@@ -361,7 +361,7 @@ Summary: Oracle Unbreakable Enterprise Kernel Release 8
%define kernel_prereq coreutils, systemd >= 203-2, /usr/bin/kernel-install
%define initrd_prereq dracut >= 027

-%define variant %{?build_variant:%{build_variant}}%{!?build_variant:-luci}
+%define variant %{?build_variant:%{build_variant}}%{!?build_variant:-mainline}

%define installonly_variant_name kernel%{?build_variant:%{build_variant}}%{!?build_variant:-luci}

--
2.31.1


2024-05-22 13:56:59

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 1/6] Orabug_list: Drop 36459425

From: luci <[email protected]>

Build fix for 6.9 LUCI

Signed-off-by: Luci Bot <[email protected]>
---
uek-rpm/.Orabug_list | 1 +
1 file changed, 1 insertion(+)

diff --git a/uek-rpm/.Orabug_list b/uek-rpm/.Orabug_list
index c5b31288c668c..7becf1b0a9be7 100644
--- a/uek-rpm/.Orabug_list
+++ b/uek-rpm/.Orabug_list
@@ -2,3 +2,4 @@
34116060 # LUCI Maintainer: Disable OpenSSL 3.0 warnings for v5.18
35455153 # [UEK-NEXT] Manage Original OL Signing Keys
35641429 # Add uek_kabi.h to LUCI and update check-kabi scripts
+36459425 # Build fix for 6.9 LUCI
--
2.31.1


2024-05-22 13:57:42

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 4/6] RDMA/cm: Brute force GFP_NOIO

In ib_cm_init(), we call memalloc_noio_{save,restore} in a parenthetic
fashion when enabled by the module parameter force_noio.

This in order to conditionally enable ib_cm to work aligned with block
I/O devices. Any work queued later on work-queues created during
module initialization will inherit the PF_MEMALLOC_{NOIO,NOFS}
flag(s), due to commit ("workqueue: Inherit NOIO and NOFS alloc
flags").

We do this in order to enable ULPs using the RDMA stack to be used as
a network block I/O device. This to support a filesystem on top of a
raw block device which uses said ULP(s) and the RDMA stack as the
network transport layer.

Under intense memory pressure, we get memory reclaims. Assume the
filesystem reclaims memory, goes to the raw block device, which calls
into the ULP in question, which calls the RDMA stack. Now, if regular
GFP_KERNEL allocations in ULP or the RDMA stack require reclaims to be
fulfilled, we end up in a circular dependency.

We break this circular dependency by:

1. Force all allocations in the ULP and the relevant RDMA stack to use
GFP_NOIO, by means of a parenthetic use of
memalloc_noio_{save,restore} on all relevant entry points.

2. Make sure work-queues inherits current->flags
wrt. PF_MEMALLOC_{NOIO,NOFS}, such that work executed on the
work-queue inherits the same flag(s).

Signed-off-by: Håkon Bugge <[email protected]>
---
drivers/infiniband/core/cm.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 07fb8d3c037f0..767eec38eb57d 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -22,6 +22,7 @@
#include <linux/workqueue.h>
#include <linux/kdev_t.h>
#include <linux/etherdevice.h>
+#include <linux/sched/mm.h>

#include <rdma/ib_cache.h>
#include <rdma/ib_cm.h>
@@ -35,6 +36,11 @@ MODULE_DESCRIPTION("InfiniBand CM");
MODULE_LICENSE("Dual BSD/GPL");

#define CM_DESTROY_ID_WAIT_TIMEOUT 10000 /* msecs */
+
+static bool cm_force_noio;
+module_param_named(force_noio, cm_force_noio, bool, 0444);
+MODULE_PARM_DESC(force_noio, "Force the use of GFP_NOIO (Y/N)");
+
static const char * const ibcm_rej_reason_strs[] = {
[IB_CM_REJ_NO_QP] = "no QP",
[IB_CM_REJ_NO_EEC] = "no EEC",
@@ -4504,6 +4510,10 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)
static int __init ib_cm_init(void)
{
int ret;
+ unsigned int noio_flags;
+
+ if (cm_force_noio)
+ noio_flags = memalloc_noio_save();

INIT_LIST_HEAD(&cm.device_list);
rwlock_init(&cm.device_lock);
@@ -4527,10 +4537,13 @@ static int __init ib_cm_init(void)
if (ret)
goto error3;

- return 0;
+ goto error2;
error3:
destroy_workqueue(cm.wq);
error2:
+ if (cm_force_noio)
+ memalloc_noio_restore(noio_flags);
+
return ret;
}

--
2.31.1


2024-05-22 13:57:45

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 4/6] ml: Remove revocation list

From: Luci Bot <[email protected]>

Remove revocation list

Signed-off-by: Luci Bot <[email protected]>
Reviewed-by: Mark Nicholson <[email protected]>
---
ml-rpm/ol8/config-aarch64 | 2 --
ml-rpm/ol8/config-aarch64-container | 2 --
ml-rpm/ol8/config-aarch64-debug | 2 --
ml-rpm/ol8/config-aarch64-emb3 | 2 --
ml-rpm/ol8/config-aarch64-emb3-debug | 2 --
ml-rpm/ol8/config-x86_64 | 2 --
ml-rpm/ol8/config-x86_64-debug | 2 --
ml-rpm/ol9/config-aarch64 | 2 --
ml-rpm/ol9/config-aarch64-container | 2 --
ml-rpm/ol9/config-aarch64-debug | 2 --
ml-rpm/ol9/config-x86_64 | 2 --
ml-rpm/ol9/config-x86_64-debug | 2 --
12 files changed, 24 deletions(-)

diff --git a/ml-rpm/ol8/config-aarch64 b/ml-rpm/ol8/config-aarch64
index a4df0eba125b6..37d717c5a8d33 100644
--- a/ml-rpm/ol8/config-aarch64
+++ b/ml-rpm/ol8/config-aarch64
@@ -2981,8 +2981,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_SWIOTLB_DYNAMIC=y
CONFIG_DMA_RESTRICTED_POOL=y
CONFIG_DMA_NUMA_CMA=y
diff --git a/ml-rpm/ol8/config-aarch64-container b/ml-rpm/ol8/config-aarch64-container
index d793781f15e3d..0fe9d3ff00c24 100644
--- a/ml-rpm/ol8/config-aarch64-container
+++ b/ml-rpm/ol8/config-aarch64-container
@@ -804,8 +804,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_CORDIC=y
CONFIG_SWIOTLB_DYNAMIC=y
CONFIG_DMA_RESTRICTED_POOL=y
diff --git a/ml-rpm/ol8/config-aarch64-debug b/ml-rpm/ol8/config-aarch64-debug
index c32292309a83b..c53800d995e55 100644
--- a/ml-rpm/ol8/config-aarch64-debug
+++ b/ml-rpm/ol8/config-aarch64-debug
@@ -2982,8 +2982,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_SWIOTLB_DYNAMIC=y
CONFIG_DMA_RESTRICTED_POOL=y
CONFIG_DMA_NUMA_CMA=y
diff --git a/ml-rpm/ol8/config-aarch64-emb3 b/ml-rpm/ol8/config-aarch64-emb3
index 1cf1cc181a2a5..f3242c8fd1526 100644
--- a/ml-rpm/ol8/config-aarch64-emb3
+++ b/ml-rpm/ol8/config-aarch64-emb3
@@ -2295,8 +2295,6 @@ CONFIG_SYSTEM_TRUSTED_KEYS="certs/ol_signing_keys.pem"
CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_CORDIC=m
CONFIG_DMA_RESTRICTED_POOL=y
CONFIG_DMA_CMA=y
diff --git a/ml-rpm/ol8/config-aarch64-emb3-debug b/ml-rpm/ol8/config-aarch64-emb3-debug
index 39835c5ea13a6..b67b24f5f4128 100644
--- a/ml-rpm/ol8/config-aarch64-emb3-debug
+++ b/ml-rpm/ol8/config-aarch64-emb3-debug
@@ -2295,8 +2295,6 @@ CONFIG_SYSTEM_TRUSTED_KEYS="certs/ol_signing_keys.pem"
CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_CORDIC=m
CONFIG_DMA_RESTRICTED_POOL=y
CONFIG_DMA_CMA=y
diff --git a/ml-rpm/ol8/config-x86_64 b/ml-rpm/ol8/config-x86_64
index 6fcf000a07e99..3b64dd1e4d726 100644
--- a/ml-rpm/ol8/config-x86_64
+++ b/ml-rpm/ol8/config-x86_64
@@ -2844,8 +2844,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_CRC16=y
CONFIG_CRC_T10DIF=y
CONFIG_SWIOTLB_DYNAMIC=y
diff --git a/ml-rpm/ol8/config-x86_64-debug b/ml-rpm/ol8/config-x86_64-debug
index 6f416ab81a59f..c7e44a1771a2e 100644
--- a/ml-rpm/ol8/config-x86_64-debug
+++ b/ml-rpm/ol8/config-x86_64-debug
@@ -2864,8 +2864,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_CRC16=y
CONFIG_CRC_T10DIF=y
CONFIG_RANDOM32_SELFTEST=y
diff --git a/ml-rpm/ol9/config-aarch64 b/ml-rpm/ol9/config-aarch64
index 3b5feccf3fac6..52016234394da 100644
--- a/ml-rpm/ol9/config-aarch64
+++ b/ml-rpm/ol9/config-aarch64
@@ -2984,8 +2984,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_SWIOTLB_DYNAMIC=y
CONFIG_DMA_RESTRICTED_POOL=y
CONFIG_DMA_NUMA_CMA=y
diff --git a/ml-rpm/ol9/config-aarch64-container b/ml-rpm/ol9/config-aarch64-container
index 3a32908836299..10aab8ae56a80 100644
--- a/ml-rpm/ol9/config-aarch64-container
+++ b/ml-rpm/ol9/config-aarch64-container
@@ -818,8 +818,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_CORDIC=y
CONFIG_SWIOTLB_DYNAMIC=y
CONFIG_DMA_RESTRICTED_POOL=y
diff --git a/ml-rpm/ol9/config-aarch64-debug b/ml-rpm/ol9/config-aarch64-debug
index a263556e04956..6efe07685e993 100644
--- a/ml-rpm/ol9/config-aarch64-debug
+++ b/ml-rpm/ol9/config-aarch64-debug
@@ -2985,8 +2985,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_SWIOTLB_DYNAMIC=y
CONFIG_DMA_RESTRICTED_POOL=y
CONFIG_DMA_NUMA_CMA=y
diff --git a/ml-rpm/ol9/config-x86_64 b/ml-rpm/ol9/config-x86_64
index fefc2541cb166..dc72342bc78ce 100644
--- a/ml-rpm/ol9/config-x86_64
+++ b/ml-rpm/ol9/config-x86_64
@@ -2836,8 +2836,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_CRC16=y
CONFIG_CRC_T10DIF=y
CONFIG_SWIOTLB_DYNAMIC=y
diff --git a/ml-rpm/ol9/config-x86_64-debug b/ml-rpm/ol9/config-x86_64-debug
index 358b2ab724b04..fb67da8c1c03e 100644
--- a/ml-rpm/ol9/config-x86_64-debug
+++ b/ml-rpm/ol9/config-x86_64-debug
@@ -2856,8 +2856,6 @@ CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=8192
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
-CONFIG_SYSTEM_REVOCATION_LIST=y
-CONFIG_SYSTEM_REVOCATION_KEYS="certs/ol_revocation_keys.pem"
CONFIG_CRC16=y
CONFIG_CRC_T10DIF=y
CONFIG_RANDOM32_SELFTEST=y
--
2.31.1


2024-05-22 13:58:04

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 2/6] ml: renaming metadata directory

From: Luci Bot <[email protected]>

Adjusting the metadata directory name to match the legacy mainline system

Signed-off-by: Luci Bot <[email protected]>
Reviewed-by: Mark Nicholson <[email protected]>
---
{uek-rpm => ml-rpm}/ol8/Module.kabi_aarch64 | 0
{uek-rpm => ml-rpm}/ol8/Module.kabi_aarch64debug | 0
{uek-rpm => ml-rpm}/ol8/Module.kabi_x86_64 | 0
{uek-rpm => ml-rpm}/ol8/Module.kabi_x86_64debug | 0
{uek-rpm => ml-rpm}/ol8/Symtypes.kabi_aarch64 | 0
{uek-rpm => ml-rpm}/ol8/Symtypes.kabi_aarch64debug | 0
{uek-rpm => ml-rpm}/ol8/Symtypes.kabi_x86_64 | 0
{uek-rpm => ml-rpm}/ol8/Symtypes.kabi_x86_64debug | 0
{uek-rpm => ml-rpm}/ol8/check-kabi | 0
{uek-rpm => ml-rpm}/ol8/config-aarch64 | 0
{uek-rpm => ml-rpm}/ol8/config-aarch64-container | 0
{uek-rpm => ml-rpm}/ol8/config-aarch64-debug | 0
{uek-rpm => ml-rpm}/ol8/config-aarch64-emb3 | 0
{uek-rpm => ml-rpm}/ol8/config-aarch64-emb3-debug | 0
{uek-rpm => ml-rpm}/ol8/config-x86_64 | 0
{uek-rpm => ml-rpm}/ol8/config-x86_64-container | 0
{uek-rpm => ml-rpm}/ol8/config-x86_64-debug | 0
{uek-rpm => ml-rpm}/ol8/core-emb3-aarch64.list | 0
{uek-rpm => ml-rpm}/ol8/filter-aarch64.sh | 0
{uek-rpm => ml-rpm}/ol8/filter-modules.sh | 0
{uek-rpm => ml-rpm}/ol8/filter-x86_64.sh | 0
{uek-rpm => ml-rpm}/ol8/find-provides | 0
{uek-rpm => ml-rpm}/ol8/generate_bls_conf.sh | 0
{uek-rpm => ml-rpm}/ol8/kabi_lockedlist_aarch64 | 0
.../ol8/kabi_lockedlist_aarch64debug | 0
{uek-rpm => ml-rpm}/ol8/kabi_lockedlist_x86_64 | 0
{uek-rpm => ml-rpm}/ol8/kabi_lockedlist_x86_64debug | 0
{uek-rpm => ml-rpm}/ol8/kabitool | 0
{uek-rpm => ml-rpm}/ol8/kernel-uek.spec | 0
{uek-rpm => ml-rpm}/ol8/mod-denylist.sh | 0
{uek-rpm => ml-rpm}/ol8/mod-extra.list | 0
{uek-rpm => ml-rpm}/ol8/mod-sign.sh | 0
{uek-rpm => ml-rpm}/ol8/modules-core-aarch64.list | 0
{uek-rpm => ml-rpm}/ol8/modules-core-x86_64.list | 0
{uek-rpm => ml-rpm}/ol8/perf | 0
{uek-rpm => ml-rpm}/ol8/secureboot.cer | Bin
{uek-rpm => ml-rpm}/ol8/secureboot_aarch64.cer | Bin
{uek-rpm => ml-rpm}/ol8/securebootca.cer | Bin
{uek-rpm => ml-rpm}/ol8/turbostat | 0
{uek-rpm => ml-rpm}/ol8/update-el-aarch64 | 0
{uek-rpm => ml-rpm}/ol8/update-el-x86 | 0
{uek-rpm => ml-rpm}/ol8/x509.genkey | 0
{uek-rpm => ml-rpm}/ol8/x86_energy_perf_policy | 0
{uek-rpm => ml-rpm}/ol9/Module.kabi_aarch64 | 0
{uek-rpm => ml-rpm}/ol9/Module.kabi_aarch64debug | 0
{uek-rpm => ml-rpm}/ol9/Module.kabi_x86_64 | 0
{uek-rpm => ml-rpm}/ol9/Module.kabi_x86_64debug | 0
{uek-rpm => ml-rpm}/ol9/Symtypes.kabi_aarch64 | 0
{uek-rpm => ml-rpm}/ol9/Symtypes.kabi_aarch64debug | 0
{uek-rpm => ml-rpm}/ol9/Symtypes.kabi_x86_64 | 0
{uek-rpm => ml-rpm}/ol9/Symtypes.kabi_x86_64debug | 0
{uek-rpm => ml-rpm}/ol9/check-kabi | 0
{uek-rpm => ml-rpm}/ol9/config-aarch64 | 0
{uek-rpm => ml-rpm}/ol9/config-aarch64-container | 0
{uek-rpm => ml-rpm}/ol9/config-aarch64-debug | 0
{uek-rpm => ml-rpm}/ol9/config-x86_64 | 0
{uek-rpm => ml-rpm}/ol9/config-x86_64-container | 0
{uek-rpm => ml-rpm}/ol9/config-x86_64-debug | 0
{uek-rpm => ml-rpm}/ol9/filter-aarch64.sh | 0
{uek-rpm => ml-rpm}/ol9/filter-modules.sh | 0
{uek-rpm => ml-rpm}/ol9/filter-x86_64.sh | 0
{uek-rpm => ml-rpm}/ol9/find-provides | 0
{uek-rpm => ml-rpm}/ol9/generate_bls_conf.sh | 0
{uek-rpm => ml-rpm}/ol9/kabi_lockedlist_aarch64 | 0
.../ol9/kabi_lockedlist_aarch64debug | 0
{uek-rpm => ml-rpm}/ol9/kabi_lockedlist_x86_64 | 0
{uek-rpm => ml-rpm}/ol9/kabi_lockedlist_x86_64debug | 0
{uek-rpm => ml-rpm}/ol9/kabitool | 0
{uek-rpm => ml-rpm}/ol9/kernel-uek.spec | 0
{uek-rpm => ml-rpm}/ol9/mod-denylist.sh | 0
{uek-rpm => ml-rpm}/ol9/mod-extra.list | 0
{uek-rpm => ml-rpm}/ol9/mod-sign.sh | 0
{uek-rpm => ml-rpm}/ol9/modules-core-aarch64.list | 0
{uek-rpm => ml-rpm}/ol9/modules-core-x86_64.list | 0
{uek-rpm => ml-rpm}/ol9/perf | 0
{uek-rpm => ml-rpm}/ol9/secureboot.cer | Bin
{uek-rpm => ml-rpm}/ol9/secureboot_aarch64.cer | Bin
{uek-rpm => ml-rpm}/ol9/securebootca.cer | Bin
{uek-rpm => ml-rpm}/ol9/turbostat | 0
{uek-rpm => ml-rpm}/ol9/update-el-aarch64 | 0
{uek-rpm => ml-rpm}/ol9/update-el-x86 | 0
{uek-rpm => ml-rpm}/ol9/x509.genkey | 0
{uek-rpm => ml-rpm}/ol9/x86_energy_perf_policy | 0
{uek-rpm => ml-rpm}/tools/kabi | 0
uek-rpm/.Orabug_list | 5 -----
85 files changed, 5 deletions(-)
rename {uek-rpm => ml-rpm}/ol8/Module.kabi_aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol8/Module.kabi_aarch64debug (100%)
rename {uek-rpm => ml-rpm}/ol8/Module.kabi_x86_64 (100%)
rename {uek-rpm => ml-rpm}/ol8/Module.kabi_x86_64debug (100%)
rename {uek-rpm => ml-rpm}/ol8/Symtypes.kabi_aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol8/Symtypes.kabi_aarch64debug (100%)
rename {uek-rpm => ml-rpm}/ol8/Symtypes.kabi_x86_64 (100%)
rename {uek-rpm => ml-rpm}/ol8/Symtypes.kabi_x86_64debug (100%)
rename {uek-rpm => ml-rpm}/ol8/check-kabi (100%)
rename {uek-rpm => ml-rpm}/ol8/config-aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol8/config-aarch64-container (100%)
rename {uek-rpm => ml-rpm}/ol8/config-aarch64-debug (100%)
rename {uek-rpm => ml-rpm}/ol8/config-aarch64-emb3 (100%)
rename {uek-rpm => ml-rpm}/ol8/config-aarch64-emb3-debug (100%)
rename {uek-rpm => ml-rpm}/ol8/config-x86_64 (100%)
rename {uek-rpm => ml-rpm}/ol8/config-x86_64-container (100%)
rename {uek-rpm => ml-rpm}/ol8/config-x86_64-debug (100%)
rename {uek-rpm => ml-rpm}/ol8/core-emb3-aarch64.list (100%)
rename {uek-rpm => ml-rpm}/ol8/filter-aarch64.sh (100%)
rename {uek-rpm => ml-rpm}/ol8/filter-modules.sh (100%)
rename {uek-rpm => ml-rpm}/ol8/filter-x86_64.sh (100%)
rename {uek-rpm => ml-rpm}/ol8/find-provides (100%)
rename {uek-rpm => ml-rpm}/ol8/generate_bls_conf.sh (100%)
rename {uek-rpm => ml-rpm}/ol8/kabi_lockedlist_aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol8/kabi_lockedlist_aarch64debug (100%)
rename {uek-rpm => ml-rpm}/ol8/kabi_lockedlist_x86_64 (100%)
rename {uek-rpm => ml-rpm}/ol8/kabi_lockedlist_x86_64debug (100%)
rename {uek-rpm => ml-rpm}/ol8/kabitool (100%)
rename {uek-rpm => ml-rpm}/ol8/kernel-uek.spec (100%)
rename {uek-rpm => ml-rpm}/ol8/mod-denylist.sh (100%)
rename {uek-rpm => ml-rpm}/ol8/mod-extra.list (100%)
rename {uek-rpm => ml-rpm}/ol8/mod-sign.sh (100%)
rename {uek-rpm => ml-rpm}/ol8/modules-core-aarch64.list (100%)
rename {uek-rpm => ml-rpm}/ol8/modules-core-x86_64.list (100%)
rename {uek-rpm => ml-rpm}/ol8/perf (100%)
rename {uek-rpm => ml-rpm}/ol8/secureboot.cer (100%)
rename {uek-rpm => ml-rpm}/ol8/secureboot_aarch64.cer (100%)
rename {uek-rpm => ml-rpm}/ol8/securebootca.cer (100%)
rename {uek-rpm => ml-rpm}/ol8/turbostat (100%)
rename {uek-rpm => ml-rpm}/ol8/update-el-aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol8/update-el-x86 (100%)
rename {uek-rpm => ml-rpm}/ol8/x509.genkey (100%)
rename {uek-rpm => ml-rpm}/ol8/x86_energy_perf_policy (100%)
rename {uek-rpm => ml-rpm}/ol9/Module.kabi_aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol9/Module.kabi_aarch64debug (100%)
rename {uek-rpm => ml-rpm}/ol9/Module.kabi_x86_64 (100%)
rename {uek-rpm => ml-rpm}/ol9/Module.kabi_x86_64debug (100%)
rename {uek-rpm => ml-rpm}/ol9/Symtypes.kabi_aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol9/Symtypes.kabi_aarch64debug (100%)
rename {uek-rpm => ml-rpm}/ol9/Symtypes.kabi_x86_64 (100%)
rename {uek-rpm => ml-rpm}/ol9/Symtypes.kabi_x86_64debug (100%)
rename {uek-rpm => ml-rpm}/ol9/check-kabi (100%)
rename {uek-rpm => ml-rpm}/ol9/config-aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol9/config-aarch64-container (100%)
rename {uek-rpm => ml-rpm}/ol9/config-aarch64-debug (100%)
rename {uek-rpm => ml-rpm}/ol9/config-x86_64 (100%)
rename {uek-rpm => ml-rpm}/ol9/config-x86_64-container (100%)
rename {uek-rpm => ml-rpm}/ol9/config-x86_64-debug (100%)
rename {uek-rpm => ml-rpm}/ol9/filter-aarch64.sh (100%)
rename {uek-rpm => ml-rpm}/ol9/filter-modules.sh (100%)
rename {uek-rpm => ml-rpm}/ol9/filter-x86_64.sh (100%)
rename {uek-rpm => ml-rpm}/ol9/find-provides (100%)
rename {uek-rpm => ml-rpm}/ol9/generate_bls_conf.sh (100%)
rename {uek-rpm => ml-rpm}/ol9/kabi_lockedlist_aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol9/kabi_lockedlist_aarch64debug (100%)
rename {uek-rpm => ml-rpm}/ol9/kabi_lockedlist_x86_64 (100%)
rename {uek-rpm => ml-rpm}/ol9/kabi_lockedlist_x86_64debug (100%)
rename {uek-rpm => ml-rpm}/ol9/kabitool (100%)
rename {uek-rpm => ml-rpm}/ol9/kernel-uek.spec (100%)
rename {uek-rpm => ml-rpm}/ol9/mod-denylist.sh (100%)
rename {uek-rpm => ml-rpm}/ol9/mod-extra.list (100%)
rename {uek-rpm => ml-rpm}/ol9/mod-sign.sh (100%)
rename {uek-rpm => ml-rpm}/ol9/modules-core-aarch64.list (100%)
rename {uek-rpm => ml-rpm}/ol9/modules-core-x86_64.list (100%)
rename {uek-rpm => ml-rpm}/ol9/perf (100%)
rename {uek-rpm => ml-rpm}/ol9/secureboot.cer (100%)
rename {uek-rpm => ml-rpm}/ol9/secureboot_aarch64.cer (100%)
rename {uek-rpm => ml-rpm}/ol9/securebootca.cer (100%)
rename {uek-rpm => ml-rpm}/ol9/turbostat (100%)
rename {uek-rpm => ml-rpm}/ol9/update-el-aarch64 (100%)
rename {uek-rpm => ml-rpm}/ol9/update-el-x86 (100%)
rename {uek-rpm => ml-rpm}/ol9/x509.genkey (100%)
rename {uek-rpm => ml-rpm}/ol9/x86_energy_perf_policy (100%)
rename {uek-rpm => ml-rpm}/tools/kabi (100%)
delete mode 100644 uek-rpm/.Orabug_list

diff --git a/uek-rpm/ol8/Module.kabi_aarch64 b/ml-rpm/ol8/Module.kabi_aarch64
similarity index 100%
rename from uek-rpm/ol8/Module.kabi_aarch64
rename to ml-rpm/ol8/Module.kabi_aarch64
diff --git a/uek-rpm/ol8/Module.kabi_aarch64debug b/ml-rpm/ol8/Module.kabi_aarch64debug
similarity index 100%
rename from uek-rpm/ol8/Module.kabi_aarch64debug
rename to ml-rpm/ol8/Module.kabi_aarch64debug
diff --git a/uek-rpm/ol8/Module.kabi_x86_64 b/ml-rpm/ol8/Module.kabi_x86_64
similarity index 100%
rename from uek-rpm/ol8/Module.kabi_x86_64
rename to ml-rpm/ol8/Module.kabi_x86_64
diff --git a/uek-rpm/ol8/Module.kabi_x86_64debug b/ml-rpm/ol8/Module.kabi_x86_64debug
similarity index 100%
rename from uek-rpm/ol8/Module.kabi_x86_64debug
rename to ml-rpm/ol8/Module.kabi_x86_64debug
diff --git a/uek-rpm/ol8/Symtypes.kabi_aarch64 b/ml-rpm/ol8/Symtypes.kabi_aarch64
similarity index 100%
rename from uek-rpm/ol8/Symtypes.kabi_aarch64
rename to ml-rpm/ol8/Symtypes.kabi_aarch64
diff --git a/uek-rpm/ol8/Symtypes.kabi_aarch64debug b/ml-rpm/ol8/Symtypes.kabi_aarch64debug
similarity index 100%
rename from uek-rpm/ol8/Symtypes.kabi_aarch64debug
rename to ml-rpm/ol8/Symtypes.kabi_aarch64debug
diff --git a/uek-rpm/ol8/Symtypes.kabi_x86_64 b/ml-rpm/ol8/Symtypes.kabi_x86_64
similarity index 100%
rename from uek-rpm/ol8/Symtypes.kabi_x86_64
rename to ml-rpm/ol8/Symtypes.kabi_x86_64
diff --git a/uek-rpm/ol8/Symtypes.kabi_x86_64debug b/ml-rpm/ol8/Symtypes.kabi_x86_64debug
similarity index 100%
rename from uek-rpm/ol8/Symtypes.kabi_x86_64debug
rename to ml-rpm/ol8/Symtypes.kabi_x86_64debug
diff --git a/uek-rpm/ol8/check-kabi b/ml-rpm/ol8/check-kabi
similarity index 100%
rename from uek-rpm/ol8/check-kabi
rename to ml-rpm/ol8/check-kabi
diff --git a/uek-rpm/ol8/config-aarch64 b/ml-rpm/ol8/config-aarch64
similarity index 100%
rename from uek-rpm/ol8/config-aarch64
rename to ml-rpm/ol8/config-aarch64
diff --git a/uek-rpm/ol8/config-aarch64-container b/ml-rpm/ol8/config-aarch64-container
similarity index 100%
rename from uek-rpm/ol8/config-aarch64-container
rename to ml-rpm/ol8/config-aarch64-container
diff --git a/uek-rpm/ol8/config-aarch64-debug b/ml-rpm/ol8/config-aarch64-debug
similarity index 100%
rename from uek-rpm/ol8/config-aarch64-debug
rename to ml-rpm/ol8/config-aarch64-debug
diff --git a/uek-rpm/ol8/config-aarch64-emb3 b/ml-rpm/ol8/config-aarch64-emb3
similarity index 100%
rename from uek-rpm/ol8/config-aarch64-emb3
rename to ml-rpm/ol8/config-aarch64-emb3
diff --git a/uek-rpm/ol8/config-aarch64-emb3-debug b/ml-rpm/ol8/config-aarch64-emb3-debug
similarity index 100%
rename from uek-rpm/ol8/config-aarch64-emb3-debug
rename to ml-rpm/ol8/config-aarch64-emb3-debug
diff --git a/uek-rpm/ol8/config-x86_64 b/ml-rpm/ol8/config-x86_64
similarity index 100%
rename from uek-rpm/ol8/config-x86_64
rename to ml-rpm/ol8/config-x86_64
diff --git a/uek-rpm/ol8/config-x86_64-container b/ml-rpm/ol8/config-x86_64-container
similarity index 100%
rename from uek-rpm/ol8/config-x86_64-container
rename to ml-rpm/ol8/config-x86_64-container
diff --git a/uek-rpm/ol8/config-x86_64-debug b/ml-rpm/ol8/config-x86_64-debug
similarity index 100%
rename from uek-rpm/ol8/config-x86_64-debug
rename to ml-rpm/ol8/config-x86_64-debug
diff --git a/uek-rpm/ol8/core-emb3-aarch64.list b/ml-rpm/ol8/core-emb3-aarch64.list
similarity index 100%
rename from uek-rpm/ol8/core-emb3-aarch64.list
rename to ml-rpm/ol8/core-emb3-aarch64.list
diff --git a/uek-rpm/ol8/filter-aarch64.sh b/ml-rpm/ol8/filter-aarch64.sh
similarity index 100%
rename from uek-rpm/ol8/filter-aarch64.sh
rename to ml-rpm/ol8/filter-aarch64.sh
diff --git a/uek-rpm/ol8/filter-modules.sh b/ml-rpm/ol8/filter-modules.sh
similarity index 100%
rename from uek-rpm/ol8/filter-modules.sh
rename to ml-rpm/ol8/filter-modules.sh
diff --git a/uek-rpm/ol8/filter-x86_64.sh b/ml-rpm/ol8/filter-x86_64.sh
similarity index 100%
rename from uek-rpm/ol8/filter-x86_64.sh
rename to ml-rpm/ol8/filter-x86_64.sh
diff --git a/uek-rpm/ol8/find-provides b/ml-rpm/ol8/find-provides
similarity index 100%
rename from uek-rpm/ol8/find-provides
rename to ml-rpm/ol8/find-provides
diff --git a/uek-rpm/ol8/generate_bls_conf.sh b/ml-rpm/ol8/generate_bls_conf.sh
similarity index 100%
rename from uek-rpm/ol8/generate_bls_conf.sh
rename to ml-rpm/ol8/generate_bls_conf.sh
diff --git a/uek-rpm/ol8/kabi_lockedlist_aarch64 b/ml-rpm/ol8/kabi_lockedlist_aarch64
similarity index 100%
rename from uek-rpm/ol8/kabi_lockedlist_aarch64
rename to ml-rpm/ol8/kabi_lockedlist_aarch64
diff --git a/uek-rpm/ol8/kabi_lockedlist_aarch64debug b/ml-rpm/ol8/kabi_lockedlist_aarch64debug
similarity index 100%
rename from uek-rpm/ol8/kabi_lockedlist_aarch64debug
rename to ml-rpm/ol8/kabi_lockedlist_aarch64debug
diff --git a/uek-rpm/ol8/kabi_lockedlist_x86_64 b/ml-rpm/ol8/kabi_lockedlist_x86_64
similarity index 100%
rename from uek-rpm/ol8/kabi_lockedlist_x86_64
rename to ml-rpm/ol8/kabi_lockedlist_x86_64
diff --git a/uek-rpm/ol8/kabi_lockedlist_x86_64debug b/ml-rpm/ol8/kabi_lockedlist_x86_64debug
similarity index 100%
rename from uek-rpm/ol8/kabi_lockedlist_x86_64debug
rename to ml-rpm/ol8/kabi_lockedlist_x86_64debug
diff --git a/uek-rpm/ol8/kabitool b/ml-rpm/ol8/kabitool
similarity index 100%
rename from uek-rpm/ol8/kabitool
rename to ml-rpm/ol8/kabitool
diff --git a/uek-rpm/ol8/kernel-uek.spec b/ml-rpm/ol8/kernel-uek.spec
similarity index 100%
rename from uek-rpm/ol8/kernel-uek.spec
rename to ml-rpm/ol8/kernel-uek.spec
diff --git a/uek-rpm/ol8/mod-denylist.sh b/ml-rpm/ol8/mod-denylist.sh
similarity index 100%
rename from uek-rpm/ol8/mod-denylist.sh
rename to ml-rpm/ol8/mod-denylist.sh
diff --git a/uek-rpm/ol8/mod-extra.list b/ml-rpm/ol8/mod-extra.list
similarity index 100%
rename from uek-rpm/ol8/mod-extra.list
rename to ml-rpm/ol8/mod-extra.list
diff --git a/uek-rpm/ol8/mod-sign.sh b/ml-rpm/ol8/mod-sign.sh
similarity index 100%
rename from uek-rpm/ol8/mod-sign.sh
rename to ml-rpm/ol8/mod-sign.sh
diff --git a/uek-rpm/ol8/modules-core-aarch64.list b/ml-rpm/ol8/modules-core-aarch64.list
similarity index 100%
rename from uek-rpm/ol8/modules-core-aarch64.list
rename to ml-rpm/ol8/modules-core-aarch64.list
diff --git a/uek-rpm/ol8/modules-core-x86_64.list b/ml-rpm/ol8/modules-core-x86_64.list
similarity index 100%
rename from uek-rpm/ol8/modules-core-x86_64.list
rename to ml-rpm/ol8/modules-core-x86_64.list
diff --git a/uek-rpm/ol8/perf b/ml-rpm/ol8/perf
similarity index 100%
rename from uek-rpm/ol8/perf
rename to ml-rpm/ol8/perf
diff --git a/uek-rpm/ol8/secureboot.cer b/ml-rpm/ol8/secureboot.cer
similarity index 100%
rename from uek-rpm/ol8/secureboot.cer
rename to ml-rpm/ol8/secureboot.cer
diff --git a/uek-rpm/ol8/secureboot_aarch64.cer b/ml-rpm/ol8/secureboot_aarch64.cer
similarity index 100%
rename from uek-rpm/ol8/secureboot_aarch64.cer
rename to ml-rpm/ol8/secureboot_aarch64.cer
diff --git a/uek-rpm/ol8/securebootca.cer b/ml-rpm/ol8/securebootca.cer
similarity index 100%
rename from uek-rpm/ol8/securebootca.cer
rename to ml-rpm/ol8/securebootca.cer
diff --git a/uek-rpm/ol8/turbostat b/ml-rpm/ol8/turbostat
similarity index 100%
rename from uek-rpm/ol8/turbostat
rename to ml-rpm/ol8/turbostat
diff --git a/uek-rpm/ol8/update-el-aarch64 b/ml-rpm/ol8/update-el-aarch64
similarity index 100%
rename from uek-rpm/ol8/update-el-aarch64
rename to ml-rpm/ol8/update-el-aarch64
diff --git a/uek-rpm/ol8/update-el-x86 b/ml-rpm/ol8/update-el-x86
similarity index 100%
rename from uek-rpm/ol8/update-el-x86
rename to ml-rpm/ol8/update-el-x86
diff --git a/uek-rpm/ol8/x509.genkey b/ml-rpm/ol8/x509.genkey
similarity index 100%
rename from uek-rpm/ol8/x509.genkey
rename to ml-rpm/ol8/x509.genkey
diff --git a/uek-rpm/ol8/x86_energy_perf_policy b/ml-rpm/ol8/x86_energy_perf_policy
similarity index 100%
rename from uek-rpm/ol8/x86_energy_perf_policy
rename to ml-rpm/ol8/x86_energy_perf_policy
diff --git a/uek-rpm/ol9/Module.kabi_aarch64 b/ml-rpm/ol9/Module.kabi_aarch64
similarity index 100%
rename from uek-rpm/ol9/Module.kabi_aarch64
rename to ml-rpm/ol9/Module.kabi_aarch64
diff --git a/uek-rpm/ol9/Module.kabi_aarch64debug b/ml-rpm/ol9/Module.kabi_aarch64debug
similarity index 100%
rename from uek-rpm/ol9/Module.kabi_aarch64debug
rename to ml-rpm/ol9/Module.kabi_aarch64debug
diff --git a/uek-rpm/ol9/Module.kabi_x86_64 b/ml-rpm/ol9/Module.kabi_x86_64
similarity index 100%
rename from uek-rpm/ol9/Module.kabi_x86_64
rename to ml-rpm/ol9/Module.kabi_x86_64
diff --git a/uek-rpm/ol9/Module.kabi_x86_64debug b/ml-rpm/ol9/Module.kabi_x86_64debug
similarity index 100%
rename from uek-rpm/ol9/Module.kabi_x86_64debug
rename to ml-rpm/ol9/Module.kabi_x86_64debug
diff --git a/uek-rpm/ol9/Symtypes.kabi_aarch64 b/ml-rpm/ol9/Symtypes.kabi_aarch64
similarity index 100%
rename from uek-rpm/ol9/Symtypes.kabi_aarch64
rename to ml-rpm/ol9/Symtypes.kabi_aarch64
diff --git a/uek-rpm/ol9/Symtypes.kabi_aarch64debug b/ml-rpm/ol9/Symtypes.kabi_aarch64debug
similarity index 100%
rename from uek-rpm/ol9/Symtypes.kabi_aarch64debug
rename to ml-rpm/ol9/Symtypes.kabi_aarch64debug
diff --git a/uek-rpm/ol9/Symtypes.kabi_x86_64 b/ml-rpm/ol9/Symtypes.kabi_x86_64
similarity index 100%
rename from uek-rpm/ol9/Symtypes.kabi_x86_64
rename to ml-rpm/ol9/Symtypes.kabi_x86_64
diff --git a/uek-rpm/ol9/Symtypes.kabi_x86_64debug b/ml-rpm/ol9/Symtypes.kabi_x86_64debug
similarity index 100%
rename from uek-rpm/ol9/Symtypes.kabi_x86_64debug
rename to ml-rpm/ol9/Symtypes.kabi_x86_64debug
diff --git a/uek-rpm/ol9/check-kabi b/ml-rpm/ol9/check-kabi
similarity index 100%
rename from uek-rpm/ol9/check-kabi
rename to ml-rpm/ol9/check-kabi
diff --git a/uek-rpm/ol9/config-aarch64 b/ml-rpm/ol9/config-aarch64
similarity index 100%
rename from uek-rpm/ol9/config-aarch64
rename to ml-rpm/ol9/config-aarch64
diff --git a/uek-rpm/ol9/config-aarch64-container b/ml-rpm/ol9/config-aarch64-container
similarity index 100%
rename from uek-rpm/ol9/config-aarch64-container
rename to ml-rpm/ol9/config-aarch64-container
diff --git a/uek-rpm/ol9/config-aarch64-debug b/ml-rpm/ol9/config-aarch64-debug
similarity index 100%
rename from uek-rpm/ol9/config-aarch64-debug
rename to ml-rpm/ol9/config-aarch64-debug
diff --git a/uek-rpm/ol9/config-x86_64 b/ml-rpm/ol9/config-x86_64
similarity index 100%
rename from uek-rpm/ol9/config-x86_64
rename to ml-rpm/ol9/config-x86_64
diff --git a/uek-rpm/ol9/config-x86_64-container b/ml-rpm/ol9/config-x86_64-container
similarity index 100%
rename from uek-rpm/ol9/config-x86_64-container
rename to ml-rpm/ol9/config-x86_64-container
diff --git a/uek-rpm/ol9/config-x86_64-debug b/ml-rpm/ol9/config-x86_64-debug
similarity index 100%
rename from uek-rpm/ol9/config-x86_64-debug
rename to ml-rpm/ol9/config-x86_64-debug
diff --git a/uek-rpm/ol9/filter-aarch64.sh b/ml-rpm/ol9/filter-aarch64.sh
similarity index 100%
rename from uek-rpm/ol9/filter-aarch64.sh
rename to ml-rpm/ol9/filter-aarch64.sh
diff --git a/uek-rpm/ol9/filter-modules.sh b/ml-rpm/ol9/filter-modules.sh
similarity index 100%
rename from uek-rpm/ol9/filter-modules.sh
rename to ml-rpm/ol9/filter-modules.sh
diff --git a/uek-rpm/ol9/filter-x86_64.sh b/ml-rpm/ol9/filter-x86_64.sh
similarity index 100%
rename from uek-rpm/ol9/filter-x86_64.sh
rename to ml-rpm/ol9/filter-x86_64.sh
diff --git a/uek-rpm/ol9/find-provides b/ml-rpm/ol9/find-provides
similarity index 100%
rename from uek-rpm/ol9/find-provides
rename to ml-rpm/ol9/find-provides
diff --git a/uek-rpm/ol9/generate_bls_conf.sh b/ml-rpm/ol9/generate_bls_conf.sh
similarity index 100%
rename from uek-rpm/ol9/generate_bls_conf.sh
rename to ml-rpm/ol9/generate_bls_conf.sh
diff --git a/uek-rpm/ol9/kabi_lockedlist_aarch64 b/ml-rpm/ol9/kabi_lockedlist_aarch64
similarity index 100%
rename from uek-rpm/ol9/kabi_lockedlist_aarch64
rename to ml-rpm/ol9/kabi_lockedlist_aarch64
diff --git a/uek-rpm/ol9/kabi_lockedlist_aarch64debug b/ml-rpm/ol9/kabi_lockedlist_aarch64debug
similarity index 100%
rename from uek-rpm/ol9/kabi_lockedlist_aarch64debug
rename to ml-rpm/ol9/kabi_lockedlist_aarch64debug
diff --git a/uek-rpm/ol9/kabi_lockedlist_x86_64 b/ml-rpm/ol9/kabi_lockedlist_x86_64
similarity index 100%
rename from uek-rpm/ol9/kabi_lockedlist_x86_64
rename to ml-rpm/ol9/kabi_lockedlist_x86_64
diff --git a/uek-rpm/ol9/kabi_lockedlist_x86_64debug b/ml-rpm/ol9/kabi_lockedlist_x86_64debug
similarity index 100%
rename from uek-rpm/ol9/kabi_lockedlist_x86_64debug
rename to ml-rpm/ol9/kabi_lockedlist_x86_64debug
diff --git a/uek-rpm/ol9/kabitool b/ml-rpm/ol9/kabitool
similarity index 100%
rename from uek-rpm/ol9/kabitool
rename to ml-rpm/ol9/kabitool
diff --git a/uek-rpm/ol9/kernel-uek.spec b/ml-rpm/ol9/kernel-uek.spec
similarity index 100%
rename from uek-rpm/ol9/kernel-uek.spec
rename to ml-rpm/ol9/kernel-uek.spec
diff --git a/uek-rpm/ol9/mod-denylist.sh b/ml-rpm/ol9/mod-denylist.sh
similarity index 100%
rename from uek-rpm/ol9/mod-denylist.sh
rename to ml-rpm/ol9/mod-denylist.sh
diff --git a/uek-rpm/ol9/mod-extra.list b/ml-rpm/ol9/mod-extra.list
similarity index 100%
rename from uek-rpm/ol9/mod-extra.list
rename to ml-rpm/ol9/mod-extra.list
diff --git a/uek-rpm/ol9/mod-sign.sh b/ml-rpm/ol9/mod-sign.sh
similarity index 100%
rename from uek-rpm/ol9/mod-sign.sh
rename to ml-rpm/ol9/mod-sign.sh
diff --git a/uek-rpm/ol9/modules-core-aarch64.list b/ml-rpm/ol9/modules-core-aarch64.list
similarity index 100%
rename from uek-rpm/ol9/modules-core-aarch64.list
rename to ml-rpm/ol9/modules-core-aarch64.list
diff --git a/uek-rpm/ol9/modules-core-x86_64.list b/ml-rpm/ol9/modules-core-x86_64.list
similarity index 100%
rename from uek-rpm/ol9/modules-core-x86_64.list
rename to ml-rpm/ol9/modules-core-x86_64.list
diff --git a/uek-rpm/ol9/perf b/ml-rpm/ol9/perf
similarity index 100%
rename from uek-rpm/ol9/perf
rename to ml-rpm/ol9/perf
diff --git a/uek-rpm/ol9/secureboot.cer b/ml-rpm/ol9/secureboot.cer
similarity index 100%
rename from uek-rpm/ol9/secureboot.cer
rename to ml-rpm/ol9/secureboot.cer
diff --git a/uek-rpm/ol9/secureboot_aarch64.cer b/ml-rpm/ol9/secureboot_aarch64.cer
similarity index 100%
rename from uek-rpm/ol9/secureboot_aarch64.cer
rename to ml-rpm/ol9/secureboot_aarch64.cer
diff --git a/uek-rpm/ol9/securebootca.cer b/ml-rpm/ol9/securebootca.cer
similarity index 100%
rename from uek-rpm/ol9/securebootca.cer
rename to ml-rpm/ol9/securebootca.cer
diff --git a/uek-rpm/ol9/turbostat b/ml-rpm/ol9/turbostat
similarity index 100%
rename from uek-rpm/ol9/turbostat
rename to ml-rpm/ol9/turbostat
diff --git a/uek-rpm/ol9/update-el-aarch64 b/ml-rpm/ol9/update-el-aarch64
similarity index 100%
rename from uek-rpm/ol9/update-el-aarch64
rename to ml-rpm/ol9/update-el-aarch64
diff --git a/uek-rpm/ol9/update-el-x86 b/ml-rpm/ol9/update-el-x86
similarity index 100%
rename from uek-rpm/ol9/update-el-x86
rename to ml-rpm/ol9/update-el-x86
diff --git a/uek-rpm/ol9/x509.genkey b/ml-rpm/ol9/x509.genkey
similarity index 100%
rename from uek-rpm/ol9/x509.genkey
rename to ml-rpm/ol9/x509.genkey
diff --git a/uek-rpm/ol9/x86_energy_perf_policy b/ml-rpm/ol9/x86_energy_perf_policy
similarity index 100%
rename from uek-rpm/ol9/x86_energy_perf_policy
rename to ml-rpm/ol9/x86_energy_perf_policy
diff --git a/uek-rpm/tools/kabi b/ml-rpm/tools/kabi
similarity index 100%
rename from uek-rpm/tools/kabi
rename to ml-rpm/tools/kabi
diff --git a/uek-rpm/.Orabug_list b/uek-rpm/.Orabug_list
deleted file mode 100644
index 7becf1b0a9be7..0000000000000
--- a/uek-rpm/.Orabug_list
+++ /dev/null
@@ -1,5 +0,0 @@
-31961009 # [UEK-NEXT] kexec allows kernel whose signature is in the dbx to be booted
-34116060 # LUCI Maintainer: Disable OpenSSL 3.0 warnings for v5.18
-35455153 # [UEK-NEXT] Manage Original OL Signing Keys
-35641429 # Add uek_kabi.h to LUCI and update check-kabi scripts
-36459425 # Build fix for 6.9 LUCI
--
2.31.1


2024-05-22 13:58:16

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 5/6] ml: Add ol_signing_keys.pem in certs dir

From: Luci Bot <[email protected]>

ol_signing_keys.pem is copied in certs directory

Signed-off-by: Luci Bot <[email protected]>
Reviewed-by: Mark Nicholson <[email protected]>
---
ml-rpm/ol8/kernel-mainline.spec | 11 +++++++++++
ml-rpm/ol9/kernel-mainline.spec | 11 +++++++++++
2 files changed, 22 insertions(+)

diff --git a/ml-rpm/ol8/kernel-mainline.spec b/ml-rpm/ol8/kernel-mainline.spec
index ed47eb0706a87..8487d522984a3 100644
--- a/ml-rpm/ol8/kernel-mainline.spec
+++ b/ml-rpm/ol8/kernel-mainline.spec
@@ -483,6 +483,7 @@ BuildConflicts: rpm < 4.13.0.1-19
Source0: linux-%{kversion}.tar.bz2

%if %{signkernel}%{signmodules}
+Source9: ol_signing_keys.pem
Source10: x509.genkey
%endif

@@ -1110,6 +1111,11 @@ BuildContainerKernel() {
perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = ${ExtraVer}/" Makefile

make %{?make_opts} mrproper
+
+%if %{signkernel}%{signmodules}
+ cp %{SOURCE10} %{SOURCE9} certs/.
+%endif
+
cp configs/config-container .config

make %{?make_opts} ARCH=$Arch %{?_kernel_cc} olddefconfig > /dev/null
@@ -1159,6 +1165,11 @@ BuildKernel() {

make %{?make_opts} mrproper

+%if %{signkernel}%{signmodules}
+ cp %{SOURCE10} %{SOURCE9} certs/.
+%endif
+
+
%if %{signkernel}%{signmodules}
cp %{SOURCE10} certs/.
%endif
diff --git a/ml-rpm/ol9/kernel-mainline.spec b/ml-rpm/ol9/kernel-mainline.spec
index 0eb7d20043ed0..6a84976f01632 100644
--- a/ml-rpm/ol9/kernel-mainline.spec
+++ b/ml-rpm/ol9/kernel-mainline.spec
@@ -458,6 +458,7 @@ BuildConflicts: rpm < 4.13.0.1-19
Source0: linux-%{kversion}.tar.bz2

%if %{signkernel}%{signmodules}
+Source9: ol_signing_keys.pem
Source10: x509.genkey
%endif

@@ -1072,6 +1073,11 @@ BuildContainerKernel() {
perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = ${ExtraVer}/" Makefile

make %{?make_opts} mrproper
+
+%if %{signkernel}%{signmodules}
+ cp %{SOURCE10} %{SOURCE9} certs/.
+%endif
+
cp configs/config-container .config

make %{?make_opts} ARCH=$Arch %{?_kernel_cc} olddefconfig > /dev/null
@@ -1121,6 +1127,11 @@ BuildKernel() {

make %{?make_opts} mrproper

+%if %{signkernel}%{signmodules}
+ cp %{SOURCE10} %{SOURCE9} certs/.
+%endif
+
+
%if %{signkernel}%{signmodules}
cp %{SOURCE10} certs/.
%endif
--
2.31.1


2024-05-22 13:58:32

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 5/6] RDMA/mlx5: Brute force GFP_NOIO

In mlx5_ib_init(), we call memalloc_noio_{save,restore} in a parenthetic
fashion when enabled by the module parameter force_noio.

This in order to conditionally enable mlx5_ib to work aligned with
I/O devices. Any work queued later on work-queues created during
module initialization will inherit the PF_MEMALLOC_{NOIO,NOFS}
flag(s), due to commit ("workqueue: Inherit NOIO and NOFS alloc
flags").

We do this in order to enable ULPs using the RDMA stack and the
mlx5_ib driver to be used as a network block I/O device. This to
support a filesystem on top of a raw block device which uses said
ULP(s) and the RDMA stack as the network transport layer.

Under intense memory pressure, we get memory reclaims. Assume the
filesystem reclaims memory, goes to the raw block device, which calls
into the ULP in question, which calls the RDMA stack. Now, if regular
GFP_KERNEL allocations in ULP or the RDMA stack require reclaims to be
fulfilled, we end up in a circular dependency.

We break this circular dependency by:

1. Force all allocations in the ULP and the relevant RDMA stack to use
GFP_NOIO, by means of a parenthetic use of
memalloc_noio_{save,restore} on all relevant entry points.

2. Make sure work-queues inherits current->flags
wrt. PF_MEMALLOC_{NOIO,NOFS}, such that work executed on the
work-queue inherits the same flag(s).

Signed-off-by: Håkon Bugge <[email protected]>
---
drivers/infiniband/hw/mlx5/main.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 2366c46eebc87..d47ef7d48f492 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -56,6 +56,10 @@ MODULE_AUTHOR("Eli Cohen <[email protected]>");
MODULE_DESCRIPTION("Mellanox 5th generation network adapters (ConnectX series) IB driver");
MODULE_LICENSE("Dual BSD/GPL");

+static bool mlx5_ib_force_noio;
+module_param_named(force_noio, mlx5_ib_force_noio, bool, 0444);
+MODULE_PARM_DESC(force_noio, "Force the use of GFP_NOIO (Y/N)");
+
struct mlx5_ib_event_work {
struct work_struct work;
union {
@@ -4488,16 +4492,23 @@ static struct auxiliary_driver mlx5r_driver = {

static int __init mlx5_ib_init(void)
{
+ unsigned int noio_flags;
int ret;

+ if (mlx5_ib_force_noio)
+ noio_flags = memalloc_noio_save();
+
xlt_emergency_page = (void *)__get_free_page(GFP_KERNEL);
- if (!xlt_emergency_page)
- return -ENOMEM;
+ if (!xlt_emergency_page) {
+ ret = -ENOMEM;
+ goto out;
+ }

mlx5_ib_event_wq = alloc_ordered_workqueue("mlx5_ib_event_wq", 0);
if (!mlx5_ib_event_wq) {
free_page((unsigned long)xlt_emergency_page);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto out;
}

ret = mlx5_ib_qp_event_init();
@@ -4514,7 +4525,7 @@ static int __init mlx5_ib_init(void)
ret = auxiliary_driver_register(&mlx5r_driver);
if (ret)
goto drv_err;
- return 0;
+ goto out;

drv_err:
auxiliary_driver_unregister(&mlx5r_mp_driver);
@@ -4525,6 +4536,9 @@ static int __init mlx5_ib_init(void)
qp_event_err:
destroy_workqueue(mlx5_ib_event_wq);
free_page((unsigned long)xlt_emergency_page);
+out:
+ if (mlx5_ib_force_noio)
+ memalloc_noio_restore(noio_flags);
return ret;
}

--
2.31.1


2024-05-22 13:59:00

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 6/6] net/mlx5: Brute force GFP_NOIO

In mlx5_core_init(), we call memalloc_noio_{save,restore} in a parenthetic
fashion when enabled by the module parameter force_noio.

This in order to conditionally enable mlx5_core to work aligned with
I/O devices. Any work queued later on work-queues created during
module initialization will inherit the PF_MEMALLOC_{NOIO,NOFS}
flag(s), due to commit ("workqueue: Inherit NOIO and NOFS alloc
flags").

We do this in order to enable ULPs using the RDMA stack and the
mlx5_core driver to be used as a network block I/O device. This to
support a filesystem on top of a raw block device which uses said
ULP(s) and the RDMA stack as the network transport layer.

Under intense memory pressure, we get memory reclaims. Assume the
filesystem reclaims memory, goes to the raw block device, which calls
into the ULP in question, which calls the RDMA stack. Now, if regular
GFP_KERNEL allocations in ULP or the RDMA stack require reclaims to be
fulfilled, we end up in a circular dependency.

We break this circular dependency by:

1. Force all allocations in the ULP and the relevant RDMA stack to use
GFP_NOIO, by means of a parenthetic use of
memalloc_noio_{save,restore} on all relevant entry points.

2. Make sure work-queues inherits current->flags
wrt. PF_MEMALLOC_{NOIO,NOFS}, such that work executed on the
work-queue inherits the same flag(s).

Signed-off-by: Håkon Bugge <[email protected]>
---
drivers/net/ethernet/mellanox/mlx5/core/main.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index 6574c145dc1e2..66cef64a82c61 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -48,6 +48,7 @@
#include <linux/mlx5/vport.h>
#include <linux/version.h>
#include <net/devlink.h>
+#include <linux/sched/mm.h>
#include "mlx5_core.h"
#include "lib/eq.h"
#include "fs_core.h"
@@ -87,6 +88,10 @@ static unsigned int prof_sel = MLX5_DEFAULT_PROF;
module_param_named(prof_sel, prof_sel, uint, 0444);
MODULE_PARM_DESC(prof_sel, "profile selector. Valid range 0 - 2");

+static bool mlx5_core_force_noio;
+module_param_named(force_noio, mlx5_core_force_noio, bool, 0444);
+MODULE_PARM_DESC(force_noio, "Force the use of GFP_NOIO (Y/N)");
+
static u32 sw_owner_id[4];
#define MAX_SW_VHCA_ID (BIT(__mlx5_bit_sz(cmd_hca_cap_2, sw_vhca_id)) - 1)
static DEFINE_IDA(sw_vhca_ida);
@@ -2308,8 +2313,12 @@ static void mlx5_core_verify_params(void)

static int __init mlx5_init(void)
{
+ unsigned int noio_flags;
int err;

+ if (mlx5_core_force_noio)
+ noio_flags = memalloc_noio_save();
+
WARN_ONCE(strcmp(MLX5_ADEV_NAME, KBUILD_MODNAME),
"mlx5_core name not in sync with kernel module name");

@@ -2330,7 +2339,7 @@ static int __init mlx5_init(void)
if (err)
goto err_pci;

- return 0;
+ goto out;

err_pci:
mlx5_sf_driver_unregister();
@@ -2338,6 +2347,9 @@ static int __init mlx5_init(void)
mlx5e_cleanup();
err_debug:
mlx5_unregister_debugfs();
+out:
+ if (mlx5_core_force_noio)
+ memalloc_noio_restore(noio_flags);
return err;
}

--
2.31.1


2024-05-22 13:59:16

by Haakon Bugge

[permalink] [raw]
Subject: [PATCH v3 6/6] workqueue: Inherit per-process allocation flags

For drivers/modules running inside a memalloc_flags_{save,restore}
region, if a work-queue is created, we make sure work executed on the
work-queue inherits the same flag(s).

This in order to conditionally enable drivers to work aligned with
block I/O devices. This commit makes sure that any work queued later
on work-queues created during module initialization, when current's
flags has any of the PF_MEMALLOC* set, will inherit the same flags.

We do this in order to enable drivers to be used as a network block
I/O device. This in order to support XFS or other file-systems on top
of a raw block device which uses said drivers as the network transport
layer.

Under intense memory pressure, we get memory reclaims. Assume the
file-system reclaims memory, goes to the raw block device, which calls
into said drivers. Now, if regular GFP_KERNEL allocations in the
drivers require reclaims to be fulfilled, we end up in a circular
dependency.

We break this circular dependency by:

1. Force all allocations in the drivers to use GFP_NOIO, by means of a
parenthetic use of memalloc_flags_{save,restore} on all relevant
entry points, setting/clearing the PF_MEMALLOC_NOIO bit.

2. Make sure work-queues inherits current->flags
wrt. PF_MEMALLOC_NOIO, such that work executed on the
work-queue inherits the same flag(s). That is what this commit
contributes with.

Signed-off-by: Håkon Bugge <[email protected]>

---

v2 -> v3:
* Add support for all PF_MEMALLOC* flags
* Re-worded commit message

v1 -> v2:
* Added missing hunk in alloc_workqueue()
---
include/linux/workqueue.h | 9 ++++++
kernel/workqueue.c | 60 +++++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+)

diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
index fb39938945365..f8c87f824272b 100644
--- a/include/linux/workqueue.h
+++ b/include/linux/workqueue.h
@@ -406,9 +406,18 @@ enum wq_flags {
__WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */
__WQ_ORDERED = 1 << 17, /* internal: workqueue is ordered */
__WQ_LEGACY = 1 << 18, /* internal: create*_workqueue() */
+ __WQ_MEMALLOC = 1 << 19, /* internal: execute work with MEMALLOC */
+ __WQ_MEMALLOC_NOFS = 1 << 20, /* internal: execute work with MEMALLOC_NOFS */
+ __WQ_MEMALLOC_NOIO = 1 << 21, /* internal: execute work with MEMALLOC_NOIO */
+ __WQ_MEMALLOC_NORECLAIM = 1 << 22, /* internal: execute work with MEMALLOC_NORECLAIM */
+ __WQ_MEMALLOC_NOWARN = 1 << 23, /* internal: execute work with MEMALLOC_NOWARN */
+ __WQ_MEMALLOC_PIN = 1 << 24, /* internal: execute work with MEMALLOC_PIN */

/* BH wq only allows the following flags */
__WQ_BH_ALLOWS = WQ_BH | WQ_HIGHPRI,
+
+ __WQ_PF_MEMALLOC_MASK = PF_MEMALLOC | PF_MEMALLOC_NOFS | PF_MEMALLOC_NOIO |
+ PF_MEMALLOC_NORECLAIM | PF_MEMALLOC_NOWARN | PF_MEMALLOC_PIN,
};

enum wq_consts {
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 003474c9a77d0..28ed6b9556e91 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -51,6 +51,7 @@
#include <linux/uaccess.h>
#include <linux/sched/isolation.h>
#include <linux/sched/debug.h>
+#include <linux/sched/mm.h>
#include <linux/nmi.h>
#include <linux/kvm_para.h>
#include <linux/delay.h>
@@ -3113,6 +3114,28 @@ static bool manage_workers(struct worker *worker)
return true;
}

+static unsigned int wq_build_memalloc_flags(struct pool_workqueue *pwq)
+{
+ unsigned int pf_flags = 0;
+
+#define BUILD_PF_FLAGS_FROM_WQ(name) \
+ do { \
+ if (pwq->wq->flags & __WQ_ ## name) \
+ pf_flags |= PF_ ## name; \
+ } while (0)
+
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_NOFS);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_NOIO);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_NORECLAIM);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_NOWARN);
+ BUILD_PF_FLAGS_FROM_WQ(MEMALLOC_PIN);
+
+#undef BUILD_PF_FLAGS_FROM_WQ
+
+ return pf_flags;
+}
+
/**
* process_one_work - process single work
* @worker: self
@@ -3136,6 +3159,8 @@ __acquires(&pool->lock)
unsigned long work_data;
int lockdep_start_depth, rcu_start_depth;
bool bh_draining = pool->flags & POOL_BH_DRAINING;
+ unsigned int memalloc_flags = wq_build_memalloc_flags(pwq);
+ unsigned int memalloc_flags_old;
#ifdef CONFIG_LOCKDEP
/*
* It is permissible to free the struct work_struct from
@@ -3148,6 +3173,10 @@ __acquires(&pool->lock)

lockdep_copy_map(&lockdep_map, &work->lockdep_map);
#endif
+ /* Set inherited alloc flags */
+ if (memalloc_flags)
+ memalloc_flags_old = memalloc_flags_save(memalloc_flags);
+
/* ensure we're on the correct CPU */
WARN_ON_ONCE(!(pool->flags & POOL_DISASSOCIATED) &&
raw_smp_processor_id() != pool->cpu);
@@ -3284,6 +3313,10 @@ __acquires(&pool->lock)

/* must be the last step, see the function comment */
pwq_dec_nr_in_flight(pwq, work_data);
+
+ /* Restore alloc flags */
+ if (memalloc_flags)
+ memalloc_flags_restore(memalloc_flags_old);
}

/**
@@ -5637,6 +5670,30 @@ static void wq_adjust_max_active(struct workqueue_struct *wq)
} while (activated);
}

+/**
+ * wq_set_memalloc_flags - Test current->flags for PF_MEMALLOC_FOO_BAR
+ * flag bits and set the corresponding __WQ_MEMALLOC_FOO_BAR in the
+ * WQ's flags variable.
+ * @flags_ptr: Pointer to wq->flags
+ */
+static void wq_set_memalloc_flags(unsigned int *flags_ptr)
+{
+#define TEST_PF_SET_WQ(name) \
+ do { \
+ if (current->flags & PF_ ## name) \
+ *flags_ptr |= __WQ_ ## name; \
+ } while (0)
+
+ TEST_PF_SET_WQ(MEMALLOC);
+ TEST_PF_SET_WQ(MEMALLOC_NOFS);
+ TEST_PF_SET_WQ(MEMALLOC_NOIO);
+ TEST_PF_SET_WQ(MEMALLOC_NORECLAIM);
+ TEST_PF_SET_WQ(MEMALLOC_NOWARN);
+ TEST_PF_SET_WQ(MEMALLOC_PIN);
+
+#undef TEST_PF_SET_WQ
+}
+
__printf(1, 4)
struct workqueue_struct *alloc_workqueue(const char *fmt,
unsigned int flags,
@@ -5695,6 +5752,9 @@ struct workqueue_struct *alloc_workqueue(const char *fmt,

/* init wq */
wq->flags = flags;
+ if (current->flags & __WQ_PF_MEMALLOC_MASK)
+ wq_set_memalloc_flags(&wq->flags);
+
wq->max_active = max_active;
wq->min_active = min(max_active, WQ_DFL_MIN_ACTIVE);
wq->saved_max_active = wq->max_active;
--
2.31.1


2024-05-22 16:37:32

by Tejun Heo

[permalink] [raw]
Subject: Re: [PATCH v3 1/6] workqueue: Inherit per-process allocation flags

Hello,

On Wed, May 22, 2024 at 03:54:34PM +0200, H?kon Bugge wrote:
> --- a/include/linux/workqueue.h
> +++ b/include/linux/workqueue.h
> @@ -406,9 +406,18 @@ enum wq_flags {
> __WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */
> __WQ_ORDERED = 1 << 17, /* internal: workqueue is ordered */
> __WQ_LEGACY = 1 << 18, /* internal: create*_workqueue() */
> + __WQ_MEMALLOC = 1 << 19, /* internal: execute work with MEMALLOC */
> + __WQ_MEMALLOC_NOFS = 1 << 20, /* internal: execute work with MEMALLOC_NOFS */
> + __WQ_MEMALLOC_NOIO = 1 << 21, /* internal: execute work with MEMALLOC_NOIO */
> + __WQ_MEMALLOC_NORECLAIM = 1 << 22, /* internal: execute work with MEMALLOC_NORECLAIM */
> + __WQ_MEMALLOC_NOWARN = 1 << 23, /* internal: execute work with MEMALLOC_NOWARN */
> + __WQ_MEMALLOC_PIN = 1 << 24, /* internal: execute work with MEMALLOC_PIN */

Please use a separate field w/ gfp_t. You can probably add it to
workqueue_attrs.

Thanks.

--
tejun

2024-05-23 06:46:09

by Naveen Mamindlapalli

[permalink] [raw]
Subject: RE: [PATCH v3 4/6] RDMA/cm: Brute force GFP_NOIO


> -----Original Message-----
> From: Håkon Bugge <[email protected]>
> Sent: Wednesday, May 22, 2024 7:25 PM
> To: [email protected]; [email protected];
> [email protected]; [email protected]
> Cc: Jason Gunthorpe <[email protected]>; Leon Romanovsky <[email protected]>;
> Saeed Mahameed <[email protected]>; Tariq Toukan <[email protected]>;
> David S . Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Jakub Kicinski <[email protected]>; Paolo Abeni
> <[email protected]>; Tejun Heo <[email protected]>; Lai Jiangshan
> <[email protected]>; Allison Henderson <[email protected]>;
> Manjunath Patil <[email protected]>; Mark Zhang
> <[email protected]>; Håkon Bugge <[email protected]>; Chuck
> Lever <[email protected]>; Shiraz Saleem <[email protected]>;
> Yang Li <[email protected]>
> Subject: [PATCH v3 4/6] RDMA/cm: Brute force GFP_NOIO
>
> In ib_cm_init(), we call memalloc_noio_{save,restore} in a parenthetic fashion
> when enabled by the module parameter force_noio.
>
> This in order to conditionally enable ib_cm to work aligned with block I/O devices.
> Any work queued later on work-queues created during module initialization will
> inherit the PF_MEMALLOC_{NOIO,NOFS} flag(s), due to commit ("workqueue:
> Inherit NOIO and NOFS alloc flags").
>
> We do this in order to enable ULPs using the RDMA stack to be used as a
> network block I/O device. This to support a filesystem on top of a raw block
> device which uses said ULP(s) and the RDMA stack as the network transport
> layer.
>
> Under intense memory pressure, we get memory reclaims. Assume the filesystem
> reclaims memory, goes to the raw block device, which calls into the ULP in
> question, which calls the RDMA stack. Now, if regular GFP_KERNEL allocations
> in ULP or the RDMA stack require reclaims to be fulfilled, we end up in a circular
> dependency.
>
> We break this circular dependency by:
>
> 1. Force all allocations in the ULP and the relevant RDMA stack to use
> GFP_NOIO, by means of a parenthetic use of
> memalloc_noio_{save,restore} on all relevant entry points.
>
> 2. Make sure work-queues inherits current->flags
> wrt. PF_MEMALLOC_{NOIO,NOFS}, such that work executed on the
> work-queue inherits the same flag(s).
>
> Signed-off-by: Håkon Bugge <[email protected]>
> ---
> drivers/infiniband/core/cm.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index
> 07fb8d3c037f0..767eec38eb57d 100644
> --- a/drivers/infiniband/core/cm.c
> +++ b/drivers/infiniband/core/cm.c
> @@ -22,6 +22,7 @@
> #include <linux/workqueue.h>
> #include <linux/kdev_t.h>
> #include <linux/etherdevice.h>
> +#include <linux/sched/mm.h>
>
> #include <rdma/ib_cache.h>
> #include <rdma/ib_cm.h>
> @@ -35,6 +36,11 @@ MODULE_DESCRIPTION("InfiniBand CM");
> MODULE_LICENSE("Dual BSD/GPL");
>
> #define CM_DESTROY_ID_WAIT_TIMEOUT 10000 /* msecs */
> +
> +static bool cm_force_noio;
> +module_param_named(force_noio, cm_force_noio, bool, 0444);
> +MODULE_PARM_DESC(force_noio, "Force the use of GFP_NOIO (Y/N)");
> +
> static const char * const ibcm_rej_reason_strs[] = {
> [IB_CM_REJ_NO_QP] = "no QP",
> [IB_CM_REJ_NO_EEC] = "no EEC",
> @@ -4504,6 +4510,10 @@ static void cm_remove_one(struct ib_device
> *ib_device, void *client_data) static int __init ib_cm_init(void) {
> int ret;
> + unsigned int noio_flags;

minor: please follow reverse xmas tree order

> +
> + if (cm_force_noio)
> + noio_flags = memalloc_noio_save();
>
> INIT_LIST_HEAD(&cm.device_list);
> rwlock_init(&cm.device_lock);
> @@ -4527,10 +4537,13 @@ static int __init ib_cm_init(void)
> if (ret)
> goto error3;
>
> - return 0;
> + goto error2;
> error3:
> destroy_workqueue(cm.wq);
> error2:
> + if (cm_force_noio)
> + memalloc_noio_restore(noio_flags);
> +
> return ret;
> }
>
> --
> 2.31.1
>

2024-05-23 10:38:46

by Haakon Bugge

[permalink] [raw]
Subject: Re: [PATCH v3 0/6] rds: rdma: Add ability to force GFP_NOIO



> On 23 May 2024, at 10:18, Christoph Hellwig <[email protected]> wrote:
>
> Still NAK with the same reason as the previous round.

Understood. Our emails crossed.


Thxs, Håkon

2024-05-23 14:23:17

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH v3 0/6] rds: rdma: Add ability to force GFP_NOIO

Still NAK with the same reason as the previous round.