Current implementation of helper function pci_vfs_assigned() is a little complex, to
get sum of VFs that assigned to VM, access low level configuration space register and
then loop in traversing device tree.
This patch introduce an atomic reference counter for VFs that assigned to VM in struct
pci_sriov, and compose two more helper functions
pci_sriov_assign_device(),
pci_sriov_deassign_device()
to replace manipulation to device flag and the meanwhile increase and decease the counter.
Passed building on 3.15.5
Signed-off-by: Ethan Zhao <redacted>
---
drivers/pci/iov.c | 65 ++++++++++++++++++++++++++++----------------------
drivers/pci/pci.h | 1 +
include/linux/pci.h | 4 +++
3 files changed, 41 insertions(+), 29 deletions(-)
@@ -603,45 +604,51 @@ int pci_num_vf(struct pci_dev *dev)EXPORT_SYMBOL_GPL(pci_num_vf);/**-*pci_vfs_assigned-returnsnumberofVFsareassignedtoaguest-*@dev:thePCIdevice+*pci_vfs_assigned-returnsnumberofVFsareassignedtoVM+*@dev:thephysicalPCIdevicethatcontainstheVFs.*-*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoaguest.+*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoVM.*Ifdeviceisnotaphysicalfunctionreturns0.*/intpci_vfs_assigned(structpci_dev*dev){-structpci_dev*vfdev;-unsignedintvfs_assigned=0;-unsignedshortdev_id;--/* only search if we are a PF */if(!dev->is_physfn)return0;+if(dev->sriov)+returnatomic_read(&dev->sriov->VFs_assigned_cnt);+return0;+}+EXPORT_SYMBOL_GPL(pci_vfs_assigned);-/*-*determinethedeviceIDfortheVFs,thevendorIDwillbethe-*sameasthePFsothereisnoneedtocheckforthatone-*/-pci_read_config_word(dev,dev->sriov->pos+PCI_SRIOV_VF_DID,&dev_id);--/* loop through all the VFs to see if we own any that are assigned */-vfdev=pci_get_device(dev->vendor,dev_id,NULL);-while(vfdev){-/*-*Itisconsideredassignedifitisavirtualfunctionwith-*ourdevasthephysicalfunctionandtheassignedbitisset-*/-if(vfdev->is_virtfn&&(vfdev->physfn==dev)&&-(vfdev->dev_flags&PCI_DEV_FLAGS_ASSIGNED))-vfs_assigned++;--vfdev=pci_get_device(dev->vendor,dev_id,vfdev);-}+/**+*pci_sriov_assign_device-assigndevicetoVM+*@pdev:thedevicetobeassigned.+*/+voidpci_sriov_assign_device(structpci_dev*pdev)+{+pdev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_inc(&pdev->physfn->sriov->+VFs_assigned_cnt);+}+EXPORT_SYMBOL_GPL(pci_sriov_assign_device);-returnvfs_assigned;+/**+*pci_sriov_deassign_device-deasigndevicefromVM+*@pdev:thedevicetobedeassigned.+*/+voidpci_sriov_deassign_device(structpci_dev*pdev)+{+pdev->dev_flags&=~PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_dec(&pdev->physfn->sriov->+VFs_assigned_cnt);}-EXPORT_SYMBOL_GPL(pci_vfs_assigned);+EXPORT_SYMBOL_GPL(pci_sriov_deassign_device);/***pci_sriov_set_totalvfs--reducetheTotalVFsavailable
@@ -235,6 +235,7 @@ struct pci_sriov {u32pgsz;/* page size for BAR alignment */u8link;/* Function Dependency Link */u16driver_max_VFs;/* max num VFs driver supports */+atomic_tVFs_assigned_cnt;/* counter of VFs assigned to VM */structpci_dev*dev;/* lowest numbered PF */structpci_dev*self;/* this PF */structmutexlock;/* lock for VF bus */
@@ -1601,6 +1601,8 @@ int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);voidpci_disable_sriov(structpci_dev*dev);intpci_num_vf(structpci_dev*dev);intpci_vfs_assigned(structpci_dev*dev);+voidpci_sriov_assign_device(structpci_dev*dev);+voidpci_sriov_deassign_device(structpci_dev*dev);intpci_sriov_set_totalvfs(structpci_dev*dev,u16numvfs);intpci_sriov_get_totalvfs(structpci_dev*dev);#else
--
1.7.1
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
New VFs reference counter mechanism and VFs assignment helper functions are introduced to
PCI SRIOV, use them instead of manipulating device flag directly.
Signed-off-by: Ethan Zhao <redacted>
---
drivers/xen/xen-pciback/pci_stub.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
@@ -404,7 +404,7 @@ static int pcistub_init_device(struct pci_dev *dev)dev_dbg(&dev->dev,"reset device\n");xen_pcibk_reset_device(dev);-dev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+pci_sriov_assign_device(dev);return0;config_release:
--
1.7.1
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
@@ -194,7 +194,7 @@ int kvm_assign_device(struct kvm *kvm,gotoout_unmap;}-pdev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+pci_sriov_assign_device(pdev);dev_info(&pdev->dev,"kvm assign device\n");
@@ -220,7 +220,7 @@ int kvm_deassign_device(struct kvm *kvm,iommu_detach_device(domain,&pdev->dev);-pdev->dev_flags&=~PCI_DEV_FLAGS_ASSIGNED;+pci_sriov_deassign_device(pdev);dev_info(&pdev->dev,"kvm deassign device\n");
--
1.7.1
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
New VFs reference counter mechanism and VFs assignment helper functions are introduced to
PCI SRIOV, use them instead of manipulating device flag directly.
Signed-off-by: Ethan Zhao <redacted>
---
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 17 ++---------------
1 files changed, 2 insertions(+), 15 deletions(-)
@@ -693,22 +693,9 @@ complete_reset:staticbooli40e_vfs_are_assigned(structi40e_pf*pf){structpci_dev*pdev=pf->pdev;-structpci_dev*vfdev;--/* loop through all the VFs to see if we own any that are assigned */-vfdev=pci_get_device(PCI_VENDOR_ID_INTEL,I40E_DEV_ID_VF,NULL);-while(vfdev){-/* if we don't own it we don't care */-if(vfdev->is_virtfn&&pci_physfn(vfdev)==pdev){-/* if it is assigned we cannot release it */-if(vfdev->dev_flags&PCI_DEV_FLAGS_ASSIGNED)-returntrue;-}-vfdev=pci_get_device(PCI_VENDOR_ID_INTEL,-I40E_DEV_ID_VF,-vfdev);-}+if(pci_vfs_assigned(pdev))+returntrue;returnfalse;}
--
1.7.1
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
From: Alex Williamson <hidden> Date: 2014-07-11 01:48:36
Since there's no 0th patch, I guess I'll comment here. This series is
not bisectable, patch 1 breaks the existing implementation. I'd
suggest:
patch 1 - fix i40e
patch 2 - create assign/deassign that uses dev_flags
patch 3 - convert users to new interface
patch 4 - convert interface to use atomic_t
IMHO, the assigned flag is a horrible hack and I don't know why drivers
like xenback need to use it. KVM needs to use it because it doesn't
actually have a driver to bind to when a device is assigned, it's happy
to assign devices without any driver. Thanks,
Alex
On Fri, 2014-07-11 at 08:47 +0800, Ethan Zhao wrote:
quoted hunk
Current implementation of helper function pci_vfs_assigned() is a little complex, to
get sum of VFs that assigned to VM, access low level configuration space register and
then loop in traversing device tree.
This patch introduce an atomic reference counter for VFs that assigned to VM in struct
pci_sriov, and compose two more helper functions
pci_sriov_assign_device(),
pci_sriov_deassign_device()
to replace manipulation to device flag and the meanwhile increase and decease the counter.
Passed building on 3.15.5
Signed-off-by: Ethan Zhao <redacted>
---
drivers/pci/iov.c | 65 ++++++++++++++++++++++++++++----------------------
drivers/pci/pci.h | 1 +
include/linux/pci.h | 4 +++
3 files changed, 41 insertions(+), 29 deletions(-)
@@ -603,45 +604,51 @@ int pci_num_vf(struct pci_dev *dev)EXPORT_SYMBOL_GPL(pci_num_vf);/**-*pci_vfs_assigned-returnsnumberofVFsareassignedtoaguest-*@dev:thePCIdevice+*pci_vfs_assigned-returnsnumberofVFsareassignedtoVM+*@dev:thephysicalPCIdevicethatcontainstheVFs.*-*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoaguest.+*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoVM.*Ifdeviceisnotaphysicalfunctionreturns0.*/intpci_vfs_assigned(structpci_dev*dev){-structpci_dev*vfdev;-unsignedintvfs_assigned=0;-unsignedshortdev_id;--/* only search if we are a PF */if(!dev->is_physfn)return0;+if(dev->sriov)+returnatomic_read(&dev->sriov->VFs_assigned_cnt);+return0;+}+EXPORT_SYMBOL_GPL(pci_vfs_assigned);-/*-*determinethedeviceIDfortheVFs,thevendorIDwillbethe-*sameasthePFsothereisnoneedtocheckforthatone-*/-pci_read_config_word(dev,dev->sriov->pos+PCI_SRIOV_VF_DID,&dev_id);--/* loop through all the VFs to see if we own any that are assigned */-vfdev=pci_get_device(dev->vendor,dev_id,NULL);-while(vfdev){-/*-*Itisconsideredassignedifitisavirtualfunctionwith-*ourdevasthephysicalfunctionandtheassignedbitisset-*/-if(vfdev->is_virtfn&&(vfdev->physfn==dev)&&-(vfdev->dev_flags&PCI_DEV_FLAGS_ASSIGNED))-vfs_assigned++;--vfdev=pci_get_device(dev->vendor,dev_id,vfdev);-}+/**+*pci_sriov_assign_device-assigndevicetoVM+*@pdev:thedevicetobeassigned.+*/+voidpci_sriov_assign_device(structpci_dev*pdev)+{+pdev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_inc(&pdev->physfn->sriov->+VFs_assigned_cnt);+}+EXPORT_SYMBOL_GPL(pci_sriov_assign_device);-returnvfs_assigned;+/**+*pci_sriov_deassign_device-deasigndevicefromVM+*@pdev:thedevicetobedeassigned.+*/+voidpci_sriov_deassign_device(structpci_dev*pdev)+{+pdev->dev_flags&=~PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_dec(&pdev->physfn->sriov->+VFs_assigned_cnt);}-EXPORT_SYMBOL_GPL(pci_vfs_assigned);+EXPORT_SYMBOL_GPL(pci_sriov_deassign_device);/***pci_sriov_set_totalvfs--reducetheTotalVFsavailable
@@ -235,6 +235,7 @@ struct pci_sriov {u32pgsz;/* page size for BAR alignment */u8link;/* Function Dependency Link */u16driver_max_VFs;/* max num VFs driver supports */+atomic_tVFs_assigned_cnt;/* counter of VFs assigned to VM */structpci_dev*dev;/* lowest numbered PF */structpci_dev*self;/* this PF */structmutexlock;/* lock for VF bus */
@@ -1601,6 +1601,8 @@ int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);voidpci_disable_sriov(structpci_dev*dev);intpci_num_vf(structpci_dev*dev);intpci_vfs_assigned(structpci_dev*dev);+voidpci_sriov_assign_device(structpci_dev*dev);+voidpci_sriov_deassign_device(structpci_dev*dev);intpci_sriov_set_totalvfs(structpci_dev*dev,u16numvfs);intpci_sriov_get_totalvfs(structpci_dev*dev);#else
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
Alex,
Thanks for your reviewing, when I create the patch order, I thought
about the question you concerned for
quit a while, make every patch be independent to each other as possible
as I could, so we can do bisect when hit
problem.
I manage to take more time to figure out better patch order.
Thanks,
Ethan
On 2014/7/11 9:48, Alex Williamson wrote:
Since there's no 0th patch, I guess I'll comment here. This series is
not bisectable, patch 1 breaks the existing implementation. I'd
suggest:
patch 1 - fix i40e
i40e only could be fixed with new interface, so it couldn't
be the first one.
patch 2 - create assign/deassign that uses dev_flags
This will be the first ?
patch 3 - convert users to new interface
Have to be the later step.
patch 4 - convert interface to use atomic_t
Could it be standalone step ?
Let me think about it.
IMHO, the assigned flag is a horrible hack and I don't know why drivers
like xenback need to use it. KVM needs to use it because it doesn't
actually have a driver to bind to when a device is assigned, it's happy
to assign devices without any driver. Thanks,
Alex
On Fri, 2014-07-11 at 08:47 +0800, Ethan Zhao wrote:
quoted
Current implementation of helper function pci_vfs_assigned() is a little complex, to
get sum of VFs that assigned to VM, access low level configuration space register and
then loop in traversing device tree.
This patch introduce an atomic reference counter for VFs that assigned to VM in struct
pci_sriov, and compose two more helper functions
pci_sriov_assign_device(),
pci_sriov_deassign_device()
to replace manipulation to device flag and the meanwhile increase and decease the counter.
Passed building on 3.15.5
Signed-off-by: Ethan Zhao <redacted>
---
drivers/pci/iov.c | 65 ++++++++++++++++++++++++++++----------------------
drivers/pci/pci.h | 1 +
include/linux/pci.h | 4 +++
3 files changed, 41 insertions(+), 29 deletions(-)
@@ -603,45 +604,51 @@ int pci_num_vf(struct pci_dev *dev)EXPORT_SYMBOL_GPL(pci_num_vf);/**-*pci_vfs_assigned-returnsnumberofVFsareassignedtoaguest-*@dev:thePCIdevice+*pci_vfs_assigned-returnsnumberofVFsareassignedtoVM+*@dev:thephysicalPCIdevicethatcontainstheVFs.*-*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoaguest.+*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoVM.*Ifdeviceisnotaphysicalfunctionreturns0.*/intpci_vfs_assigned(structpci_dev*dev){-structpci_dev*vfdev;-unsignedintvfs_assigned=0;-unsignedshortdev_id;--/* only search if we are a PF */if(!dev->is_physfn)return0;+if(dev->sriov)+returnatomic_read(&dev->sriov->VFs_assigned_cnt);+return0;+}+EXPORT_SYMBOL_GPL(pci_vfs_assigned);-/*-*determinethedeviceIDfortheVFs,thevendorIDwillbethe-*sameasthePFsothereisnoneedtocheckforthatone-*/-pci_read_config_word(dev,dev->sriov->pos+PCI_SRIOV_VF_DID,&dev_id);--/* loop through all the VFs to see if we own any that are assigned */-vfdev=pci_get_device(dev->vendor,dev_id,NULL);-while(vfdev){-/*-*Itisconsideredassignedifitisavirtualfunctionwith-*ourdevasthephysicalfunctionandtheassignedbitisset-*/-if(vfdev->is_virtfn&&(vfdev->physfn==dev)&&-(vfdev->dev_flags&PCI_DEV_FLAGS_ASSIGNED))-vfs_assigned++;--vfdev=pci_get_device(dev->vendor,dev_id,vfdev);-}+/**+*pci_sriov_assign_device-assigndevicetoVM+*@pdev:thedevicetobeassigned.+*/+voidpci_sriov_assign_device(structpci_dev*pdev)+{+pdev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_inc(&pdev->physfn->sriov->+VFs_assigned_cnt);+}+EXPORT_SYMBOL_GPL(pci_sriov_assign_device);-returnvfs_assigned;+/**+*pci_sriov_deassign_device-deasigndevicefromVM+*@pdev:thedevicetobedeassigned.+*/+voidpci_sriov_deassign_device(structpci_dev*pdev)+{+pdev->dev_flags&=~PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_dec(&pdev->physfn->sriov->+VFs_assigned_cnt);}-EXPORT_SYMBOL_GPL(pci_vfs_assigned);+EXPORT_SYMBOL_GPL(pci_sriov_deassign_device);/***pci_sriov_set_totalvfs--reducetheTotalVFsavailable
@@ -235,6 +235,7 @@ struct pci_sriov {u32pgsz;/* page size for BAR alignment */u8link;/* Function Dependency Link */u16driver_max_VFs;/* max num VFs driver supports */+atomic_tVFs_assigned_cnt;/* counter of VFs assigned to VM */structpci_dev*dev;/* lowest numbered PF */structpci_dev*self;/* this PF */structmutexlock;/* lock for VF bus */
@@ -1601,6 +1601,8 @@ int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);voidpci_disable_sriov(structpci_dev*dev);intpci_num_vf(structpci_dev*dev);intpci_vfs_assigned(structpci_dev*dev);+voidpci_sriov_assign_device(structpci_dev*dev);+voidpci_sriov_deassign_device(structpci_dev*dev);intpci_sriov_set_totalvfs(structpci_dev*dev,u16numvfs);intpci_sriov_get_totalvfs(structpci_dev*dev);#else
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
From: Alex Williamson <hidden> Date: 2014-07-11 02:22:30
On Fri, 2014-07-11 at 10:10 +0800, ethan zhao wrote:
Alex,
Thanks for your reviewing, when I create the patch order, I thought
about the question you concerned for
quit a while, make every patch be independent to each other as possible
as I could, so we can do bisect when hit
problem.
I manage to take more time to figure out better patch order.
Thanks,
Ethan
On 2014/7/11 9:48, Alex Williamson wrote:
quoted
Since there's no 0th patch, I guess I'll comment here. This series is
not bisectable, patch 1 breaks the existing implementation. I'd
suggest:
patch 1 - fix i40e
i40e only could be fixed with new interface, so it couldn't
be the first one.
It looks like i40e just has it's own copy of pci_vfs_assigned(), why
can't your current patch 4/4 be applied now?
quoted
patch 2 - create assign/deassign that uses dev_flags
This will be the first ?
quoted
patch 3 - convert users to new interface
Have to be the later step.
quoted
patch 4 - convert interface to use atomic_t
Could it be standalone step ?
Let me think about it.
quoted
IMHO, the assigned flag is a horrible hack and I don't know why drivers
like xenback need to use it. KVM needs to use it because it doesn't
actually have a driver to bind to when a device is assigned, it's happy
to assign devices without any driver. Thanks,
Alex
On Fri, 2014-07-11 at 08:47 +0800, Ethan Zhao wrote:
quoted
Current implementation of helper function pci_vfs_assigned() is a little complex, to
get sum of VFs that assigned to VM, access low level configuration space register and
then loop in traversing device tree.
This patch introduce an atomic reference counter for VFs that assigned to VM in struct
pci_sriov, and compose two more helper functions
pci_sriov_assign_device(),
pci_sriov_deassign_device()
to replace manipulation to device flag and the meanwhile increase and decease the counter.
Passed building on 3.15.5
Signed-off-by: Ethan Zhao <redacted>
---
drivers/pci/iov.c | 65 ++++++++++++++++++++++++++++----------------------
drivers/pci/pci.h | 1 +
include/linux/pci.h | 4 +++
3 files changed, 41 insertions(+), 29 deletions(-)
@@ -603,45 +604,51 @@ int pci_num_vf(struct pci_dev *dev)EXPORT_SYMBOL_GPL(pci_num_vf);/**-*pci_vfs_assigned-returnsnumberofVFsareassignedtoaguest-*@dev:thePCIdevice+*pci_vfs_assigned-returnsnumberofVFsareassignedtoVM+*@dev:thephysicalPCIdevicethatcontainstheVFs.*-*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoaguest.+*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoVM.*Ifdeviceisnotaphysicalfunctionreturns0.*/intpci_vfs_assigned(structpci_dev*dev){-structpci_dev*vfdev;-unsignedintvfs_assigned=0;-unsignedshortdev_id;--/* only search if we are a PF */if(!dev->is_physfn)return0;+if(dev->sriov)+returnatomic_read(&dev->sriov->VFs_assigned_cnt);+return0;+}+EXPORT_SYMBOL_GPL(pci_vfs_assigned);-/*-*determinethedeviceIDfortheVFs,thevendorIDwillbethe-*sameasthePFsothereisnoneedtocheckforthatone-*/-pci_read_config_word(dev,dev->sriov->pos+PCI_SRIOV_VF_DID,&dev_id);--/* loop through all the VFs to see if we own any that are assigned */-vfdev=pci_get_device(dev->vendor,dev_id,NULL);-while(vfdev){-/*-*Itisconsideredassignedifitisavirtualfunctionwith-*ourdevasthephysicalfunctionandtheassignedbitisset-*/-if(vfdev->is_virtfn&&(vfdev->physfn==dev)&&-(vfdev->dev_flags&PCI_DEV_FLAGS_ASSIGNED))-vfs_assigned++;--vfdev=pci_get_device(dev->vendor,dev_id,vfdev);-}+/**+*pci_sriov_assign_device-assigndevicetoVM+*@pdev:thedevicetobeassigned.+*/+voidpci_sriov_assign_device(structpci_dev*pdev)+{+pdev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_inc(&pdev->physfn->sriov->+VFs_assigned_cnt);+}+EXPORT_SYMBOL_GPL(pci_sriov_assign_device);-returnvfs_assigned;+/**+*pci_sriov_deassign_device-deasigndevicefromVM+*@pdev:thedevicetobedeassigned.+*/+voidpci_sriov_deassign_device(structpci_dev*pdev)+{+pdev->dev_flags&=~PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_dec(&pdev->physfn->sriov->+VFs_assigned_cnt);}-EXPORT_SYMBOL_GPL(pci_vfs_assigned);+EXPORT_SYMBOL_GPL(pci_sriov_deassign_device);/***pci_sriov_set_totalvfs--reducetheTotalVFsavailable
@@ -235,6 +235,7 @@ struct pci_sriov {u32pgsz;/* page size for BAR alignment */u8link;/* Function Dependency Link */u16driver_max_VFs;/* max num VFs driver supports */+atomic_tVFs_assigned_cnt;/* counter of VFs assigned to VM */structpci_dev*dev;/* lowest numbered PF */structpci_dev*self;/* this PF */structmutexlock;/* lock for VF bus */
@@ -1601,6 +1601,8 @@ int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);voidpci_disable_sriov(structpci_dev*dev);intpci_num_vf(structpci_dev*dev);intpci_vfs_assigned(structpci_dev*dev);+voidpci_sriov_assign_device(structpci_dev*dev);+voidpci_sriov_deassign_device(structpci_dev*dev);intpci_sriov_set_totalvfs(structpci_dev*dev,u16numvfs);intpci_sriov_get_totalvfs(structpci_dev*dev);#else
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
On Fri, 2014-07-11 at 10:10 +0800, ethan zhao wrote:
quoted
Alex,
Thanks for your reviewing, when I create the patch order, I thought
about the question you concerned for
quit a while, make every patch be independent to each other as possible
as I could, so we can do bisect when hit
problem.
I manage to take more time to figure out better patch order.
Thanks,
Ethan
On 2014/7/11 9:48, Alex Williamson wrote:
quoted
Since there's no 0th patch, I guess I'll comment here. This series is
not bisectable, patch 1 breaks the existing implementation. I'd
suggest:
patch 1 - fix i40e
i40e only could be fixed with new interface, so it couldn't
be the first one.
It looks like i40e just has it's own copy of pci_vfs_assigned(), why
can't your current patch 4/4 be applied now?
Yes, i40e has its local copy of pci_vfs_assigned(),it could be
simplified .
with new interface,in another word, its a user of new interface.
Thanks,
Ethan
quoted
quoted
patch 2 - create assign/deassign that uses dev_flags
This will be the first ?
quoted
patch 3 - convert users to new interface
Have to be the later step.
quoted
patch 4 - convert interface to use atomic_t
Could it be standalone step ?
Let me think about it.
quoted
IMHO, the assigned flag is a horrible hack and I don't know why drivers
like xenback need to use it. KVM needs to use it because it doesn't
actually have a driver to bind to when a device is assigned, it's happy
to assign devices without any driver. Thanks,
Alex
On Fri, 2014-07-11 at 08:47 +0800, Ethan Zhao wrote:
quoted
Current implementation of helper function pci_vfs_assigned() is a little complex, to
get sum of VFs that assigned to VM, access low level configuration space register and
then loop in traversing device tree.
This patch introduce an atomic reference counter for VFs that assigned to VM in struct
pci_sriov, and compose two more helper functions
pci_sriov_assign_device(),
pci_sriov_deassign_device()
to replace manipulation to device flag and the meanwhile increase and decease the counter.
Passed building on 3.15.5
Signed-off-by: Ethan Zhao <redacted>
---
drivers/pci/iov.c | 65 ++++++++++++++++++++++++++++----------------------
drivers/pci/pci.h | 1 +
include/linux/pci.h | 4 +++
3 files changed, 41 insertions(+), 29 deletions(-)
@@ -603,45 +604,51 @@ int pci_num_vf(struct pci_dev *dev)EXPORT_SYMBOL_GPL(pci_num_vf);/**-*pci_vfs_assigned-returnsnumberofVFsareassignedtoaguest-*@dev:thePCIdevice+*pci_vfs_assigned-returnsnumberofVFsareassignedtoVM+*@dev:thephysicalPCIdevicethatcontainstheVFs.*-*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoaguest.+*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoVM.*Ifdeviceisnotaphysicalfunctionreturns0.*/intpci_vfs_assigned(structpci_dev*dev){-structpci_dev*vfdev;-unsignedintvfs_assigned=0;-unsignedshortdev_id;--/* only search if we are a PF */if(!dev->is_physfn)return0;+if(dev->sriov)+returnatomic_read(&dev->sriov->VFs_assigned_cnt);+return0;+}+EXPORT_SYMBOL_GPL(pci_vfs_assigned);-/*-*determinethedeviceIDfortheVFs,thevendorIDwillbethe-*sameasthePFsothereisnoneedtocheckforthatone-*/-pci_read_config_word(dev,dev->sriov->pos+PCI_SRIOV_VF_DID,&dev_id);--/* loop through all the VFs to see if we own any that are assigned */-vfdev=pci_get_device(dev->vendor,dev_id,NULL);-while(vfdev){-/*-*Itisconsideredassignedifitisavirtualfunctionwith-*ourdevasthephysicalfunctionandtheassignedbitisset-*/-if(vfdev->is_virtfn&&(vfdev->physfn==dev)&&-(vfdev->dev_flags&PCI_DEV_FLAGS_ASSIGNED))-vfs_assigned++;--vfdev=pci_get_device(dev->vendor,dev_id,vfdev);-}+/**+*pci_sriov_assign_device-assigndevicetoVM+*@pdev:thedevicetobeassigned.+*/+voidpci_sriov_assign_device(structpci_dev*pdev)+{+pdev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_inc(&pdev->physfn->sriov->+VFs_assigned_cnt);+}+EXPORT_SYMBOL_GPL(pci_sriov_assign_device);-returnvfs_assigned;+/**+*pci_sriov_deassign_device-deasigndevicefromVM+*@pdev:thedevicetobedeassigned.+*/+voidpci_sriov_deassign_device(structpci_dev*pdev)+{+pdev->dev_flags&=~PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_dec(&pdev->physfn->sriov->+VFs_assigned_cnt);}-EXPORT_SYMBOL_GPL(pci_vfs_assigned);+EXPORT_SYMBOL_GPL(pci_sriov_deassign_device);/***pci_sriov_set_totalvfs--reducetheTotalVFsavailable
@@ -235,6 +235,7 @@ struct pci_sriov {u32pgsz;/* page size for BAR alignment */u8link;/* Function Dependency Link */u16driver_max_VFs;/* max num VFs driver supports */+atomic_tVFs_assigned_cnt;/* counter of VFs assigned to VM */structpci_dev*dev;/* lowest numbered PF */structpci_dev*self;/* this PF */structmutexlock;/* lock for VF bus */
@@ -1601,6 +1601,8 @@ int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);voidpci_disable_sriov(structpci_dev*dev);intpci_num_vf(structpci_dev*dev);intpci_vfs_assigned(structpci_dev*dev);+voidpci_sriov_assign_device(structpci_dev*dev);+voidpci_sriov_deassign_device(structpci_dev*dev);intpci_sriov_set_totalvfs(structpci_dev*dev,u16numvfs);intpci_sriov_get_totalvfs(structpci_dev*dev);#else
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
From: Alex Williamson <hidden> Date: 2014-07-11 02:34:26
On Fri, 2014-07-11 at 10:29 +0800, ethan zhao wrote:
On 2014/7/11 10:22, Alex Williamson wrote:
quoted
On Fri, 2014-07-11 at 10:10 +0800, ethan zhao wrote:
quoted
Alex,
Thanks for your reviewing, when I create the patch order, I thought
about the question you concerned for
quit a while, make every patch be independent to each other as possible
as I could, so we can do bisect when hit
problem.
I manage to take more time to figure out better patch order.
Thanks,
Ethan
On 2014/7/11 9:48, Alex Williamson wrote:
quoted
Since there's no 0th patch, I guess I'll comment here. This series is
not bisectable, patch 1 breaks the existing implementation. I'd
suggest:
patch 1 - fix i40e
i40e only could be fixed with new interface, so it couldn't
be the first one.
It looks like i40e just has it's own copy of pci_vfs_assigned(), why
can't your current patch 4/4 be applied now?
Yes, i40e has its local copy of pci_vfs_assigned(),it could be
simplified .
with new interface,in another word, its a user of new interface.
It's a user of the existing interface. You're missing the point,
abstract all the users of the assigned dev_flags first, then you're free
to fix the implementation of the interface in one shot without breaking
anything.
quoted
quoted
quoted
patch 2 - create assign/deassign that uses dev_flags
This will be the first ?
quoted
patch 3 - convert users to new interface
Have to be the later step.
quoted
patch 4 - convert interface to use atomic_t
Could it be standalone step ?
Let me think about it.
quoted
IMHO, the assigned flag is a horrible hack and I don't know why drivers
like xenback need to use it. KVM needs to use it because it doesn't
actually have a driver to bind to when a device is assigned, it's happy
to assign devices without any driver. Thanks,
Alex
On Fri, 2014-07-11 at 08:47 +0800, Ethan Zhao wrote:
quoted
Current implementation of helper function pci_vfs_assigned() is a little complex, to
get sum of VFs that assigned to VM, access low level configuration space register and
then loop in traversing device tree.
This patch introduce an atomic reference counter for VFs that assigned to VM in struct
pci_sriov, and compose two more helper functions
pci_sriov_assign_device(),
pci_sriov_deassign_device()
to replace manipulation to device flag and the meanwhile increase and decease the counter.
Passed building on 3.15.5
Signed-off-by: Ethan Zhao <redacted>
---
drivers/pci/iov.c | 65 ++++++++++++++++++++++++++++----------------------
drivers/pci/pci.h | 1 +
include/linux/pci.h | 4 +++
3 files changed, 41 insertions(+), 29 deletions(-)
@@ -603,45 +604,51 @@ int pci_num_vf(struct pci_dev *dev)EXPORT_SYMBOL_GPL(pci_num_vf);/**-*pci_vfs_assigned-returnsnumberofVFsareassignedtoaguest-*@dev:thePCIdevice+*pci_vfs_assigned-returnsnumberofVFsareassignedtoVM+*@dev:thephysicalPCIdevicethatcontainstheVFs.*-*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoaguest.+*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoVM.*Ifdeviceisnotaphysicalfunctionreturns0.*/intpci_vfs_assigned(structpci_dev*dev){-structpci_dev*vfdev;-unsignedintvfs_assigned=0;-unsignedshortdev_id;--/* only search if we are a PF */if(!dev->is_physfn)return0;+if(dev->sriov)+returnatomic_read(&dev->sriov->VFs_assigned_cnt);+return0;+}+EXPORT_SYMBOL_GPL(pci_vfs_assigned);-/*-*determinethedeviceIDfortheVFs,thevendorIDwillbethe-*sameasthePFsothereisnoneedtocheckforthatone-*/-pci_read_config_word(dev,dev->sriov->pos+PCI_SRIOV_VF_DID,&dev_id);--/* loop through all the VFs to see if we own any that are assigned */-vfdev=pci_get_device(dev->vendor,dev_id,NULL);-while(vfdev){-/*-*Itisconsideredassignedifitisavirtualfunctionwith-*ourdevasthephysicalfunctionandtheassignedbitisset-*/-if(vfdev->is_virtfn&&(vfdev->physfn==dev)&&-(vfdev->dev_flags&PCI_DEV_FLAGS_ASSIGNED))-vfs_assigned++;--vfdev=pci_get_device(dev->vendor,dev_id,vfdev);-}+/**+*pci_sriov_assign_device-assigndevicetoVM+*@pdev:thedevicetobeassigned.+*/+voidpci_sriov_assign_device(structpci_dev*pdev)+{+pdev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_inc(&pdev->physfn->sriov->+VFs_assigned_cnt);+}+EXPORT_SYMBOL_GPL(pci_sriov_assign_device);-returnvfs_assigned;+/**+*pci_sriov_deassign_device-deasigndevicefromVM+*@pdev:thedevicetobedeassigned.+*/+voidpci_sriov_deassign_device(structpci_dev*pdev)+{+pdev->dev_flags&=~PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_dec(&pdev->physfn->sriov->+VFs_assigned_cnt);}-EXPORT_SYMBOL_GPL(pci_vfs_assigned);+EXPORT_SYMBOL_GPL(pci_sriov_deassign_device);/***pci_sriov_set_totalvfs--reducetheTotalVFsavailable
@@ -235,6 +235,7 @@ struct pci_sriov {u32pgsz;/* page size for BAR alignment */u8link;/* Function Dependency Link */u16driver_max_VFs;/* max num VFs driver supports */+atomic_tVFs_assigned_cnt;/* counter of VFs assigned to VM */structpci_dev*dev;/* lowest numbered PF */structpci_dev*self;/* this PF */structmutexlock;/* lock for VF bus */
@@ -1601,6 +1601,8 @@ int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);voidpci_disable_sriov(structpci_dev*dev);intpci_num_vf(structpci_dev*dev);intpci_vfs_assigned(structpci_dev*dev);+voidpci_sriov_assign_device(structpci_dev*dev);+voidpci_sriov_deassign_device(structpci_dev*dev);intpci_sriov_set_totalvfs(structpci_dev*dev,u16numvfs);intpci_sriov_get_totalvfs(structpci_dev*dev);#else
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
On Fri, 2014-07-11 at 10:29 +0800, ethan zhao wrote:
quoted
On 2014/7/11 10:22, Alex Williamson wrote:
quoted
On Fri, 2014-07-11 at 10:10 +0800, ethan zhao wrote:
quoted
Alex,
Thanks for your reviewing, when I create the patch order, I thought
about the question you concerned for
quit a while, make every patch be independent to each other as possible
as I could, so we can do bisect when hit
problem.
I manage to take more time to figure out better patch order.
Thanks,
Ethan
On 2014/7/11 9:48, Alex Williamson wrote:
quoted
Since there's no 0th patch, I guess I'll comment here. This series is
not bisectable, patch 1 breaks the existing implementation. I'd
suggest:
patch 1 - fix i40e
i40e only could be fixed with new interface, so it couldn't
be the first one.
It looks like i40e just has it's own copy of pci_vfs_assigned(), why
can't your current patch 4/4 be applied now?
Yes, i40e has its local copy of pci_vfs_assigned(),it could be
simplified .
with new interface,in another word, its a user of new interface.
It's a user of the existing interface. You're missing the point,
abstract all the users of the assigned dev_flags first, then you're free
to fix the implementation of the interface in one shot without breaking
anything.
Great,you hit the center this time, agree !
quoted
quoted
quoted
quoted
patch 2 - create assign/deassign that uses dev_flags
This will be the first ?
quoted
patch 3 - convert users to new interface
Have to be the later step.
quoted
patch 4 - convert interface to use atomic_t
Could it be standalone step ?
Let me think about it.
quoted
IMHO, the assigned flag is a horrible hack and I don't know why drivers
like xenback need to use it. KVM needs to use it because it doesn't
actually have a driver to bind to when a device is assigned, it's happy
to assign devices without any driver. Thanks,
Alex
On Fri, 2014-07-11 at 08:47 +0800, Ethan Zhao wrote:
quoted
Current implementation of helper function pci_vfs_assigned() is a little complex, to
get sum of VFs that assigned to VM, access low level configuration space register and
then loop in traversing device tree.
This patch introduce an atomic reference counter for VFs that assigned to VM in struct
pci_sriov, and compose two more helper functions
pci_sriov_assign_device(),
pci_sriov_deassign_device()
to replace manipulation to device flag and the meanwhile increase and decease the counter.
Passed building on 3.15.5
Signed-off-by: Ethan Zhao <redacted>
---
drivers/pci/iov.c | 65 ++++++++++++++++++++++++++++----------------------
drivers/pci/pci.h | 1 +
include/linux/pci.h | 4 +++
3 files changed, 41 insertions(+), 29 deletions(-)
@@ -603,45 +604,51 @@ int pci_num_vf(struct pci_dev *dev)EXPORT_SYMBOL_GPL(pci_num_vf);/**-*pci_vfs_assigned-returnsnumberofVFsareassignedtoaguest-*@dev:thePCIdevice+*pci_vfs_assigned-returnsnumberofVFsareassignedtoVM+*@dev:thephysicalPCIdevicethatcontainstheVFs.*-*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoaguest.+*ReturnsnumberofVFsbelongingtothisdevicethatareassignedtoVM.*Ifdeviceisnotaphysicalfunctionreturns0.*/intpci_vfs_assigned(structpci_dev*dev){-structpci_dev*vfdev;-unsignedintvfs_assigned=0;-unsignedshortdev_id;--/* only search if we are a PF */if(!dev->is_physfn)return0;+if(dev->sriov)+returnatomic_read(&dev->sriov->VFs_assigned_cnt);+return0;+}+EXPORT_SYMBOL_GPL(pci_vfs_assigned);-/*-*determinethedeviceIDfortheVFs,thevendorIDwillbethe-*sameasthePFsothereisnoneedtocheckforthatone-*/-pci_read_config_word(dev,dev->sriov->pos+PCI_SRIOV_VF_DID,&dev_id);--/* loop through all the VFs to see if we own any that are assigned */-vfdev=pci_get_device(dev->vendor,dev_id,NULL);-while(vfdev){-/*-*Itisconsideredassignedifitisavirtualfunctionwith-*ourdevasthephysicalfunctionandtheassignedbitisset-*/-if(vfdev->is_virtfn&&(vfdev->physfn==dev)&&-(vfdev->dev_flags&PCI_DEV_FLAGS_ASSIGNED))-vfs_assigned++;--vfdev=pci_get_device(dev->vendor,dev_id,vfdev);-}+/**+*pci_sriov_assign_device-assigndevicetoVM+*@pdev:thedevicetobeassigned.+*/+voidpci_sriov_assign_device(structpci_dev*pdev)+{+pdev->dev_flags|=PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_inc(&pdev->physfn->sriov->+VFs_assigned_cnt);+}+EXPORT_SYMBOL_GPL(pci_sriov_assign_device);-returnvfs_assigned;+/**+*pci_sriov_deassign_device-deasigndevicefromVM+*@pdev:thedevicetobedeassigned.+*/+voidpci_sriov_deassign_device(structpci_dev*pdev)+{+pdev->dev_flags&=~PCI_DEV_FLAGS_ASSIGNED;+if(pdev->is_virtfn&&!pdev->is_physfn)+if(pdev->physfn)+if(pdev->physfn->sriov)+atomic_dec(&pdev->physfn->sriov->+VFs_assigned_cnt);}-EXPORT_SYMBOL_GPL(pci_vfs_assigned);+EXPORT_SYMBOL_GPL(pci_sriov_deassign_device);/***pci_sriov_set_totalvfs--reducetheTotalVFsavailable
@@ -235,6 +235,7 @@ struct pci_sriov {u32pgsz;/* page size for BAR alignment */u8link;/* Function Dependency Link */u16driver_max_VFs;/* max num VFs driver supports */+atomic_tVFs_assigned_cnt;/* counter of VFs assigned to VM */structpci_dev*dev;/* lowest numbered PF */structpci_dev*self;/* this PF */structmutexlock;/* lock for VF bus */
@@ -1601,6 +1601,8 @@ int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn);voidpci_disable_sriov(structpci_dev*dev);intpci_num_vf(structpci_dev*dev);intpci_vfs_assigned(structpci_dev*dev);+voidpci_sriov_assign_device(structpci_dev*dev);+voidpci_sriov_deassign_device(structpci_dev*dev);intpci_sriov_set_totalvfs(structpci_dev*dev,u16numvfs);intpci_sriov_get_totalvfs(structpci_dev*dev);#else
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired