mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
RDMA/hfi1: Remove opa_vnic
OPA Vnic has been abandoned and left to rot. Time to excise. Signed-off-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com> Link: https://patch.msgid.link/177308912950.1280237.15051663328388849915.stgit@awdrv-04.cornelisnetworks.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
committed by
Leon Romanovsky
parent
2afa8b9f5f
commit
1b50f42049
@@ -92,21 +92,6 @@ iSCSI Extensions for RDMA (iSER)
|
||||
.. kernel-doc:: drivers/infiniband/ulp/iser/iser_verbs.c
|
||||
:internal:
|
||||
|
||||
Omni-Path (OPA) Virtual NIC support
|
||||
-----------------------------------
|
||||
|
||||
.. kernel-doc:: drivers/infiniband/ulp/opa_vnic/opa_vnic_internal.h
|
||||
:internal:
|
||||
|
||||
.. kernel-doc:: drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.h
|
||||
:internal:
|
||||
|
||||
.. kernel-doc:: drivers/infiniband/ulp/opa_vnic/opa_vnic_vema_iface.c
|
||||
:internal:
|
||||
|
||||
.. kernel-doc:: drivers/infiniband/ulp/opa_vnic/opa_vnic_vema.c
|
||||
:internal:
|
||||
|
||||
InfiniBand SCSI RDMA protocol target support
|
||||
--------------------------------------------
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ InfiniBand
|
||||
|
||||
core_locking
|
||||
ipoib
|
||||
opa_vnic
|
||||
sysfs
|
||||
tag_matching
|
||||
ucaps
|
||||
|
||||
@@ -1,159 +0,0 @@
|
||||
=================================================================
|
||||
Intel Omni-Path (OPA) Virtual Network Interface Controller (VNIC)
|
||||
=================================================================
|
||||
|
||||
Intel Omni-Path (OPA) Virtual Network Interface Controller (VNIC) feature
|
||||
supports Ethernet functionality over Omni-Path fabric by encapsulating
|
||||
the Ethernet packets between HFI nodes.
|
||||
|
||||
Architecture
|
||||
=============
|
||||
The patterns of exchanges of Omni-Path encapsulated Ethernet packets
|
||||
involves one or more virtual Ethernet switches overlaid on the Omni-Path
|
||||
fabric topology. A subset of HFI nodes on the Omni-Path fabric are
|
||||
permitted to exchange encapsulated Ethernet packets across a particular
|
||||
virtual Ethernet switch. The virtual Ethernet switches are logical
|
||||
abstractions achieved by configuring the HFI nodes on the fabric for
|
||||
header generation and processing. In the simplest configuration all HFI
|
||||
nodes across the fabric exchange encapsulated Ethernet packets over a
|
||||
single virtual Ethernet switch. A virtual Ethernet switch, is effectively
|
||||
an independent Ethernet network. The configuration is performed by an
|
||||
Ethernet Manager (EM) which is part of the trusted Fabric Manager (FM)
|
||||
application. HFI nodes can have multiple VNICs each connected to a
|
||||
different virtual Ethernet switch. The below diagram presents a case
|
||||
of two virtual Ethernet switches with two HFI nodes::
|
||||
|
||||
+-------------------+
|
||||
| Subnet/ |
|
||||
| Ethernet |
|
||||
| Manager |
|
||||
+-------------------+
|
||||
/ /
|
||||
/ /
|
||||
/ /
|
||||
/ /
|
||||
+-----------------------------+ +------------------------------+
|
||||
| Virtual Ethernet Switch | | Virtual Ethernet Switch |
|
||||
| +---------+ +---------+ | | +---------+ +---------+ |
|
||||
| | VPORT | | VPORT | | | | VPORT | | VPORT | |
|
||||
+--+---------+----+---------+-+ +-+---------+----+---------+---+
|
||||
| \ / |
|
||||
| \ / |
|
||||
| \/ |
|
||||
| / \ |
|
||||
| / \ |
|
||||
+-----------+------------+ +-----------+------------+
|
||||
| VNIC | VNIC | | VNIC | VNIC |
|
||||
+-----------+------------+ +-----------+------------+
|
||||
| HFI | | HFI |
|
||||
+------------------------+ +------------------------+
|
||||
|
||||
|
||||
The Omni-Path encapsulated Ethernet packet format is as described below.
|
||||
|
||||
==================== ================================
|
||||
Bits Field
|
||||
==================== ================================
|
||||
Quad Word 0:
|
||||
0-19 SLID (lower 20 bits)
|
||||
20-30 Length (in Quad Words)
|
||||
31 BECN bit
|
||||
32-51 DLID (lower 20 bits)
|
||||
52-56 SC (Service Class)
|
||||
57-59 RC (Routing Control)
|
||||
60 FECN bit
|
||||
61-62 L2 (=10, 16B format)
|
||||
63 LT (=1, Link Transfer Head Flit)
|
||||
|
||||
Quad Word 1:
|
||||
0-7 L4 type (=0x78 ETHERNET)
|
||||
8-11 SLID[23:20]
|
||||
12-15 DLID[23:20]
|
||||
16-31 PKEY
|
||||
32-47 Entropy
|
||||
48-63 Reserved
|
||||
|
||||
Quad Word 2:
|
||||
0-15 Reserved
|
||||
16-31 L4 header
|
||||
32-63 Ethernet Packet
|
||||
|
||||
Quad Words 3 to N-1:
|
||||
0-63 Ethernet packet (pad extended)
|
||||
|
||||
Quad Word N (last):
|
||||
0-23 Ethernet packet (pad extended)
|
||||
24-55 ICRC
|
||||
56-61 Tail
|
||||
62-63 LT (=01, Link Transfer Tail Flit)
|
||||
==================== ================================
|
||||
|
||||
Ethernet packet is padded on the transmit side to ensure that the VNIC OPA
|
||||
packet is quad word aligned. The 'Tail' field contains the number of bytes
|
||||
padded. On the receive side the 'Tail' field is read and the padding is
|
||||
removed (along with ICRC, Tail and OPA header) before passing packet up
|
||||
the network stack.
|
||||
|
||||
The L4 header field contains the virtual Ethernet switch id the VNIC port
|
||||
belongs to. On the receive side, this field is used to de-multiplex the
|
||||
received VNIC packets to different VNIC ports.
|
||||
|
||||
Driver Design
|
||||
==============
|
||||
Intel OPA VNIC software design is presented in the below diagram.
|
||||
OPA VNIC functionality has a HW dependent component and a HW
|
||||
independent component.
|
||||
|
||||
The support has been added for IB device to allocate and free the RDMA
|
||||
netdev devices. The RDMA netdev supports interfacing with the network
|
||||
stack thus creating standard network interfaces. OPA_VNIC is an RDMA
|
||||
netdev device type.
|
||||
|
||||
The HW dependent VNIC functionality is part of the HFI1 driver. It
|
||||
implements the verbs to allocate and free the OPA_VNIC RDMA netdev.
|
||||
It involves HW resource allocation/management for VNIC functionality.
|
||||
It interfaces with the network stack and implements the required
|
||||
net_device_ops functions. It expects Omni-Path encapsulated Ethernet
|
||||
packets in the transmit path and provides HW access to them. It strips
|
||||
the Omni-Path header from the received packets before passing them up
|
||||
the network stack. It also implements the RDMA netdev control operations.
|
||||
|
||||
The OPA VNIC module implements the HW independent VNIC functionality.
|
||||
It consists of two parts. The VNIC Ethernet Management Agent (VEMA)
|
||||
registers itself with IB core as an IB client and interfaces with the
|
||||
IB MAD stack. It exchanges the management information with the Ethernet
|
||||
Manager (EM) and the VNIC netdev. The VNIC netdev part allocates and frees
|
||||
the OPA_VNIC RDMA netdev devices. It overrides the net_device_ops functions
|
||||
set by HW dependent VNIC driver where required to accommodate any control
|
||||
operation. It also handles the encapsulation of Ethernet packets with an
|
||||
Omni-Path header in the transmit path. For each VNIC interface, the
|
||||
information required for encapsulation is configured by the EM via VEMA MAD
|
||||
interface. It also passes any control information to the HW dependent driver
|
||||
by invoking the RDMA netdev control operations::
|
||||
|
||||
+-------------------+ +----------------------+
|
||||
| | | Linux |
|
||||
| IB MAD | | Network |
|
||||
| | | Stack |
|
||||
+-------------------+ +----------------------+
|
||||
| | |
|
||||
| | |
|
||||
+----------------------------+ |
|
||||
| | |
|
||||
| OPA VNIC Module | |
|
||||
| (OPA VNIC RDMA Netdev | |
|
||||
| & EMA functions) | |
|
||||
| | |
|
||||
+----------------------------+ |
|
||||
| |
|
||||
| |
|
||||
+------------------+ |
|
||||
| IB core | |
|
||||
+------------------+ |
|
||||
| |
|
||||
| |
|
||||
+--------------------------------------------+
|
||||
| |
|
||||
| HFI1 Driver with VNIC support |
|
||||
| |
|
||||
+--------------------------------------------+
|
||||
@@ -24,7 +24,6 @@ infiniband
|
||||
|
||||
core_locking
|
||||
ipoib
|
||||
opa_vnic
|
||||
sysfs
|
||||
tag_matching
|
||||
user_mad
|
||||
|
||||
@@ -1,156 +0,0 @@
|
||||
.. include:: ../disclaimer-zh_CN.rst
|
||||
|
||||
:Original: Documentation/infiniband/opa_vnic.rst
|
||||
|
||||
:翻译:
|
||||
|
||||
司延腾 Yanteng Si <siyanteng@loongson.cn>
|
||||
|
||||
:校译:
|
||||
|
||||
王普宇 Puyu Wang <realpuyuwang@gmail.com>
|
||||
时奎亮 Alex Shi <alexs@kernel.org>
|
||||
|
||||
.. _cn_infiniband_opa_vnic:
|
||||
|
||||
=============================================
|
||||
英特尔全路径(OPA)虚拟网络接口控制器(VNIC)
|
||||
=============================================
|
||||
|
||||
英特尔全路径(OPA)虚拟网络接口控制器(VNIC)功能通过封装HFI节点之间的以
|
||||
太网数据包,支持Omni-Path结构上的以太网功能。
|
||||
|
||||
体系结构
|
||||
========
|
||||
|
||||
Omni-Path封装的以太网数据包的交换模式涉及Omni-Path结构拓扑上覆盖的一个或
|
||||
多个虚拟以太网交换机。Omni-Path结构上的HFI节点的一个子集被允许在特定的虚
|
||||
拟以太网交换机上交换封装的以太网数据包。虚拟以太网交换机是通过配置结构上的
|
||||
HFI节点实现的逻辑抽象,用于生成和处理报头。在最简单的配置中,整个结构的所有
|
||||
HFI节点通过一个虚拟以太网交换机交换封装的以太网数据包。一个虚拟以太网交换机,
|
||||
实际上是一个独立的以太网网络。该配置由以太网管理器(EM)执行,它是可信的结
|
||||
构管理器(FM)应用程序的一部分。HFI节点可以有多个VNIC,每个连接到不同的虚
|
||||
拟以太网交换机。下图介绍了两个虚拟以太网交换机与两个HFI节点的情况::
|
||||
|
||||
+-------------------+
|
||||
| 子网/ |
|
||||
| 以太网 |
|
||||
| 管理 |
|
||||
+-------------------+
|
||||
/ /
|
||||
/ /
|
||||
/ /
|
||||
/ /
|
||||
+-----------------------------+ +------------------------------+
|
||||
| 虚拟以太网切换 | | 虚拟以太网切换 |
|
||||
| +---------+ +---------+ | | +---------+ +---------+ |
|
||||
| | VPORT | | VPORT | | | | VPORT | | VPORT | |
|
||||
+--+---------+----+---------+-+ +-+---------+----+---------+---+
|
||||
| \ / |
|
||||
| \ / |
|
||||
| \/ |
|
||||
| / \ |
|
||||
| / \ |
|
||||
+-----------+------------+ +-----------+------------+
|
||||
| VNIC | VNIC | | VNIC | VNIC |
|
||||
+-----------+------------+ +-----------+------------+
|
||||
| HFI | | HFI |
|
||||
+------------------------+ +------------------------+
|
||||
|
||||
|
||||
Omni-Path封装的以太网数据包格式如下所述。
|
||||
|
||||
==================== ================================
|
||||
位 域
|
||||
==================== ================================
|
||||
Quad Word 0:
|
||||
0-19 SLID (低20位)
|
||||
20-30 长度 (以四字为单位)
|
||||
31 BECN 位
|
||||
32-51 DLID (低20位)
|
||||
52-56 SC (服务级别)
|
||||
57-59 RC (路由控制)
|
||||
60 FECN 位
|
||||
61-62 L2 (=10, 16B 格式)
|
||||
63 LT (=1, 链路传输头 Flit)
|
||||
|
||||
Quad Word 1:
|
||||
0-7 L4 type (=0x78 ETHERNET)
|
||||
8-11 SLID[23:20]
|
||||
12-15 DLID[23:20]
|
||||
16-31 PKEY
|
||||
32-47 熵
|
||||
48-63 保留
|
||||
|
||||
Quad Word 2:
|
||||
0-15 保留
|
||||
16-31 L4 头
|
||||
32-63 以太网数据包
|
||||
|
||||
Quad Words 3 to N-1:
|
||||
0-63 以太网数据包 (pad拓展)
|
||||
|
||||
Quad Word N (last):
|
||||
0-23 以太网数据包 (pad拓展)
|
||||
24-55 ICRC
|
||||
56-61 尾
|
||||
62-63 LT (=01, 链路传输尾 Flit)
|
||||
==================== ================================
|
||||
|
||||
以太网数据包在传输端被填充,以确保VNIC OPA数据包是四字对齐的。“尾”字段
|
||||
包含填充的字节数。在接收端,“尾”字段被读取,在将数据包向上传递到网络堆
|
||||
栈之前,填充物被移除(与ICRC、尾和OPA头一起)。
|
||||
|
||||
L4头字段包含VNIC端口所属的虚拟以太网交换机ID。在接收端,该字段用于将收
|
||||
到的VNIC数据包去多路复用到不同的VNIC端口。
|
||||
|
||||
驱动设计
|
||||
========
|
||||
|
||||
英特尔OPA VNIC的软件设计如下图所示。OPA VNIC功能有一个依赖于硬件的部分
|
||||
和一个独立于硬件的部分。
|
||||
|
||||
对IB设备分配和释放RDMA netdev设备的支持已经被加入。RDMA netdev支持与
|
||||
网络堆栈的对接,从而创建标准的网络接口。OPA_VNIC是一个RDMA netdev设备
|
||||
类型。
|
||||
|
||||
依赖于HW的VNIC功能是HFI1驱动的一部分。它实现了分配和释放OPA_VNIC RDMA
|
||||
netdev的动作。它涉及VNIC功能的HW资源分配/管理。它与网络堆栈接口并实现所
|
||||
需的net_device_ops功能。它在传输路径中期待Omni-Path封装的以太网数据包,
|
||||
并提供对它们的HW访问。在将数据包向上传递到网络堆栈之前,它把Omni-Path头
|
||||
从接收的数据包中剥离。它还实现了RDMA netdev控制操作。
|
||||
|
||||
OPA VNIC模块实现了独立于硬件的VNIC功能。它由两部分组成。VNIC以太网管理
|
||||
代理(VEMA)作为一个IB客户端向IB核心注册,并与IB MAD栈接口。它与以太网
|
||||
管理器(EM)和VNIC netdev交换管理信息。VNIC netdev部分分配和释放OPA_VNIC
|
||||
RDMA netdev设备。它在需要时覆盖由依赖HW的VNIC驱动设置的net_device_ops函数,
|
||||
以适应任何控制操作。它还处理以太网数据包的封装,在传输路径中使用Omni-Path头。
|
||||
对于每个VNIC接口,封装所需的信息是由EM通过VEMA MAD接口配置的。它还通过调用
|
||||
RDMA netdev控制操作将任何控制信息传递给依赖于HW的驱动程序::
|
||||
|
||||
+-------------------+ +----------------------+
|
||||
| | | Linux |
|
||||
| IB MAD | | 网络 |
|
||||
| | | 栈 |
|
||||
+-------------------+ +----------------------+
|
||||
| | |
|
||||
| | |
|
||||
+----------------------------+ |
|
||||
| | |
|
||||
| OPA VNIC 模块 | |
|
||||
| (OPA VNIC RDMA Netdev | |
|
||||
| & EMA 函数) | |
|
||||
| | |
|
||||
+----------------------------+ |
|
||||
| |
|
||||
| |
|
||||
+------------------+ |
|
||||
| IB 核心 | |
|
||||
+------------------+ |
|
||||
| |
|
||||
| |
|
||||
+--------------------------------------------+
|
||||
| |
|
||||
| HFI1 驱动和 VNIC 支持 |
|
||||
| |
|
||||
+--------------------------------------------+
|
||||
@@ -19764,12 +19764,6 @@ L: linux-rtc@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/rtc/rtc-optee.c
|
||||
|
||||
OPA-VNIC DRIVER
|
||||
M: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
|
||||
L: linux-rdma@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/infiniband/ulp/opa_vnic
|
||||
|
||||
OPEN ALLIANCE 10BASE-T1S MACPHY SERIAL INTERFACE FRAMEWORK
|
||||
M: Parthiban Veerasooran <parthiban.veerasooran@microchip.com>
|
||||
L: netdev@vger.kernel.org
|
||||
|
||||
@@ -112,6 +112,4 @@ source "drivers/infiniband/ulp/iser/Kconfig"
|
||||
source "drivers/infiniband/ulp/isert/Kconfig"
|
||||
source "drivers/infiniband/ulp/rtrs/Kconfig"
|
||||
|
||||
source "drivers/infiniband/ulp/opa_vnic/Kconfig"
|
||||
|
||||
endif # INFINIBAND
|
||||
|
||||
@@ -49,9 +49,7 @@ hfi1-y := \
|
||||
user_pages.o \
|
||||
user_sdma.o \
|
||||
verbs.o \
|
||||
verbs_txreq.o \
|
||||
vnic_main.o \
|
||||
vnic_sdma.o
|
||||
verbs_txreq.o
|
||||
|
||||
ifdef CONFIG_DEBUG_FS
|
||||
hfi1-y += debugfs.o
|
||||
|
||||
@@ -179,7 +179,7 @@ static void aspm_ctx_timer_function(struct timer_list *t)
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable interrupt processing for verbs contexts when PSM or VNIC contexts
|
||||
* Disable interrupt processing for verbs contexts when PSM contexts
|
||||
* are open.
|
||||
*/
|
||||
void aspm_disable_all(struct hfi1_devdata *dd)
|
||||
|
||||
@@ -85,12 +85,12 @@ struct flag_table {
|
||||
/*
|
||||
* RSM instance allocation
|
||||
* 0 - User Fecn Handling
|
||||
* 1 - Vnic
|
||||
* 1 - Deprecated
|
||||
* 2 - AIP
|
||||
* 3 - Verbs
|
||||
*/
|
||||
#define RSM_INS_FECN 0
|
||||
#define RSM_INS_VNIC 1
|
||||
#define RSM_INS_DEPRECATED 1
|
||||
#define RSM_INS_AIP 2
|
||||
#define RSM_INS_VERBS 3
|
||||
|
||||
@@ -152,15 +152,6 @@ struct flag_table {
|
||||
#define DETH_AIP_SQPN_SELECT_OFFSET \
|
||||
DETH_AIP_SQPN_OFFSET(DETH_AIP_SQPN_BIT_OFFSET)
|
||||
|
||||
/* RSM fields for Vnic */
|
||||
/* L2_TYPE: QW 0, OFFSET 61 - for match */
|
||||
#define L2_TYPE_QW 0ull
|
||||
#define L2_TYPE_BIT_OFFSET 61ull
|
||||
#define L2_TYPE_OFFSET(off) ((L2_TYPE_QW << QW_SHIFT) | (off))
|
||||
#define L2_TYPE_MATCH_OFFSET L2_TYPE_OFFSET(L2_TYPE_BIT_OFFSET)
|
||||
#define L2_TYPE_MASK 3ull
|
||||
#define L2_16B_VALUE 2ull
|
||||
|
||||
/* L4_TYPE QW 1, OFFSET 0 - for match */
|
||||
#define L4_TYPE_QW 1ull
|
||||
#define L4_TYPE_BIT_OFFSET 0ull
|
||||
@@ -6844,9 +6835,9 @@ static void rxe_kernel_unfreeze(struct hfi1_devdata *dd)
|
||||
for (i = 0; i < dd->num_rcv_contexts; i++) {
|
||||
rcd = hfi1_rcd_get_by_index(dd, i);
|
||||
|
||||
/* Ensure all non-user contexts(including vnic) are enabled */
|
||||
/* Ensure all non-user contexts are enabled */
|
||||
if (!rcd ||
|
||||
(i >= dd->first_dyn_alloc_ctxt && !rcd->is_vnic)) {
|
||||
(i >= dd->first_dyn_alloc_ctxt)) {
|
||||
hfi1_rcd_put(rcd);
|
||||
continue;
|
||||
}
|
||||
@@ -8467,7 +8458,7 @@ int hfi1_netdev_rx_napi(struct napi_struct *napi, int budget)
|
||||
return work_done;
|
||||
}
|
||||
|
||||
/* Receive packet napi handler for netdevs VNIC and AIP */
|
||||
/* Receive packet napi handler for netdevs AIP */
|
||||
irqreturn_t receive_context_interrupt_napi(int irq, void *data)
|
||||
{
|
||||
struct hfi1_ctxtdata *rcd = data;
|
||||
@@ -14506,7 +14497,7 @@ static bool hfi1_netdev_update_rmt(struct hfi1_devdata *dd)
|
||||
int ctxt_count = hfi1_netdev_ctxt_count(dd);
|
||||
|
||||
/* We already have contexts mapped in RMT */
|
||||
if (has_rsm_rule(dd, RSM_INS_VNIC) || has_rsm_rule(dd, RSM_INS_AIP)) {
|
||||
if (has_rsm_rule(dd, RSM_INS_AIP)) {
|
||||
dd_dev_info(dd, "Contexts are already mapped in RMT\n");
|
||||
return true;
|
||||
}
|
||||
@@ -14587,37 +14578,6 @@ void hfi1_init_aip_rsm(struct hfi1_devdata *dd)
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize RSM for VNIC */
|
||||
void hfi1_init_vnic_rsm(struct hfi1_devdata *dd)
|
||||
{
|
||||
int rmt_start = hfi1_netdev_get_free_rmt_idx(dd);
|
||||
struct rsm_rule_data rrd = {
|
||||
/* Add rule for vnic */
|
||||
.offset = rmt_start,
|
||||
.pkt_type = 4,
|
||||
/* Match 16B packets */
|
||||
.field1_off = L2_TYPE_MATCH_OFFSET,
|
||||
.mask1 = L2_TYPE_MASK,
|
||||
.value1 = L2_16B_VALUE,
|
||||
/* Match ETH L4 packets */
|
||||
.field2_off = L4_TYPE_MATCH_OFFSET,
|
||||
.mask2 = L4_16B_TYPE_MASK,
|
||||
.value2 = L4_16B_ETH_VALUE,
|
||||
/* Calc context from veswid and entropy */
|
||||
.index1_off = L4_16B_HDR_VESWID_OFFSET,
|
||||
.index1_width = ilog2(NUM_NETDEV_MAP_ENTRIES),
|
||||
.index2_off = L2_16B_ENTROPY_OFFSET,
|
||||
.index2_width = ilog2(NUM_NETDEV_MAP_ENTRIES)
|
||||
};
|
||||
|
||||
hfi1_enable_rsm_rule(dd, RSM_INS_VNIC, &rrd);
|
||||
}
|
||||
|
||||
void hfi1_deinit_vnic_rsm(struct hfi1_devdata *dd)
|
||||
{
|
||||
clear_rsm_rule(dd, RSM_INS_VNIC);
|
||||
}
|
||||
|
||||
void hfi1_deinit_aip_rsm(struct hfi1_devdata *dd)
|
||||
{
|
||||
/* only actually clear the rule if it's the last user asking to do so */
|
||||
@@ -15195,7 +15155,7 @@ int hfi1_init_dd(struct hfi1_devdata *dd)
|
||||
(dd->revision >> CCE_REVISION_SW_SHIFT)
|
||||
& CCE_REVISION_SW_MASK);
|
||||
|
||||
/* alloc VNIC/AIP rx data */
|
||||
/* alloc AIP rx data */
|
||||
ret = hfi1_alloc_rx(dd);
|
||||
if (ret)
|
||||
goto bail_cleanup;
|
||||
|
||||
@@ -1392,8 +1392,6 @@ int hfi1_set_ctxt_pkey(struct hfi1_devdata *dd, struct hfi1_ctxtdata *ctxt,
|
||||
u16 pkey);
|
||||
int hfi1_clear_ctxt_pkey(struct hfi1_devdata *dd, struct hfi1_ctxtdata *ctxt);
|
||||
void hfi1_read_link_quality(struct hfi1_devdata *dd, u8 *link_quality);
|
||||
void hfi1_init_vnic_rsm(struct hfi1_devdata *dd);
|
||||
void hfi1_deinit_vnic_rsm(struct hfi1_devdata *dd);
|
||||
|
||||
irqreturn_t general_interrupt(int irq, void *data);
|
||||
irqreturn_t sdma_interrupt(int irq, void *data);
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include "qp.h"
|
||||
#include "sdma.h"
|
||||
#include "debugfs.h"
|
||||
#include "vnic.h"
|
||||
#include "fault.h"
|
||||
|
||||
#include "ipoib.h"
|
||||
@@ -909,11 +908,11 @@ static void set_all_fastpath(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)
|
||||
u16 i;
|
||||
|
||||
/*
|
||||
* For dynamically allocated kernel contexts (like vnic) switch
|
||||
* For dynamically allocated kernel contexts switch
|
||||
* interrupt handler only for that context. Otherwise, switch
|
||||
* interrupt handler for all statically allocated kernel contexts.
|
||||
*/
|
||||
if (rcd->ctxt >= dd->first_dyn_alloc_ctxt && !rcd->is_vnic) {
|
||||
if (rcd->ctxt >= dd->first_dyn_alloc_ctxt) {
|
||||
hfi1_rcd_get(rcd);
|
||||
hfi1_set_fast(rcd);
|
||||
hfi1_rcd_put(rcd);
|
||||
@@ -922,7 +921,7 @@ static void set_all_fastpath(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)
|
||||
|
||||
for (i = HFI1_CTRL_CTXT + 1; i < dd->num_rcv_contexts; i++) {
|
||||
rcd = hfi1_rcd_get_by_index(dd, i);
|
||||
if (rcd && (i < dd->first_dyn_alloc_ctxt || rcd->is_vnic))
|
||||
if (rcd && (i < dd->first_dyn_alloc_ctxt))
|
||||
hfi1_set_fast(rcd);
|
||||
hfi1_rcd_put(rcd);
|
||||
}
|
||||
@@ -938,7 +937,7 @@ void set_all_slowpath(struct hfi1_devdata *dd)
|
||||
rcd = hfi1_rcd_get_by_index(dd, i);
|
||||
if (!rcd)
|
||||
continue;
|
||||
if (i < dd->first_dyn_alloc_ctxt || rcd->is_vnic)
|
||||
if (i < dd->first_dyn_alloc_ctxt)
|
||||
rcd->do_interrupt = rcd->slow_handler;
|
||||
|
||||
hfi1_rcd_put(rcd);
|
||||
@@ -1400,7 +1399,7 @@ int hfi1_reset_device(int unit)
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* If there are any user/vnic contexts, we cannot reset */
|
||||
/* If there are any user contexts, we cannot reset */
|
||||
mutex_lock(&hfi1_mutex);
|
||||
if (dd->rcd)
|
||||
if (hfi1_stats.sps_ctxts) {
|
||||
@@ -1899,7 +1898,7 @@ const rhf_rcv_function_ptr netdev_rhf_rcv_functions[] = {
|
||||
[RHF_RCV_TYPE_EAGER] = process_receive_invalid,
|
||||
[RHF_RCV_TYPE_IB] = hfi1_ipoib_ib_rcv,
|
||||
[RHF_RCV_TYPE_ERROR] = process_receive_error,
|
||||
[RHF_RCV_TYPE_BYPASS] = hfi1_vnic_bypass_rcv,
|
||||
[RHF_RCV_TYPE_BYPASS] = process_receive_invalid,
|
||||
[RHF_RCV_TYPE_INVALID5] = process_receive_invalid,
|
||||
[RHF_RCV_TYPE_INVALID6] = process_receive_invalid,
|
||||
[RHF_RCV_TYPE_INVALID7] = process_receive_invalid,
|
||||
|
||||
@@ -212,10 +212,6 @@ struct hfi1_ctxtdata {
|
||||
u8 rhf_offset;
|
||||
/* dynamic receive available interrupt timeout */
|
||||
u8 rcvavail_timeout;
|
||||
/* Indicates that this is vnic context */
|
||||
bool is_vnic;
|
||||
/* vnic queue index this context is mapped to */
|
||||
u8 vnic_q_idx;
|
||||
/* Is ASPM interrupt supported for this context */
|
||||
bool aspm_intr_supported;
|
||||
/* ASPM state (enabled/disabled) for this context */
|
||||
@@ -402,7 +398,6 @@ struct hfi1_packet {
|
||||
#define OPA_16B_L4_FM 0x08
|
||||
#define OPA_16B_L4_IB_LOCAL 0x09
|
||||
#define OPA_16B_L4_IB_GLOBAL 0x0A
|
||||
#define OPA_16B_L4_ETHR OPA_VNIC_L4_ETHR
|
||||
|
||||
/*
|
||||
* OPA 16B Management
|
||||
@@ -997,14 +992,6 @@ struct hfi1_asic_data {
|
||||
#define NUM_MAP_ENTRIES 256
|
||||
#define NUM_MAP_REGS 32
|
||||
|
||||
/* Virtual NIC information */
|
||||
struct hfi1_vnic_data {
|
||||
struct kmem_cache *txreq_cache;
|
||||
u8 num_vports;
|
||||
};
|
||||
|
||||
struct hfi1_vnic_vport_info;
|
||||
|
||||
/* device data struct now contains only "general per-device" info.
|
||||
* fields related to a physical IB port are in a hfi1_pportdata struct.
|
||||
*/
|
||||
@@ -1298,9 +1285,6 @@ struct hfi1_devdata {
|
||||
send_routine process_dma_send;
|
||||
void (*pio_inline_send)(struct hfi1_devdata *dd, struct pio_buf *pbuf,
|
||||
u64 pbc, const void *from, size_t count);
|
||||
int (*process_vnic_dma_send)(struct hfi1_devdata *dd, u8 q_idx,
|
||||
struct hfi1_vnic_vport_info *vinfo,
|
||||
struct sk_buff *skb, u64 pbc, u8 plen);
|
||||
/* hfi1_pportdata, points to array of (physical) port-specific
|
||||
* data structs, indexed by pidx (0..n-1)
|
||||
*/
|
||||
@@ -1314,7 +1298,6 @@ struct hfi1_devdata {
|
||||
u16 flags;
|
||||
/* Number of physical ports available */
|
||||
u8 num_pports;
|
||||
/* Lowest context number which can be used by user processes or VNIC */
|
||||
u8 first_dyn_alloc_ctxt;
|
||||
/* adding a new field here would make it part of this cacheline */
|
||||
|
||||
@@ -1353,11 +1336,8 @@ struct hfi1_devdata {
|
||||
bool aspm_enabled; /* ASPM state: enabled/disabled */
|
||||
struct rhashtable *sdma_rht;
|
||||
|
||||
/* vnic data */
|
||||
struct hfi1_vnic_data vnic;
|
||||
/* Lock to protect IRQ SRC register access */
|
||||
spinlock_t irq_src_lock;
|
||||
int vnic_num_vports;
|
||||
struct hfi1_netdev_rx *netdev_rx;
|
||||
struct hfi1_affinity_node *affinity_entry;
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "verbs.h"
|
||||
#include "aspm.h"
|
||||
#include "affinity.h"
|
||||
#include "vnic.h"
|
||||
#include "exp_rcv.h"
|
||||
#include "netdev.h"
|
||||
|
||||
@@ -349,7 +348,7 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa,
|
||||
* We do this here because we have to take into account all
|
||||
* the RcvArray entries that previous context would have
|
||||
* taken and we have to account for any extra groups assigned
|
||||
* to the static (kernel) or dynamic (vnic/user) contexts.
|
||||
* to the static (kernel) or dynamic (user) contexts.
|
||||
*/
|
||||
if (ctxt < dd->first_dyn_alloc_ctxt) {
|
||||
if (ctxt < kctxt_ngroups) {
|
||||
@@ -851,7 +850,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)
|
||||
dd->process_pio_send = hfi1_verbs_send_pio;
|
||||
dd->process_dma_send = hfi1_verbs_send_dma;
|
||||
dd->pio_inline_send = pio_copy;
|
||||
dd->process_vnic_dma_send = hfi1_vnic_send_dma;
|
||||
|
||||
if (is_ax(dd)) {
|
||||
atomic_set(&dd->drop_packet, DROP_PACKET_ON);
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include "mad.h"
|
||||
#include "trace.h"
|
||||
#include "qp.h"
|
||||
#include "vnic.h"
|
||||
|
||||
/* the reset value from the FM is supposed to be 0xffff, handle both */
|
||||
#define OPA_LINK_WIDTH_RESET_OLD 0x0fff
|
||||
|
||||
@@ -24,7 +24,6 @@ int msix_initialize(struct hfi1_devdata *dd)
|
||||
* one for the general, "slow path" interrupt
|
||||
* one per used SDMA engine
|
||||
* one per kernel receive context
|
||||
* one for each VNIC context
|
||||
* ...any new IRQs should be added here.
|
||||
*/
|
||||
total = 1 + dd->num_sdma + dd->n_krcv_queues + dd->num_netdev_contexts;
|
||||
@@ -127,8 +126,7 @@ static int msix_request_rcd_irq_common(struct hfi1_ctxtdata *rcd,
|
||||
irq_handler_t thread,
|
||||
const char *name)
|
||||
{
|
||||
int nr = msix_request_irq(rcd->dd, rcd, handler, thread,
|
||||
rcd->is_vnic ? IRQ_NETDEVCTXT : IRQ_RCVCTXT,
|
||||
int nr = msix_request_irq(rcd->dd, rcd, handler, thread, IRQ_RCVCTXT,
|
||||
name);
|
||||
if (nr < 0)
|
||||
return nr;
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/**
|
||||
* struct hfi1_netdev_rxq - Receive Queue for HFI
|
||||
* Both IPoIB and VNIC netdevices will be working on the rx abstraction.
|
||||
* IPoIB netdevices will be working on the rx abstraction.
|
||||
* @napi: napi object
|
||||
* @rx: ptr to netdev_rx
|
||||
* @rcd: ptr to receive context data
|
||||
@@ -25,10 +25,6 @@ struct hfi1_netdev_rxq {
|
||||
struct hfi1_ctxtdata *rcd;
|
||||
};
|
||||
|
||||
/*
|
||||
* Number of netdev contexts used. Ensure it is less than or equal to
|
||||
* max queues supported by VNIC (HFI1_VNIC_MAX_QUEUE).
|
||||
*/
|
||||
#define HFI1_MAX_NETDEV_CTXTS 8
|
||||
|
||||
/* Number of NETDEV RSM entries */
|
||||
@@ -42,7 +38,7 @@ struct hfi1_netdev_rxq {
|
||||
* @num_rx_q: number of receive queues
|
||||
* @rmt_index: first free index in RMT Array
|
||||
* @msix_start: first free MSI-X interrupt vector.
|
||||
* @dev_tbl: netdev table for unique identifier VNIC and IPoIb VLANs.
|
||||
* @dev_tbl: netdev table for unique identifier IPoIb VLANs.
|
||||
* @enabled: atomic counter of netdevs enabling receive queues.
|
||||
* When 0 NAPI will be disabled.
|
||||
* @netdevs: atomic counter of netdevs using dummy netdev.
|
||||
|
||||
@@ -78,7 +78,6 @@ static int hfi1_netdev_allocate_ctxt(struct hfi1_devdata *dd,
|
||||
uctxt->fast_handler = handle_receive_interrupt_napi_fp;
|
||||
uctxt->slow_handler = handle_receive_interrupt_napi_sp;
|
||||
hfi1_set_seq_cnt(uctxt, 1);
|
||||
uctxt->is_vnic = true;
|
||||
|
||||
hfi1_stats.sps_ctxts++;
|
||||
|
||||
@@ -427,7 +426,7 @@ void hfi1_netdev_disable_queues(struct hfi1_devdata *dd)
|
||||
|
||||
/**
|
||||
* hfi1_netdev_add_data - Registers data with unique identifier
|
||||
* to be requested later this is needed for VNIC and IPoIB VLANs
|
||||
* to be requested later this is needed for IPoIB VLANs
|
||||
* implementations.
|
||||
* This call is protected by mutex idr_lock.
|
||||
*
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include "qp.h"
|
||||
#include "verbs_txreq.h"
|
||||
#include "debugfs.h"
|
||||
#include "vnic.h"
|
||||
#include "fault.h"
|
||||
#include "affinity.h"
|
||||
#include "ipoib.h"
|
||||
@@ -1729,7 +1728,6 @@ static const struct ib_device_ops hfi1_dev_ops = {
|
||||
|
||||
.alloc_hw_device_stats = hfi1_alloc_hw_device_stats,
|
||||
.alloc_hw_port_stats = hfi_alloc_hw_port_stats,
|
||||
.alloc_rdma_netdev = hfi1_vnic_alloc_rn,
|
||||
.device_group = &ib_hfi1_attr_group,
|
||||
.get_dev_fw_str = hfi1_get_dev_fw_str,
|
||||
.get_hw_stats = get_hw_stats,
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright(c) 2017 - 2020 Intel Corporation.
|
||||
*/
|
||||
|
||||
#ifndef _HFI1_VNIC_H
|
||||
#define _HFI1_VNIC_H
|
||||
#include <rdma/opa_vnic.h>
|
||||
#include "hfi.h"
|
||||
#include "sdma.h"
|
||||
|
||||
#define HFI1_VNIC_MAX_TXQ 16
|
||||
#define HFI1_VNIC_MAX_PAD 12
|
||||
|
||||
/* L4 header definitions */
|
||||
#define HFI1_VNIC_L4_HDR_OFFSET OPA_VNIC_L2_HDR_LEN
|
||||
|
||||
#define HFI1_VNIC_GET_L4_HDR(data) \
|
||||
(*((u16 *)((u8 *)(data) + HFI1_VNIC_L4_HDR_OFFSET)))
|
||||
|
||||
#define HFI1_VNIC_GET_VESWID(data) \
|
||||
(HFI1_VNIC_GET_L4_HDR(data) & 0xFFF)
|
||||
|
||||
/* Service class */
|
||||
#define HFI1_VNIC_SC_OFFSET_LOW 6
|
||||
#define HFI1_VNIC_SC_OFFSET_HI 7
|
||||
#define HFI1_VNIC_SC_SHIFT 4
|
||||
|
||||
#define HFI1_VNIC_MAX_QUEUE 16
|
||||
#define HFI1_NUM_VNIC_CTXT 8
|
||||
|
||||
/**
|
||||
* struct hfi1_vnic_sdma - VNIC per Tx ring SDMA information
|
||||
* @dd - device data pointer
|
||||
* @sde - sdma engine
|
||||
* @vinfo - vnic info pointer
|
||||
* @wait - iowait structure
|
||||
* @stx - sdma tx request
|
||||
* @state - vnic Tx ring SDMA state
|
||||
* @q_idx - vnic Tx queue index
|
||||
*/
|
||||
struct hfi1_vnic_sdma {
|
||||
struct hfi1_devdata *dd;
|
||||
struct sdma_engine *sde;
|
||||
struct hfi1_vnic_vport_info *vinfo;
|
||||
struct iowait wait;
|
||||
struct sdma_txreq stx;
|
||||
unsigned int state;
|
||||
u8 q_idx;
|
||||
bool pkts_sent;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct hfi1_vnic_rx_queue - HFI1 VNIC receive queue
|
||||
* @idx: queue index
|
||||
* @vinfo: pointer to vport information
|
||||
* @netdev: network device
|
||||
* @napi: netdev napi structure
|
||||
* @skbq: queue of received socket buffers
|
||||
*/
|
||||
struct hfi1_vnic_rx_queue {
|
||||
u8 idx;
|
||||
struct hfi1_vnic_vport_info *vinfo;
|
||||
struct net_device *netdev;
|
||||
struct napi_struct napi;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct hfi1_vnic_vport_info - HFI1 VNIC virtual port information
|
||||
* @dd: device data pointer
|
||||
* @netdev: net device pointer
|
||||
* @flags: state flags
|
||||
* @lock: vport lock
|
||||
* @num_tx_q: number of transmit queues
|
||||
* @num_rx_q: number of receive queues
|
||||
* @vesw_id: virtual switch id
|
||||
* @rxq: Array of receive queues
|
||||
* @stats: per queue stats
|
||||
* @sdma: VNIC SDMA structure per TXQ
|
||||
*/
|
||||
struct hfi1_vnic_vport_info {
|
||||
struct hfi1_devdata *dd;
|
||||
struct net_device *netdev;
|
||||
unsigned long flags;
|
||||
|
||||
/* Lock used around state updates */
|
||||
struct mutex lock;
|
||||
|
||||
u8 num_tx_q;
|
||||
u8 num_rx_q;
|
||||
u16 vesw_id;
|
||||
struct hfi1_vnic_rx_queue rxq[HFI1_NUM_VNIC_CTXT];
|
||||
|
||||
struct opa_vnic_stats stats[HFI1_VNIC_MAX_QUEUE];
|
||||
struct hfi1_vnic_sdma sdma[HFI1_VNIC_MAX_TXQ];
|
||||
};
|
||||
|
||||
#define v_dbg(format, arg...) \
|
||||
netdev_dbg(vinfo->netdev, format, ## arg)
|
||||
#define v_err(format, arg...) \
|
||||
netdev_err(vinfo->netdev, format, ## arg)
|
||||
#define v_info(format, arg...) \
|
||||
netdev_info(vinfo->netdev, format, ## arg)
|
||||
|
||||
/* vnic hfi1 internal functions */
|
||||
void hfi1_vnic_setup(struct hfi1_devdata *dd);
|
||||
int hfi1_vnic_txreq_init(struct hfi1_devdata *dd);
|
||||
void hfi1_vnic_txreq_deinit(struct hfi1_devdata *dd);
|
||||
|
||||
void hfi1_vnic_bypass_rcv(struct hfi1_packet *packet);
|
||||
void hfi1_vnic_sdma_init(struct hfi1_vnic_vport_info *vinfo);
|
||||
bool hfi1_vnic_sdma_write_avail(struct hfi1_vnic_vport_info *vinfo,
|
||||
u8 q_idx);
|
||||
|
||||
/* vnic rdma netdev operations */
|
||||
struct net_device *hfi1_vnic_alloc_rn(struct ib_device *device,
|
||||
u32 port_num,
|
||||
enum rdma_netdev_t type,
|
||||
const char *name,
|
||||
unsigned char name_assign_type,
|
||||
void (*setup)(struct net_device *));
|
||||
int hfi1_vnic_send_dma(struct hfi1_devdata *dd, u8 q_idx,
|
||||
struct hfi1_vnic_vport_info *vinfo,
|
||||
struct sk_buff *skb, u64 pbc, u8 plen);
|
||||
|
||||
#endif /* _HFI1_VNIC_H */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user