2017-03-07 03:34:40

by Shannon Nelson

[permalink] [raw]
Subject: [PATCH net-next 0/5] sunvnet: better connection management

These patches remove some problems in handling of carrier state
with the ldmvsw vswitch, remove an xoff misuse in sunvnet, and
add stats for debug and tracking of point-to-point connections
between the ldom VMs.

Shannon Nelson (5):
ldmvsw: better use of link up and down on ldom vswitch
sunvnet: add stats to track ldom to ldom packets and bytes
sunvnet: track port queues correctly
sunvnet: count multicast packets
sunvnet: xoff not needed when removing port link

drivers/net/ethernet/sun/ldmvsw.c | 10 ++-
drivers/net/ethernet/sun/sunvnet.c | 114 +++++++++++++++++++++++++++++
drivers/net/ethernet/sun/sunvnet_common.c | 50 +++++++++++--
drivers/net/ethernet/sun/sunvnet_common.h | 26 ++++--
4 files changed, 180 insertions(+), 20 deletions(-)


2017-03-06 23:43:31

by Shannon Nelson

[permalink] [raw]
Subject: [PATCH net-next 3/5] sunvnet: track port queues correctly

Track our used and unused queue indices correctly. Otherwise, as ports
dropped out and returned, they all eventually ended up with the same
queue index.

Signed-off-by: Shannon Nelson <[email protected]>
---
drivers/net/ethernet/sun/sunvnet_common.c | 24 ++++++++++++++++++++----
drivers/net/ethernet/sun/sunvnet_common.h | 11 ++---------
2 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/sun/sunvnet_common.c b/drivers/net/ethernet/sun/sunvnet_common.c
index a8e7506..8afc659 100644
--- a/drivers/net/ethernet/sun/sunvnet_common.c
+++ b/drivers/net/ethernet/sun/sunvnet_common.c
@@ -1728,11 +1728,25 @@ void sunvnet_poll_controller_common(struct net_device *dev, struct vnet *vp)
void sunvnet_port_add_txq_common(struct vnet_port *port)
{
struct vnet *vp = port->vp;
- int n;
+ int smallest = 0;
+ int i;
+
+ /* find the first least-used q
+ * When there are more ldoms than q's, we start to
+ * double up on ports per queue.
+ */
+ for (i = 0; i < VNET_MAX_TXQS; i++) {
+ if (vp->q_used[i] == 0) {
+ smallest = i;
+ break;
+ }
+ if (vp->q_used[i] < vp->q_used[smallest])
+ smallest = i;
+ }

- n = vp->nports++;
- n = n & (VNET_MAX_TXQS - 1);
- port->q_index = n;
+ vp->nports++;
+ vp->q_used[smallest]++;
+ port->q_index = smallest;
netif_tx_wake_queue(netdev_get_tx_queue(VNET_PORT_TO_NET_DEVICE(port),
port->q_index));
}
@@ -1743,5 +1757,7 @@ void sunvnet_port_rm_txq_common(struct vnet_port *port)
port->vp->nports--;
netif_tx_stop_queue(netdev_get_tx_queue(VNET_PORT_TO_NET_DEVICE(port),
port->q_index));
+ port->vp->q_used[port->q_index]--;
+ port->q_index = 0;
}
EXPORT_SYMBOL_GPL(sunvnet_port_rm_txq_common);
diff --git a/drivers/net/ethernet/sun/sunvnet_common.h b/drivers/net/ethernet/sun/sunvnet_common.h
index 006eaf8..d4b4a4e 100644
--- a/drivers/net/ethernet/sun/sunvnet_common.h
+++ b/drivers/net/ethernet/sun/sunvnet_common.h
@@ -112,22 +112,15 @@ struct vnet_mcast_entry {
};

