Subject: Re: mlx4: "failed to allocate default counter port 1"

From: Or Gerlitz <[email-masked]>
Date: Wed, 1 Jul 2015 16:18:07 +0300

On 6/30/2015 5:17 PM, Sebastian Ott wrote:
> On Tue, 30 Jun 2015, Or Gerlitz wrote:
>> On 6/30/2015 4:24 PM, Sebastian Ott wrote:
>>>>> Do you run the VF on the same system/kernel as the PF, or the VF is
>>>>> probed to
>>>>> VM which runs the latest kernel and the PF runsolder kernel (which?)
>>> The latter case. The PF is driven by a much older Kernel running OFED
>>> 2.3.2.0.0.1
>>>
>> Can you try running the inbox PF driver that comes with the PF kernel (what
>> kernel is that?) I'd like to see we're OK there.
> Frankly, I don't know. Plus I also don't know how to build an ofed kernel.
>

I didn't want you to build that package, but rather the outer way 
around, namely
see what happens if uninstalling this package and running with the mlx4 
inbox PF
driver from the kernel provided from your distro of choice or an 
upstreamkernel installed
by you. Anyway, I hope the below patch would provide a quick band-aid 
and let
you to continue running upstream VFs over that PF config, let me know (I 
will be
OOO till Thu-Sun). Once we see how this behaves, will take it from there.

Or.

diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c 
b/drivers/net/ethernet/mellanox/mlx4/main.c
index 12fbfcb..a66cc6e 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -2273,6 +2273,10 @@ static int mlx4_allocate_default_counters(struct 
mlx4_dev *dev)
                 } else if (err == -ENOENT) {
                         err = 0;
                         continue;
+               } else if (mlx4_is_slave(dev) && err == -EINVAL) {
+                       priv->def_counter[port] = 
MLX4_SINK_COUNTER_INDEX(dev);
+                       mlx4_warn(dev, "can't allocate counter from old 
PF driver, using index %d\n",
+ MLX4_SINK_COUNTER_INDEX(dev));
                 } else {
                         mlx4_err(dev, "%s: failed to allocate default 
counter port %d err %d\n",
                                  __func__, port + 1, err);