~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/PCI/pci-iov-howto.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. SPDX-License-Identifier: GPL-2.0
  2 .. include:: <isonum.txt>
  3 .. include:: ../disclaimer-zh_CN.rst
  4 
  5 :Original: Documentation/PCI/pci-iov-howto.rst
  6 
  7 :翻译:
  8 
  9  司延腾 Yanteng Si <siyanteng@loongson.cn>
 10 
 11 :校译:
 12 
 13 
 14 
 15 .. _cn_pci-iov-howto:
 16 
 17 ==========================
 18 PCI Express I/O 虚拟化指南
 19 ==========================
 20 
 21 :版权: |copy| 2009 Intel Corporation
 22 :作者: - Yu Zhao <yu.zhao@intel.com>
 23           - Donald Dutile <ddutile@redhat.com>
 24 
 25 概述
 26 ====
 27 
 28 什么是SR-IOV
 29 ------------
 30 
 31 单根I/O虚拟化(SR-IOV)是一种PCI Express扩展功能,它使一个物理设备显示为多个
 32 虚拟设备。物理设备被称为物理功能(PF),而虚拟设备被称为虚拟功能(VF)。VF的分
 33 配可以由PF通过封装在该功能中的寄存器动态控制。默认情况下,该功能未被启用,PF表
 34 现为传统的PCIe设备。一旦开启,每个VF的PCI配置空间都可以通过自己的总线、设备和
 35 功能编号(路由ID)来访问。而且每个VF也有PCI内存空间,用于映射其寄存器集。VF设
 36 备驱动程序对寄存器集进行操作,这样它就可以发挥功能,并作为一个真正的现有PCI设备
 37 出现。
 38 
 39 使用指南
 40 ========
 41 
 42 我怎样才能启用SR-IOV功能
 43 ------------------------
 44 
 45 有多种方法可用于SR-IOV的启用。在第一种方法中,设备驱动(PF驱动)将通过SR-IOV
 46 核心提供的API控制功能的启用和禁用。如果硬件具有SR-IOV能力,加载其PF驱动器将启
 47 用它和与PF相关的所有VF。一些PF驱动需要设置一个模块参数,以确定要启用的VF的数量。
 48 在第二种方法中,对sysfs文件sriov_numvfs的写入将启用和禁用与PCIe PF相关的VF。
 49 这种方法实现了每个PF的VF启用/禁用值,而第一种方法则适用于同一设备的所有PF。此外,
 50 PCI SRIOV核心支持确保启用/禁用操作是有效的,以减少同一检查在多个驱动程序中的重
 51 复,例如,如果启用VF,检查numvfs == 0,确保numvfs <= totalvfs。
 52 第二种方法是对新的/未来的VF设备的推荐方法。
 53 
 54 我怎样才能使用虚拟功能
 55 ----------------------
 56 
 57 在内核中,VF被视为热插拔的PCI设备,所以它们应该能够以与真正的PCI设备相同的方式
 58 工作。VF需要的设备驱动与普通PCI设备的驱动相同。
 59 
 60 开发者指南
 61 ==========
 62 
 63 SR-IOV API
 64 ----------
 65 
 66 用来开启SR-IOV功能:
 67 
 68 (a) 对于第一种方法,在驱动程序中::
 69 
 70         int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);
 71 
 72 nr_virtfn'是要启用的VF的编号。
 73 
 74 (b) 对于第二种方法,从sysfs::
 75 
 76         echo 'nr_virtfn' > \
 77         /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs
 78 
 79 用来关闭SR-IOV功能:
 80 
 81 (a) 对于第一种方法,在驱动程序中::
 82 
 83         void pci_disable_sriov(struct pci_dev *dev);
 84 
 85 (b) 对于第二种方法,从sysfs::
 86 
 87         echo  0 > \
 88         /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_numvfs
 89 
 90 要想通过主机上的兼容驱动启用自动探测VF,在启用SR-IOV功能之前运行下面的命令。这
 91 是默认的行为。
 92 ::
 93 
 94         echo 1 > \
 95         /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_drivers_autoprobe
 96 
 97 要禁止主机上的兼容驱动自动探测VF,请在启用SR-IOV功能之前运行以下命令。更新这个
 98 入口不会影响已经被探测的VF。
 99 ::
100 
101         echo  0 > \
102         /sys/bus/pci/devices/<DOMAIN:BUS:DEVICE.FUNCTION>/sriov_drivers_autoprobe
103 
104 用例
105 ----
106 
107 下面的代码演示了SR-IOV API的用法
108 ::
109 
110         static int dev_probe(struct pci_dev *dev, const struct pci_device_id *id)
111         {
112                 pci_enable_sriov(dev, NR_VIRTFN);
113 
114                 ...
115 
116                 return 0;
117         }
118 
119         static void dev_remove(struct pci_dev *dev)
120         {
121                 pci_disable_sriov(dev);
122 
123                 ...
124         }
125 
126         static int dev_suspend(struct device *dev)
127         {
128                 ...
129 
130                 return 0;
131         }
132 
133         static int dev_resume(struct device *dev)
134         {
135                 ...
136 
137                 return 0;
138         }
139 
140         static void dev_shutdown(struct pci_dev *dev)
141         {
142                 ...
143         }
144 
145         static int dev_sriov_configure(struct pci_dev *dev, int numvfs)
146         {
147                 if (numvfs > 0) {
148                         ...
149                         pci_enable_sriov(dev, numvfs);
150                         ...
151                         return numvfs;
152                 }
153                 if (numvfs == 0) {
154                         ....
155                         pci_disable_sriov(dev);
156                         ...
157                         return 0;
158                 }
159         }
160 
161         static struct pci_driver dev_driver = {
162                 .name =         "SR-IOV Physical Function driver",
163                 .id_table =     dev_id_table,
164                 .probe =        dev_probe,
165                 .remove =       dev_remove,
166                 .driver.pm =    &dev_pm_ops
167                 .shutdown =     dev_shutdown,
168                 .sriov_configure = dev_sriov_configure,
169         };

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php