struct vnet {
- /* Protects port_list and port_hash. */
- spinlock_t lock;
-
+ spinlock_t lock; /* Protects port_list and port_hash. */
struct net_device *dev;
-
u32 msg_enable;
-
+ u16 q_used[VNET_MAX_TXQS];
struct list_head port_list;
-
struct hlist_head port_hash[VNET_PORT_HASH_SIZE];
-
struct vnet_mcast_entry *mcast_list;
-
struct list_head list;
u64 local_mac;
-
int nports;
};

--
1.7.1

2017-03-06 23:43:45

by Shannon Nelson

[permalink] [raw]
Subject: [PATCH net-next 4/5] sunvnet: count multicast packets

Make sure multicast packets get counted in the device.

Signed-off-by: Shannon Nelson <[email protected]>
---
drivers/net/ethernet/sun/sunvnet_common.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/drivers/net/ethernet/sun/sunvnet_common.c b/drivers/net/ethernet/sun/sunvnet_common.c
index 8afc659..7eb53af 100644
--- a/drivers/net/ethernet/sun/sunvnet_common.c
+++ b/drivers/net/ethernet/sun/sunvnet_common.c
@@ -410,6 +410,8 @@ static int vnet_rx_one(struct vnet_port *port, struct vio_net_desc *desc)

skb->ip_summed = port->switch_port ? CHECKSUM_NONE : CHECKSUM_PARTIAL;

+ if (unlikely(is_multicast_ether_addr(eth_hdr(skb)->h_dest)))
+ dev->stats.multicast++;
dev->stats.rx_packets++;
dev->stats.rx_bytes += len;
port->stats.rx_packets++;
--
1.7.1

2017-03-07 02:02:10

by Shannon Nelson

[permalink] [raw]
Subject: [PATCH net-next 5/5] sunvnet: xoff not needed when removing port link

The sunvnet netdev is connected to the controlling ldom's vswitch
for network bridging. However, for higher performance between ldoms,
there also is a channel between each client ldom. These connections are
represented in the sunvnet driver by a queue for each ldom. The driver
uses select_queue to tell the stack which queue to use by tracking the mac
addresses on the other end of each port. When a connected ldom shuts down,
the driver receives an LDC_EVENT_RESET and the port is removed from the
driver, thus a queue with no ldom on the other end will never be selected
for Tx.

The driver was trying to reinforce the "don't use this queue" notion with
netif_tx_stop_queue() and netif_tx_wake_queue(), which really should only
be used to signal a Tx queue is full (aka XOFF). This misuse of queue
state resulted in NETDEV WATCHDOG messages and lots of unnecessary calls
into the driver's tx_timeout handler. Simply removing these takes care
of the problem.

Orabug: 25190537

Signed-off-by: Shannon Nelson <[email protected]>
---
drivers/net/ethernet/sun/sunvnet_common.c | 4 ----
1 files changed, 0 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/sun/sunvnet_common.c b/drivers/net/ethernet/sun/sunvnet_common.c
index 7eb53af..1788d6f 100644
--- a/drivers/net/ethernet/sun/sunvnet_common.c
+++ b/drivers/net/ethernet/sun/sunvnet_common.c
@@ -1749,16 +1749,12 @@ void sunvnet_port_add_txq_common(struct vnet_port *port)
vp->nports++;
vp->q_used[smallest]++;
port->q_index = smallest;
- netif_tx_wake_queue(netdev_get_tx_queue(VNET_PORT_TO_NET_DEVICE(port),
- port->q_index));
}
EXPORT_SYMBOL_GPL(sunvnet_port_add_txq_common);

void sunvnet_port_rm_txq_common(struct vnet_port *port)
{
port->vp->nports--;
- netif_tx_stop_queue(netdev_get_tx_queue(VNET_PORT_TO_NET_DEVICE(port),
- port->q_index));
port->vp->q_used[port->q_index]--;
port->q_index = 0;
}
--
1.7.1

2017-03-07 02:05:25

by Shannon Nelson

[permalink] [raw]
Subject: [PATCH net-next 1/5] ldmvsw: better use of link up and down on ldom vswitch

