[PATCH] Enhancement: PCI Device information enhancement

From: Wen Wang <wenwang@linux.vnet.ibm.com> This patch provide the way that shows more specific PCI device information by hanging the mouse on top of device name. Signed-off-by: Wen Wang <wenwang@linux.vnet.ibm.com> --- ui/js/src/kimchi.api.js | 14 ++++++++++++++ ui/js/src/kimchi.guest_edit_main.js | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-) diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 8a6e416..aebac56 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -1129,6 +1129,20 @@ var kimchi = { }); }, + getPCIDeviceDescriptions : function(pcidev, suc, err) { + kimchi.requestJSON({ + url : kimchi.url + 'host/devices?_passthrough_affected_by=' + pcidev, + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend : true, + success : suc, + error : err ? err : function(data) { + kimchi.message.error(data.responseJSON.reason); + } + }); + }, + getISCSITargets : function(server, port, suc, err) { server = encodeURIComponent(server); port = port ? '&_server_port='+encodeURIComponent(port) : ''; diff --git a/ui/js/src/kimchi.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js index 030e112..580f648 100644 --- a/ui/js/src/kimchi.guest_edit_main.js +++ b/ui/js/src/kimchi.guest_edit_main.js @@ -365,6 +365,9 @@ kimchi.guest_edit_main = function() { kimchi.getCapabilities(function(result) { var pciEnabled = result.kernel_vfio; for(var i=0; i<hostPCIs.length; i++){ + + + var itemNode = $.parseHTML(kimchi.substitute($('#pci-tmpl').html(),{ name: hostPCIs[i].name, product: hostPCIs[i].product.description, @@ -407,6 +410,28 @@ kimchi.guest_edit_main = function() { }); } }); + kimchi.getPCIDeviceDescriptions(hostPCIs[i].name, function(infoData) { + var pciTitle = ""; + if(infoData.length>0) { + for(var p=0; p<infoData.length; p++) { + if(infoData[p].interface) { + pciTitle += "interface: " + infoData[p].interface; + pciTitle += ", address: " + infoData[p].address; + pciTitle += ", link_type: " + infoData[p].link_type; + pciTitle += " "; + } else if(infoData[p].block) { + pciTitle += "block: " + infoData[p].block; + pciTitle += ", drive_type: " + infoData[p].drive_type; + pciTitle += ", model: " + infoData[p].model; + pciTitle += " "; + } + + } + for(var q=0; q<infoData.length; q++) { + pciTitle === "" || $(".name", "#" + infoData[q].parent).attr("title", pciTitle); + } + } + }); } }); }); -- 1.7.1

