An I/O domain is a domain that has direct ownership of and direct access to physical I/O devices. It can be created by assigning a PCI EXPRESS (PCI-E) bus to a domain. PCI-E buses that are present on a server are identified with names such as pci@400 (pci_0). Use the ldm command to assign each bus to a separate domain.
The maximum number of I/O domains that you can create depends on the number of PCI-E buses available on the server. A Sun UltraSPARC T2 Plus based server has up to four PCI-E buses, so it can have up to four I/O domains.
Sun UltraSPARC T2 based servers, such as the Sun SPARC Enterprise T5120 and T5220 servers, only have one PCI-E bus. So, such servers cannot configure more than one domain with direct access to physical devices. However, you can assign a Network Interface Unit (NIU) to a domain rather than configuring a new I/O domain. See Using NIU Hybrid I/O.
When a server is initially configured with Logical Domains or is using the factory-default configuration, the control domain has access to all the physical device resources. This means that the control (primary) domain is the only I/O domain configured on the system and that it owns all the PCI-E buses.
This example procedure shows how to create a new I/O domain from an initial configuration where several buses are owned by the primary domain. By default the primary domain owns all buses present on the system. This example is for a Sun SPARC Enterprise T5440 server. This procedure can also be used on other servers. The instructions for different servers might vary slightly from these, but you can obtain the basic principles from this example.
First, you must retain the bus that has the primary domain's boot disk. Then, remove another bus from the primary domain and assign it to another domain.
All internal disks on the supported servers are connected to a single PCI bus. If a domain is booted from an internal disk, do not remove that bus from the domain. Also, ensure that you are not removing a bus with devices (such as network ports) that are used by a domain. If you remove the wrong bus, a domain might not be able to access the required devices and could become unusable. To remove a bus that has devices that are used by a domain, reconfigure that domain to use devices from other buses. For example, you might have to reconfigure the domain to use a different onboard network port or a PCI card from a different PCI slot.
In this example, the primary domain only uses a ZFS pool (rpool (c0t1d0s0)) and network interface (nxge0). If the primary domain uses more devices, repeat Steps 2-4 for each device to ensure that none are located on the bus that will be removed.
Verify that the primary domain owns several PCI buses.
primary# ldm list-bindings primary ... IO DEVICE PSEUDONYM OPTIONS pci@400 pci_0 pci@500 pci_1 pci@600 pci_2 pci@700 pci_3 ... |
Determine the device path of the boot disk, which needs to be retained.
For UFS file systems, run the df / command to determine the device path of the boot disk.
primary# df / / (/dev/dsk/c0t1d0s0 ): 1309384 blocks 457028 files |
For ZFS file systems, first run the df / command to determine the pool name, and then run the zpool status command to determine the device path of the boot disk.
primary# df / / (rpool/ROOT/s10s_u8wos_08a):245176332 blocks 245176332 files primary# zpool status rpool zpool status rpool pool: rpool state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 c0t1d0s0 ONLINE 0 0 0 |
Determine the physical device to which the block device is linked.
The following example uses block device c1t0d0s0:
primary# ls -l /dev/dsk/c0t1d0s0 lrwxrwxrwx 1 root root 49 Oct 1 10:39 /dev/dsk/c0t1d0s0 -> ../../devices/pci@400/pci@0/pci@1/scsi@0/sd@1,0:a |
In this example, the physical device for the primary domain's boot disk is connected to bus pci@400, which corresponds to the earlier listing of pci_0. This means that you cannot assign pci_0 (pci@400) to another domain.
Determine the network interface that is used by the system.
primary# dladm show-dev vsw0 link: up speed: 1000 Mbps duplex: full nxge0 link: up speed: 1000 Mbps duplex: full nxge1 link: unknown speed: 0 Mbps duplex: unknown nxge2 link: unknown speed: 0 Mbps duplex: unknown nxge3 link: unknown speed: 0 Mbps duplex: unknown |
Interfaces that are in the unknown state are not configured, so they are not used. In this example, the nxge0 interface is used.
Determine the physical device to which the network interface is linked.
The following command uses the nxge0 network interface:
primary# ls -l /dev/nxge0 lrwxrwxrwx 1 root root 46 Oct 1 10:39 /dev/nxge0 -> ../devices/pci@500/pci@0/pci@c/network@0:nxge0 |
In this example, the physical device for the network interface used by the primary domain are under bus pci@500, which corresponds to the earlier listing of pci_1. So, the other two buses, pci_2 (pci@600) and pci_3 (pci@700), can safely be assigned to other domains because they are not used by the primary domain.
If the network interface used by the primary domain was on a bus that you want to assign to another domain, the primary domain would need to be reconfigured to use a different network interface.
Remove the buses that do not contain the boot disk from a domain.
In this example, bus pci@600 and bus pci@700 are being removed from the primary domain.
primary# ldm remove-io pci@600 primary primary# ldm remove-io pci@700 primary |
Save this configuration to the service processor.
In this example, the configuration is io-domain.
primary# ldm add-config io-domain |
This configuration, io-domain, is also set as the next configuration to be used after the reboot.
Currently, there is a limit of 8 configurations that can be saved on the SP, not including the factory-default configuration.
Reboot the primary domain so that the change takes effect.
primary# shutdown -i6 -g0 -y |
Stop the domain to which you want to add the PCI bus.
The following example stops the ldg1 domain:
primary# ldm stop ldg1 primary# ldm unbind ldg1 |
Add the available bus to the domain that needs direct access.
The available bus is pci@600 and the domain is ldg1.
primary# ldm add-io pci@600 ldg1 |
If you have an Infiniband card, you might need to enable the bypass mode on the pci@600 bus. See Enabling the I/O MMU Bypass Mode on a PCI Bus for information on whether you need to enable the bypass mode.
Restart the domain so that the change takes affect.
The following commands restart the ldg1 domain:
primary# ldm bind ldg1 primary# ldm start ldg1 |
Confirm that the correct bus is still assigned to the primary domain and the correct bus is assigned to domain ldg1.
primary# ldm list-bindings primary ldg1 NAME STATE FLAGS CONS VCPU MEMORY UTIL UPTIME primary active -n-cv SP 4 4G 0.4% 18h 25m ... IO DEVICE PSEUDONYM OPTIONS pci@400 pci_0 pci@500 pci_1 ... ---------------------------------------------------------------- NAME STATE FLAGS CONS VCPU MEMORY UTIL UPTIME ldg1 active -n--- 5000 4 2G 10% 35m ... IO DEVICE PSEUDONYM OPTIONS pci@600 pci_2 ... |
This output confirms that the PCI-E buses pci_0 and pci_1 and the devices below them are assigned to domain primary, and that pci_2 and its devices are assigned to ldg1.