When an ldom VM is bound, the network vswitch infrastructure is set up for
it, but was being forced 'UP' by the userland switch configuration script.
When 'UP' but not actually connected to a running VM, the ipv6 neighbor
probes fail (not a horrible thing) and start cluttering up the kernel logs.
Funny thing: these are debug messages that never actually show up, but
we do see the net_ratelimited messages that say N callbacks were
suppressed.

This patch defers the netif_carrier_on() until an actual link has been
established with the VM, as indicated by receiving an LDC_EVENT_UP from
the underlying LDC protocol. Similarly, we take the link down when we
see the LDC_EVENT_RESET.

Orabug: 25525312

Signed-off-by: Shannon Nelson <[email protected]>
---
drivers/net/ethernet/sun/ldmvsw.c | 10 +++++++---
drivers/net/ethernet/sun/sunvnet_common.c | 14 ++++++++++++++
2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/sun/ldmvsw.c b/drivers/net/ethernet/sun/ldmvsw.c
index 89952de..c6f6d59 100644
--- a/drivers/net/ethernet/sun/ldmvsw.c
+++ b/drivers/net/ethernet/sun/ldmvsw.c
@@ -41,8 +41,8 @@
static u8 vsw_port_hwaddr[ETH_ALEN] = {0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

#define DRV_MODULE_NAME "ldmvsw"
-#define DRV_MODULE_VERSION "1.1"
-#define DRV_MODULE_RELDATE "February 3, 2017"
+#define DRV_MODULE_VERSION "1.2"
+#define DRV_MODULE_RELDATE "March 4, 2017"

static char version[] =
DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")";
@@ -133,7 +133,6 @@ static void vsw_poll_controller(struct net_device *dev)
#endif

static const struct net_device_ops vsw_ops = {
- .ndo_open = sunvnet_open_common,
.ndo_stop = sunvnet_close_common,
.ndo_set_rx_mode = vsw_set_rx_mode,
.ndo_set_mac_address = sunvnet_set_mac_addr_common,
@@ -365,6 +364,11 @@ static int vsw_port_probe(struct vio_dev *vdev, const struct vio_device_id *id)
napi_enable(&port->napi);
vio_port_up(&port->vio);

+ /* assure no carrier until we receive an LDC_EVENT_UP,
+ * even if the vsw config script tries to force us up
+ */
+ netif_carrier_off(dev);
+
netdev_info(dev, "LDOM vsw-port %pM\n", dev->dev_addr);

pr_info("%s: PORT ( remote-mac %pM%s )\n", dev->name,
diff --git a/drivers/net/ethernet/sun/sunvnet_common.c b/drivers/net/ethernet/sun/sunvnet_common.c
index fa2d11c..bba0691 100644
--- a/drivers/net/ethernet/sun/sunvnet_common.c
+++ b/drivers/net/ethernet/sun/sunvnet_common.c
@@ -747,6 +747,13 @@ static int vnet_event_napi(struct vnet_port *port, int budget)

/* RESET takes precedent over any other event */
if (port->rx_event & LDC_EVENT_RESET) {
+ /* a link went down */
+
+ if (port->vsw == 1) {
+ netif_tx_stop_all_queues(dev);
+ netif_carrier_off(dev);
+ }
+
vio_link_state_change(vio, LDC_EVENT_RESET);
vnet_port_reset(port);
vio_port_up(vio);
@@ -766,6 +773,13 @@ static int vnet_event_napi(struct vnet_port *port, int budget)
}

if (port->rx_event & LDC_EVENT_UP) {
+ /* a link came up */
+
+ if (port->vsw == 1) {
+ netif_carrier_on(port->dev);
+ netif_tx_start_all_queues(port->dev);
+ }
+
vio_link_state_change(vio, LDC_EVENT_UP);
port->rx_event = 0;
return 0;
--
1.7.1

2017-03-07 03:49:55

by Shannon Nelson

[permalink] [raw]
Subject: [PATCH net-next 2/5] sunvnet: add stats to track ldom to ldom packets and bytes

In this driver, there is a "port" created for the connection to each of
the other ldoms; a netdev queue is mapped to each port, and they are
collected under a single netdev. The generic netdev statistics show
us all the traffic in and out of our network device, but don't show
individual queue/port stats. This patch breaks out the traffic counts
for the individual ports and gives us a little view into the state of
those connections.

Signed-off-by: Shannon Nelson <[email protected]>
---
drivers/net/ethernet/sun/sunvnet.c | 114 +++++++++++++++++++++++++++++
drivers/net/ethernet/sun/sunvnet_common.c | 6 ++
drivers/net/ethernet/sun/sunvnet_common.h | 15 ++++
3 files changed, 135 insertions(+), 0 deletions(-)

diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c
index 4cc2571..80de4fa 100644
--- a/drivers/net/ethernet/sun/sunvnet.c
+++ b/drivers/net/ethernet/sun/sunvnet.c
@@ -77,11 +77,125 @@ static void vnet_set_msglevel(struct net_device *dev, u32 value)
vp->msg_enable = value;
}

+static const struct {
+ const char string[ETH_GSTRING_LEN];
+} ethtool_stats_keys[] = {
+ { "rx_packets" },
+ { "tx_packets" },
+ { "rx_bytes" },
+ { "tx_bytes" },
+ { "rx_errors" },
+ { "tx_errors" },
+ { "rx_dropped" },
+ { "tx_dropped" },
+ { "multicast" },
+ { "rx_length_errors" },
+ { "rx_frame_errors" },
+ { "rx_missed_errors" },
+ { "tx_carrier_errors" },
+ { "nports" },
+};
+
+static int vnet_get_sset_count(struct net_device *dev, int sset)
+{
+ struct vnet *vp = (struct vnet *)netdev_priv(dev);
+
+ switch (sset) {
+ case ETH_SS_STATS:
+ return ARRAY_SIZE(ethtool_stats_keys)
+ + (NUM_VNET_PORT_STATS * vp->nports);
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
+static void vnet_get_strings(struct net_device *dev, u32 stringset, u8 *buf)
+{
+ struct vnet *vp = (struct vnet *)netdev_priv(dev);
+ struct vnet_port *port;
+ char *p = (char *)buf;
+
+ switch (stringset) {
+ case ETH_SS_STATS:
+ memcpy(buf, &ethtool_stats_keys, sizeof(ethtool_stats_keys));
+ p += sizeof(ethtool_stats_keys);
+
+ rcu_read_lock();
+ list_for_each_entry_rcu(port, &vp->port_list, list) {
+ snprintf(p, ETH_GSTRING_LEN, "p%u.%s-%pM",
+ port->q_index, port->switch_port ? "s" : "q",
+ port->raddr);
+ p += ETH_GSTRING_LEN;
+ snprintf(p, ETH_GSTRING_LEN, "p%u.rx_packets",
+ port->q_index);
+ p += ETH_GSTRING_LEN;
+ snprintf(p, ETH_GSTRING_LEN, "p%u.tx_packets",
+ port->q_index);
+ p += ETH_GSTRING_LEN;
+ snprintf(p, ETH_GSTRING_LEN, "p%u.rx_bytes",
+ port->q_index);
+ p += ETH_GSTRING_LEN;
+ snprintf(p, ETH_GSTRING_LEN, "p%u.tx_bytes",
+ port->q_index);
+ p += ETH_GSTRING_LEN;
+ snprintf(p, ETH_GSTRING_LEN, "p%u.event_up",
+ port->q_index);
+ p += ETH_GSTRING_LEN;
+ snprintf(p, ETH_GSTRING_LEN, "p%u.event_reset",
+ port->q_index);
+ p += ETH_GSTRING_LEN;
+ }
+ rcu_read_unlock();
+ break;
+ default:
+ WARN_ON(1);
+ break;
+ }
+}
+
+static void vnet_get_ethtool_stats(struct net_device *dev,
+ struct ethtool_stats *estats, u64 *data)
+{
+ struct vnet *vp = (struct vnet *)netdev_priv(dev);
+ struct vnet_port *port;
+ int i = 0;
+
+ data[i++] = dev->stats.rx_packets;
+ data[i++] = dev->stats.tx_packets;
+ data[i++] = dev->stats.rx_bytes;
+ data[i++] = dev->stats.tx_bytes;
+ data[i++] = dev->stats.rx_errors;
+ data[i++] = dev->stats.tx_errors;
+ data[i++] = dev->stats.rx_dropped;
+ data[i++] = dev->stats.tx_dropped;
+ data[i++] = dev->stats.multicast;
+ data[i++] = dev->stats.rx_length_errors;
+ data[i++] = dev->stats.rx_frame_errors;
+ data[i++] = dev->stats.rx_missed_errors;
+ data[i++] = dev->stats.tx_carrier_errors;
+ data[i++] = vp->nports;
+
+ rcu_read_lock();
+ list_for_each_entry_rcu(port, &vp->port_list, list) {
+ data[i++] = port->q_index;
+ data[i++] = port->stats.rx_packets;
+ data[i++] = port->stats.tx_packets;
+ data[i++] = port->stats.rx_bytes;
+ data[i++] = port->stats.tx_bytes;
+ data[i++] = port->stats.event_up;
+ data[i++] = port->stats.event_reset;
+ }
+ rcu_read_unlock();
+}
+
static const struct ethtool_ops vnet_ethtool_ops = {
.get_drvinfo = vnet_get_drvinfo,
.get_msglevel = vnet_get_msglevel,
.set_msglevel = vnet_set_msglevel,
.get_link = ethtool_op_get_link,
+ .get_sset_count = vnet_get_sset_count,
+ .get_strings = vnet_get_strings,
+ .get_ethtool_stats = vnet_get_ethtool_stats,
};

static LIST_HEAD(vnet_list);
diff --git a/drivers/net/ethernet/sun/sunvnet_common.c b/drivers/net/ethernet/sun/sunvnet_common.c
index bba0691..a8e7506 100644
--- a/drivers/net/ethernet/sun/sunvnet_common.c
+++ b/drivers/net/ethernet/sun/sunvnet_common.c
@@ -412,6 +412,8 @@ static int vnet_rx_one(struct vnet_port *port, struct vio_net_desc *desc)

dev->stats.rx_packets++;
dev->stats.rx_bytes += len;
+ port->stats.rx_packets++;
+ port->stats.rx_bytes += len;
napi_gro_receive(&port->napi, skb);
return 0;

@@ -769,6 +771,7 @@ static int vnet_event_napi(struct vnet_port *port, int budget)
maybe_tx_wakeup(port);

port->rx_event = 0;
+ port->stats.event_reset++;
return 0;
}

@@ -782,6 +785,7 @@ static int vnet_event_napi(struct vnet_port *port, int budget)

vio_link_state_change(vio, LDC_EVENT_UP);
port->rx_event = 0;
+ port->stats.event_up++;
return 0;
}

@@ -1431,6 +1435,8 @@ int sunvnet_start_xmit_common(struct sk_buff *skb, struct net_device *dev,

dev->stats.tx_packets++;
dev->stats.tx_bytes += port->tx_bufs[txi].skb->len;
+ port->stats.tx_packets++;
+ port->stats.tx_bytes += port->tx_bufs[txi].skb->len;

dr->prod = (dr->prod + 1) & (VNET_TX_RING_SIZE - 1);
if (unlikely(vnet_tx_dring_avail(dr) < 1)) {
diff --git a/drivers/net/ethernet/sun/sunvnet_common.h b/drivers/net/ethernet/sun/sunvnet_common.h
index ce5c824..006eaf8 100644
--- a/drivers/net/ethernet/sun/sunvnet_common.h
+++ b/drivers/net/ethernet/sun/sunvnet_common.h
@@ -35,6 +35,19 @@ struct vnet_tx_entry {

struct vnet;

+struct vnet_port_stats {
+ /* keep them all the same size */
+ u32 rx_bytes;
+ u32 tx_bytes;
+ u32 rx_packets;
+ u32 tx_packets;
+ u32 event_up;
+ u32 event_reset;
+ u32 q_placeholder;
+};
+
+#define NUM_VNET_PORT_STATS (sizeof(struct vnet_port_stats) / sizeof(u32))
+
/* Structure to describe a vnet-port or vsw-port in the MD.
* If the vsw bit is set, this structure represents a vswitch
* port, and the net_device can be found from ->dev. If the
@@ -44,6 +57,8 @@ struct vnet_tx_entry {
struct vnet_port {
struct vio_driver_state vio;

+ struct vnet_port_stats stats;
+
struct hlist_node hash;
u8 raddr[ETH_ALEN];
unsigned switch_port:1;
--
1.7.1

2017-03-07 03:49:46

by Florian Fainelli

[permalink] [raw]
Subject: Re: [PATCH net-next 1/5] ldmvsw: better use of link up and down on ldom vswitch

On 03/06/2017 03:15 PM, Shannon Nelson wrote:
> When an ldom VM is bound, the network vswitch infrastructure is set up for
> it, but was being forced 'UP' by the userland switch configuration script.
> When 'UP' but not actually connected to a running VM, the ipv6 neighbor
> probes fail (not a horrible thing) and start cluttering up the kernel logs.
> Funny thing: these are debug messages that never actually show up, but
> we do see the net_ratelimited messages that say N callbacks were
> suppressed.
>
> This patch defers the netif_carrier_on() until an actual link has been
> established with the VM, as indicated by receiving an LDC_EVENT_UP from
> the underlying LDC protocol. Similarly, we take the link down when we
> see the LDC_EVENT_RESET.
>
> Orabug: 25525312
>
> Signed-off-by: Shannon Nelson <[email protected]>
> ---
> drivers/net/ethernet/sun/ldmvsw.c | 10 +++++++---
> drivers/net/ethernet/sun/sunvnet_common.c | 14 ++++++++++++++
> 2 files changed, 21 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/sun/ldmvsw.c b/drivers/net/ethernet/sun/ldmvsw.c
> index 89952de..c6f6d59 100644
> --- a/drivers/net/ethernet/sun/ldmvsw.c
> +++ b/drivers/net/ethernet/sun/ldmvsw.c
> @@ -41,8 +41,8 @@
> static u8 vsw_port_hwaddr[ETH_ALEN] = {0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
>
> #define DRV_MODULE_NAME "ldmvsw"
> -#define DRV_MODULE_VERSION "1.1"
> -#define DRV_MODULE_RELDATE "February 3, 2017"
> +#define DRV_MODULE_VERSION "1.2"
> +#define DRV_MODULE_RELDATE "March 4, 2017"
>
> static char version[] =
> DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")";
> @@ -133,7 +133,6 @@ static void vsw_poll_controller(struct net_device *dev)
> #endif
>
> static const struct net_device_ops vsw_ops = {
> - .ndo_open = sunvnet_open_common,

Is this change intentional? It was not entirely obvious where you would
be setting ::ndo_open in other places.
--
Florian

2017-03-07 04:42:32

by Shannon Nelson

[permalink] [raw]
Subject: Re: [PATCH net-next 1/5] ldmvsw: better use of link up and down on ldom vswitch



On 3/6/2017 3:53 PM, Florian Fainelli wrote:
> On 03/06/2017 03:15 PM, Shannon Nelson wrote:
>> When an ldom VM is bound, the network vswitch infrastructure is set up for
>> it, but was being forced 'UP' by the userland switch configuration script.
>> When 'UP' but not actually connected to a running VM, the ipv6 neighbor
>> probes fail (not a horrible thing) and start cluttering up the kernel logs.
>> Funny thing: these are debug messages that never actually show up, but
>> we do see the net_ratelimited messages that say N callbacks were
>> suppressed.
>>
>> This patch defers the netif_carrier_on() until an actual link has been
>> established with the VM, as indicated by receiving an LDC_EVENT_UP from
>> the underlying LDC protocol. Similarly, we take the link down when we
>> see the LDC_EVENT_RESET.
>>
>> Orabug: 25525312
>>
>> Signed-off-by: Shannon Nelson <[email protected]>
>> ---
>> drivers/net/ethernet/sun/ldmvsw.c | 10 +++++++---
>> drivers/net/ethernet/sun/sunvnet_common.c | 14 ++++++++++++++
>> 2 files changed, 21 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/sun/ldmvsw.c b/drivers/net/ethernet/sun/ldmvsw.c
>> index 89952de..c6f6d59 100644
>> --- a/drivers/net/ethernet/sun/ldmvsw.c
>> +++ b/drivers/net/ethernet/sun/ldmvsw.c
>> @@ -41,8 +41,8 @@
>> static u8 vsw_port_hwaddr[ETH_ALEN] = {0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
>>
>> #define DRV_MODULE_NAME "ldmvsw"
>> -#define DRV_MODULE_VERSION "1.1"
>> -#define DRV_MODULE_RELDATE "February 3, 2017"
>> +#define DRV_MODULE_VERSION "1.2"
>> +#define DRV_MODULE_RELDATE "March 4, 2017"
>>
>> static char version[] =
>> DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")";
>> @@ -133,7 +133,6 @@ static void vsw_poll_controller(struct net_device *dev)
>> #endif
>>
>> static const struct net_device_ops vsw_ops = {
>> - .ndo_open = sunvnet_open_common,
>
> Is this change intentional? It was not entirely obvious where you would
> be setting ::ndo_open in other places.

Yes, it is correct. It does look a bit odd, but nearly all the work is
done in the _probe(), and now the carrier_on happens a little later when
the LDC_EVENT_UP is received, so there's no longer a need for the
_open() call.

sln


>

2017-03-09 03:26:27

by Shannon Nelson

[permalink] [raw]
Subject: Re: [PATCH net-next 0/5] sunvnet: better connection management

On 3/6/2017 3:15 PM, Shannon Nelson wrote:
> These patches remove some problems in handling of carrier state
> with the ldmvsw vswitch, remove an xoff misuse in sunvnet, and
> add stats for debug and tracking of point-to-point connections
> between the ldom VMs.

Further testing shows a problem in one of the patches, so there will be
a V2 coming.

Thanks,
sln

>
> Shannon Nelson (5):
> ldmvsw: better use of link up and down on ldom vswitch
> sunvnet: add stats to track ldom to ldom packets and bytes
> sunvnet: track port queues correctly
> sunvnet: count multicast packets
> sunvnet: xoff not needed when removing port link
>
> drivers/net/ethernet/sun/ldmvsw.c | 10 ++-
> drivers/net/ethernet/sun/sunvnet.c | 114 +++++++++++++++++++++++++++++
> drivers/net/ethernet/sun/sunvnet_common.c | 50 +++++++++++--
> drivers/net/ethernet/sun/sunvnet_common.h | 26 ++++--
> 4 files changed, 180 insertions(+), 20 deletions(-)
>

2017-03-09 06:00:49

by David Miller

[permalink] [raw]
Subject: Re: [PATCH net-next 0/5] sunvnet: better connection management

From: Shannon Nelson <[email protected]>
Date: Wed, 8 Mar 2017 15:04:45 -0800

> On 3/6/2017 3:15 PM, Shannon Nelson wrote:
>> These patches remove some problems in handling of carrier state
>> with the ldmvsw vswitch, remove an xoff misuse in sunvnet, and
>> add stats for debug and tracking of point-to-point connections
>> between the ldom VMs.
>
> Further testing shows a problem in one of the patches, so there will
> be a V2 coming.

Ok.