I made this patch according to Zheng Sheng's advice that we provide more specific information of PCI device of "interface" and "storage", which more types of devices can be added. By hanging the mouse on top of the name, possible information will be shown if there is any description available. Recently we have host device passthrough feature merged into master. If you have ever tried it, you may find that it's not very easy to determine which device is suitable to passthrough. For example, in Kimchi web interface we have list of host PCI devices as follow. pci_0000_00_19_0 82579LM Gigabit Network Connection pci_0000_00_1f_2 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller pci_0000_03_00_0 Centrino Advanced-N 6205 [Taylor Peak] pci_0000_0d_00_0 MMC/SD Host Controller If there are multiple NIC or HBA cards on the host, the user will see more similar entries like this. However the user is unclear of the relationship between a "82579LM Gigabit Network Connection" and "eth0", or the relationship between "SATA AHCI Controller" and "sda". It'll be better if we can provide the related devices information when the user click one of the PCI device. The back-end has already provided a API to query the passthrough affected device. Just GET /host/devices?_passthrough_affected_by=pci_0000_00_19_0 where "pci_0000_00_19_0" is the device name of "82579LM Gigabit Network Connection". The back-end returns the following information. [ { "parent":"pci_0000_00_19_0", "name":"net_em1_00_21_cc_c2_6d_a6", "device_type":"net", "address":"00:21:cc:c2:6d:a6", "interface":"em1", "path":"/sys/devices/pci0000:00/0000:00:19.0/net/em1", "link_type":"IEEE 802.3" } ] So in the "interface" field indicates that the related Linux network interface device is "em1", and "address" provides the MAC address. GET /host/devices?_passthrough_affected_by=pci_0000_03_00_0 returns [ { "parent":"pci_0000_03_00_0", "name":"net_wlp3s0_8c_70_5a_5d_5e_90", "device_type":"net", "address":"8c:70:5a:5d:5e:90", "interface":"wlp3s0", "path":"/sys/devices/pci0000:00/0000:00:1c.1/0000:03:00.0/net/wlp3s0", "link_type":"IEEE 802.11" } ] "Centrino Advanced-N 6205 [Taylor Peak]" is a WLAN NIC, because "link_type" is "IEEE 802.11". The Linux network interface device "wlp3s0" is related to it, the MAC address is "8c:70:5a:5d:5e:90". As regard to storage device, GET /host/devices?_passthrough_affected_by=pci_0000_00_1f_2 returns [ { "num_blocks":976773168, "vendor":"ATA", "name":"block_sda_HITACHI_HTS727550A9E364_J3320082GMK10A", "parent":"scsi_0_0_0_0", "bus":"ata", "drive_type":"disk", "device_type":"storage", "logical_block_size":512, "path":"/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda", "model":"HITACHI HTS72755", "serial":"HITACHI_HTS727550A9E364_J3320082GMK10A", "block":"/dev/sda", "size":500107862016 }, { "vendor":"HL-DT-ST", "name":"block_sr0_HL_DT_ST_DVDRAM_GT50N_M3MC3C81854", "parent":"scsi_1_0_0_0", "bus":"ata", "drive_type":"cdrom", "device_type":"storage", "media":{ "available":false, "media_size":0, "type":"removable" }, "path":"/sys/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sr0", "model":"DVDRAM GT50N", "serial":"HL-DT-ST_DVDRAM_GT50N_M3MC3C81854", "block":"/dev/sr0" }, ...] Indicate that "/dev/sda" and "/dev/sr0" are related to HBA card "6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller". "sda" is a disk, and the size is 500107862016, "sr0" is a cdrom and it's emtpy. All the above example mean that if the user passthrough a PCI device to the guest, the related "em1" or "sda" "sr0" will also be affected. I think in UI we can make of this "/host/devices?_passthrough_affected_by" API. When the user selects a PCI device, the front-end GETs this URI and parses the result, and then pops a tool tip or something to show the related devices. This would be very helpful for a user to estimate the impact of passing through a device. -- Zhou Zheng Sheng / 周征晟 E-mail:zhshzhou@linux.vnet.ibm.com Telephone: 86-10-82454397 在 10/24/14 6:16 PM, Wen Wang 写道:
From: Wen Wang<wenwang@linux.vnet.ibm.com>
This patch provide the way that shows more specific PCI device information by hanging the mouse on top of device name.
Signed-off-by: Wen Wang<wenwang@linux.vnet.ibm.com> --- ui/js/src/kimchi.api.js | 14 ++++++++++++++ ui/js/src/kimchi.guest_edit_main.js | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 8a6e416..aebac56 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -1129,6 +1129,20 @@ var kimchi = { }); },
+ getPCIDeviceDescriptions : function(pcidev, suc, err) { + kimchi.requestJSON({ + url : kimchi.url + 'host/devices?_passthrough_affected_by=' + pcidev, + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend : true, + success : suc, + error : err ? err : function(data) { + kimchi.message.error(data.responseJSON.reason); + } + }); + }, + getISCSITargets : function(server, port, suc, err) { server = encodeURIComponent(server); port = port ? '&_server_port='+encodeURIComponent(port) : ''; diff --git a/ui/js/src/kimchi.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js index 030e112..580f648 100644 --- a/ui/js/src/kimchi.guest_edit_main.js +++ b/ui/js/src/kimchi.guest_edit_main.js @@ -365,6 +365,9 @@ kimchi.guest_edit_main = function() { kimchi.getCapabilities(function(result) { var pciEnabled = result.kernel_vfio; for(var i=0; i<hostPCIs.length; i++){ + + + var itemNode = $.parseHTML(kimchi.substitute($('#pci-tmpl').html(),{ name: hostPCIs[i].name, product: hostPCIs[i].product.description, @@ -407,6 +410,28 @@ kimchi.guest_edit_main = function() { }); } }); + kimchi.getPCIDeviceDescriptions(hostPCIs[i].name, function(infoData) { + var pciTitle = ""; + if(infoData.length>0) { + for(var p=0; p<infoData.length; p++) { + if(infoData[p].interface) { + pciTitle += "interface: " + infoData[p].interface; + pciTitle += ", address: " + infoData[p].address; + pciTitle += ", link_type: " + infoData[p].link_type; + pciTitle += " "; + } else if(infoData[p].block) { + pciTitle += "block: " + infoData[p].block; + pciTitle += ", drive_type: " + infoData[p].drive_type; + pciTitle += ", model: " + infoData[p].model; + pciTitle += " "; + } + + } + for(var q=0; q<infoData.length; q++) { + pciTitle === "" || $(".name", "#" + infoData[q].parent).attr("title", pciTitle); + } + } + }); } }); }); -- 1.7.1

