FILE
hns_roce_bond.c
File preview with syntax highlighting.
linux-6.19.14/drivers/infiniband/hw/hns/hns_roce_bond.c
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright (c) 2025 Hisilicon Limited. 4 */ 5 6#include <net/lag.h> 7#include <net/bonding.h> 8#include "hns_roce_device.h" 9#include "hns_roce_hw_v2.h" 10#include "hns_roce_bond.h" 11 12static DEFINE_XARRAY(roce_bond_xa); 13 14static struct hns_roce_dev *hns_roce_get_hrdev_by_netdev(struct net_device *net_dev) 15{ 16 struct ib_device *ibdev = 17 ib_device_get_by_netdev(net_dev, RDMA_DRIVER_HNS); 18 19 if (!ibdev) 20 return NULL; 21 22 return container_of(ibdev, struct hns_roce_dev, ib_dev); 23} 24 25static struct net_device *get_upper_dev_from_ndev(struct net_device *net_dev) 26{ 27 struct net_device *upper_dev; 28 29 rcu_read_lock(); 30 upper_dev = netdev_master_upper_dev_get_rcu(net_dev); 31 dev_hold(upper_dev); 32 rcu_read_unlock(); 33 34 return upper_dev; 35} 36 37static int get_netdev_bond_slave_id(struct net_device *net_dev, 38 struct hns_roce_bond_group *bond_grp) 39{ 40 int i; 41 42 for (i = 0; i < ROCE_BOND_FUNC_MAX; i++) 43 if (net_dev == bond_grp->bond_func_info[i].net_dev) 44 return i; 45 46 return -ENOENT; 47} 48 49struct hns_roce_bond_group *hns_roce_get_bond_grp(struct net_device *net_dev, 50 u8 bus_num) 51{ 52 struct hns_roce_die_info *die_info = xa_load(&roce_bond_xa, bus_num); 53 struct hns_roce_bond_group *bond_grp; 54 struct net_device *upper_dev = NULL; 55 int i; 56 57 if (!die_info) 58 return NULL; 59 60 for (i = 0; i < ROCE_BOND_NUM_MAX; i++) { 61 bond_grp = die_info->bgrps[i]; 62 if (!bond_grp) 63 continue; 64 if (get_netdev_bond_slave_id(net_dev, bond_grp) >= 0) 65 return bond_grp; 66 if (bond_grp->upper_dev) { 67 upper_dev = get_upper_dev_from_ndev(net_dev); 68 if (bond_grp->upper_dev == upper_dev) { 69 dev_put(upper_dev); 70 return bond_grp; 71 } 72 dev_put(upper_dev); 73 } 74 } 75 76 return NULL; 77} 78 79static int hns_roce_set_bond_netdev(struct hns_roce_bond_group *bond_grp, 80 struct hns_roce_dev *hr_dev) 81{ 82 struct net_device *active_dev; 83 struct net_device *old_dev; 84 int i, ret = 0; 85 86 if (bond_grp->tx_type == NETDEV_LAG_TX_TYPE_ACTIVEBACKUP) { 87 rcu_read_lock(); 88 active_dev = 89 bond_option_active_slave_get_rcu(netdev_priv(bond_grp->upper_dev)); 90 rcu_read_unlock(); 91 } else { 92 for (i = 0; i < ROCE_BOND_FUNC_MAX; i++) { 93 active_dev = bond_grp->bond_func_info[i].net_dev; 94 if (active_dev && 95 ib_get_curr_port_state(active_dev) == IB_PORT_ACTIVE) 96 break; 97 } 98 } 99 100 if (!active_dev || i == ROCE_BOND_FUNC_MAX) 101 active_dev = get_hr_netdev(hr_dev, 0); 102 103 old_dev = ib_device_get_netdev(&hr_dev->ib_dev, 1); 104 if (old_dev == active_dev) 105 goto out; 106 107 ret = ib_device_set_netdev(&hr_dev->ib_dev, active_dev, 1); 108 if (ret) { 109 dev_err(hr_dev->dev, "failed to set netdev for bond.\n"); 110 goto out; 111 } 112 113 if (bond_grp->tx_type == NETDEV_LAG_TX_TYPE_ACTIVEBACKUP) { 114 if (old_dev) 115 roce_del_all_netdev_gids(&hr_dev->ib_dev, 1, old_dev); 116 rdma_roce_rescan_port(&hr_dev->ib_dev, 1); 117 } 118out: 119 dev_put(old_dev); 120 return ret; 121} 122 123bool hns_roce_bond_is_active(struct hns_roce_dev *hr_dev) 124{ 125 struct net_device *net_dev = get_hr_netdev(hr_dev, 0); 126 struct hns_roce_bond_group *bond_grp; 127 u8 bus_num = get_hr_bus_num(hr_dev); 128 129 bond_grp = hns_roce_get_bond_grp(net_dev, bus_num); 130 if (bond_grp && bond_grp->bond_state != HNS_ROCE_BOND_NOT_BONDED && 131 bond_grp->bond_state != HNS_ROCE_BOND_NOT_ATTACHED) 132 return true; 133 134 return false; 135} 136 137static void hns_roce_bond_get_active_slave(struct hns_roce_bond_group *bond_grp) 138{ 139 struct net_device *net_dev; 140 u32 active_slave_map = 0; 141 u8 active_slave_num = 0; 142 bool active; 143 u8 i; 144 145 for (i = 0; i < ROCE_BOND_FUNC_MAX; i++) { 146 net_dev = bond_grp->bond_func_info[i].net_dev; 147 if (!net_dev || !(bond_grp->slave_map & (1U << i))) 148 continue; 149 150 active = (bond_grp->tx_type == NETDEV_LAG_TX_TYPE_ACTIVEBACKUP) ? 151 net_lag_port_dev_txable(net_dev) : 152 (ib_get_curr_port_state(net_dev) == IB_PORT_ACTIVE); 153 if (active) { 154 active_slave_num++; 155 active_slave_map |= (1U << i); 156 } 157 } 158 159 bond_grp->active_slave_num = active_slave_num; 160 bond_grp->active_slave_map = active_slave_map; 161} 162 163static int hns_roce_recover_bond(struct hns_roce_bond_group *bond_grp, 164 struct hns_roce_dev *hr_dev) 165{ 166 bond_grp->main_hr_dev = hr_dev; 167 hns_roce_bond_get_active_slave(bond_grp); 168 169 return hns_roce_cmd_bond(bond_grp, HNS_ROCE_SET_BOND); 170} 171 172static void hns_roce_slave_uninit(struct hns_roce_bond_group *bond_grp, 173 u8 func_idx) 174{ 175 struct hnae3_handle *handle; 176 177 handle = bond_grp->bond_func_info[func_idx].handle; 178 if (handle->priv) 179 hns_roce_bond_uninit_client(bond_grp, func_idx); 180} 181 182static struct hns_roce_dev 183 *hns_roce_slave_init(struct hns_roce_bond_group *bond_grp, 184 u8 func_idx, bool need_switch); 185 186static int switch_main_dev(struct hns_roce_bond_group *bond_grp, 187 u8 main_func_idx) 188{ 189 struct hns_roce_dev *hr_dev; 190 struct net_device *net_dev; 191 u8 i; 192 193 bond_grp->main_hr_dev = NULL; 194 hns_roce_bond_uninit_client(bond_grp, main_func_idx); 195 196 for (i = 0; i < ROCE_BOND_FUNC_MAX; i++) { 197 net_dev = bond_grp->bond_func_info[i].net_dev; 198 if ((bond_grp->slave_map & (1U << i)) && net_dev) { 199 /* In case this slave is still being registered as 200 * a non-bonded PF, uninit it first and then re-init 201 * it as the main device. 202 */ 203 hns_roce_slave_uninit(bond_grp, i); 204 hr_dev = hns_roce_slave_init(bond_grp, i, false); 205 if (hr_dev) { 206 bond_grp->main_hr_dev = hr_dev; 207 break; 208 } 209 } 210 } 211 212 if (!bond_grp->main_hr_dev) 213 return -ENODEV; 214 215 return 0; 216} 217 218static struct hns_roce_dev 219 *hns_roce_slave_init(struct hns_roce_bond_group *bond_grp, 220 u8 func_idx, bool need_switch) 221{ 222 struct hns_roce_dev *hr_dev = NULL; 223 struct hnae3_handle *handle; 224 u8 main_func_idx; 225 int ret; 226 227 if (need_switch) { 228 main_func_idx = PCI_FUNC(bond_grp->main_hr_dev->pci_dev->devfn); 229 if (func_idx == main_func_idx) { 230 ret = switch_main_dev(bond_grp, main_func_idx); 231 if (ret == -ENODEV) 232 return NULL; 233 } 234 } 235 236 handle = bond_grp->bond_func_info[func_idx].handle; 237 if (handle) { 238 if (handle->priv) 239 return handle->priv; 240 /* Prevent this device from being initialized as a bond device */ 241 if (need_switch) 242 bond_grp->bond_func_info[func_idx].net_dev = NULL; 243 hr_dev = hns_roce_bond_init_client(bond_grp, func_idx); 244 if (!hr_dev) 245 BOND_ERR_LOG("failed to init slave %u.\n", func_idx); 246 } 247 248 return hr_dev; 249} 250 251static struct hns_roce_die_info *alloc_die_info(int bus_num) 252{ 253 struct hns_roce_die_info *die_info; 254 int ret; 255 256 die_info = kzalloc(sizeof(*die_info), GFP_KERNEL); 257 if (!die_info) 258 return NULL; 259 260 ret = xa_err(xa_store(&roce_bond_xa, bus_num, die_info, GFP_KERNEL)); 261 if (ret) { 262 kfree(die_info); 263 return NULL; 264 } 265 266 mutex_init(&die_info->die_mutex); 267 268 return die_info; 269} 270 271static void dealloc_die_info(struct hns_roce_die_info *die_info, u8 bus_num) 272{ 273 mutex_destroy(&die_info->die_mutex); 274 xa_erase(&roce_bond_xa, bus_num); 275 kfree(die_info); 276} 277 278static int alloc_bond_id(struct hns_roce_bond_group *bond_grp) 279{ 280 u8 bus_num = bond_grp->bus_num; 281 struct hns_roce_die_info *die_info = xa_load(&roce_bond_xa, bus_num); 282 int i; 283 284 if (!die_info) { 285 die_info = alloc_die_info(bus_num); 286 if (!die_info) 287 return -ENOMEM; 288 } 289 290 for (i = 0; i < ROCE_BOND_NUM_MAX; i++) { 291 if (die_info->bond_id_mask & BOND_ID(i)) 292 continue; 293 294 die_info->bond_id_mask |= BOND_ID(i); 295 die_info->bgrps[i] = bond_grp; 296 bond_grp->bond_id = i; 297 298 return 0; 299 } 300 301 return -ENOSPC; 302} 303 304static int remove_bond_id(int bus_num, u8 bond_id) 305{ 306 struct hns_roce_die_info *die_info = xa_load(&roce_bond_xa, bus_num); 307 308 if (bond_id >= ROCE_BOND_NUM_MAX) 309 return -EINVAL; 310 311 if (!die_info) 312 return -ENODEV; 313 314 die_info->bond_id_mask &= ~BOND_ID(bond_id); 315 die_info->bgrps[bond_id] = NULL; 316 if (!die_info->bond_id_mask) 317 dealloc_die_info(die_info, bus_num); 318 319 return 0; 320} 321 322static void hns_roce_set_bond(struct hns_roce_bond_group *bond_grp) 323{ 324 struct hns_roce_dev *hr_dev; 325 int ret; 326 int i; 327 328 for (i = ROCE_BOND_FUNC_MAX - 1; i >= 0; i--) { 329 if (bond_grp->slave_map & (1 << i)) 330 hns_roce_slave_uninit(bond_grp, i); 331 } 332 333 mutex_lock(&bond_grp->bond_mutex); 334 bond_grp->bond_state = HNS_ROCE_BOND_IS_BONDED; 335 mutex_unlock(&bond_grp->bond_mutex); 336 bond_grp->main_hr_dev = NULL; 337 338 for (i = 0; i < ROCE_BOND_FUNC_MAX; i++) { 339 if (bond_grp->slave_map & (1 << i)) { 340 hr_dev = hns_roce_slave_init(bond_grp, i, false); 341 if (hr_dev) { 342 bond_grp->main_hr_dev = hr_dev; 343 break; 344 } 345 } 346 } 347 348 if (!bond_grp->main_hr_dev) { 349 ret = -ENODEV; 350 goto out; 351 } 352 353 hns_roce_bond_get_active_slave(bond_grp); 354 355 ret = hns_roce_cmd_bond(bond_grp, HNS_ROCE_SET_BOND); 356 357out: 358 if (ret) { 359 BOND_ERR_LOG("failed to set RoCE bond, ret = %d.\n", ret); 360 hns_roce_cleanup_bond(bond_grp); 361 } else { 362 ibdev_info(&bond_grp->main_hr_dev->ib_dev, 363 "RoCE set bond finished!\n"); 364 } 365} 366 367static void hns_roce_clear_bond(struct hns_roce_bond_group *bond_grp) 368{ 369 u8 main_func_idx = PCI_FUNC(bond_grp->main_hr_dev->pci_dev->devfn); 370 struct hns_roce_dev *hr_dev; 371 u8 i; 372 373 if (bond_grp->bond_state == HNS_ROCE_BOND_NOT_BONDED) 374 goto out; 375 376 bond_grp->bond_state = HNS_ROCE_BOND_NOT_BONDED; 377 bond_grp->main_hr_dev = NULL; 378 379 hns_roce_slave_uninit(bond_grp, main_func_idx); 380 381 for (i = 0; i < ROCE_BOND_FUNC_MAX; i++) { 382 hr_dev = hns_roce_slave_init(bond_grp, i, false); 383 if (hr_dev) 384 bond_grp->main_hr_dev = hr_dev; 385 } 386 387out: 388 hns_roce_cleanup_bond(bond_grp); 389} 390 391static void hns_roce_slave_changestate(struct hns_roce_bond_group *bond_grp) 392{ 393 int ret; 394 395 hns_roce_bond_get_active_slave(bond_grp); 396 397 ret = hns_roce_cmd_bond(bond_grp, HNS_ROCE_CHANGE_BOND); 398 399 mutex_lock(&bond_grp->bond_mutex); 400 if (bond_grp->bond_state == HNS_ROCE_BOND_SLAVE_CHANGESTATE) 401 bond_grp->bond_state = HNS_ROCE_BOND_IS_BONDED; 402 mutex_unlock(&bond_grp->bond_mutex); 403 404 if (ret) 405 ibdev_err(&bond_grp->main_hr_dev->ib_dev, 406 "failed to change RoCE bond slave state, ret = %d.\n", 407 ret); 408 else 409 ibdev_info(&bond_grp->main_hr_dev->ib_dev, 410 "RoCE slave changestate finished!\n"); 411} 412 413static void hns_roce_slave_change_num(struct hns_roce_bond_group *bond_grp) 414{ 415 int ret; 416 u8 i; 417 418 for (i = 0; i < ROCE_BOND_FUNC_MAX; i++) { 419 if (bond_grp->slave_map & (1U << i)) { 420 if (i == PCI_FUNC(bond_grp->main_hr_dev->pci_dev->devfn)) 421 continue; 422 hns_roce_slave_uninit(bond_grp, i); 423 } else { 424 hns_roce_slave_init(bond_grp, i, true); 425 if (!bond_grp->main_hr_dev) { 426 ret = -ENODEV; 427 goto out; 428 } 429 bond_grp->bond_func_info[i].net_dev = NULL; 430 bond_grp->bond_func_info[i].handle = NULL; 431 } 432 } 433 434 hns_roce_bond_get_active_slave(bond_grp); 435 436 ret = hns_roce_cmd_bond(bond_grp, HNS_ROCE_CHANGE_BOND); 437 438out: 439 if (ret) { 440 BOND_ERR_LOG("failed to change RoCE bond slave num, ret = %d.\n", ret); 441 hns_roce_cleanup_bond(bond_grp); 442 } else { 443 mutex_lock(&bond_grp->bond_mutex); 444 if (bond_grp->bond_state == HNS_ROCE_BOND_SLAVE_CHANGE_NUM) 445 bond_grp->bond_state = HNS_ROCE_BOND_IS_BONDED; 446 mutex_unlock(&bond_grp->bond_mutex); 447 ibdev_info(&bond_grp->main_hr_dev->ib_dev, 448 "RoCE slave change num finished!\n"); 449 } 450} 451 452static void hns_roce_bond_info_update_nolock(struct hns_roce_bond_group *bond_grp, 453 struct net_device *upper_dev) 454{ 455 struct hns_roce_v2_priv *priv; 456 struct hns_roce_dev *hr_dev; 457 struct net_device *net_dev; 458 int func_idx; 459 460 bond_grp->slave_map = 0; 461 rcu_read_lock(); 462 for_each_netdev_in_bond_rcu(upper_dev, net_dev) { 463 func_idx = get_netdev_bond_slave_id(net_dev, bond_grp); 464 if (func_idx < 0) { 465 hr_dev = hns_roce_get_hrdev_by_netdev(net_dev); 466 if (!hr_dev) 467 continue; 468 func_idx = PCI_FUNC(hr_dev->pci_dev->devfn); 469 if (!bond_grp->bond_func_info[func_idx].net_dev) { 470 priv = hr_dev->priv; 471 bond_grp->bond_func_info[func_idx].net_dev = 472 net_dev; 473 bond_grp->bond_func_info[func_idx].handle = 474 priv->handle; 475 } 476 ib_device_put(&hr_dev->ib_dev); 477 } 478 479 bond_grp->slave_map |= (1 << func_idx); 480 } 481 rcu_read_unlock(); 482} 483 484static bool is_dev_bond_supported(struct hns_roce_bond_group *bond_grp, 485 struct net_device *net_dev) 486{ 487 struct hns_roce_dev *hr_dev = hns_roce_get_hrdev_by_netdev(net_dev); 488 bool ret = true; 489 490 if (!hr_dev) { 491 if (bond_grp && 492 get_netdev_bond_slave_id(net_dev, bond_grp) >= 0) 493 return true; 494 else 495 return false; 496 } 497 498 if (!(hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_BOND)) { 499 ret = false; 500 goto out; 501 } 502 503 if (hr_dev->is_vf || pci_num_vf(hr_dev->pci_dev) > 0) { 504 ret = false; 505 goto out; 506 } 507 508 if (bond_grp->bus_num != get_hr_bus_num(hr_dev)) 509 ret = false; 510 511out: 512 ib_device_put(&hr_dev->ib_dev); 513 return ret; 514} 515 516static bool check_slave_support(struct hns_roce_bond_group *bond_grp, 517 struct net_device *upper_dev) 518{ 519 struct net_device *net_dev; 520 u8 slave_num = 0; 521 522 rcu_read_lock(); 523 for_each_netdev_in_bond_rcu(upper_dev, net_dev) { 524 if (is_dev_bond_supported(bond_grp, net_dev)) { 525 slave_num++; 526 continue; 527 } 528 rcu_read_unlock(); 529 return false; 530 } 531 rcu_read_unlock(); 532 533 return (slave_num > 1 && slave_num <= ROCE_BOND_FUNC_MAX); 534} 535 536static void hns_roce_bond_work(struct work_struct *work) 537{ 538 struct delayed_work *delayed_work = to_delayed_work(work); 539 struct hns_roce_bond_group *bond_grp = 540 container_of(delayed_work, struct hns_roce_bond_group, 541 bond_work); 542 enum hns_roce_bond_state bond_state; 543 bool bond_ready; 544 545 mutex_lock(&bond_grp->bond_mutex); 546 bond_ready = check_slave_support(bond_grp, bond_grp->upper_dev); 547 hns_roce_bond_info_update_nolock(bond_grp, bond_grp->upper_dev); 548 bond_state = bond_grp->bond_state; 549 bond_grp->bond_ready = bond_ready; 550 mutex_unlock(&bond_grp->bond_mutex); 551 552 ibdev_info(&bond_grp->main_hr_dev->ib_dev, 553 "bond work: bond_ready - %d, bond_state - %d.\n", 554 bond_ready, bond_state); 555 556 if (!bond_ready) { 557 hns_roce_clear_bond(bond_grp); 558 return; 559 } 560 561 switch (bond_state) { 562 case HNS_ROCE_BOND_NOT_BONDED: 563 hns_roce_set_bond(bond_grp); 564 /* In set_bond flow, we don't need to set bond netdev here as 565 * it has been done when bond_grp->main_hr_dev is registered. 566 */ 567 return; 568 case HNS_ROCE_BOND_SLAVE_CHANGESTATE: 569 hns_roce_slave_changestate(bond_grp); 570 break; 571 case HNS_ROCE_BOND_SLAVE_CHANGE_NUM: 572 hns_roce_slave_change_num(bond_grp); 573 break; 574 default: 575 return; 576 } 577 hns_roce_set_bond_netdev(bond_grp, bond_grp->main_hr_dev); 578} 579 580static void hns_roce_attach_bond_grp(struct hns_roce_bond_group *bond_grp, 581 struct hns_roce_dev *hr_dev, 582 struct net_device *upper_dev) 583{ 584 bond_grp->upper_dev = upper_dev; 585 bond_grp->main_hr_dev = hr_dev; 586 bond_grp->bond_state = HNS_ROCE_BOND_NOT_BONDED; 587 bond_grp->bond_ready = false; 588} 589 590static void hns_roce_detach_bond_grp(struct hns_roce_bond_group *bond_grp) 591{ 592 mutex_lock(&bond_grp->bond_mutex); 593 594 cancel_delayed_work(&bond_grp->bond_work); 595 bond_grp->upper_dev = NULL; 596 bond_grp->main_hr_dev = NULL; 597 bond_grp->bond_ready = false; 598 bond_grp->bond_state = HNS_ROCE_BOND_NOT_ATTACHED; 599 bond_grp->slave_map = 0; 600 memset(bond_grp->bond_func_info, 0, sizeof(bond_grp->bond_func_info)); 601 602 mutex_unlock(&bond_grp->bond_mutex); 603} 604 605void hns_roce_cleanup_bond(struct hns_roce_bond_group *bond_grp) 606{ 607 int ret; 608 609 ret = bond_grp->main_hr_dev ? 610 hns_roce_cmd_bond(bond_grp, HNS_ROCE_CLEAR_BOND) : -EIO; 611 if (ret) 612 BOND_ERR_LOG("failed to clear RoCE bond, ret = %d.\n", ret); 613 else 614 ibdev_info(&bond_grp->main_hr_dev->ib_dev, 615 "RoCE clear bond finished!\n"); 616 617 hns_roce_detach_bond_grp(bond_grp); 618} 619 620static bool lowerstate_event_filter(struct hns_roce_bond_group *bond_grp, 621 struct net_device *net_dev) 622{ 623 struct hns_roce_bond_group *bond_grp_tmp; 624 625 bond_grp_tmp = hns_roce_get_bond_grp(net_dev, bond_grp->bus_num); 626 return bond_grp_tmp == bond_grp; 627} 628 629static void lowerstate_event_setting(struct hns_roce_bond_group *bond_grp, 630 struct netdev_notifier_changelowerstate_info *info) 631{ 632 mutex_lock(&bond_grp->bond_mutex); 633 634 if (bond_grp->bond_ready && 635 bond_grp->bond_state == HNS_ROCE_BOND_IS_BONDED) 636 bond_grp->bond_state = HNS_ROCE_BOND_SLAVE_CHANGESTATE; 637 638 mutex_unlock(&bond_grp->bond_mutex); 639} 640 641static bool hns_roce_bond_lowerstate_event(struct hns_roce_bond_group *bond_grp, 642 struct netdev_notifier_changelowerstate_info *info) 643{ 644 struct net_device *net_dev = 645 netdev_notifier_info_to_dev((struct netdev_notifier_info *)info); 646 647 if (!netif_is_lag_port(net_dev)) 648 return false; 649 650 if (!lowerstate_event_filter(bond_grp, net_dev)) 651 return false; 652 653 lowerstate_event_setting(bond_grp, info); 654 655 return true; 656} 657 658static bool is_bond_setting_supported(struct netdev_lag_upper_info *bond_info) 659{ 660 if (!bond_info) 661 return false; 662 663 if (bond_info->tx_type != NETDEV_LAG_TX_TYPE_ACTIVEBACKUP && 664 bond_info->tx_type != NETDEV_LAG_TX_TYPE_HASH) 665 return false; 666 667 if (bond_info->tx_type == NETDEV_LAG_TX_TYPE_HASH && 668 bond_info->hash_type > NETDEV_LAG_HASH_L23) 669 return false; 670 671 return true; 672} 673 674static void upper_event_setting(struct hns_roce_bond_group *bond_grp, 675 struct netdev_notifier_changeupper_info *info) 676{ 677 struct netdev_lag_upper_info *bond_upper_info = NULL; 678 bool slave_inc = info->linking; 679 680 if (slave_inc) 681 bond_upper_info = info->upper_info; 682 683 if (bond_upper_info) { 684 bond_grp->tx_type = bond_upper_info->tx_type; 685 bond_grp->hash_type = bond_upper_info->hash_type; 686 } 687} 688 689static bool check_unlinking_bond_support(struct hns_roce_bond_group *bond_grp) 690{ 691 struct net_device *net_dev; 692 u8 slave_num = 0; 693 694 rcu_read_lock(); 695 for_each_netdev_in_bond_rcu(bond_grp->upper_dev, net_dev) { 696 if (get_netdev_bond_slave_id(net_dev, bond_grp) >= 0) 697 slave_num++; 698 } 699 rcu_read_unlock(); 700 701 return (slave_num > 1); 702} 703 704static bool check_linking_bond_support(struct netdev_lag_upper_info *bond_info, 705 struct hns_roce_bond_group *bond_grp, 706 struct net_device *upper_dev) 707{ 708 if (!is_bond_setting_supported(bond_info)) 709 return false; 710 711 return check_slave_support(bond_grp, upper_dev); 712} 713 714static enum bond_support_type 715 check_bond_support(struct hns_roce_bond_group *bond_grp, 716 struct net_device *upper_dev, 717 struct netdev_notifier_changeupper_info *info) 718{ 719 bool bond_grp_exist = false; 720 bool support; 721 722 if (upper_dev == bond_grp->upper_dev) 723 bond_grp_exist = true; 724 725 if (!info->linking && !bond_grp_exist) 726 return BOND_NOT_SUPPORT; 727 728 if (info->linking) 729 support = check_linking_bond_support(info->upper_info, bond_grp, 730 upper_dev); 731 else 732 support = check_unlinking_bond_support(bond_grp); 733 734 if (support) 735 return BOND_SUPPORT; 736 737 return bond_grp_exist ? BOND_EXISTING_NOT_SUPPORT : BOND_NOT_SUPPORT; 738} 739 740static bool upper_event_filter(struct netdev_notifier_changeupper_info *info, 741 struct hns_roce_bond_group *bond_grp, 742 struct net_device *net_dev) 743{ 744 struct net_device *upper_dev = info->upper_dev; 745 struct hns_roce_bond_group *bond_grp_tmp; 746 struct hns_roce_dev *hr_dev; 747 bool ret = true; 748 u8 bus_num; 749 750 if (!info->linking || 751 bond_grp->bond_state != HNS_ROCE_BOND_NOT_ATTACHED) 752 return bond_grp->upper_dev == upper_dev; 753 754 hr_dev = hns_roce_get_hrdev_by_netdev(net_dev); 755 if (!hr_dev) 756 return false; 757 758 bus_num = get_hr_bus_num(hr_dev); 759 if (bond_grp->bus_num != bus_num) { 760 ret = false; 761 goto out; 762 } 763 764 bond_grp_tmp = hns_roce_get_bond_grp(net_dev, bus_num); 765 if (bond_grp_tmp && bond_grp_tmp != bond_grp) 766 ret = false; 767out: 768 ib_device_put(&hr_dev->ib_dev); 769 return ret; 770} 771 772static bool hns_roce_bond_upper_event(struct hns_roce_bond_group *bond_grp, 773 struct netdev_notifier_changeupper_info *info) 774{ 775 struct net_device *net_dev = 776 netdev_notifier_info_to_dev((struct netdev_notifier_info *)info); 777 struct net_device *upper_dev = info->upper_dev; 778 enum bond_support_type support = BOND_SUPPORT; 779 struct hns_roce_dev *hr_dev; 780 int slave_id; 781 782 if (!upper_dev || !netif_is_lag_master(upper_dev)) 783 return false; 784 785 if (!upper_event_filter(info, bond_grp, net_dev)) 786 return false; 787 788 mutex_lock(&bond_grp->bond_mutex); 789 support = check_bond_support(bond_grp, upper_dev, info); 790 if (support == BOND_NOT_SUPPORT) { 791 mutex_unlock(&bond_grp->bond_mutex); 792 return false; 793 } 794 795 if (bond_grp->bond_state == HNS_ROCE_BOND_NOT_ATTACHED) { 796 hr_dev = hns_roce_get_hrdev_by_netdev(net_dev); 797 if (!hr_dev) { 798 mutex_unlock(&bond_grp->bond_mutex); 799 return false; 800 } 801 hns_roce_attach_bond_grp(bond_grp, hr_dev, upper_dev); 802 ib_device_put(&hr_dev->ib_dev); 803 } 804 805 /* In the case of netdev being unregistered, the roce 806 * instance shouldn't be inited. 807 */ 808 if (net_dev->reg_state >= NETREG_UNREGISTERING) { 809 slave_id = get_netdev_bond_slave_id(net_dev, bond_grp); 810 if (slave_id >= 0) { 811 bond_grp->bond_func_info[slave_id].net_dev = NULL; 812 bond_grp->bond_func_info[slave_id].handle = NULL; 813 } 814 } 815 816 if (support == BOND_SUPPORT) { 817 bond_grp->bond_ready = true; 818 if (bond_grp->bond_state != HNS_ROCE_BOND_NOT_BONDED) 819 bond_grp->bond_state = HNS_ROCE_BOND_SLAVE_CHANGE_NUM; 820 } 821 mutex_unlock(&bond_grp->bond_mutex); 822 if (support == BOND_SUPPORT) 823 upper_event_setting(bond_grp, info); 824 825 return true; 826} 827 828static int hns_roce_bond_event(struct notifier_block *self, 829 unsigned long event, void *ptr) 830{ 831 struct hns_roce_bond_group *bond_grp = 832 container_of(self, struct hns_roce_bond_group, bond_nb); 833 bool changed = false; 834 835 if (event == NETDEV_CHANGEUPPER) 836 changed = hns_roce_bond_upper_event(bond_grp, ptr); 837 if (event == NETDEV_CHANGELOWERSTATE) 838 changed = hns_roce_bond_lowerstate_event(bond_grp, ptr); 839 840 if (changed) 841 schedule_delayed_work(&bond_grp->bond_work, HZ); 842 843 return NOTIFY_DONE; 844} 845 846int hns_roce_alloc_bond_grp(struct hns_roce_dev *hr_dev) 847{ 848 struct hns_roce_bond_group *bgrps[ROCE_BOND_NUM_MAX]; 849 struct hns_roce_bond_group *bond_grp; 850 u8 bus_num = get_hr_bus_num(hr_dev); 851 int ret; 852 int i; 853 854 if (xa_load(&roce_bond_xa, bus_num)) 855 return 0; 856 857 for (i = 0; i < ROCE_BOND_NUM_MAX; i++) { 858 bond_grp = kvzalloc(sizeof(*bond_grp), GFP_KERNEL); 859 if (!bond_grp) { 860 ret = -ENOMEM; 861 goto mem_err; 862 } 863 864 mutex_init(&bond_grp->bond_mutex); 865 INIT_DELAYED_WORK(&bond_grp->bond_work, hns_roce_bond_work); 866 867 bond_grp->bond_ready = false; 868 bond_grp->bond_state = HNS_ROCE_BOND_NOT_ATTACHED; 869 bond_grp->bus_num = bus_num; 870 871 ret = alloc_bond_id(bond_grp); 872 if (ret) { 873 dev_err(hr_dev->dev, 874 "failed to alloc bond ID, ret = %d.\n", ret); 875 goto alloc_id_err; 876 } 877 878 bond_grp->bond_nb.notifier_call = hns_roce_bond_event; 879 ret = register_netdevice_notifier(&bond_grp->bond_nb); 880 if (ret) { 881 ibdev_err(&hr_dev->ib_dev, 882 "failed to register bond nb, ret = %d.\n", ret); 883 goto register_nb_err; 884 } 885 bgrps[i] = bond_grp; 886 } 887 888 return 0; 889 890register_nb_err: 891 remove_bond_id(bond_grp->bus_num, bond_grp->bond_id); 892alloc_id_err: 893 mutex_destroy(&bond_grp->bond_mutex); 894 kvfree(bond_grp); 895mem_err: 896 for (i--; i >= 0; i--) { 897 unregister_netdevice_notifier(&bgrps[i]->bond_nb); 898 cancel_delayed_work_sync(&bgrps[i]->bond_work); 899 remove_bond_id(bgrps[i]->bus_num, bgrps[i]->bond_id); 900 mutex_destroy(&bgrps[i]->bond_mutex); 901 kvfree(bgrps[i]); 902 } 903 return ret; 904} 905 906void hns_roce_dealloc_bond_grp(void) 907{ 908 struct hns_roce_bond_group *bond_grp; 909 struct hns_roce_die_info *die_info; 910 unsigned long id; 911 int i; 912 913 xa_for_each(&roce_bond_xa, id, die_info) { 914 for (i = 0; i < ROCE_BOND_NUM_MAX; i++) { 915 bond_grp = die_info->bgrps[i]; 916 if (!bond_grp) 917 continue; 918 unregister_netdevice_notifier(&bond_grp->bond_nb); 919 cancel_delayed_work_sync(&bond_grp->bond_work); 920 remove_bond_id(bond_grp->bus_num, bond_grp->bond_id); 921 mutex_destroy(&bond_grp->bond_mutex); 922 kvfree(bond_grp); 923 } 924 } 925} 926 927int hns_roce_bond_init(struct hns_roce_dev *hr_dev) 928{ 929 struct net_device *net_dev = get_hr_netdev(hr_dev, 0); 930 struct hns_roce_v2_priv *priv = hr_dev->priv; 931 struct hns_roce_bond_group *bond_grp; 932 u8 bus_num = get_hr_bus_num(hr_dev); 933 int ret; 934 935 bond_grp = hns_roce_get_bond_grp(net_dev, bus_num); 936 937 if (priv->handle->rinfo.reset_state == HNS_ROCE_STATE_RST_INIT) { 938 ret = hns_roce_recover_bond(bond_grp, hr_dev); 939 if (ret) { 940 dev_err(hr_dev->dev, 941 "failed to recover RoCE bond, ret = %d.\n", ret); 942 return ret; 943 } 944 } 945 946 return hns_roce_set_bond_netdev(bond_grp, hr_dev); 947} 948 949void hns_roce_bond_suspend(struct hnae3_handle *handle) 950{ 951 u8 bus_num = handle->pdev->bus->number; 952 struct hns_roce_bond_group *bond_grp; 953 struct hns_roce_die_info *die_info; 954 int i; 955 956 die_info = xa_load(&roce_bond_xa, bus_num); 957 if (!die_info) 958 return; 959 960 mutex_lock(&die_info->die_mutex); 961 962 /* 963 * Avoid duplicated processing when calling this function 964 * multiple times. 965 */ 966 if (die_info->suspend_cnt) 967 goto out; 968 969 for (i = 0; i < ROCE_BOND_NUM_MAX; i++) { 970 bond_grp = die_info->bgrps[i]; 971 if (!bond_grp) 972 continue; 973 unregister_netdevice_notifier(&bond_grp->bond_nb); 974 cancel_delayed_work_sync(&bond_grp->bond_work); 975 } 976 977out: 978 die_info->suspend_cnt++; 979 mutex_unlock(&die_info->die_mutex); 980} 981 982void hns_roce_bond_resume(struct hnae3_handle *handle) 983{ 984 u8 bus_num = handle->pdev->bus->number; 985 struct hns_roce_bond_group *bond_grp; 986 struct hns_roce_die_info *die_info; 987 int i, ret; 988 989 die_info = xa_load(&roce_bond_xa, bus_num); 990 if (!die_info) 991 return; 992 993 mutex_lock(&die_info->die_mutex); 994 995 die_info->suspend_cnt--; 996 if (die_info->suspend_cnt) 997 goto out; 998 999 for (i = 0; i < ROCE_BOND_NUM_MAX; i++) { 1000 bond_grp = die_info->bgrps[i]; 1001 if (!bond_grp) 1002 continue; 1003 ret = register_netdevice_notifier(&bond_grp->bond_nb); 1004 if (ret) 1005 dev_err(&handle->pdev->dev, 1006 "failed to resume bond notifier(bus_num = %u, id = %u), ret = %d.\n", 1007 bus_num, bond_grp->bond_id, ret); 1008 } 1009 1010out: 1011 mutex_unlock(&die_info->die_mutex); 1012}
~/
Read-only file preview.