247641
From 783de6c93b01fec3f3cb8682156a21417567db9f Mon Sep 17 00:00:00 2001
247641
From: Narendra K <narendra_k@dell.com>
247641
Date: Wed, 4 Sep 2013 20:32:14 +0530
247641
Subject: [PATCH] Fix regression introduced by the addslot function
247641
247641
This patch reverts the following commits
247641
247641
1452ea7125b5e713b80459f7b528d5562438f3d5
247641
0bb870f09a34b6c505fcefdbcf85cfcc1aa5ca97
247641
247641
The commits introduced addslot function to implement naming for
247641
devices which have more than one physical port sharing the same
247641
PCI b/d/f. But the port determination logic in 'addslot' function
247641
could
247641
result in more than one interface on a given PCI slot getting same
247641
port number when renames are happening in parallel. This patch
247641
restores the logic that existed in version 0.3.11 to determine
247641
port number of an interface.
247641
247641
Fixes Fedora bz-782145.
247641
---
247641
 src/bios_device.c   | 59 ------------------------------------
247641
 src/bios_device.h   |  3 --
247641
 src/naming_policy.c |  6 ++--
247641
 src/pci.c           | 86 ++++++++++++++++++++++++++++++-----------------------
247641
 4 files changed, 50 insertions(+), 104 deletions(-)
247641
247641
diff --git a/src/bios_device.c b/src/bios_device.c
247641
index a8827ec..132877e 100644
247641
--- a/src/bios_device.c
247641
+++ b/src/bios_device.c
247641
@@ -217,32 +217,6 @@ static void match_pci_and_eth_devs(struct libbiosdevname_state *state)
247641
 	struct pci_device *p;
247641
 	struct bios_device *b;
247641
 	struct network_device *n;
247641
-
247641
-	list_for_each_entry(n, &state->network_devices, node) {
247641
-		p = find_dev_by_pci_name(state, n->drvinfo.bus_info);
247641
-		if (!p)
247641
-			continue;
247641
-
247641
-		b = malloc(sizeof(*b));
247641
-		if (!b)
247641
-			continue;
247641
-		memset(b, 0, sizeof(*b));
247641
-		INIT_LIST_HEAD(&b->node);
247641
-		b->pcidev = p;
247641
-		b->netdev = n;
247641
-		b->slot_num = -1;
247641
-		b->port_num = -1;
247641
-		claim_netdev(b->netdev);
247641
-		list_add(&b->node, &state->bios_devices);
247641
-	}
247641
-}
247641
-
247641
-
247641
-static void match_eth_and_pci_devs(struct libbiosdevname_state *state)
247641
-{
247641
-	struct pci_device *p;
247641
-	struct bios_device *b;
247641
-	struct network_device *n;
247641
 	char pci_name[40];
247641
 
247641
 	list_for_each_entry(p, &state->pci_devices, node) {
247641
@@ -261,8 +235,6 @@ static void match_eth_and_pci_devs(struct libbiosdevname_state *state)
247641
 		INIT_LIST_HEAD(&b->node);
247641
 		b->pcidev = p;
247641
 		b->netdev = n;
247641
-		b->slot_num = -1;
247641
-		b->port_num = -1;
247641
 		claim_netdev(b->netdev);
247641
 		list_add(&b->node, &state->bios_devices);
247641
 	}
247641
@@ -286,8 +258,6 @@ static void match_unknown_eths(struct libbiosdevname_state *state)
247641
 		memset(b, 0, sizeof(*b));
247641
 		INIT_LIST_HEAD(&b->node);
247641
 		b->netdev = n;
247641
-		b->slot_num = -1;
247641
-		b->port_num = -1;
247641
 		list_add(&b->node, &state->bios_devices);
247641
 	}
247641
 }
247641
@@ -355,32 +325,6 @@ static void find_duplicates(struct libbiosdevname_state *state)
247641
 	}
247641
 }
247641
 