Hi Wen, The patch is excellent. I tested the it and it worked with the back-end _passthrough_affected_by API properly. I find a few problems. First problem is that only when mouse points to the "Name" column, it shows the related devices. It's not obvious enough for the user to discover it. Maybe we can also show the tooltip in all the columns, or as long as the mouse points to any place inside the row of the device. The second problem is that the information it shows is not very self-explanatory. For example, it shows the following information for my wlan NIC. interface: wlp3s0, address: 8c:70:5a:5d:5e:90, link_type: IEEE 802.11 While this is correct, but how this information is related to the device :"Centrino Advanced-N 6205 [Taylor Peak]" is not clear. Suppose there are 4 affected devices, maybe we can show it like this Affected devices: net_wlp3s0_8c_70_5a_5d_5e_90 interface: wlp3s0, address: 8c:70:5a:5d:5e:90, link_type: IEEE 802.11 device2_name_blah device3_name_blah device4_name_blah detailed information blah I have some other inline comments, please scroll down and see below. on 2014/10/24 18:16, Wen Wang wrote:
From: Wen Wang <wenwang@linux.vnet.ibm.com>
This patch provide the way that shows more specific PCI device information by hanging the mouse on top of device name.
Signed-off-by: Wen Wang <wenwang@linux.vnet.ibm.com> --- ui/js/src/kimchi.api.js | 14 ++++++++++++++ ui/js/src/kimchi.guest_edit_main.js | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 8a6e416..aebac56 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -1129,6 +1129,20 @@ var kimchi = { }); },
+ getPCIDeviceDescriptions : function(pcidev, suc, err) {
I think "getPCIDeviceCompanions" may be a better name.
+ kimchi.requestJSON({ + url : kimchi.url + 'host/devices?_passthrough_affected_by=' + pcidev, + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend : true, + success : suc, + error : err ? err : function(data) { + kimchi.message.error(data.responseJSON.reason); + } + }); + }, + getISCSITargets : function(server, port, suc, err) { server = encodeURIComponent(server); port = port ? '&_server_port='+encodeURIComponent(port) : ''; diff --git a/ui/js/src/kimchi.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js index 030e112..580f648 100644 --- a/ui/js/src/kimchi.guest_edit_main.js +++ b/ui/js/src/kimchi.guest_edit_main.js @@ -365,6 +365,9 @@ kimchi.guest_edit_main = function() { kimchi.getCapabilities(function(result) { var pciEnabled = result.kernel_vfio; for(var i=0; i<hostPCIs.length; i++){ + + + var itemNode = $.parseHTML(kimchi.substitute($('#pci-tmpl').html(),{ name: hostPCIs[i].name, product: hostPCIs[i].product.description, @@ -407,6 +410,28 @@ kimchi.guest_edit_main = function() { }); } }); + kimchi.getPCIDeviceDescriptions(hostPCIs[i].name, function(infoData) { + var pciTitle = ""; + if(infoData.length>0) { + for(var p=0; p<infoData.length; p++) { + if(infoData[p].interface) { + pciTitle += "interface: " + infoData[p].interface; + pciTitle += ", address: " + infoData[p].address; + pciTitle += ", link_type: " + infoData[p].link_type; + pciTitle += " "; + } else if(infoData[p].block) { + pciTitle += "block: " + infoData[p].block; + pciTitle += ", drive_type: " + infoData[p].drive_type; + pciTitle += ", model: " + infoData[p].model; + pciTitle += " "; + }
If you notice, each returned infoData[p] should have a ".device_type". For example, [ { "parent":"pci_0000_00_19_0", "name":"net_em1_00_21_cc_c2_6d_a6", "device_type":"net", "address":"00:21:cc:c2:6d:a6", "interface":"em1", "path":"/sys/devices/pci0000:00/0000:00:19.0/net/em1", "link_type":"IEEE 802.3" } ] If the 'infoData[p].device_type == "net"', we can sure that it also contains ".interface"m ".address" and also ".link_type". I think the it's better to check the "device_type" rather than to check existence of "infoData[p].interface" or "infoData[p].block". This is because there might be a totally different device information which also contains ".interface" or ".block".
+ + } + for(var q=0; q<infoData.length; q++) { + pciTitle === "" || $(".name", "#" + infoData[q].parent).attr("title", pciTitle); + } + } + }); } }); });
-- Zhou Zheng Sheng / 周征晟 E-mail: zhshzhou@linux.vnet.ibm.com Telephone: 86-10-82454397

