anitazha / rpms / ndctl

Forked from rpms/ndctl a year ago
Clone

Blame 0180-cxl-lib-Maintain-decoders-in-id-order.patch

Jeff Moyer 2c91dc
From 06ae7118aaa74aa2139004fa12b4910bc15236de Mon Sep 17 00:00:00 2001
Jeff Moyer 2c91dc
From: Dan Williams <dan.j.williams@intel.com>
Jeff Moyer 2c91dc
Date: Thu, 14 Jul 2022 10:02:21 -0700
Jeff Moyer 2c91dc
Subject: [PATCH 180/217] cxl/lib: Maintain decoders in id order
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Given that decoder instance order is fundamental to the DPA translation
Jeff Moyer 2c91dc
sequence for endpoint decoders, enforce that cxl_decoder_for_each() returns
Jeff Moyer 2c91dc
decoders in instance order. Otherwise, they show up in readddir() order
Jeff Moyer 2c91dc
which is not predictable.
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Add a list_add_sorted() to generically handle inserting into a sorted list.
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Link: https://lore.kernel.org/r/165781814167.1555691.14895625637451030942.stgit@dwillia2-xfh.jf.intel.com
Jeff Moyer 2c91dc
Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
Jeff Moyer 2c91dc
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Jeff Moyer 2c91dc
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Jeff Moyer 2c91dc
---
Jeff Moyer 2c91dc
 cxl/lib/libcxl.c |  8 +++++++-
Jeff Moyer 2c91dc
 util/list.h      | 39 +++++++++++++++++++++++++++++++++++++++
Jeff Moyer 2c91dc
 2 files changed, 46 insertions(+), 1 deletion(-)
Jeff Moyer 2c91dc
 create mode 100644 util/list.h
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
index 6f4d64d..ea597f6 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
+++ b/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
@@ -19,6 +19,7 @@
Jeff Moyer 2c91dc
 #include <ccan/short_types/short_types.h>
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 #include <util/log.h>
Jeff Moyer 2c91dc
+#include <util/list.h>
Jeff Moyer 2c91dc
 #include <util/size.h>
Jeff Moyer 2c91dc
 #include <util/sysfs.h>
Jeff Moyer 2c91dc
 #include <util/bitmap.h>
Jeff Moyer 2c91dc
@@ -909,6 +910,11 @@ cxl_endpoint_get_memdev(struct cxl_endpoint *endpoint)
Jeff Moyer 2c91dc
 	return NULL;
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+static int decoder_id_cmp(struct cxl_decoder *d1, struct cxl_decoder *d2)
Jeff Moyer 2c91dc
+{
Jeff Moyer 2c91dc
+	return d1->id - d2->id;
Jeff Moyer 2c91dc
+}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
 static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base)
Jeff Moyer 2c91dc
 {
Jeff Moyer 2c91dc
 	const char *devname = devpath_to_devname(cxldecoder_base);
Jeff Moyer 2c91dc
@@ -1050,7 +1056,7 @@ static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base)
Jeff Moyer 2c91dc
 			return decoder_dup;
Jeff Moyer 2c91dc
 		}
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
-	list_add(&port->decoders, &decoder->list);
Jeff Moyer 2c91dc
+	list_add_sorted(&port->decoders, decoder, list, decoder_id_cmp);
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 	free(path);
Jeff Moyer 2c91dc
 	return decoder;
Jeff Moyer 2c91dc
diff --git a/util/list.h b/util/list.h
Jeff Moyer 2c91dc
new file mode 100644
Jeff Moyer 2c91dc
index 0000000..cb77271
Jeff Moyer 2c91dc
--- /dev/null
Jeff Moyer 2c91dc
+++ b/util/list.h
Jeff Moyer 2c91dc
@@ -0,0 +1,39 @@
Jeff Moyer 2c91dc
+/* SPDX-License-Identifier: GPL-2.0 */
Jeff Moyer 2c91dc
+/* Copyright (C) 2022 Intel Corporation. All rights reserved. */
Jeff Moyer 2c91dc
+#ifndef _NDCTL_LIST_H_
Jeff Moyer 2c91dc
+#define _NDCTL_LIST_H_
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+#include <ccan/list/list.h>
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+#define list_add_sorted(head, n, node, cmp)                                    \
Jeff Moyer 2c91dc
+	do {                                                                   \
Jeff Moyer 2c91dc
+		struct list_head *__head = (head);                             \
Jeff Moyer 2c91dc
+		typeof(n) __iter, __next;                                      \
Jeff Moyer 2c91dc
+		typeof(n) __new = (n);                                         \
Jeff Moyer 2c91dc
+                                                                               \
Jeff Moyer 2c91dc
+		if (list_empty(__head)) {                                      \
Jeff Moyer 2c91dc
+			list_add(__head, &__new->node);                        \
Jeff Moyer 2c91dc
+			break;                                                 \
Jeff Moyer 2c91dc
+		}                                                              \
Jeff Moyer 2c91dc
+                                                                               \
Jeff Moyer 2c91dc
+		list_for_each (__head, __iter, node) {                         \
Jeff Moyer 2c91dc
+			if (cmp(__new, __iter) < 0) {                          \
Jeff Moyer 2c91dc
+				list_add_before(__head, &__iter->node,         \
Jeff Moyer 2c91dc
+						&__new->node);                 \
Jeff Moyer 2c91dc
+				break;                                         \
Jeff Moyer 2c91dc
+			}                                                      \
Jeff Moyer 2c91dc
+			__next = list_next(__head, __iter, node);              \
Jeff Moyer 2c91dc
+			if (!__next) {                                         \
Jeff Moyer 2c91dc
+				list_add_after(__head, &__iter->node,          \
Jeff Moyer 2c91dc
+					       &__new->node);                  \
Jeff Moyer 2c91dc
+				break;                                         \
Jeff Moyer 2c91dc
+			}                                                      \
Jeff Moyer 2c91dc
+			if (cmp(__new, __next) < 0) {                          \
Jeff Moyer 2c91dc
+				list_add_before(__head, &__next->node,         \
Jeff Moyer 2c91dc
+						&__new->node);                 \
Jeff Moyer 2c91dc
+				break;                                         \
Jeff Moyer 2c91dc
+			}                                                      \
Jeff Moyer 2c91dc
+		}                                                              \
Jeff Moyer 2c91dc
+	} while (0)
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+#endif /* _NDCTL_LIST_H_ */
Jeff Moyer 2c91dc
-- 
Jeff Moyer 2c91dc
2.27.0
Jeff Moyer 2c91dc