247641
-extern int addslot(struct libbiosdevname_state *state, int slot);
247641
-
247641
-/* Fix for RHBZ 816536/757743/756164/: Cards with same PCI but multiple ports
247641
- * chelsio, mellanox */
247641
-static int check_ports(struct libbiosdevname_state *state)
247641
-{
247641
-	struct pci_device *dev;
247641
-	struct bios_device *a;
247641
-        int slot = 0;
247641
-
247641
-	list_for_each_entry(a, &state->bios_devices, node) {
247641
-		dev = a->pcidev;
247641
-		if (dev == NULL || dev->is_sriov_virtual_function || dev->vpd_port != INT_MAX)
247641
-			continue;
247641
-		if (dev->physical_slot != PHYSICAL_SLOT_UNKNOWN) {
247641
-			a->slot_num = dev->physical_slot;
247641
-			slot = addslot(state, 0x1000 + dev->physical_slot);
247641
-                        if (slot<0)
247641
-                                return slot;
247641
-                        a->port_num = slot;
247641
-		}
247641
-	}
247641
-
247641
-        return 0;
247641
-}
247641
-
247641
 void * setup_bios_devices(int namingpolicy, const char *prefix)
247641
 {
247641
 	int rc=1;
247641
@@ -396,9 +340,6 @@ void * setup_bios_devices(int namingpolicy, const char *prefix)
247641
 	get_eths(state);
247641
 	match_all(state);
247641
 	sort_device_list(state);
247641
-	rc = check_ports(state);
247641
-        if (rc)
247641
-                goto out;
247641
 	rc = assign_bios_network_names(state, namingpolicy, prefix);
247641
 	if (rc)
247641
 		goto out;
247641
diff --git a/src/bios_device.h b/src/bios_device.h
247641
index d1ef911..690ed6f 100644
247641
--- a/src/bios_device.h
247641
+++ b/src/bios_device.h
247641
@@ -19,9 +19,6 @@ struct bios_device {
247641
 	struct pci_device *pcidev;
247641
 	char *bios_name;
247641
 	int duplicate;
247641
-
247641
-	int slot_num;
247641
-	int port_num;
247641
 };
247641
 
247641
 static inline int is_pci(const struct bios_device *dev)
247641
diff --git a/src/naming_policy.c b/src/naming_policy.c
247641
index fe7b934..4f2033c 100644
247641
--- a/src/naming_policy.c
247641
+++ b/src/naming_policy.c
247641
@@ -59,8 +59,8 @@ static void use_physical(const struct libbiosdevname_state *state, const char *p
247641
 					portnum = vf->sysfs_index;
247641
 				else if (vf->uses_smbios & HAS_SMBIOS_INSTANCE && is_pci_smbios_type_ethernet(vf))
247641
 					portnum = vf->smbios_instance;
247641
-				else if (dev->port_num != -1)
247641
-					portnum = dev->port_num;
247641
+				else if (vf->embedded_index_valid)
247641
+					portnum = vf->embedded_index;
247641
 				if (portnum != INT_MAX) {	
247641
 					snprintf(location, sizeof(location), "%s%u", prefix, portnum);
247641
 					known=1;
247641
@@ -70,8 +70,6 @@ static void use_physical(const struct libbiosdevname_state *state, const char *p
247641
 				snprintf(location, sizeof(location), "p%u", dev->pcidev->physical_slot);
247641
 				if (dev->pcidev->vpd_port < INT_MAX)
247641
 					portnum = dev->pcidev->vpd_port;
247641
-				else if (dev->port_num != -1)
247641
-					portnum = dev->port_num;
247641
 				else if (!dev->pcidev->is_sriov_virtual_function)
247641
 				  	portnum = dev->pcidev->index_in_slot;
247641
 				else
247641
diff --git a/src/pci.c b/src/pci.c
247641
index b64fc3f..7aa32fc 100644
247641
--- a/src/pci.c
247641
+++ b/src/pci.c
247641
@@ -637,26 +637,6 @@ void free_pci_devices(struct libbiosdevname_state *state)
247641
 	}
247641
 }
247641
 
247641
-int addslot(struct libbiosdevname_state *state, int slot)
247641
-{
247641
-	struct slotlist *s;
247641
-
247641
-	list_for_each_entry(s, &state->slots, node) {
247641
-		if (s->slot == slot) {
247641
-			return ++s->count;
247641
-		}
247641
-	}
247641
-	s = malloc(sizeof(*s));
247641
-        if(!s)
247641
-                return -1;
247641
-	INIT_LIST_HEAD(&s->node);
247641
-	s->slot = slot;
247641
-	s->count = 0;
247641
-	list_add(&s->node, &state->slots);
247641
-
247641
-	return ++s->count;
247641
-}
247641
-
247641
 static int set_pci_slots(struct libbiosdevname_state *state)
247641
 {
247641
 	struct pci_device *dev;
247641
@@ -665,29 +645,56 @@ static int set_pci_slots(struct libbiosdevname_state *state)
247641
 	list_for_each_entry(dev, &state->pci_devices, node) {
247641
 		dev_to_slot(state, dev);
247641
 	}
247641
+}
247641
 
247641
-	/* Get mapping for each slot */
247641
-	list_for_each_entry(dev, &state->pci_devices, node) {
247641
-		if (dev->is_sriov_virtual_function || !is_pci_network(dev) || dev->vpd_port != INT_MAX) {
247641
+static int set_pci_slot_index(struct libbiosdevname_state *state)
247641
+{
247641
+	struct pci_device *pcidev;
247641
+	int prevslot=-1;
247641
+	int index=1;
247641
+
247641
+	/* only iterate over the PCI devices, because the bios_device list may be incomplete due to renames happening in parallel */
247641
+	list_for_each_entry(pcidev, &state->pci_devices, node) {
247641
+		if (pcidev->physical_slot == 0) /* skip embedded devices */
247641
+ 			continue;
247641
+		if (!is_pci_network(pcidev)) /* only look at PCI network devices */
247641
 			continue;
247641
-		}
247641
-		if (dev->physical_slot == 0) {
247641
-			dev->embedded_index_valid = 1;
247641
-			slot = addslot(state, 0);
247641
-                        if (slot<0)
247641
-                                return slot;
247641
-                        dev->embedded_index = slot;
247641
-		} else if (dev->physical_slot != PHYSICAL_SLOT_UNKNOWN) {
247641
-			slot = addslot(state, dev->physical_slot);
247641
-                        if (slot<0)
247641
-                                return slot;
247641
-                        dev->index_in_slot = slot;
247641
-		}
247641
-	}
247641
+		if (pcidev->is_sriov_virtual_function) /* skip sriov VFs, they're handled later */
247641
+			continue;
247641
+		if (pcidev->physical_slot != prevslot) {
247641
+			index=1;
247641
+			prevslot = pcidev->physical_slot;
247641
+ 		}
247641
+		else
247641
+			index++;
247641
+		pcidev->index_in_slot = index;
247641
+ 	}
247641
+	return 0;
247641
+}
247641
+ 
247641
+static int set_embedded_index(struct libbiosdevname_state *state)
247641
+{
247641
+	struct pci_device *pcidev;
247641
+	int index=1;
247641
 
247641
-        return 0;
247641
+	list_for_each_entry(pcidev, &state->pci_devices, node) {
247641
+		if (pcidev->physical_slot != 0) /* skip non-embedded devices */
247641
+			continue;
247641
+		if (!is_pci_network(pcidev)) /* only look at PCI network devices */
247641
+			continue;
247641
+		if (pcidev->is_sriov_virtual_function) /* skip sriov VFs, they're handled later */
247641
+			continue;
247641
+		if (pcidev->vpd_port != INT_MAX)
247641
+			continue;
247641
+		pcidev->embedded_index = index;
247641
+		pcidev->embedded_index_valid = 1;
247641
+		index++;
247641
+	}
247641
+	return 0;
247641
 }
247641
 
247641
+
247641
+
247641
 static void set_sriov_pf_vf(struct libbiosdevname_state *state)
247641
 {
247641
 	struct pci_device *vf;
247641
@@ -774,6 +781,9 @@ int get_pci_devices(struct libbiosdevname_state *state)
247641
 	rc = set_pci_slots(state);
247641
         if(rc)
247641
                 goto out;
247641
+
247641
+        set_embedded_index(state);
247641
+	set_pci_slot_index(state);
247641
 	set_sriov_pf_vf(state);
247641
 
247641
 out:
247641
-- 
247641
1.8.3.1
247641