]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: hisilicon/qm - optimize device selection priority based on queue ref count...
authorChenghai Huang <huangchenghai2@huawei.com>
Thu, 18 Dec 2025 13:44:49 +0000 (21:44 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 16 Jan 2026 06:02:06 +0000 (14:02 +0800)
Add device sorting criteria to prioritize devices with fewer
references and closer NUMA distances. Devices that are fully
occupied will not be prioritized for use.

Signed-off-by: Chenghai Huang <huangchenghai2@huawei.com>
Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/hisilicon/qm.c

index 1f1714ea5af7406ab3ec2634fdcdcdb4c480e55f..700fc1b8318ed3cd00bf72cafed6e0d36cf207c7 100644 (file)
@@ -3617,6 +3617,20 @@ void hisi_qm_free_qps(struct hisi_qp **qps, int qp_num)
 }
 EXPORT_SYMBOL_GPL(hisi_qm_free_qps);
 
+static void qm_insert_sorted(struct list_head *head, struct hisi_qm_resource *res)
+{
+       struct hisi_qm_resource *tmp;
+       struct list_head *n = head;
+
+       list_for_each_entry(tmp, head, list) {
+               if (res->distance < tmp->distance) {
+                       n = &tmp->list;
+                       break;
+               }
+       }
+       list_add_tail(&res->list, n);
+}
+
 static void free_list(struct list_head *head)
 {
        struct hisi_qm_resource *res, *tmp;
@@ -3672,11 +3686,12 @@ stop_and_free:
 static int hisi_qm_sort_devices(int node, struct list_head *head,
                                struct hisi_qm_list *qm_list)
 {
-       struct hisi_qm_resource *res, *tmp;
+       struct hisi_qm_resource *res;
        struct hisi_qm *qm;
-       struct list_head *n;
        struct device *dev;
        int dev_node;
+       LIST_HEAD(non_full_list);
+       LIST_HEAD(full_list);
 
        list_for_each_entry(qm, &qm_list->list, list) {
                dev = &qm->pdev->dev;
@@ -3691,16 +3706,16 @@ static int hisi_qm_sort_devices(int node, struct list_head *head,
 
                res->qm = qm;
                res->distance = node_distance(dev_node, node);
-               n = head;
-               list_for_each_entry(tmp, head, list) {
-                       if (res->distance < tmp->distance) {
-                               n = &tmp->list;
-                               break;
-                       }
-               }
-               list_add_tail(&res->list, n);
+
+               if (qm->qp_in_used == qm->qp_num)
+                       qm_insert_sorted(&full_list, res);
+               else
+                       qm_insert_sorted(&non_full_list, res);
        }
 
+       list_splice_tail(&non_full_list, head);
+       list_splice_tail(&full_list, head);
+
        return 0;
 }