0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #include <linux/if_vlan.h>
0037 #include <linux/errno.h>
0038 #include <linux/slab.h>
0039 #include <linux/workqueue.h>
0040 #include <linux/netdevice.h>
0041 #include <net/addrconf.h>
0042
0043 #include <rdma/ib_cache.h>
0044
0045 #include "core_priv.h"
0046
0047 struct ib_pkey_cache {
0048 int table_len;
0049 u16 table[];
0050 };
0051
0052 struct ib_update_work {
0053 struct work_struct work;
0054 struct ib_event event;
0055 bool enforce_security;
0056 };
0057
0058 union ib_gid zgid;
0059 EXPORT_SYMBOL(zgid);
0060
0061 enum gid_attr_find_mask {
0062 GID_ATTR_FIND_MASK_GID = 1UL << 0,
0063 GID_ATTR_FIND_MASK_NETDEV = 1UL << 1,
0064 GID_ATTR_FIND_MASK_DEFAULT = 1UL << 2,
0065 GID_ATTR_FIND_MASK_GID_TYPE = 1UL << 3,
0066 };
0067
0068 enum gid_table_entry_state {
0069 GID_TABLE_ENTRY_INVALID = 1,
0070 GID_TABLE_ENTRY_VALID = 2,
0071
0072
0073
0074
0075
0076
0077 GID_TABLE_ENTRY_PENDING_DEL = 3,
0078 };
0079
0080 struct roce_gid_ndev_storage {
0081 struct rcu_head rcu_head;
0082 struct net_device *ndev;
0083 };
0084
0085 struct ib_gid_table_entry {
0086 struct kref kref;
0087 struct work_struct del_work;
0088 struct ib_gid_attr attr;
0089 void *context;
0090
0091
0092
0093
0094
0095 struct roce_gid_ndev_storage *ndev_storage;
0096 enum gid_table_entry_state state;
0097 };
0098
0099 struct ib_gid_table {
0100 int sz;
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115 struct mutex lock;
0116
0117
0118 rwlock_t rwlock;
0119 struct ib_gid_table_entry **data_vec;
0120
0121 u32 default_gid_indices;
0122 };
0123
0124 static void dispatch_gid_change_event(struct ib_device *ib_dev, u32 port)
0125 {
0126 struct ib_event event;
0127
0128 event.device = ib_dev;
0129 event.element.port_num = port;
0130 event.event = IB_EVENT_GID_CHANGE;
0131
0132 ib_dispatch_event_clients(&event);
0133 }
0134
0135 static const char * const gid_type_str[] = {
0136
0137
0138
0139 [IB_GID_TYPE_IB] = "IB/RoCE v1",
0140 [IB_GID_TYPE_ROCE] = "IB/RoCE v1",
0141 [IB_GID_TYPE_ROCE_UDP_ENCAP] = "RoCE v2",
0142 };
0143
0144 const char *ib_cache_gid_type_str(enum ib_gid_type gid_type)
0145 {
0146 if (gid_type < ARRAY_SIZE(gid_type_str) && gid_type_str[gid_type])
0147 return gid_type_str[gid_type];
0148
0149 return "Invalid GID type";
0150 }
0151 EXPORT_SYMBOL(ib_cache_gid_type_str);
0152
0153
0154
0155
0156
0157 bool rdma_is_zero_gid(const union ib_gid *gid)
0158 {
0159 return !memcmp(gid, &zgid, sizeof(*gid));
0160 }
0161 EXPORT_SYMBOL(rdma_is_zero_gid);
0162
0163
0164
0165
0166
0167
0168
0169
0170 static bool is_gid_index_default(const struct ib_gid_table *table,
0171 unsigned int index)
0172 {
0173 return index < 32 && (BIT(index) & table->default_gid_indices);
0174 }
0175
0176 int ib_cache_gid_parse_type_str(const char *buf)
0177 {
0178 unsigned int i;
0179 size_t len;
0180 int err = -EINVAL;
0181
0182 len = strlen(buf);
0183 if (len == 0)
0184 return -EINVAL;
0185
0186 if (buf[len - 1] == '\n')
0187 len--;
0188
0189 for (i = 0; i < ARRAY_SIZE(gid_type_str); ++i)
0190 if (gid_type_str[i] && !strncmp(buf, gid_type_str[i], len) &&
0191 len == strlen(gid_type_str[i])) {
0192 err = i;
0193 break;
0194 }
0195
0196 return err;
0197 }
0198 EXPORT_SYMBOL(ib_cache_gid_parse_type_str);
0199
0200 static struct ib_gid_table *rdma_gid_table(struct ib_device *device, u32 port)
0201 {
0202 return device->port_data[port].cache.gid;
0203 }
0204
0205 static bool is_gid_entry_free(const struct ib_gid_table_entry *entry)
0206 {
0207 return !entry;
0208 }
0209
0210 static bool is_gid_entry_valid(const struct ib_gid_table_entry *entry)
0211 {
0212 return entry && entry->state == GID_TABLE_ENTRY_VALID;
0213 }
0214
0215 static void schedule_free_gid(struct kref *kref)
0216 {
0217 struct ib_gid_table_entry *entry =
0218 container_of(kref, struct ib_gid_table_entry, kref);
0219
0220 queue_work(ib_wq, &entry->del_work);
0221 }
0222
0223 static void put_gid_ndev(struct rcu_head *head)
0224 {
0225 struct roce_gid_ndev_storage *storage =
0226 container_of(head, struct roce_gid_ndev_storage, rcu_head);
0227
0228 WARN_ON(!storage->ndev);
0229
0230
0231
0232
0233 dev_put(storage->ndev);
0234 kfree(storage);
0235 }
0236
0237 static void free_gid_entry_locked(struct ib_gid_table_entry *entry)
0238 {
0239 struct ib_device *device = entry->attr.device;
0240 u32 port_num = entry->attr.port_num;
0241 struct ib_gid_table *table = rdma_gid_table(device, port_num);
0242
0243 dev_dbg(&device->dev, "%s port=%u index=%u gid %pI6\n", __func__,
0244 port_num, entry->attr.index, entry->attr.gid.raw);
0245
0246 write_lock_irq(&table->rwlock);
0247
0248
0249
0250
0251
0252
0253
0254 if (entry == table->data_vec[entry->attr.index])
0255 table->data_vec[entry->attr.index] = NULL;
0256
0257 write_unlock_irq(&table->rwlock);
0258
0259 if (entry->ndev_storage)
0260 call_rcu(&entry->ndev_storage->rcu_head, put_gid_ndev);
0261 kfree(entry);
0262 }
0263
0264 static void free_gid_entry(struct kref *kref)
0265 {
0266 struct ib_gid_table_entry *entry =
0267 container_of(kref, struct ib_gid_table_entry, kref);
0268
0269 free_gid_entry_locked(entry);
0270 }
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 static void free_gid_work(struct work_struct *work)
0281 {
0282 struct ib_gid_table_entry *entry =
0283 container_of(work, struct ib_gid_table_entry, del_work);
0284 struct ib_device *device = entry->attr.device;
0285 u32 port_num = entry->attr.port_num;
0286 struct ib_gid_table *table = rdma_gid_table(device, port_num);
0287
0288 mutex_lock(&table->lock);
0289 free_gid_entry_locked(entry);
0290 mutex_unlock(&table->lock);
0291 }
0292
0293 static struct ib_gid_table_entry *
0294 alloc_gid_entry(const struct ib_gid_attr *attr)
0295 {
0296 struct ib_gid_table_entry *entry;
0297 struct net_device *ndev;
0298
0299 entry = kzalloc(sizeof(*entry), GFP_KERNEL);
0300 if (!entry)
0301 return NULL;
0302
0303 ndev = rcu_dereference_protected(attr->ndev, 1);
0304 if (ndev) {
0305 entry->ndev_storage = kzalloc(sizeof(*entry->ndev_storage),
0306 GFP_KERNEL);
0307 if (!entry->ndev_storage) {
0308 kfree(entry);
0309 return NULL;
0310 }
0311 dev_hold(ndev);
0312 entry->ndev_storage->ndev = ndev;
0313 }
0314 kref_init(&entry->kref);
0315 memcpy(&entry->attr, attr, sizeof(*attr));
0316 INIT_WORK(&entry->del_work, free_gid_work);
0317 entry->state = GID_TABLE_ENTRY_INVALID;
0318 return entry;
0319 }
0320
0321 static void store_gid_entry(struct ib_gid_table *table,
0322 struct ib_gid_table_entry *entry)
0323 {
0324 entry->state = GID_TABLE_ENTRY_VALID;
0325
0326 dev_dbg(&entry->attr.device->dev, "%s port=%u index=%u gid %pI6\n",
0327 __func__, entry->attr.port_num, entry->attr.index,
0328 entry->attr.gid.raw);
0329
0330 lockdep_assert_held(&table->lock);
0331 write_lock_irq(&table->rwlock);
0332 table->data_vec[entry->attr.index] = entry;
0333 write_unlock_irq(&table->rwlock);
0334 }
0335
0336 static void get_gid_entry(struct ib_gid_table_entry *entry)
0337 {
0338 kref_get(&entry->kref);
0339 }
0340
0341 static void put_gid_entry(struct ib_gid_table_entry *entry)
0342 {
0343 kref_put(&entry->kref, schedule_free_gid);
0344 }
0345
0346 static void put_gid_entry_locked(struct ib_gid_table_entry *entry)
0347 {
0348 kref_put(&entry->kref, free_gid_entry);
0349 }
0350
0351 static int add_roce_gid(struct ib_gid_table_entry *entry)
0352 {
0353 const struct ib_gid_attr *attr = &entry->attr;
0354 int ret;
0355
0356 if (!attr->ndev) {
0357 dev_err(&attr->device->dev, "%s NULL netdev port=%u index=%u\n",
0358 __func__, attr->port_num, attr->index);
0359 return -EINVAL;
0360 }
0361 if (rdma_cap_roce_gid_table(attr->device, attr->port_num)) {
0362 ret = attr->device->ops.add_gid(attr, &entry->context);
0363 if (ret) {
0364 dev_err(&attr->device->dev,
0365 "%s GID add failed port=%u index=%u\n",
0366 __func__, attr->port_num, attr->index);
0367 return ret;
0368 }
0369 }
0370 return 0;
0371 }
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382 static void del_gid(struct ib_device *ib_dev, u32 port,
0383 struct ib_gid_table *table, int ix)
0384 {
0385 struct roce_gid_ndev_storage *ndev_storage;
0386 struct ib_gid_table_entry *entry;
0387
0388 lockdep_assert_held(&table->lock);
0389
0390 dev_dbg(&ib_dev->dev, "%s port=%u index=%d gid %pI6\n", __func__, port,
0391 ix, table->data_vec[ix]->attr.gid.raw);
0392
0393 write_lock_irq(&table->rwlock);
0394 entry = table->data_vec[ix];
0395 entry->state = GID_TABLE_ENTRY_PENDING_DEL;
0396
0397
0398
0399 if (!rdma_protocol_roce(ib_dev, port))
0400 table->data_vec[ix] = NULL;
0401 write_unlock_irq(&table->rwlock);
0402
0403 ndev_storage = entry->ndev_storage;
0404 if (ndev_storage) {
0405 entry->ndev_storage = NULL;
0406 rcu_assign_pointer(entry->attr.ndev, NULL);
0407 call_rcu(&ndev_storage->rcu_head, put_gid_ndev);
0408 }
0409
0410 if (rdma_cap_roce_gid_table(ib_dev, port))
0411 ib_dev->ops.del_gid(&entry->attr, &entry->context);
0412
0413 put_gid_entry_locked(entry);
0414 }
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426 static int add_modify_gid(struct ib_gid_table *table,
0427 const struct ib_gid_attr *attr)
0428 {
0429 struct ib_gid_table_entry *entry;
0430 int ret = 0;
0431
0432
0433
0434
0435
0436 if (is_gid_entry_valid(table->data_vec[attr->index]))
0437 del_gid(attr->device, attr->port_num, table, attr->index);
0438
0439
0440
0441
0442
0443
0444 if (rdma_is_zero_gid(&attr->gid))
0445 return 0;
0446
0447 entry = alloc_gid_entry(attr);
0448 if (!entry)
0449 return -ENOMEM;
0450
0451 if (rdma_protocol_roce(attr->device, attr->port_num)) {
0452 ret = add_roce_gid(entry);
0453 if (ret)
0454 goto done;
0455 }
0456
0457 store_gid_entry(table, entry);
0458 return 0;
0459
0460 done:
0461 put_gid_entry(entry);
0462 return ret;
0463 }
0464
0465
0466 static int find_gid(struct ib_gid_table *table, const union ib_gid *gid,
0467 const struct ib_gid_attr *val, bool default_gid,
0468 unsigned long mask, int *pempty)
0469 {
0470 int i = 0;
0471 int found = -1;
0472 int empty = pempty ? -1 : 0;
0473
0474 while (i < table->sz && (found < 0 || empty < 0)) {
0475 struct ib_gid_table_entry *data = table->data_vec[i];
0476 struct ib_gid_attr *attr;
0477 int curr_index = i;
0478
0479 i++;
0480
0481
0482
0483
0484
0485
0486 if (pempty && empty < 0) {
0487 if (is_gid_entry_free(data) &&
0488 default_gid ==
0489 is_gid_index_default(table, curr_index)) {
0490
0491
0492
0493
0494
0495
0496
0497
0498 empty = curr_index;
0499 }
0500 }
0501
0502
0503
0504
0505
0506
0507
0508 if (!is_gid_entry_valid(data))
0509 continue;
0510
0511 if (found >= 0)
0512 continue;
0513
0514 attr = &data->attr;
0515 if (mask & GID_ATTR_FIND_MASK_GID_TYPE &&
0516 attr->gid_type != val->gid_type)
0517 continue;
0518
0519 if (mask & GID_ATTR_FIND_MASK_GID &&
0520 memcmp(gid, &data->attr.gid, sizeof(*gid)))
0521 continue;
0522
0523 if (mask & GID_ATTR_FIND_MASK_NETDEV &&
0524 attr->ndev != val->ndev)
0525 continue;
0526
0527 if (mask & GID_ATTR_FIND_MASK_DEFAULT &&
0528 is_gid_index_default(table, curr_index) != default_gid)
0529 continue;
0530
0531 found = curr_index;
0532 }
0533
0534 if (pempty)
0535 *pempty = empty;
0536
0537 return found;
0538 }
0539
0540 static void make_default_gid(struct net_device *dev, union ib_gid *gid)
0541 {
0542 gid->global.subnet_prefix = cpu_to_be64(0xfe80000000000000LL);
0543 addrconf_ifid_eui48(&gid->raw[8], dev);
0544 }
0545
0546 static int __ib_cache_gid_add(struct ib_device *ib_dev, u32 port,
0547 union ib_gid *gid, struct ib_gid_attr *attr,
0548 unsigned long mask, bool default_gid)
0549 {
0550 struct ib_gid_table *table;
0551 int ret = 0;
0552 int empty;
0553 int ix;
0554
0555
0556
0557
0558
0559 if (rdma_is_zero_gid(gid))
0560 return -EINVAL;
0561
0562 table = rdma_gid_table(ib_dev, port);
0563
0564 mutex_lock(&table->lock);
0565
0566 ix = find_gid(table, gid, attr, default_gid, mask, &empty);
0567 if (ix >= 0)
0568 goto out_unlock;
0569
0570 if (empty < 0) {
0571 ret = -ENOSPC;
0572 goto out_unlock;
0573 }
0574 attr->device = ib_dev;
0575 attr->index = empty;
0576 attr->port_num = port;
0577 attr->gid = *gid;
0578 ret = add_modify_gid(table, attr);
0579 if (!ret)
0580 dispatch_gid_change_event(ib_dev, port);
0581
0582 out_unlock:
0583 mutex_unlock(&table->lock);
0584 if (ret)
0585 pr_warn("%s: unable to add gid %pI6 error=%d\n",
0586 __func__, gid->raw, ret);
0587 return ret;
0588 }
0589
0590 int ib_cache_gid_add(struct ib_device *ib_dev, u32 port,
0591 union ib_gid *gid, struct ib_gid_attr *attr)
0592 {
0593 unsigned long mask = GID_ATTR_FIND_MASK_GID |
0594 GID_ATTR_FIND_MASK_GID_TYPE |
0595 GID_ATTR_FIND_MASK_NETDEV;
0596
0597 return __ib_cache_gid_add(ib_dev, port, gid, attr, mask, false);
0598 }
0599
0600 static int
0601 _ib_cache_gid_del(struct ib_device *ib_dev, u32 port,
0602 union ib_gid *gid, struct ib_gid_attr *attr,
0603 unsigned long mask, bool default_gid)
0604 {
0605 struct ib_gid_table *table;
0606 int ret = 0;
0607 int ix;
0608
0609 table = rdma_gid_table(ib_dev, port);
0610
0611 mutex_lock(&table->lock);
0612
0613 ix = find_gid(table, gid, attr, default_gid, mask, NULL);
0614 if (ix < 0) {
0615 ret = -EINVAL;
0616 goto out_unlock;
0617 }
0618
0619 del_gid(ib_dev, port, table, ix);
0620 dispatch_gid_change_event(ib_dev, port);
0621
0622 out_unlock:
0623 mutex_unlock(&table->lock);
0624 if (ret)
0625 pr_debug("%s: can't delete gid %pI6 error=%d\n",
0626 __func__, gid->raw, ret);
0627 return ret;
0628 }
0629
0630 int ib_cache_gid_del(struct ib_device *ib_dev, u32 port,
0631 union ib_gid *gid, struct ib_gid_attr *attr)
0632 {
0633 unsigned long mask = GID_ATTR_FIND_MASK_GID |
0634 GID_ATTR_FIND_MASK_GID_TYPE |
0635 GID_ATTR_FIND_MASK_DEFAULT |
0636 GID_ATTR_FIND_MASK_NETDEV;
0637
0638 return _ib_cache_gid_del(ib_dev, port, gid, attr, mask, false);
0639 }
0640
0641 int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u32 port,
0642 struct net_device *ndev)
0643 {
0644 struct ib_gid_table *table;
0645 int ix;
0646 bool deleted = false;
0647
0648 table = rdma_gid_table(ib_dev, port);
0649
0650 mutex_lock(&table->lock);
0651
0652 for (ix = 0; ix < table->sz; ix++) {
0653 if (is_gid_entry_valid(table->data_vec[ix]) &&
0654 table->data_vec[ix]->attr.ndev == ndev) {
0655 del_gid(ib_dev, port, table, ix);
0656 deleted = true;
0657 }
0658 }
0659
0660 mutex_unlock(&table->lock);
0661
0662 if (deleted)
0663 dispatch_gid_change_event(ib_dev, port);
0664
0665 return 0;
0666 }
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682 const struct ib_gid_attr *
0683 rdma_find_gid_by_port(struct ib_device *ib_dev,
0684 const union ib_gid *gid,
0685 enum ib_gid_type gid_type,
0686 u32 port, struct net_device *ndev)
0687 {
0688 int local_index;
0689 struct ib_gid_table *table;
0690 unsigned long mask = GID_ATTR_FIND_MASK_GID |
0691 GID_ATTR_FIND_MASK_GID_TYPE;
0692 struct ib_gid_attr val = {.ndev = ndev, .gid_type = gid_type};
0693 const struct ib_gid_attr *attr;
0694 unsigned long flags;
0695
0696 if (!rdma_is_port_valid(ib_dev, port))
0697 return ERR_PTR(-ENOENT);
0698
0699 table = rdma_gid_table(ib_dev, port);
0700
0701 if (ndev)
0702 mask |= GID_ATTR_FIND_MASK_NETDEV;
0703
0704 read_lock_irqsave(&table->rwlock, flags);
0705 local_index = find_gid(table, gid, &val, false, mask, NULL);
0706 if (local_index >= 0) {
0707 get_gid_entry(table->data_vec[local_index]);
0708 attr = &table->data_vec[local_index]->attr;
0709 read_unlock_irqrestore(&table->rwlock, flags);
0710 return attr;
0711 }
0712
0713 read_unlock_irqrestore(&table->rwlock, flags);
0714 return ERR_PTR(-ENOENT);
0715 }
0716 EXPORT_SYMBOL(rdma_find_gid_by_port);
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736 const struct ib_gid_attr *rdma_find_gid_by_filter(
0737 struct ib_device *ib_dev, const union ib_gid *gid, u32 port,
0738 bool (*filter)(const union ib_gid *gid, const struct ib_gid_attr *,
0739 void *),
0740 void *context)
0741 {
0742 const struct ib_gid_attr *res = ERR_PTR(-ENOENT);
0743 struct ib_gid_table *table;
0744 unsigned long flags;
0745 unsigned int i;
0746
0747 if (!rdma_is_port_valid(ib_dev, port))
0748 return ERR_PTR(-EINVAL);
0749
0750 table = rdma_gid_table(ib_dev, port);
0751
0752 read_lock_irqsave(&table->rwlock, flags);
0753 for (i = 0; i < table->sz; i++) {
0754 struct ib_gid_table_entry *entry = table->data_vec[i];
0755
0756 if (!is_gid_entry_valid(entry))
0757 continue;
0758
0759 if (memcmp(gid, &entry->attr.gid, sizeof(*gid)))
0760 continue;
0761
0762 if (filter(gid, &entry->attr, context)) {
0763 get_gid_entry(entry);
0764 res = &entry->attr;
0765 break;
0766 }
0767 }
0768 read_unlock_irqrestore(&table->rwlock, flags);
0769 return res;
0770 }
0771
0772 static struct ib_gid_table *alloc_gid_table(int sz)
0773 {
0774 struct ib_gid_table *table = kzalloc(sizeof(*table), GFP_KERNEL);
0775
0776 if (!table)
0777 return NULL;
0778
0779 table->data_vec = kcalloc(sz, sizeof(*table->data_vec), GFP_KERNEL);
0780 if (!table->data_vec)
0781 goto err_free_table;
0782
0783 mutex_init(&table->lock);
0784
0785 table->sz = sz;
0786 rwlock_init(&table->rwlock);
0787 return table;
0788
0789 err_free_table:
0790 kfree(table);
0791 return NULL;
0792 }
0793
0794 static void release_gid_table(struct ib_device *device,
0795 struct ib_gid_table *table)
0796 {
0797 bool leak = false;
0798 int i;
0799
0800 if (!table)
0801 return;
0802
0803 for (i = 0; i < table->sz; i++) {
0804 if (is_gid_entry_free(table->data_vec[i]))
0805 continue;
0806 if (kref_read(&table->data_vec[i]->kref) > 1) {
0807 dev_err(&device->dev,
0808 "GID entry ref leak for index %d ref=%u\n", i,
0809 kref_read(&table->data_vec[i]->kref));
0810 leak = true;
0811 }
0812 }
0813 if (leak)
0814 return;
0815
0816 mutex_destroy(&table->lock);
0817 kfree(table->data_vec);
0818 kfree(table);
0819 }
0820
0821 static void cleanup_gid_table_port(struct ib_device *ib_dev, u32 port,
0822 struct ib_gid_table *table)
0823 {
0824 int i;
0825
0826 if (!table)
0827 return;
0828
0829 mutex_lock(&table->lock);
0830 for (i = 0; i < table->sz; ++i) {
0831 if (is_gid_entry_valid(table->data_vec[i]))
0832 del_gid(ib_dev, port, table, i);
0833 }
0834 mutex_unlock(&table->lock);
0835 }
0836
0837 void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u32 port,
0838 struct net_device *ndev,
0839 unsigned long gid_type_mask,
0840 enum ib_cache_gid_default_mode mode)
0841 {
0842 union ib_gid gid = { };
0843 struct ib_gid_attr gid_attr;
0844 unsigned int gid_type;
0845 unsigned long mask;
0846
0847 mask = GID_ATTR_FIND_MASK_GID_TYPE |
0848 GID_ATTR_FIND_MASK_DEFAULT |
0849 GID_ATTR_FIND_MASK_NETDEV;
0850 memset(&gid_attr, 0, sizeof(gid_attr));
0851 gid_attr.ndev = ndev;
0852
0853 for (gid_type = 0; gid_type < IB_GID_TYPE_SIZE; ++gid_type) {
0854 if (1UL << gid_type & ~gid_type_mask)
0855 continue;
0856
0857 gid_attr.gid_type = gid_type;
0858
0859 if (mode == IB_CACHE_GID_DEFAULT_MODE_SET) {
0860 make_default_gid(ndev, &gid);
0861 __ib_cache_gid_add(ib_dev, port, &gid,
0862 &gid_attr, mask, true);
0863 } else if (mode == IB_CACHE_GID_DEFAULT_MODE_DELETE) {
0864 _ib_cache_gid_del(ib_dev, port, &gid,
0865 &gid_attr, mask, true);
0866 }
0867 }
0868 }
0869
0870 static void gid_table_reserve_default(struct ib_device *ib_dev, u32 port,
0871 struct ib_gid_table *table)
0872 {
0873 unsigned int i;
0874 unsigned long roce_gid_type_mask;
0875 unsigned int num_default_gids;
0876
0877 roce_gid_type_mask = roce_gid_type_mask_support(ib_dev, port);
0878 num_default_gids = hweight_long(roce_gid_type_mask);
0879
0880 for (i = 0; i < num_default_gids && i < table->sz; i++)
0881 table->default_gid_indices |= BIT(i);
0882 }
0883
0884
0885 static void gid_table_release_one(struct ib_device *ib_dev)
0886 {
0887 u32 p;
0888
0889 rdma_for_each_port (ib_dev, p) {
0890 release_gid_table(ib_dev, ib_dev->port_data[p].cache.gid);
0891 ib_dev->port_data[p].cache.gid = NULL;
0892 }
0893 }
0894
0895 static int _gid_table_setup_one(struct ib_device *ib_dev)
0896 {
0897 struct ib_gid_table *table;
0898 u32 rdma_port;
0899
0900 rdma_for_each_port (ib_dev, rdma_port) {
0901 table = alloc_gid_table(
0902 ib_dev->port_data[rdma_port].immutable.gid_tbl_len);
0903 if (!table)
0904 goto rollback_table_setup;
0905
0906 gid_table_reserve_default(ib_dev, rdma_port, table);
0907 ib_dev->port_data[rdma_port].cache.gid = table;
0908 }
0909 return 0;
0910
0911 rollback_table_setup:
0912 gid_table_release_one(ib_dev);
0913 return -ENOMEM;
0914 }
0915
0916 static void gid_table_cleanup_one(struct ib_device *ib_dev)
0917 {
0918 u32 p;
0919
0920 rdma_for_each_port (ib_dev, p)
0921 cleanup_gid_table_port(ib_dev, p,
0922 ib_dev->port_data[p].cache.gid);
0923 }
0924
0925 static int gid_table_setup_one(struct ib_device *ib_dev)
0926 {
0927 int err;
0928
0929 err = _gid_table_setup_one(ib_dev);
0930
0931 if (err)
0932 return err;
0933
0934 rdma_roce_rescan_device(ib_dev);
0935
0936 return err;
0937 }
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951
0952
0953 int rdma_query_gid(struct ib_device *device, u32 port_num,
0954 int index, union ib_gid *gid)
0955 {
0956 struct ib_gid_table *table;
0957 unsigned long flags;
0958 int res;
0959
0960 if (!rdma_is_port_valid(device, port_num))
0961 return -EINVAL;
0962
0963 table = rdma_gid_table(device, port_num);
0964 read_lock_irqsave(&table->rwlock, flags);
0965
0966 if (index < 0 || index >= table->sz) {
0967 res = -EINVAL;
0968 goto done;
0969 }
0970
0971 if (!is_gid_entry_valid(table->data_vec[index])) {
0972 res = -ENOENT;
0973 goto done;
0974 }
0975
0976 memcpy(gid, &table->data_vec[index]->attr.gid, sizeof(*gid));
0977 res = 0;
0978
0979 done:
0980 read_unlock_irqrestore(&table->rwlock, flags);
0981 return res;
0982 }
0983 EXPORT_SYMBOL(rdma_query_gid);
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996 void *rdma_read_gid_hw_context(const struct ib_gid_attr *attr)
0997 {
0998 return container_of(attr, struct ib_gid_table_entry, attr)->context;
0999 }
1000 EXPORT_SYMBOL(rdma_read_gid_hw_context);
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015 const struct ib_gid_attr *rdma_find_gid(struct ib_device *device,
1016 const union ib_gid *gid,
1017 enum ib_gid_type gid_type,
1018 struct net_device *ndev)
1019 {
1020 unsigned long mask = GID_ATTR_FIND_MASK_GID |
1021 GID_ATTR_FIND_MASK_GID_TYPE;
1022 struct ib_gid_attr gid_attr_val = {.ndev = ndev, .gid_type = gid_type};
1023 u32 p;
1024
1025 if (ndev)
1026 mask |= GID_ATTR_FIND_MASK_NETDEV;
1027
1028 rdma_for_each_port(device, p) {
1029 struct ib_gid_table *table;
1030 unsigned long flags;
1031 int index;
1032
1033 table = device->port_data[p].cache.gid;
1034 read_lock_irqsave(&table->rwlock, flags);
1035 index = find_gid(table, gid, &gid_attr_val, false, mask, NULL);
1036 if (index >= 0) {
1037 const struct ib_gid_attr *attr;
1038
1039 get_gid_entry(table->data_vec[index]);
1040 attr = &table->data_vec[index]->attr;
1041 read_unlock_irqrestore(&table->rwlock, flags);
1042 return attr;
1043 }
1044 read_unlock_irqrestore(&table->rwlock, flags);
1045 }
1046
1047 return ERR_PTR(-ENOENT);
1048 }
1049 EXPORT_SYMBOL(rdma_find_gid);
1050
1051 int ib_get_cached_pkey(struct ib_device *device,
1052 u32 port_num,
1053 int index,
1054 u16 *pkey)
1055 {
1056 struct ib_pkey_cache *cache;
1057 unsigned long flags;
1058 int ret = 0;
1059
1060 if (!rdma_is_port_valid(device, port_num))
1061 return -EINVAL;
1062
1063 read_lock_irqsave(&device->cache_lock, flags);
1064
1065 cache = device->port_data[port_num].cache.pkey;
1066
1067 if (!cache || index < 0 || index >= cache->table_len)
1068 ret = -EINVAL;
1069 else
1070 *pkey = cache->table[index];
1071
1072 read_unlock_irqrestore(&device->cache_lock, flags);
1073
1074 return ret;
1075 }
1076 EXPORT_SYMBOL(ib_get_cached_pkey);
1077
1078 void ib_get_cached_subnet_prefix(struct ib_device *device, u32 port_num,
1079 u64 *sn_pfx)
1080 {
1081 unsigned long flags;
1082
1083 read_lock_irqsave(&device->cache_lock, flags);
1084 *sn_pfx = device->port_data[port_num].cache.subnet_prefix;
1085 read_unlock_irqrestore(&device->cache_lock, flags);
1086 }
1087 EXPORT_SYMBOL(ib_get_cached_subnet_prefix);
1088
1089 int ib_find_cached_pkey(struct ib_device *device, u32 port_num,
1090 u16 pkey, u16 *index)
1091 {
1092 struct ib_pkey_cache *cache;
1093 unsigned long flags;
1094 int i;
1095 int ret = -ENOENT;
1096 int partial_ix = -1;
1097
1098 if (!rdma_is_port_valid(device, port_num))
1099 return -EINVAL;
1100
1101 read_lock_irqsave(&device->cache_lock, flags);
1102
1103 cache = device->port_data[port_num].cache.pkey;
1104 if (!cache) {
1105 ret = -EINVAL;
1106 goto err;
1107 }
1108
1109 *index = -1;
1110
1111 for (i = 0; i < cache->table_len; ++i)
1112 if ((cache->table[i] & 0x7fff) == (pkey & 0x7fff)) {
1113 if (cache->table[i] & 0x8000) {
1114 *index = i;
1115 ret = 0;
1116 break;
1117 } else {
1118 partial_ix = i;
1119 }
1120 }
1121
1122 if (ret && partial_ix >= 0) {
1123 *index = partial_ix;
1124 ret = 0;
1125 }
1126
1127 err:
1128 read_unlock_irqrestore(&device->cache_lock, flags);
1129
1130 return ret;
1131 }
1132 EXPORT_SYMBOL(ib_find_cached_pkey);
1133
1134 int ib_find_exact_cached_pkey(struct ib_device *device, u32 port_num,
1135 u16 pkey, u16 *index)
1136 {
1137 struct ib_pkey_cache *cache;
1138 unsigned long flags;
1139 int i;
1140 int ret = -ENOENT;
1141
1142 if (!rdma_is_port_valid(device, port_num))
1143 return -EINVAL;
1144
1145 read_lock_irqsave(&device->cache_lock, flags);
1146
1147 cache = device->port_data[port_num].cache.pkey;
1148 if (!cache) {
1149 ret = -EINVAL;
1150 goto err;
1151 }
1152
1153 *index = -1;
1154
1155 for (i = 0; i < cache->table_len; ++i)
1156 if (cache->table[i] == pkey) {
1157 *index = i;
1158 ret = 0;
1159 break;
1160 }
1161
1162 err:
1163 read_unlock_irqrestore(&device->cache_lock, flags);
1164
1165 return ret;
1166 }
1167 EXPORT_SYMBOL(ib_find_exact_cached_pkey);
1168
1169 int ib_get_cached_lmc(struct ib_device *device, u32 port_num, u8 *lmc)
1170 {
1171 unsigned long flags;
1172 int ret = 0;
1173
1174 if (!rdma_is_port_valid(device, port_num))
1175 return -EINVAL;
1176
1177 read_lock_irqsave(&device->cache_lock, flags);
1178 *lmc = device->port_data[port_num].cache.lmc;
1179 read_unlock_irqrestore(&device->cache_lock, flags);
1180
1181 return ret;
1182 }
1183 EXPORT_SYMBOL(ib_get_cached_lmc);
1184
1185 int ib_get_cached_port_state(struct ib_device *device, u32 port_num,
1186 enum ib_port_state *port_state)
1187 {
1188 unsigned long flags;
1189 int ret = 0;
1190
1191 if (!rdma_is_port_valid(device, port_num))
1192 return -EINVAL;
1193
1194 read_lock_irqsave(&device->cache_lock, flags);
1195 *port_state = device->port_data[port_num].cache.port_state;
1196 read_unlock_irqrestore(&device->cache_lock, flags);
1197
1198 return ret;
1199 }
1200 EXPORT_SYMBOL(ib_get_cached_port_state);
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218 const struct ib_gid_attr *
1219 rdma_get_gid_attr(struct ib_device *device, u32 port_num, int index)
1220 {
1221 const struct ib_gid_attr *attr = ERR_PTR(-ENODATA);
1222 struct ib_gid_table *table;
1223 unsigned long flags;
1224
1225 if (!rdma_is_port_valid(device, port_num))
1226 return ERR_PTR(-EINVAL);
1227
1228 table = rdma_gid_table(device, port_num);
1229 if (index < 0 || index >= table->sz)
1230 return ERR_PTR(-EINVAL);
1231
1232 read_lock_irqsave(&table->rwlock, flags);
1233 if (!is_gid_entry_valid(table->data_vec[index]))
1234 goto done;
1235
1236 get_gid_entry(table->data_vec[index]);
1237 attr = &table->data_vec[index]->attr;
1238 done:
1239 read_unlock_irqrestore(&table->rwlock, flags);
1240 return attr;
1241 }
1242 EXPORT_SYMBOL(rdma_get_gid_attr);
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253 ssize_t rdma_query_gid_table(struct ib_device *device,
1254 struct ib_uverbs_gid_entry *entries,
1255 size_t max_entries)
1256 {
1257 const struct ib_gid_attr *gid_attr;
1258 ssize_t num_entries = 0, ret;
1259 struct ib_gid_table *table;
1260 u32 port_num, i;
1261 struct net_device *ndev;
1262 unsigned long flags;
1263
1264 rdma_for_each_port(device, port_num) {
1265 table = rdma_gid_table(device, port_num);
1266 read_lock_irqsave(&table->rwlock, flags);
1267 for (i = 0; i < table->sz; i++) {
1268 if (!is_gid_entry_valid(table->data_vec[i]))
1269 continue;
1270 if (num_entries >= max_entries) {
1271 ret = -EINVAL;
1272 goto err;
1273 }
1274
1275 gid_attr = &table->data_vec[i]->attr;
1276
1277 memcpy(&entries->gid, &gid_attr->gid,
1278 sizeof(gid_attr->gid));
1279 entries->gid_index = gid_attr->index;
1280 entries->port_num = gid_attr->port_num;
1281 entries->gid_type = gid_attr->gid_type;
1282 ndev = rcu_dereference_protected(
1283 gid_attr->ndev,
1284 lockdep_is_held(&table->rwlock));
1285 if (ndev)
1286 entries->netdev_ifindex = ndev->ifindex;
1287
1288 num_entries++;
1289 entries++;
1290 }
1291 read_unlock_irqrestore(&table->rwlock, flags);
1292 }
1293
1294 return num_entries;
1295 err:
1296 read_unlock_irqrestore(&table->rwlock, flags);
1297 return ret;
1298 }
1299 EXPORT_SYMBOL(rdma_query_gid_table);
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312 void rdma_put_gid_attr(const struct ib_gid_attr *attr)
1313 {
1314 struct ib_gid_table_entry *entry =
1315 container_of(attr, struct ib_gid_table_entry, attr);
1316
1317 put_gid_entry(entry);
1318 }
1319 EXPORT_SYMBOL(rdma_put_gid_attr);
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331 void rdma_hold_gid_attr(const struct ib_gid_attr *attr)
1332 {
1333 struct ib_gid_table_entry *entry =
1334 container_of(attr, struct ib_gid_table_entry, attr);
1335
1336 get_gid_entry(entry);
1337 }
1338 EXPORT_SYMBOL(rdma_hold_gid_attr);
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352 struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr)
1353 {
1354 struct ib_gid_table_entry *entry =
1355 container_of(attr, struct ib_gid_table_entry, attr);
1356 struct ib_device *device = entry->attr.device;
1357 struct net_device *ndev = ERR_PTR(-EINVAL);
1358 u32 port_num = entry->attr.port_num;
1359 struct ib_gid_table *table;
1360 unsigned long flags;
1361 bool valid;
1362
1363 table = rdma_gid_table(device, port_num);
1364
1365 read_lock_irqsave(&table->rwlock, flags);
1366 valid = is_gid_entry_valid(table->data_vec[attr->index]);
1367 if (valid) {
1368 ndev = rcu_dereference(attr->ndev);
1369 if (!ndev)
1370 ndev = ERR_PTR(-ENODEV);
1371 }
1372 read_unlock_irqrestore(&table->rwlock, flags);
1373 return ndev;
1374 }
1375 EXPORT_SYMBOL(rdma_read_gid_attr_ndev_rcu);
1376
1377 static int get_lower_dev_vlan(struct net_device *lower_dev,
1378 struct netdev_nested_priv *priv)
1379 {
1380 u16 *vlan_id = (u16 *)priv->data;
1381
1382 if (is_vlan_dev(lower_dev))
1383 *vlan_id = vlan_dev_vlan_id(lower_dev);
1384
1385
1386
1387
1388 return 1;
1389 }
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403 int rdma_read_gid_l2_fields(const struct ib_gid_attr *attr,
1404 u16 *vlan_id, u8 *smac)
1405 {
1406 struct netdev_nested_priv priv = {
1407 .data = (void *)vlan_id,
1408 };
1409 struct net_device *ndev;
1410
1411 rcu_read_lock();
1412 ndev = rcu_dereference(attr->ndev);
1413 if (!ndev) {
1414 rcu_read_unlock();
1415 return -ENODEV;
1416 }
1417 if (smac)
1418 ether_addr_copy(smac, ndev->dev_addr);
1419 if (vlan_id) {
1420 *vlan_id = 0xffff;
1421 if (is_vlan_dev(ndev)) {
1422 *vlan_id = vlan_dev_vlan_id(ndev);
1423 } else {
1424
1425
1426
1427
1428 netdev_walk_all_lower_dev_rcu(attr->ndev,
1429 get_lower_dev_vlan, &priv);
1430 }
1431 }
1432 rcu_read_unlock();
1433 return 0;
1434 }
1435 EXPORT_SYMBOL(rdma_read_gid_l2_fields);
1436
1437 static int config_non_roce_gid_cache(struct ib_device *device,
1438 u32 port, struct ib_port_attr *tprops)
1439 {
1440 struct ib_gid_attr gid_attr = {};
1441 struct ib_gid_table *table;
1442 int ret = 0;
1443 int i;
1444
1445 gid_attr.device = device;
1446 gid_attr.port_num = port;
1447 table = rdma_gid_table(device, port);
1448
1449 mutex_lock(&table->lock);
1450 for (i = 0; i < tprops->gid_tbl_len; ++i) {
1451 if (!device->ops.query_gid)
1452 continue;
1453 ret = device->ops.query_gid(device, port, i, &gid_attr.gid);
1454 if (ret) {
1455 dev_warn(&device->dev,
1456 "query_gid failed (%d) for index %d\n", ret,
1457 i);
1458 goto err;
1459 }
1460 gid_attr.index = i;
1461 tprops->subnet_prefix =
1462 be64_to_cpu(gid_attr.gid.global.subnet_prefix);
1463 add_modify_gid(table, &gid_attr);
1464 }
1465 err:
1466 mutex_unlock(&table->lock);
1467 return ret;
1468 }
1469
1470 static int
1471 ib_cache_update(struct ib_device *device, u32 port, bool update_gids,
1472 bool update_pkeys, bool enforce_security)
1473 {
1474 struct ib_port_attr *tprops = NULL;
1475 struct ib_pkey_cache *pkey_cache = NULL;
1476 struct ib_pkey_cache *old_pkey_cache = NULL;
1477 int i;
1478 int ret;
1479
1480 if (!rdma_is_port_valid(device, port))
1481 return -EINVAL;
1482
1483 tprops = kmalloc(sizeof *tprops, GFP_KERNEL);
1484 if (!tprops)
1485 return -ENOMEM;
1486
1487 ret = ib_query_port(device, port, tprops);
1488 if (ret) {
1489 dev_warn(&device->dev, "ib_query_port failed (%d)\n", ret);
1490 goto err;
1491 }
1492
1493 if (!rdma_protocol_roce(device, port) && update_gids) {
1494 ret = config_non_roce_gid_cache(device, port,
1495 tprops);
1496 if (ret)
1497 goto err;
1498 }
1499
1500 update_pkeys &= !!tprops->pkey_tbl_len;
1501
1502 if (update_pkeys) {
1503 pkey_cache = kmalloc(struct_size(pkey_cache, table,
1504 tprops->pkey_tbl_len),
1505 GFP_KERNEL);
1506 if (!pkey_cache) {
1507 ret = -ENOMEM;
1508 goto err;
1509 }
1510
1511 pkey_cache->table_len = tprops->pkey_tbl_len;
1512
1513 for (i = 0; i < pkey_cache->table_len; ++i) {
1514 ret = ib_query_pkey(device, port, i,
1515 pkey_cache->table + i);
1516 if (ret) {
1517 dev_warn(&device->dev,
1518 "ib_query_pkey failed (%d) for index %d\n",
1519 ret, i);
1520 goto err;
1521 }
1522 }
1523 }
1524
1525 write_lock_irq(&device->cache_lock);
1526
1527 if (update_pkeys) {
1528 old_pkey_cache = device->port_data[port].cache.pkey;
1529 device->port_data[port].cache.pkey = pkey_cache;
1530 }
1531 device->port_data[port].cache.lmc = tprops->lmc;
1532 device->port_data[port].cache.port_state = tprops->state;
1533
1534 device->port_data[port].cache.subnet_prefix = tprops->subnet_prefix;
1535 write_unlock_irq(&device->cache_lock);
1536
1537 if (enforce_security)
1538 ib_security_cache_change(device,
1539 port,
1540 tprops->subnet_prefix);
1541
1542 kfree(old_pkey_cache);
1543 kfree(tprops);
1544 return 0;
1545
1546 err:
1547 kfree(pkey_cache);
1548 kfree(tprops);
1549 return ret;
1550 }
1551
1552 static void ib_cache_event_task(struct work_struct *_work)
1553 {
1554 struct ib_update_work *work =
1555 container_of(_work, struct ib_update_work, work);
1556 int ret;
1557
1558
1559
1560
1561 ret = ib_cache_update(work->event.device, work->event.element.port_num,
1562 work->event.event == IB_EVENT_GID_CHANGE,
1563 work->event.event == IB_EVENT_PKEY_CHANGE,
1564 work->enforce_security);
1565
1566
1567
1568
1569
1570 if (!ret && work->event.event != IB_EVENT_GID_CHANGE)
1571 ib_dispatch_event_clients(&work->event);
1572
1573 kfree(work);
1574 }
1575
1576 static void ib_generic_event_task(struct work_struct *_work)
1577 {
1578 struct ib_update_work *work =
1579 container_of(_work, struct ib_update_work, work);
1580
1581 ib_dispatch_event_clients(&work->event);
1582 kfree(work);
1583 }
1584
1585 static bool is_cache_update_event(const struct ib_event *event)
1586 {
1587 return (event->event == IB_EVENT_PORT_ERR ||
1588 event->event == IB_EVENT_PORT_ACTIVE ||
1589 event->event == IB_EVENT_LID_CHANGE ||
1590 event->event == IB_EVENT_PKEY_CHANGE ||
1591 event->event == IB_EVENT_CLIENT_REREGISTER ||
1592 event->event == IB_EVENT_GID_CHANGE);
1593 }
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603 void ib_dispatch_event(const struct ib_event *event)
1604 {
1605 struct ib_update_work *work;
1606
1607 work = kzalloc(sizeof(*work), GFP_ATOMIC);
1608 if (!work)
1609 return;
1610
1611 if (is_cache_update_event(event))
1612 INIT_WORK(&work->work, ib_cache_event_task);
1613 else
1614 INIT_WORK(&work->work, ib_generic_event_task);
1615
1616 work->event = *event;
1617 if (event->event == IB_EVENT_PKEY_CHANGE ||
1618 event->event == IB_EVENT_GID_CHANGE)
1619 work->enforce_security = true;
1620
1621 queue_work(ib_wq, &work->work);
1622 }
1623 EXPORT_SYMBOL(ib_dispatch_event);
1624
1625 int ib_cache_setup_one(struct ib_device *device)
1626 {
1627 u32 p;
1628 int err;
1629
1630 err = gid_table_setup_one(device);
1631 if (err)
1632 return err;
1633
1634 rdma_for_each_port (device, p) {
1635 err = ib_cache_update(device, p, true, true, true);
1636 if (err)
1637 return err;
1638 }
1639
1640 return 0;
1641 }
1642
1643 void ib_cache_release_one(struct ib_device *device)
1644 {
1645 u32 p;
1646
1647
1648
1649
1650
1651
1652
1653 rdma_for_each_port (device, p)
1654 kfree(device->port_data[p].cache.pkey);
1655
1656 gid_table_release_one(device);
1657 }
1658
1659 void ib_cache_cleanup_one(struct ib_device *device)
1660 {
1661
1662
1663
1664
1665
1666
1667 flush_workqueue(ib_wq);
1668 gid_table_cleanup_one(device);
1669
1670
1671
1672
1673 flush_workqueue(ib_wq);
1674 }