Thanks for the advice. I have sent a V2 of this patch according to your comments. Best Regards Wang Wen 在 10/27/14 11:21 AM, Zhou Zheng Sheng 写道:
Hi Wen,
The patch is excellent. I tested the it and it worked with the back-end _passthrough_affected_by API properly. I find a few problems.
First problem is that only when mouse points to the "Name" column, it shows the related devices. It's not obvious enough for the user to discover it. Maybe we can also show the tooltip in all the columns, or as long as the mouse points to any place inside the row of the device.
The second problem is that the information it shows is not very self-explanatory. For example, it shows the following information for my wlan NIC.
interface: wlp3s0, address: 8c:70:5a:5d:5e:90, link_type: IEEE 802.11
While this is correct, but how this information is related to the device :"Centrino Advanced-N 6205 [Taylor Peak]" is not clear.
Suppose there are 4 affected devices, maybe we can show it like this
Affected devices: net_wlp3s0_8c_70_5a_5d_5e_90 interface: wlp3s0, address: 8c:70:5a:5d:5e:90, link_type: IEEE 802.11 device2_name_blah device3_name_blah device4_name_blah detailed information blah
I have some other inline comments, please scroll down and see below.
on 2014/10/24 18:16, Wen Wang wrote:
From: Wen Wang<wenwang@linux.vnet.ibm.com>
This patch provide the way that shows more specific PCI device information by hanging the mouse on top of device name.
Signed-off-by: Wen Wang<wenwang@linux.vnet.ibm.com> --- ui/js/src/kimchi.api.js | 14 ++++++++++++++ ui/js/src/kimchi.guest_edit_main.js | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 8a6e416..aebac56 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -1129,6 +1129,20 @@ var kimchi = { }); },
+ getPCIDeviceDescriptions : function(pcidev, suc, err) { I think "getPCIDeviceCompanions" may be a better name.
+ kimchi.requestJSON({ + url : kimchi.url + 'host/devices?_passthrough_affected_by=' + pcidev, + type : 'GET', + contentType : 'application/json', + dataType : 'json', + resend : true, + success : suc, + error : err ? err : function(data) { + kimchi.message.error(data.responseJSON.reason); + } + }); + }, + getISCSITargets : function(server, port, suc, err) { server = encodeURIComponent(server); port = port ? '&_server_port='+encodeURIComponent(port) : ''; diff --git a/ui/js/src/kimchi.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js index 030e112..580f648 100644 --- a/ui/js/src/kimchi.guest_edit_main.js +++ b/ui/js/src/kimchi.guest_edit_main.js @@ -365,6 +365,9 @@ kimchi.guest_edit_main = function() { kimchi.getCapabilities(function(result) { var pciEnabled = result.kernel_vfio; for(var i=0; i<hostPCIs.length; i++){ + + + var itemNode = $.parseHTML(kimchi.substitute($('#pci-tmpl').html(),{ name: hostPCIs[i].name, product: hostPCIs[i].product.description, @@ -407,6 +410,28 @@ kimchi.guest_edit_main = function() { }); } }); + kimchi.getPCIDeviceDescriptions(hostPCIs[i].name, function(infoData) { + var pciTitle = ""; + if(infoData.length>0) { + for(var p=0; p<infoData.length; p++) { + if(infoData[p].interface) { + pciTitle += "interface: " + infoData[p].interface; + pciTitle += ", address: " + infoData[p].address; + pciTitle += ", link_type: " + infoData[p].link_type; + pciTitle += " "; + } else if(infoData[p].block) { + pciTitle += "block: " + infoData[p].block; + pciTitle += ", drive_type: " + infoData[p].drive_type; + pciTitle += ", model: " + infoData[p].model; + pciTitle += " "; + } If you notice, each returned infoData[p] should have a ".device_type". For example,
[ { "parent":"pci_0000_00_19_0", "name":"net_em1_00_21_cc_c2_6d_a6", "device_type":"net", "address":"00:21:cc:c2:6d:a6", "interface":"em1", "path":"/sys/devices/pci0000:00/0000:00:19.0/net/em1", "link_type":"IEEE 802.3" } ]
If the 'infoData[p].device_type == "net"', we can sure that it also contains ".interface"m ".address" and also ".link_type". I think the it's better to check the "device_type" rather than to check existence of "infoData[p].interface" or "infoData[p].block". This is because there might be a totally different device information which also contains ".interface" or ".block".
+ + } + for(var q=0; q<infoData.length; q++) { + pciTitle === "" || $(".name", "#" + infoData[q].parent).attr("title", pciTitle); + } + } + }); } }); });
-- Zhou Zheng Sheng / 周征晟 E-mail: zhshzhou@linux.vnet.ibm.com Telephone: 86-10-82454397
participants (2)
-
Wen Wang
-
Zhou Zheng Sheng