summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChenghai Huang <huangchenghai2@huawei.com>2025-12-18 16:44:49 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2026-01-16 09:02:06 +0300
commit2a75decec1193c2fca1833d7f740796a72b925f1 (patch)
treeb63db2c066b9954903cc1941a46cb82a26f02335
parent4705489742fdc294fe3de7bd9855432fb3cfe3cd (diff)
downloadlinux-2a75decec1193c2fca1833d7f740796a72b925f1.tar.xz
crypto: hisilicon/qm - optimize device selection priority based on queue ref count and NUMA distance
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>
-rw-r--r--drivers/crypto/hisilicon/qm.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/drivers/crypto/hisilicon/qm.c b/drivers/crypto/hisilicon/qm.c
index 1f1714ea5af7..700fc1b8318e 100644
--- a/drivers/crypto/hisilicon/qm.c
+++ b/drivers/crypto/hisilicon/qm.c
@@ -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;
}