hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/infiniband/core/security.c
....@@ -39,22 +39,25 @@
3939 #include "core_priv.h"
4040 #include "mad_priv.h"
4141
42
+static LIST_HEAD(mad_agent_list);
43
+/* Lock to protect mad_agent_list */
44
+static DEFINE_SPINLOCK(mad_agent_list_lock);
45
+
4246 static struct pkey_index_qp_list *get_pkey_idx_qp_list(struct ib_port_pkey *pp)
4347 {
4448 struct pkey_index_qp_list *pkey = NULL;
4549 struct pkey_index_qp_list *tmp_pkey;
4650 struct ib_device *dev = pp->sec->dev;
4751
48
- spin_lock(&dev->port_pkey_list[pp->port_num].list_lock);
49
- list_for_each_entry(tmp_pkey,
50
- &dev->port_pkey_list[pp->port_num].pkey_list,
51
- pkey_index_list) {
52
+ spin_lock(&dev->port_data[pp->port_num].pkey_list_lock);
53
+ list_for_each_entry (tmp_pkey, &dev->port_data[pp->port_num].pkey_list,
54
+ pkey_index_list) {
5255 if (tmp_pkey->pkey_index == pp->pkey_index) {
5356 pkey = tmp_pkey;
5457 break;
5558 }
5659 }
57
- spin_unlock(&dev->port_pkey_list[pp->port_num].list_lock);
60
+ spin_unlock(&dev->port_data[pp->port_num].pkey_list_lock);
5861 return pkey;
5962 }
6063
....@@ -259,12 +262,12 @@
259262 if (!pkey)
260263 return -ENOMEM;
261264
262
- spin_lock(&dev->port_pkey_list[port_num].list_lock);
265
+ spin_lock(&dev->port_data[port_num].pkey_list_lock);
263266 /* Check for the PKey again. A racing process may
264267 * have created it.
265268 */
266269 list_for_each_entry(tmp_pkey,
267
- &dev->port_pkey_list[port_num].pkey_list,
270
+ &dev->port_data[port_num].pkey_list,
268271 pkey_index_list) {
269272 if (tmp_pkey->pkey_index == pp->pkey_index) {
270273 kfree(pkey);
....@@ -279,9 +282,9 @@
279282 spin_lock_init(&pkey->qp_list_lock);
280283 INIT_LIST_HEAD(&pkey->qp_list);
281284 list_add(&pkey->pkey_index_list,
282
- &dev->port_pkey_list[port_num].pkey_list);
285
+ &dev->port_data[port_num].pkey_list);
283286 }
284
- spin_unlock(&dev->port_pkey_list[port_num].list_lock);
287
+ spin_unlock(&dev->port_data[port_num].pkey_list_lock);
285288 }
286289
287290 spin_lock(&pkey->qp_list_lock);
....@@ -411,12 +414,15 @@
411414
412415 int ib_create_qp_security(struct ib_qp *qp, struct ib_device *dev)
413416 {
414
- u8 i = rdma_start_port(dev);
417
+ unsigned int i;
415418 bool is_ib = false;
416419 int ret;
417420
418
- while (i <= rdma_end_port(dev) && !is_ib)
419
- is_ib = rdma_protocol_ib(dev, i++);
421
+ rdma_for_each_port (dev, i) {
422
+ is_ib = rdma_protocol_ib(dev, i);
423
+ if (is_ib)
424
+ break;
425
+ }
420426
421427 /* If this isn't an IB device don't create the security context */
422428 if (!is_ib)
....@@ -537,9 +543,8 @@
537543 {
538544 struct pkey_index_qp_list *pkey;
539545
540
- list_for_each_entry(pkey,
541
- &device->port_pkey_list[port_num].pkey_list,
542
- pkey_index_list) {
546
+ list_for_each_entry (pkey, &device->port_data[port_num].pkey_list,
547
+ pkey_index_list) {
543548 check_pkey_qps(pkey,
544549 device,
545550 port_num,
....@@ -547,21 +552,19 @@
547552 }
548553 }
549554
550
-void ib_security_destroy_port_pkey_list(struct ib_device *device)
555
+void ib_security_release_port_pkey_list(struct ib_device *device)
551556 {
552557 struct pkey_index_qp_list *pkey, *tmp_pkey;
553
- int i;
558
+ unsigned int i;
554559
555
- for (i = rdma_start_port(device); i <= rdma_end_port(device); i++) {
556
- spin_lock(&device->port_pkey_list[i].list_lock);
560
+ rdma_for_each_port (device, i) {
557561 list_for_each_entry_safe(pkey,
558562 tmp_pkey,
559
- &device->port_pkey_list[i].pkey_list,
563
+ &device->port_data[i].pkey_list,
560564 pkey_index_list) {
561565 list_del(&pkey->pkey_index_list);
562566 kfree(pkey);
563567 }
564
- spin_unlock(&device->port_pkey_list[i].list_lock);
565568 }
566569 }
567570
....@@ -619,10 +622,10 @@
619622 }
620623
621624 if (!ret)
622
- ret = real_qp->device->modify_qp(real_qp,
623
- qp_attr,
624
- qp_attr_mask,
625
- udata);
625
+ ret = real_qp->device->ops.modify_qp(real_qp,
626
+ qp_attr,
627
+ qp_attr_mask,
628
+ udata);
626629
627630 if (new_pps) {
628631 /* Clean up the lists and free the appropriate
....@@ -669,20 +672,18 @@
669672 return security_ib_pkey_access(sec, subnet_prefix, pkey);
670673 }
671674
672
-static int ib_mad_agent_security_change(struct notifier_block *nb,
673
- unsigned long event,
674
- void *data)
675
+void ib_mad_agent_security_change(void)
675676 {
676
- struct ib_mad_agent *ag = container_of(nb, struct ib_mad_agent, lsm_nb);
677
+ struct ib_mad_agent *ag;
677678
678
- if (event != LSM_POLICY_CHANGE)
679
- return NOTIFY_DONE;
680
-
681
- ag->smp_allowed = !security_ib_endport_manage_subnet(ag->security,
682
- ag->device->name,
683
- ag->port_num);
684
-
685
- return NOTIFY_OK;
679
+ spin_lock(&mad_agent_list_lock);
680
+ list_for_each_entry(ag,
681
+ &mad_agent_list,
682
+ mad_agent_sec_list)
683
+ WRITE_ONCE(ag->smp_allowed,
684
+ !security_ib_endport_manage_subnet(ag->security,
685
+ dev_name(&ag->device->dev), ag->port_num));
686
+ spin_unlock(&mad_agent_list_lock);
686687 }
687688
688689 int ib_mad_agent_security_setup(struct ib_mad_agent *agent,
....@@ -693,6 +694,8 @@
693694 if (!rdma_protocol_ib(agent->device, agent->port_num))
694695 return 0;
695696
697
+ INIT_LIST_HEAD(&agent->mad_agent_sec_list);
698
+
696699 ret = security_ib_alloc_security(&agent->security);
697700 if (ret)
698701 return ret;
....@@ -700,22 +703,20 @@
700703 if (qp_type != IB_QPT_SMI)
701704 return 0;
702705
706
+ spin_lock(&mad_agent_list_lock);
703707 ret = security_ib_endport_manage_subnet(agent->security,
704
- agent->device->name,
708
+ dev_name(&agent->device->dev),
705709 agent->port_num);
706710 if (ret)
707711 goto free_security;
708712
709
- agent->lsm_nb.notifier_call = ib_mad_agent_security_change;
710
- ret = register_lsm_notifier(&agent->lsm_nb);
711
- if (ret)
712
- goto free_security;
713
-
714
- agent->smp_allowed = true;
715
- agent->lsm_nb_reg = true;
713
+ WRITE_ONCE(agent->smp_allowed, true);
714
+ list_add(&agent->mad_agent_sec_list, &mad_agent_list);
715
+ spin_unlock(&mad_agent_list_lock);
716716 return 0;
717717
718718 free_security:
719
+ spin_unlock(&mad_agent_list_lock);
719720 security_ib_free_security(agent->security);
720721 return ret;
721722 }
....@@ -725,8 +726,11 @@
725726 if (!rdma_protocol_ib(agent->device, agent->port_num))
726727 return;
727728
728
- if (agent->lsm_nb_reg)
729
- unregister_lsm_notifier(&agent->lsm_nb);
729
+ if (agent->qp->qp_type == IB_QPT_SMI) {
730
+ spin_lock(&mad_agent_list_lock);
731
+ list_del(&agent->mad_agent_sec_list);
732
+ spin_unlock(&mad_agent_list_lock);
733
+ }
730734
731735 security_ib_free_security(agent->security);
732736 }
....@@ -737,7 +741,7 @@
737741 return 0;
738742
739743 if (map->agent.qp->qp_type == IB_QPT_SMI) {
740
- if (!map->agent.smp_allowed)
744
+ if (!READ_ONCE(map->agent.smp_allowed))
741745 return -EACCES;
742746 return 0;
743747 }