@@ -19,6 +19,7 @@
#include <ccan/short_types/short_types.h>
#include <util/log.h>
+#include <util/list.h>
#include <util/size.h>
#include <util/sysfs.h>
#include <util/bitmap.h>
@@ -908,6 +909,11 @@ cxl_endpoint_get_memdev(struct cxl_endpoint *endpoint)
return NULL;
}
+static int decoder_id_cmp(struct cxl_decoder *d1, struct cxl_decoder *d2)
+{
+ return d1->id - d2->id;
+}
+
static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base)
{
const char *devname = devpath_to_devname(cxldecoder_base);
@@ -1049,7 +1055,7 @@ static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base)
return decoder_dup;
}
- list_add(&port->decoders, &decoder->list);
+ list_add_sorted(&port->decoders, decoder, list, decoder_id_cmp);
free(path);
return decoder;
new file mode 100644
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (C) 2022 Intel Corporation. All rights reserved. */
+#ifndef _NDCTL_LIST_H_
+#define _NDCTL_LIST_H_
+
+#include <ccan/list/list.h>
+
+#define list_add_sorted(head, n, node, cmp) \
+ do { \
+ struct list_head *__head = (head); \
+ typeof(n) __iter, __next; \
+ typeof(n) __new = (n); \
+ \
+ if (list_empty(__head)) { \
+ list_add(__head, &__new->node); \
+ break; \
+ } \
+ \
+ list_for_each (__head, __iter, node) { \
+ if (cmp(__new, __iter) < 0) { \
+ list_add_before(__head, &__iter->node, \
+ &__new->node); \
+ break; \
+ } \
+ __next = list_next(__head, __iter, node); \
+ if (!__next) { \
+ list_add_after(__head, &__iter->node, \
+ &__new->node); \
+ break; \
+ } \
+ if (cmp(__new, __next) < 0) { \
+ list_add_before(__head, &__next->node, \
+ &__new->node); \
+ break; \
+ } \
+ } \
+ } while (0)
+
+#endif /* _NDCTL_LIST_H_ */