* Re: NULL pointer dereference at skb_queue_tail()
From: Tetsuo Handa @ 2015-01-05 12:50 UTC (permalink / raw)
To: netdev
In-Reply-To: <201412252222.HIF57826.OQFSVFFOMHLOJt@I-love.SAKURA.ne.jp>
Tetsuo Handa wrote:
> I can reproduce below oops when testing Linux 3.18 with memory allocation
> failure injection module at https://lkml.org/lkml/2014/12/25/64 .
I can reliably reproduce this oops with current linux.git using memory
allocation failure injection module. There is a possibility of memory
corruption since this oops always occurs immediately after memory
allocation failure within GPU/DRM code. I want to check whether
fields of structures have expected values or not.
> void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk)
> {
> unsigned long flags;
>
Could you tell me what are expected values (i.e. what BUG_ON() test
should I try) at this location?
> spin_lock_irqsave(&list->lock, flags);
> __skb_queue_tail(list, newsk);
> spin_unlock_irqrestore(&list->lock, flags);
> }
>
> static inline void __skb_queue_tail(struct sk_buff_head *list,
> struct sk_buff *newsk)
> {
> __skb_queue_before(list, (struct sk_buff *)list, newsk);
> }
>
> static inline void __skb_queue_before(struct sk_buff_head *list,
> struct sk_buff *next,
> struct sk_buff *newsk)
> {
> __skb_insert(newsk, next->prev, next, list);
> }
>
> static inline void __skb_insert(struct sk_buff *newsk,
> struct sk_buff *prev, struct sk_buff *next,
> struct sk_buff_head *list)
> {
> newsk->next = next;
> newsk->prev = prev;
> next->prev = prev->next = newsk; // <= ffffffff81535e27 is here.
> list->qlen++;
> }
>
^ permalink raw reply
* Re: [PATCH net-next v3] net: Do not call ndo_dflt_fdb_dump if ndo_fdb_dump is defined
From: Hubert Sokolowski @ 2015-01-05 12:57 UTC (permalink / raw)
To: David Miller; +Cc: netdev, ray.kinsella
In-Reply-To: <20141220.150554.88974537269596572.davem@davemloft.net>
On 20/12/14 20:05, David Miller wrote:
> From: Hubert Sokolowski <hubert.sokolowski@intel.com>
> Date: Fri, 19 Dec 2014 12:14:01 +0000
>
>> At the same time it is desirable to call the default dump
>> function on a bridge device.
> Device specific things do not belong in generic code.
>
> If the bridging device wants specific behavior wrt. this
> callback, it can implement the callback as needed.
Will fix it and resend the patch as v4.
Thanks,
Hubert
--
Hubert Sokolowski Intel Corporation
^ permalink raw reply
* Re: [PATCH net-next RESEND] net: Do not call ndo_dflt_fdb_dump if ndo_fdb_dump is defined.
From: Hubert Sokolowski @ 2015-01-05 12:56 UTC (permalink / raw)
To: Roopa Prabhu; +Cc: Jamal Hadi Salim, vyasevic, John Fastabend, netdev
In-Reply-To: <5494532D.4040203@cumulusnetworks.com>
On 19/12/14 16:32, Roopa Prabhu wrote:
> On 12/19/14, 7:17 AM, Hubert Sokolowski wrote:
>> On 18/12/14 22:32, Jamal Hadi Salim wrote:
>>
>>> Sorry for the latency (head-buried-in-sand in effect)
>>> On 12/17/14 11:18, Hubert Sokolowski wrote:
>>>> I have just prepared a patch where I dump uc/mc for bridge devices
>>>> by looking at (dev->priv_flags & IFF_EBRIDGE), so I have same results
>>>> as without my changes. This should satisfy Jamal and Roopa.
>>>> I could send it as v3 of my patch along with the results if you are
>>>> interested.
>>> Please do. If you satisfy Vlad's goals then we are all happy.
>> Posted as v3, please review.
>> There is still open question I asked sometime ago but never got explained.
>> It is about the new filter_dev parameter that was added to ndo_fdb_dump:
>> int (*ndo_fdb_dump)(struct sk_buff *skb,
>> struct netlink_callback *cb,
>> struct net_device *dev,
>> struct net_device *filter_dev,
>> int idx);
>>
>> When we call this function for a device, dev pointer is passed as the filter_dev:
>> if (dev->netdev_ops->ndo_fdb_dump)
>> idx = dev->netdev_ops->ndo_fdb_dump(skb, cb, bdev, dev,
>> idx);
> seems like these calls should be fixed. bdev is really dev in this case. And filter_dev should be null.
>
Will fix this too and resend the patch as v4.
Thanks,
Hubert
--
Hubert Sokolowski Intel Corporation
^ permalink raw reply
* Re: [PATCH net-next v2] rhashtable: involve rhashtable_lookup_insert routine
From: Thomas Graf @ 2015-01-05 13:05 UTC (permalink / raw)
To: Ying Xue; +Cc: davem, netdev
In-Reply-To: <1420457634-13017-1-git-send-email-ying.xue@windriver.com>
On 01/05/15 at 07:33pm, Ying Xue wrote:
> Involve a new function called rhashtable_lookup_insert() which makes
> lookup and insertion atomic under bucket lock protection, helping us
> avoid to introduce an extra lock when we search and insert an object
> into hash table.
>
> Signed-off-by: Ying Xue <ying.xue@windriver.com>
> Signed-off-by: Thomas Graf <tgraf@suug.ch>
Thanks for putting this around so quickly and thanks for testing.
I think this looks good. You might be able to factor out some code
from rhashtable_insert() to avoid duplication so we reduce the risk
of fixing a bug for one function but not the other.
I see some further optimization potential when we need to calculate
the hash for both the old and new table. We can introduce a new
function which provides both based on a single hash iteration.
However, we should do that in a separate patch.
^ permalink raw reply
* RE: [PATCH net-next 1/7] timecounter: provide a macro to initialize the cyclecounter mask field.
From: David Laight @ 2015-01-05 13:20 UTC (permalink / raw)
To: 'Richard Cochran', netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, David Miller, Jeff Kirsher,
John Stultz, Thomas Gleixner
In-Reply-To: <1f1bee3e2aa0cc530d006d99a621992a1497a442.1420108214.git.richardcochran@gmail.com>
> There is no need for users of the timecounter/cyclecounter code to include
> clocksource.h just for a single macro.
>
> Signed-off-by: Richard Cochran <richardcochran@gmail.com>
> ---
> include/linux/timecounter.h | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/timecounter.h b/include/linux/timecounter.h
> index 74f4549..4382035 100644
> --- a/include/linux/timecounter.h
> +++ b/include/linux/timecounter.h
> @@ -19,6 +19,9 @@
>
> #include <linux/types.h>
>
> +/* simplify initialization of mask field */
> +#define CYCLECOUNTER_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1)
That has me chasing through the C integer promotion rules.
Better might be:
((bits) < 64 ? (1ULL << (bits)) - 1 : (((1ULL << 63) - 1) << 1) + 1)
I actually suspect there is a standard definition somewhere?
David
^ permalink raw reply
* Re: [PATCH net-next 1/7] timecounter: provide a macro to initialize the cyclecounter mask field.
From: Richard Cochran @ 2015-01-05 13:43 UTC (permalink / raw)
To: David Laight
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
David Miller, Jeff Kirsher, John Stultz, Thomas Gleixner
In-Reply-To: <063D6719AE5E284EB5DD2968C1650D6D1CAC09D7@AcuExch.aculab.com>
On Mon, Jan 05, 2015 at 01:20:57PM +0000, David Laight wrote:
> > +/* simplify initialization of mask field */
> > +#define CYCLECOUNTER_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1)
>
> That has me chasing through the C integer promotion rules.
> Better might be:
> ((bits) < 64 ? (1ULL << (bits)) - 1 : (((1ULL << 63) - 1) << 1) + 1)
> I actually suspect there is a standard definition somewhere?
This is an exact copy of CLOCKSOURCE_MASK, and if wrong, then both are
wrong. In any case, I can't see any issue here. Is not
(some_int_type) -1
always equal to
0xf...(width of type)
for all integer types, when using 2s compliment?
Thanks
Richard
^ permalink raw reply
* [RFC PATCH] unlock rtnl mutex in ic_open_devs while waiting
From: Maarten Lankhorst @ 2015-01-05 13:52 UTC (permalink / raw)
To: David Miller, Alexey Kuznetsov, James Morris, Hideaki YOSHIFUJI,
Patrick McHardy
Cc: netdev, LKML
This fixes a deadlock with alx_link_check, which takes the rtnl_mutex in
a work item to check the link.
I have no idea whether alx should be fixed or ipconfig.c,
but this saves 120 seconds off my boot time. ;-)
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c
index 7fa18bc7e47f..c8aa15a0cdf4 100644
--- a/net/ipv4/ipconfig.c
+++ b/net/ipv4/ipconfig.c
@@ -270,7 +270,9 @@ static int __init ic_open_devs(void)
if (ic_is_init_dev(dev) && netif_carrier_ok(dev))
goto have_carrier;
+ rtnl_unlock();
msleep(1);
+ rtnl_lock();
if (time_before(jiffies, next_msg))
continue;
^ permalink raw reply related
* RE: [PATCH net-next 1/7] timecounter: provide a macro to initialize the cyclecounter mask field.
From: David Laight @ 2015-01-05 13:53 UTC (permalink / raw)
To: 'Richard Cochran'
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
David Miller, Jeff Kirsher, John Stultz, Thomas Gleixner
In-Reply-To: <20150105134327.GA8156@localhost.localdomain>
> On Mon, Jan 05, 2015 at 01:20:57PM +0000, David Laight wrote:
> > > +/* simplify initialization of mask field */
> > > +#define CYCLECOUNTER_MASK(bits) (cycle_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1)
> >
> > That has me chasing through the C integer promotion rules.
> > Better might be:
> > ((bits) < 64 ? (1ULL << (bits)) - 1 : (((1ULL << 63) - 1) << 1) + 1)
> > I actually suspect there is a standard definition somewhere?
>
> This is an exact copy of CLOCKSOURCE_MASK, and if wrong, then both are
> wrong. In any case, I can't see any issue here. Is not
>
> (some_int_type) -1
>
> always equal to
>
> 0xf...(width of type)
>
> for all integer types, when using 2s compliment?
As I said, it leaves me chasing through the promotion rules (which I
probably know if I actually think hard enough).
Thinking... ~0ULL would be nice and simple and correct.
David
^ permalink raw reply
* [PATCH net-next v3 0/5]: ixgbevf: Allow querying VFs RSS indirection table and key
From: Vlad Zolotarov @ 2015-01-05 14:15 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
Add the ethtool ops to VF driver to allow querying the RSS indirection table
and RSS Random Key.
- PF driver: Add new VF-PF channel commands.
- VF driver: Utilize these new commands and add the corresponding
ethtool callbacks.
New in v3:
- Added a missing support for x550 devices.
- Mask the indirection table values according to PSRTYPE[n].RQPL.
- Minimized the number of added VF-PF commands.
New in v2:
- Added a detailed description to patches 4 and 5.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case.
More specifically: in cases where the newly added API version is the only one
allowed. We may consider using a "switch-case" back again when the list of
allowed API versions in these specific places grows up.
Vlad Zolotarov (5):
ixgbe: Add a RETA query command to VF-PF channel API
ixgbevf: Add a RETA query code
ixgbe: Add GET_RSS_KEY command to VF-PF channel commands set
ixgbevf: Add RSS Key query code
ixgbevf: Add the appropriate ethtool ops to query RSS indirection
table and key
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 10 ++
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 91 +++++++++++++++
drivers/net/ethernet/intel/ixgbevf/ethtool.c | 43 +++++++
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 4 +-
drivers/net/ethernet/intel/ixgbevf/mbx.h | 10 ++
drivers/net/ethernet/intel/ixgbevf/vf.c | 132 ++++++++++++++++++++++
drivers/net/ethernet/intel/ixgbevf/vf.h | 2 +
7 files changed, 291 insertions(+), 1 deletion(-)
--
2.1.0
^ permalink raw reply
* [PATCH net-next v3 1/5] ixgbe: Add a RETA query command to VF-PF channel API
From: Vlad Zolotarov @ 2015-01-05 14:15 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420467311-6680-1-git-send-email-vladz@cloudius-systems.com>
82599 and x540 VFs and PF share the same RSS redirection table (RETA). Therefore we
just return it for all VFs. x550 on the other hand provides a separate redirection
table for each VF (there is a per-pool RETA table).
For 82599 and x540 RETA table is an array of 32 registers (128 bytes) and the maximum number of
registers that may be delivered in a single VF-PF channel command is 15. Therefore
we will deliver the whole table in 3 steps: 12, 12 and 8 registers in each
step correspondingly.
For x550 VFs RETA is a 64 byte array, so we may deliver it in two steps: 12 and 4 registers
correspondingly.
Thus this patch does the following:
- Adds a new API version (to specify a new commands set).
- Adds the IXGBE_VF_GET_RETA command to the VF-PF commands set.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v3:
- Pass the number of dwords and offset in RETA in the IXGBE_VF_GET_RETA request message.
This allows to reduce the added command set to a single command.
- Added a support for all devices supported by the ixgbe driver that have
SR-IOV functions support: 82599, x540 and x550. The original code supported
only 82599 and x540.
- Added the masking of the RETA entries according to the PSRTYPE[n].RQPL
value.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case
(in ixgbe_get_vf_reta()).
---
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 8 ++++
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 65 ++++++++++++++++++++++++++
2 files changed, 73 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
index a5cb755..f9b5eae 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
@@ -73,6 +73,7 @@ enum ixgbe_pfvf_api_rev {
ixgbe_mbox_api_10, /* API version 1.0, linux/freebsd VF driver */
ixgbe_mbox_api_20, /* API version 2.0, solaris Phase1 VF driver */
ixgbe_mbox_api_11, /* API version 1.1, linux/freebsd VF driver */
+ ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */
/* This value should always be last */
ixgbe_mbox_api_unknown, /* indicates that API version is not known */
};
@@ -97,6 +98,13 @@ enum ixgbe_pfvf_api_rev {
#define IXGBE_VF_TRANS_VLAN 3 /* Indication of port vlan */
#define IXGBE_VF_DEF_QUEUE 4 /* Default queue offset */
+/* mailbox API, version 1.2 VF requests */
+#define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */
+
+/* GET_RETA request data indices within the mailbox */
+#define IXGBE_VF_RETA_SZ 1 /* Number of RETA DWs to bring */
+#define IXGBE_VF_RETA_OFFSET 2 /* Offset in RETA */
+
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
/* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index c76ba90..d4f095d 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -427,6 +427,7 @@ static s32 ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
#endif /* CONFIG_FCOE */
switch (adapter->vfinfo[vf].vf_api) {
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
/*
* Version 1.1 supports jumbo frames on VFs if PF has
* jumbo frames enabled which means legacy VFs are
@@ -894,6 +895,7 @@ static int ixgbe_negotiate_vf_api(struct ixgbe_adapter *adapter,
switch (api) {
case ixgbe_mbox_api_10:
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
adapter->vfinfo[vf].vf_api = api;
return 0;
default:
@@ -917,6 +919,7 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter,
switch (adapter->vfinfo[vf].vf_api) {
case ixgbe_mbox_api_20:
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
break;
default:
return -1;
@@ -944,6 +947,65 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter,
return 0;
}
+static int ixgbe_get_vf_reta(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ int i, j;
+ u32 *reta = &msgbuf[1];
+ u32 mask = 0;
+ u32 psrtype;
+ u32 reta_offset_dw = msgbuf[IXGBE_VF_RETA_OFFSET];
+ u32 dwords = msgbuf[IXGBE_VF_RETA_SZ];
+
+ /* verify the PF is supporting the correct API */
+ if (adapter->vfinfo[vf].vf_api != ixgbe_mbox_api_12)
+ return -EPERM;
+
+ psrtype = IXGBE_READ_REG(hw, IXGBE_PSRTYPE(vf));
+
+ /* The redirection table is composed as follows:
+ * 82598: 128 (8 bit wide) entries containing pair of 4 bit RSS indices
+ * 82599/X540: 128 (8 bit wide) entries containing 4 bit RSS index X550:
+ * 512 (8 bit wide) entries containing 6 bit RSS index
+ *
+ * PSRTYPE[n].RQPL defines if 0, 1 or 2 bits from the redirection table
+ * value should be used.
+ */
+
+ if ((psrtype & (1 << 29)) == (1 << 29))
+ mask = 0x01010101;
+ else if ((psrtype & (2 << 29)) == (2 << 29))
+ mask = 0x03030303;
+ else
+ mask = 0;
+
+ switch (hw->mac.type) {
+ case ixgbe_mac_82599EB:
+ case ixgbe_mac_X540:
+ /* Read the appropriate portion of RETA */
+ for (i = 0; i < dwords; i++)
+ reta[i] = IXGBE_READ_REG(hw,
+ IXGBE_RETA(i + reta_offset_dw));
+ break;
+ case ixgbe_mac_X550:
+ case ixgbe_mac_X550EM_x:
+ /* X550 has a per-VF RETA */
+ for (i = 0, j = reta_offset_dw; i < dwords; i++, j++)
+ reta[i] = IXGBE_READ_REG(hw,
+ IXGBE_PFVFRETA(j, vf));
+ break;
+ default:
+ return -1;
+
+ }
+
+ /* Mask the relevant bits */
+ for (i = 0; i < dwords; i++)
+ reta[i] &= mask;
+
+ return 0;
+}
+
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
{
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
@@ -1000,6 +1062,9 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
case IXGBE_VF_GET_QUEUES:
retval = ixgbe_get_vf_queues(adapter, msgbuf, vf);
break;
+ case IXGBE_VF_GET_RETA:
+ retval = ixgbe_get_vf_reta(adapter, msgbuf, vf);
+ break;
default:
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
retval = IXGBE_ERR_MBX;
--
2.1.0
^ permalink raw reply related
* [PATCH net-next v3 2/5] ixgbevf: Add a RETA query code
From: Vlad Zolotarov @ 2015-01-05 14:15 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420467311-6680-1-git-send-email-vladz@cloudius-systems.com>
- Added a new API version support.
- Added the query implementation in the ixgbevf.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v3:
- Adjusted to the new interface IXGBE_VF_GET_RETA command.
- Added a proper support for x550 devices.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case
(in ixgbevf_get_reta()).
---
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 4 +-
drivers/net/ethernet/intel/ixgbevf/mbx.h | 8 +++
drivers/net/ethernet/intel/ixgbevf/vf.c | 88 +++++++++++++++++++++++
drivers/net/ethernet/intel/ixgbevf/vf.h | 1 +
4 files changed, 100 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 62a0d8e..ba6ab61 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -1880,7 +1880,8 @@ static void ixgbevf_init_last_counter_stats(struct ixgbevf_adapter *adapter)
static void ixgbevf_negotiate_api(struct ixgbevf_adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- int api[] = { ixgbe_mbox_api_11,
+ int api[] = { ixgbe_mbox_api_12,
+ ixgbe_mbox_api_11,
ixgbe_mbox_api_10,
ixgbe_mbox_api_unknown };
int err = 0, idx = 0;
@@ -3525,6 +3526,7 @@ static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu)
switch (adapter->hw.api_version) {
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE;
break;
default:
diff --git a/drivers/net/ethernet/intel/ixgbevf/mbx.h b/drivers/net/ethernet/intel/ixgbevf/mbx.h
index 0bc3005..951a506 100644
--- a/drivers/net/ethernet/intel/ixgbevf/mbx.h
+++ b/drivers/net/ethernet/intel/ixgbevf/mbx.h
@@ -86,6 +86,7 @@ enum ixgbe_pfvf_api_rev {
ixgbe_mbox_api_10, /* API version 1.0, linux/freebsd VF driver */
ixgbe_mbox_api_20, /* API version 2.0, solaris Phase1 VF driver */
ixgbe_mbox_api_11, /* API version 1.1, linux/freebsd VF driver */
+ ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */
/* This value should always be last */
ixgbe_mbox_api_unknown, /* indicates that API version is not known */
};
@@ -110,6 +111,13 @@ enum ixgbe_pfvf_api_rev {
#define IXGBE_VF_TRANS_VLAN 3 /* Indication of port vlan */
#define IXGBE_VF_DEF_QUEUE 4 /* Default queue offset */
+/* mailbox API, version 1.2 VF requests */
+#define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */
+
+/* GET_RETA request data indices within the mailbox */
+#define IXGBE_VF_RETA_SZ 1 /* Number of RETA DWs to bring */
+#define IXGBE_VF_RETA_OFFSET 2 /* Offset in RETA */
+
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
/* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c
index cdb53be..cb5a4cf 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.c
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.c
@@ -258,6 +258,93 @@ static s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr)
return ret_val;
}
+static inline int _ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *msgbuf,
+ u32 *reta, u32 reta_offset_dw, u32 dwords)
+{
+ int err;
+
+ msgbuf[0] = IXGBE_VF_GET_RETA;
+ msgbuf[IXGBE_VF_RETA_SZ] = dwords;
+ msgbuf[IXGBE_VF_RETA_OFFSET] = reta_offset_dw;
+
+ err = hw->mbx.ops.write_posted(hw, msgbuf, 3);
+
+ if (err)
+ return err;
+
+ err = hw->mbx.ops.read_posted(hw, msgbuf, 1 + dwords);
+
+ if (err)
+ return err;
+
+ msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
+
+ /* If we didn't get an ACK there must have been
+ * some sort of mailbox error so we should treat it
+ * as such.
+ */
+ if (msgbuf[0] != (IXGBE_VF_GET_RETA | IXGBE_VT_MSGTYPE_ACK))
+ return IXGBE_ERR_MBX;
+
+ memcpy(reta + reta_offset_dw, msgbuf + 1, 4 * dwords);
+
+ return 0;
+}
+
+/**
+ * ixgbevf_get_reta - get the RSS redirection table (RETA) contents.
+ * @hw: pointer to the HW structure
+ * @reta: buffer to fill with RETA contents.
+ *
+ * The "reta" buffer should be big enough to contain 32 registers.
+ *
+ * Returns: 0 on success.
+ * if API doesn't support this operation - (-EPERM).
+ */
+int ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *reta)
+{
+ int err;
+ u32 msgbuf[IXGBE_VFMAILBOX_SIZE];
+
+ /* Return an error if API doesn't RETA querying. */
+ if (hw->api_version != ixgbe_mbox_api_12)
+ return -EPERM;
+
+ /* x550 devices have a separate RETA for each VF: 64 bytes each.
+ *
+ * We'll get it in 2 steps due to mailbox size limitation - we can bring
+ * up to 15 dwords every time. Therefore we'll bring 12 and 4 dwords.
+ *
+ * Older devices share a RETA table with the PF: 128 bytes.
+ *
+ * For them we do it in 3 steps. Therefore we'll bring it in 3 steps:
+ * 12, 12 and 8 dwords in each step correspondingly.
+ */
+
+ /* RETA[0..11] */
+ err = _ixgbevf_get_reta(hw, msgbuf, reta, 0, 12);
+ if (err)
+ return err;
+
+ if (hw->mac.type >= ixgbe_mac_X550_vf) {
+ /* RETA[12..15] */
+ err = _ixgbevf_get_reta(hw, msgbuf, reta, 12, 4);
+ if (err)
+ return err;
+
+ } else {
+ /* RETA[12..23] */
+ err = _ixgbevf_get_reta(hw, msgbuf, reta, 12, 12);
+ if (err)
+ return err;
+
+ /* RETA[24..31] */
+ err = _ixgbevf_get_reta(hw, msgbuf, reta, 24, 8);
+ }
+
+ return err;
+}
+
/**
* ixgbevf_set_rar_vf - set device MAC address
* @hw: pointer to hardware structure
@@ -545,6 +632,7 @@ int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
/* do nothing if API doesn't support ixgbevf_get_queues */
switch (hw->api_version) {
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
break;
default:
return 0;
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.h b/drivers/net/ethernet/intel/ixgbevf/vf.h
index 5b17242..73c1b33 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.h
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.h
@@ -208,5 +208,6 @@ void ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size);
int ixgbevf_negotiate_api_version(struct ixgbe_hw *hw, int api);
int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
unsigned int *default_tc);
+int ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *reta);
#endif /* __IXGBE_VF_H__ */
--
2.1.0
^ permalink raw reply related
* [PATCH net-next v3 3/5] ixgbe: Add GET_RSS_KEY command to VF-PF channel commands set
From: Vlad Zolotarov @ 2015-01-05 14:15 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420467311-6680-1-git-send-email-vladz@cloudius-systems.com>
For 82599 and x540 VFs and PF share the same RSS Key. Therefore we will return
the same RSS key for all VFs.
x550 on the other hand has a separate RSS Key for every pool.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v3:
- Added a support for x550 devices.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case
(in ixgbe_get_vf_rss_key()).
---
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 2 ++
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 26 ++++++++++++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
index f9b5eae..3f14373 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
@@ -105,6 +105,8 @@ enum ixgbe_pfvf_api_rev {
#define IXGBE_VF_RETA_SZ 1 /* Number of RETA DWs to bring */
#define IXGBE_VF_RETA_OFFSET 2 /* Offset in RETA */
+#define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS key */
+
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
/* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index d4f095d..9a6a112 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -1006,6 +1006,29 @@ static int ixgbe_get_vf_reta(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
return 0;
}
+static int ixgbe_get_vf_rss_key(struct ixgbe_adapter *adapter,
+ u32 *msgbuf, u32 vf)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ int i;
+ u32 *rss_key = &msgbuf[1];
+
+ /* verify the PF is supporting the correct API */
+ if (adapter->vfinfo[vf].vf_api != ixgbe_mbox_api_12)
+ return -EPERM;
+
+ /* Read the RSS KEY */
+ if (hw->mac.type >= ixgbe_mac_X550) {
+ for (i = 0; i < 10; i++)
+ rss_key[i] = IXGBE_READ_REG(hw,
+ IXGBE_PFVFRSSRK(i, vf));
+ } else
+ for (i = 0; i < 10; i++)
+ rss_key[i] = IXGBE_READ_REG(hw, IXGBE_RSSRK(i));
+
+ return 0;
+}
+
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
{
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
@@ -1065,6 +1088,9 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
case IXGBE_VF_GET_RETA:
retval = ixgbe_get_vf_reta(adapter, msgbuf, vf);
break;
+ case IXGBE_VF_GET_RSS_KEY:
+ retval = ixgbe_get_vf_rss_key(adapter, msgbuf, vf);
+ break;
default:
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
retval = IXGBE_ERR_MBX;
--
2.1.0
^ permalink raw reply related
* [PATCH net-next v3 4/5] ixgbevf: Add RSS Key query code
From: Vlad Zolotarov @ 2015-01-05 14:15 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420467311-6680-1-git-send-email-vladz@cloudius-systems.com>
Add the ixgbevf_get_rss_key() function that queries the PF for an RSS Random Key
using a new VF-PF channel IXGBE_VF_GET_RSS_KEY command.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v2:
- Added a more detailed patch description.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case
(in ixgbevf_get_rss_key()).
---
drivers/net/ethernet/intel/ixgbevf/mbx.h | 2 ++
drivers/net/ethernet/intel/ixgbevf/vf.c | 44 ++++++++++++++++++++++++++++++++
drivers/net/ethernet/intel/ixgbevf/vf.h | 1 +
3 files changed, 47 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbevf/mbx.h b/drivers/net/ethernet/intel/ixgbevf/mbx.h
index 951a506..f79432e 100644
--- a/drivers/net/ethernet/intel/ixgbevf/mbx.h
+++ b/drivers/net/ethernet/intel/ixgbevf/mbx.h
@@ -118,6 +118,8 @@ enum ixgbe_pfvf_api_rev {
#define IXGBE_VF_RETA_SZ 1 /* Number of RETA DWs to bring */
#define IXGBE_VF_RETA_OFFSET 2 /* Offset in RETA */
+#define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS hash key */
+
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
/* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c
index cb5a4cf..f42a67d 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.c
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.c
@@ -292,6 +292,50 @@ static inline int _ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *msgbuf,
}
/**
+ * ixgbevf_get_rss_key - get the RSS Random Key
+ * @hw: pointer to the HW structure
+ * @reta: buffer to fill with RETA contents.
+ *
+ * The "rss_key" buffer should be big enough to contain 10 registers.
+ *
+ * Returns: 0 on success.
+ * if API doesn't support this operation - (-EPERM).
+ */
+int ixgbevf_get_rss_key(struct ixgbe_hw *hw, u8 *rss_key)
+{
+ int err;
+ u32 msgbuf[IXGBE_VFMAILBOX_SIZE];
+
+ /* Return and error if API doesn't support RSS Random Key retrieval */
+ if (hw->api_version != ixgbe_mbox_api_12)
+ return -EPERM;
+
+ msgbuf[0] = IXGBE_VF_GET_RSS_KEY;
+ err = hw->mbx.ops.write_posted(hw, msgbuf, 1);
+
+ if (err)
+ return err;
+
+ err = hw->mbx.ops.read_posted(hw, msgbuf, 11);
+
+ if (err)
+ return err;
+
+ msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
+
+ /* If we didn't get an ACK there must have been
+ * some sort of mailbox error so we should treat it
+ * as such.
+ */
+ if (msgbuf[0] != (IXGBE_VF_GET_RSS_KEY | IXGBE_VT_MSGTYPE_ACK))
+ return IXGBE_ERR_MBX;
+
+ memcpy(rss_key, msgbuf + 1, 40);
+
+ return 0;
+}
+
+/**
* ixgbevf_get_reta - get the RSS redirection table (RETA) contents.
* @hw: pointer to the HW structure
* @reta: buffer to fill with RETA contents.
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.h b/drivers/net/ethernet/intel/ixgbevf/vf.h
index 73c1b33..54f53f2b8 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.h
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.h
@@ -209,5 +209,6 @@ int ixgbevf_negotiate_api_version(struct ixgbe_hw *hw, int api);
int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
unsigned int *default_tc);
int ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *reta);
+int ixgbevf_get_rss_key(struct ixgbe_hw *hw, u8 *rss_key);
#endif /* __IXGBE_VF_H__ */
--
2.1.0
^ permalink raw reply related
* [PATCH net-next v3 5/5] ixgbevf: Add the appropriate ethtool ops to query RSS indirection table and key
From: Vlad Zolotarov @ 2015-01-05 14:15 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420467311-6680-1-git-send-email-vladz@cloudius-systems.com>
Added get_rxfh_indir_size, get_rxfh_key_size and get_rxfh ethtool_ops callbacks
implementations.
This enables the ethtool's "-x" and "-n rx-flow-hash" options for 82599 VF devices.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v3:
- Added a proper support for x550 devices: return the correct redirection table size.
New in v2:
- Added a detailed description to the patch.
---
drivers/net/ethernet/intel/ixgbevf/ethtool.c | 43 ++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ethtool.c b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
index cc0e5b7..eba8c0f 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
@@ -792,6 +792,46 @@ static int ixgbevf_set_coalesce(struct net_device *netdev,
return 0;
}
+static u32 ixgbevf_get_rxfh_indir_size(struct net_device *netdev)
+{
+ struct ixgbevf_adapter *adapter = netdev_priv(netdev);
+
+ if (adapter->hw.mac.type >= ixgbe_mac_X550_vf) {
+ return 64;
+ } else {
+ return 128;
+ }
+}
+
+static u32 ixgbevf_get_rxfh_key_size(struct net_device *netdev)
+{
+ return 40;
+}
+
+static int ixgbevf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
+ u8 *hfunc)
+{
+ struct ixgbevf_adapter *adapter = netdev_priv(netdev);
+ int err;
+
+ if (hfunc)
+ *hfunc = ETH_RSS_HASH_TOP;
+
+ if (indir) {
+ err = ixgbevf_get_reta(&adapter->hw, indir);
+ if (err)
+ return err;
+ }
+
+ if (key) {
+ err = ixgbevf_get_rss_key(&adapter->hw, key);
+ if (err)
+ return err;
+ }
+
+ return 0;
+}
+
static const struct ethtool_ops ixgbevf_ethtool_ops = {
.get_settings = ixgbevf_get_settings,
.get_drvinfo = ixgbevf_get_drvinfo,
@@ -809,6 +849,9 @@ static const struct ethtool_ops ixgbevf_ethtool_ops = {
.get_ethtool_stats = ixgbevf_get_ethtool_stats,
.get_coalesce = ixgbevf_get_coalesce,
.set_coalesce = ixgbevf_set_coalesce,
+ .get_rxfh_indir_size = ixgbevf_get_rxfh_indir_size,
+ .get_rxfh_key_size = ixgbevf_get_rxfh_key_size,
+ .get_rxfh = ixgbevf_get_rxfh,
};
void ixgbevf_set_ethtool_ops(struct net_device *netdev)
--
2.1.0
^ permalink raw reply related
* Re: [RFC PATCH net-next 00/11] net: remove disable_irq() from ->ndo_poll_controller
From: Sabrina Dubroca @ 2015-01-05 14:31 UTC (permalink / raw)
To: Thomas Gleixner; +Cc: David Miller, netdev, peterz
In-Reply-To: <alpine.DEB.2.11.1412122242180.16494@nanos>
2014-12-12, 23:01:28 +0100, Thomas Gleixner wrote:
> On Thu, 11 Dec 2014, Sabrina Dubroca wrote:
> > 2014-12-09, 21:44:33 -0500, David Miller wrote:
> > >
> > > Adding a new spinlock to every interrupt service routine is
> > > simply a non-starter.
> > >
> > > You will certainly have to find a way to fix this in a way
> > > that doesn't involve adding any new overhead to the normal
> > > operational paths of these drivers.
> >
> > Okay. Here is another idea.
> >
> > Since the issue is with the wait_event() part of synchronize_irq(),
> > and it only takes care of threaded handlers, maybe we could try not
> > waiting for threaded handlers.
> >
> > Introduce disable_irq_nosleep() that returns true if it successfully
> > synchronized against all handlers (there was no threaded handler
> > running), false if it left some threads running. And in
> > ->ndo_poll_controller, only call the interrupt handler if
> > synchronization was successful.
> >
> > Both users of the poll controllers retry their action (alloc/xmit an
> > skb) several times, with calls to the device's poll controller between
> > attempts. And hopefully, if the first attempt fails, we will still
> > manage to get through?
>
> Hopefully is not a good starting point. Is the poll controller
> definitely retrying? Otherwise you might end up with the following:
>
> Interrupt line is shared between your network device and a
> device which requested a threaded interrupt handler.
>
> CPU0 CPU1
> interrupt()
> your_device_handler()
> return NONE;
> shared_device_handler()
> return WAKE_THREAD;
> --> atomic_inc(threads_active);
> poll()
> disable_irq_nosleep()
> sync_hardirq()
> return atomic_read(threads_active);
>
> So if you do not have a reliable retry then you might just go into a
> stale state. And this can happen if the interrupt type is edge because
> we do not disable the interrupt when we wakeup the thread for obvious
> reasons.
We do have loops retrying to run the netpoll controller, and trying to
do the work even if the controller doesn't help. And by hopefully I
mean: even if we fail, we tried our best and netpoll isn't 100%
reliable.
static struct sk_buff *find_skb(struct netpoll *np, int len, int reserve)
{
...
repeat:
skb = alloc_skb(len, GFP_ATOMIC);
if (!skb)
skb = skb_dequeue(&skb_pool);
if (!skb) {
if (++count < 10) {
netpoll_poll_dev(np->dev);
goto repeat;
}
return NULL;
}
...
}
void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb,
struct net_device *dev)
{
...
/* try until next clock tick */
for (tries = jiffies_to_usecs(1)/USEC_PER_POLL;
tries > 0; --tries) {
if (HARD_TX_TRYLOCK(dev, txq)) {
if (!netif_xmit_stopped(txq))
status = netpoll_start_xmit(skb, dev, txq);
HARD_TX_UNLOCK(dev, txq);
if (status == NETDEV_TX_OK)
break;
}
/* tickle device maybe there is some cleanup */
netpoll_poll_dev(np->dev);
udelay(USEC_PER_POLL);
}
...
}
> Aside of that I think that something like this is a reasonable
> approach to the problem.
>
> The only other nitpicks I have are:
>
> - The name of the function sucks, though my tired braain can't
> come up with something reasonable right now
I couldn't think of anything better. Maybe 'disable_irq_trysync' or
'disable_irq_hardsync'?
Or maybe you prefer something that works like spin_trylock, and
reenables the irq before returning if we can't sync? Maybe the risk
of abuse would be a bit lower this way?
I made synchronize_irq_nosleep static, but maybe it should be
EXPORT_SYMBOL'ed as well. I didn't need that for e1000, but that
would be more consistent.
> - The lack of extensive documentation how this interface is
> supposed to be used and the pitfals of abusage, both in the
> function documentation and the changelog.
>
> Merlily copying the existing documentation of the other
> interface is not sufficient.
Yes, my email wasn't really a changelog, just a description and RFC.
Modified documentation:
-----
disable_irq_nosleep - disable an irq and wait for completion of hard IRQ handlers
@irq: Interrupt to disable
Disable the selected interrupt line. Enables and Disables are
nested.
This function does not sleep, and is safe to call in atomic context.
This function waits for any pending hard IRQ handlers for this
interrupt to complete before returning. If you use this
function while holding a resource the IRQ handler may need you
will deadlock.
This function does not wait for threaded IRQ handlers.
Returns true if synchronized, false if there are threaded
handlers pending.
If false is returned, the caller must assume that synchronization
didn't occur, and that it is NOT safe to proceed.
The caller MUST reenable the interrupt by calling enable_irq in all
cases.
This function may be called - with care - from IRQ context.
-----
Thanks.
--
Sabrina
^ permalink raw reply
* [PATCH net-next v4 0/5]: ixgbevf: Allow querying VFs RSS indirection table and key
From: Vlad Zolotarov @ 2015-01-05 14:46 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
Add the ethtool ops to VF driver to allow querying the RSS indirection table
and RSS Random Key.
- PF driver: Add new VF-PF channel commands.
- VF driver: Utilize these new commands and add the corresponding
ethtool callbacks.
New in v4:
- Forgot to run checkpatch on v3 and there were a few styling things to fix. ;)
New in v3:
- Added a missing support for x550 devices.
- Mask the indirection table values according to PSRTYPE[n].RQPL.
- Minimized the number of added VF-PF commands.
New in v2:
- Added a detailed description to patches 4 and 5.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case.
More specifically: in cases where the newly added API version is the only one
allowed. We may consider using a "switch-case" back again when the list of
allowed API versions in these specific places grows up.
Vlad Zolotarov (5):
ixgbe: Add a RETA query command to VF-PF channel API
ixgbevf: Add a RETA query code
ixgbe: Add GET_RSS_KEY command to VF-PF channel commands set
ixgbevf: Add RSS Key query code
ixgbevf: Add the appropriate ethtool ops to query RSS indirection
table and key
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 10 ++
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 90 +++++++++++++++
drivers/net/ethernet/intel/ixgbevf/ethtool.c | 42 +++++++
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 4 +-
drivers/net/ethernet/intel/ixgbevf/mbx.h | 10 ++
drivers/net/ethernet/intel/ixgbevf/vf.c | 132 ++++++++++++++++++++++
drivers/net/ethernet/intel/ixgbevf/vf.h | 2 +
7 files changed, 289 insertions(+), 1 deletion(-)
--
2.1.0
^ permalink raw reply
* [PATCH net-next v4 1/5] ixgbe: Add a RETA query command to VF-PF channel API
From: Vlad Zolotarov @ 2015-01-05 14:46 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420469202-1847-1-git-send-email-vladz@cloudius-systems.com>
82599 and x540 VFs and PF share the same RSS redirection table (RETA). Therefore we
just return it for all VFs. x550 on the other hand provides a separate redirection
table for each VF (there is a per-pool RETA table).
For 82599 and x540 RETA table is an array of 32 registers (128 bytes) and the maximum number of
registers that may be delivered in a single VF-PF channel command is 15. Therefore
we will deliver the whole table in 3 steps: 12, 12 and 8 registers in each
step correspondingly.
For x550 VFs RETA is a 64 byte array, so we may deliver it in two steps: 12 and 4 registers
correspondingly.
Thus this patch does the following:
- Adds a new API version (to specify a new commands set).
- Adds the IXGBE_VF_GET_RETA command to the VF-PF commands set.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v4:
- Deleted an empty line in ixgbe_get_vf_reta() switch-case.
New in v3:
- Pass the number of dwords and offset in RETA in the IXGBE_VF_GET_RETA request message.
This allows to reduce the added command set to a single command.
- Added a support for all devices supported by the ixgbe driver that have
SR-IOV functions support: 82599, x540 and x550. The original code supported
only 82599 and x540.
- Added the masking of the RETA entries according to the PSRTYPE[n].RQPL
value.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case
(in ixgbe_get_vf_reta()).
---
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 8 ++++
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 64 ++++++++++++++++++++++++++
2 files changed, 72 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
index a5cb755..f9b5eae 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
@@ -73,6 +73,7 @@ enum ixgbe_pfvf_api_rev {
ixgbe_mbox_api_10, /* API version 1.0, linux/freebsd VF driver */
ixgbe_mbox_api_20, /* API version 2.0, solaris Phase1 VF driver */
ixgbe_mbox_api_11, /* API version 1.1, linux/freebsd VF driver */
+ ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */
/* This value should always be last */
ixgbe_mbox_api_unknown, /* indicates that API version is not known */
};
@@ -97,6 +98,13 @@ enum ixgbe_pfvf_api_rev {
#define IXGBE_VF_TRANS_VLAN 3 /* Indication of port vlan */
#define IXGBE_VF_DEF_QUEUE 4 /* Default queue offset */
+/* mailbox API, version 1.2 VF requests */
+#define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */
+
+/* GET_RETA request data indices within the mailbox */
+#define IXGBE_VF_RETA_SZ 1 /* Number of RETA DWs to bring */
+#define IXGBE_VF_RETA_OFFSET 2 /* Offset in RETA */
+
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
/* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index c76ba90..8d6ebb3 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -427,6 +427,7 @@ static s32 ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
#endif /* CONFIG_FCOE */
switch (adapter->vfinfo[vf].vf_api) {
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
/*
* Version 1.1 supports jumbo frames on VFs if PF has
* jumbo frames enabled which means legacy VFs are
@@ -894,6 +895,7 @@ static int ixgbe_negotiate_vf_api(struct ixgbe_adapter *adapter,
switch (api) {
case ixgbe_mbox_api_10:
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
adapter->vfinfo[vf].vf_api = api;
return 0;
default:
@@ -917,6 +919,7 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter,
switch (adapter->vfinfo[vf].vf_api) {
case ixgbe_mbox_api_20:
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
break;
default:
return -1;
@@ -944,6 +947,64 @@ static int ixgbe_get_vf_queues(struct ixgbe_adapter *adapter,
return 0;
}
+static int ixgbe_get_vf_reta(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ int i, j;
+ u32 *reta = &msgbuf[1];
+ u32 mask = 0;
+ u32 psrtype;
+ u32 reta_offset_dw = msgbuf[IXGBE_VF_RETA_OFFSET];
+ u32 dwords = msgbuf[IXGBE_VF_RETA_SZ];
+
+ /* verify the PF is supporting the correct API */
+ if (adapter->vfinfo[vf].vf_api != ixgbe_mbox_api_12)
+ return -EPERM;
+
+ psrtype = IXGBE_READ_REG(hw, IXGBE_PSRTYPE(vf));
+
+ /* The redirection table is composed as follows:
+ * 82598: 128 (8 bit wide) entries containing pair of 4 bit RSS indices
+ * 82599/X540: 128 (8 bit wide) entries containing 4 bit RSS index X550:
+ * 512 (8 bit wide) entries containing 6 bit RSS index
+ *
+ * PSRTYPE[n].RQPL defines if 0, 1 or 2 bits from the redirection table
+ * value should be used.
+ */
+
+ if ((psrtype & (1 << 29)) == (1 << 29))
+ mask = 0x01010101;
+ else if ((psrtype & (2 << 29)) == (2 << 29))
+ mask = 0x03030303;
+ else
+ mask = 0;
+
+ switch (hw->mac.type) {
+ case ixgbe_mac_82599EB:
+ case ixgbe_mac_X540:
+ /* Read the appropriate portion of RETA */
+ for (i = 0; i < dwords; i++)
+ reta[i] = IXGBE_READ_REG(hw,
+ IXGBE_RETA(i + reta_offset_dw));
+ break;
+ case ixgbe_mac_X550:
+ case ixgbe_mac_X550EM_x:
+ /* X550 has a per-VF RETA */
+ for (i = 0, j = reta_offset_dw; i < dwords; i++, j++)
+ reta[i] = IXGBE_READ_REG(hw,
+ IXGBE_PFVFRETA(j, vf));
+ break;
+ default:
+ return -1;
+ }
+
+ /* Mask the relevant bits */
+ for (i = 0; i < dwords; i++)
+ reta[i] &= mask;
+
+ return 0;
+}
+
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
{
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
@@ -1000,6 +1061,9 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
case IXGBE_VF_GET_QUEUES:
retval = ixgbe_get_vf_queues(adapter, msgbuf, vf);
break;
+ case IXGBE_VF_GET_RETA:
+ retval = ixgbe_get_vf_reta(adapter, msgbuf, vf);
+ break;
default:
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
retval = IXGBE_ERR_MBX;
--
2.1.0
^ permalink raw reply related
* [PATCH net-next v4 3/5] ixgbe: Add GET_RSS_KEY command to VF-PF channel commands set
From: Vlad Zolotarov @ 2015-01-05 14:46 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420469202-1847-1-git-send-email-vladz@cloudius-systems.com>
For 82599 and x540 VFs and PF share the same RSS Key. Therefore we will return
the same RSS key for all VFs.
x550 on the other hand has a separate RSS Key for every pool.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v3:
- Added a support for x550 devices.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case
(in ixgbe_get_vf_rss_key()).
---
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 2 ++
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 26 ++++++++++++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
index f9b5eae..3f14373 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h
@@ -105,6 +105,8 @@ enum ixgbe_pfvf_api_rev {
#define IXGBE_VF_RETA_SZ 1 /* Number of RETA DWs to bring */
#define IXGBE_VF_RETA_OFFSET 2 /* Offset in RETA */
+#define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS key */
+
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
/* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
index 8d6ebb3..d29cd36 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
@@ -1005,6 +1005,29 @@ static int ixgbe_get_vf_reta(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf)
return 0;
}
+static int ixgbe_get_vf_rss_key(struct ixgbe_adapter *adapter,
+ u32 *msgbuf, u32 vf)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ int i;
+ u32 *rss_key = &msgbuf[1];
+
+ /* verify the PF is supporting the correct API */
+ if (adapter->vfinfo[vf].vf_api != ixgbe_mbox_api_12)
+ return -EPERM;
+
+ /* Read the RSS KEY */
+ if (hw->mac.type >= ixgbe_mac_X550) {
+ for (i = 0; i < 10; i++)
+ rss_key[i] = IXGBE_READ_REG(hw,
+ IXGBE_PFVFRSSRK(i, vf));
+ } else
+ for (i = 0; i < 10; i++)
+ rss_key[i] = IXGBE_READ_REG(hw, IXGBE_RSSRK(i));
+
+ return 0;
+}
+
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
{
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
@@ -1064,6 +1087,9 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
case IXGBE_VF_GET_RETA:
retval = ixgbe_get_vf_reta(adapter, msgbuf, vf);
break;
+ case IXGBE_VF_GET_RSS_KEY:
+ retval = ixgbe_get_vf_rss_key(adapter, msgbuf, vf);
+ break;
default:
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
retval = IXGBE_ERR_MBX;
--
2.1.0
^ permalink raw reply related
* [PATCH net-next v4 4/5] ixgbevf: Add RSS Key query code
From: Vlad Zolotarov @ 2015-01-05 14:46 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420469202-1847-1-git-send-email-vladz@cloudius-systems.com>
Add the ixgbevf_get_rss_key() function that queries the PF for an RSS Random Key
using a new VF-PF channel IXGBE_VF_GET_RSS_KEY command.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v2:
- Added a more detailed patch description.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case
(in ixgbevf_get_rss_key()).
---
drivers/net/ethernet/intel/ixgbevf/mbx.h | 2 ++
drivers/net/ethernet/intel/ixgbevf/vf.c | 44 ++++++++++++++++++++++++++++++++
drivers/net/ethernet/intel/ixgbevf/vf.h | 1 +
3 files changed, 47 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbevf/mbx.h b/drivers/net/ethernet/intel/ixgbevf/mbx.h
index 951a506..f79432e 100644
--- a/drivers/net/ethernet/intel/ixgbevf/mbx.h
+++ b/drivers/net/ethernet/intel/ixgbevf/mbx.h
@@ -118,6 +118,8 @@ enum ixgbe_pfvf_api_rev {
#define IXGBE_VF_RETA_SZ 1 /* Number of RETA DWs to bring */
#define IXGBE_VF_RETA_OFFSET 2 /* Offset in RETA */
+#define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS hash key */
+
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
/* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c
index cb5a4cf..f42a67d 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.c
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.c
@@ -292,6 +292,50 @@ static inline int _ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *msgbuf,
}
/**
+ * ixgbevf_get_rss_key - get the RSS Random Key
+ * @hw: pointer to the HW structure
+ * @reta: buffer to fill with RETA contents.
+ *
+ * The "rss_key" buffer should be big enough to contain 10 registers.
+ *
+ * Returns: 0 on success.
+ * if API doesn't support this operation - (-EPERM).
+ */
+int ixgbevf_get_rss_key(struct ixgbe_hw *hw, u8 *rss_key)
+{
+ int err;
+ u32 msgbuf[IXGBE_VFMAILBOX_SIZE];
+
+ /* Return and error if API doesn't support RSS Random Key retrieval */
+ if (hw->api_version != ixgbe_mbox_api_12)
+ return -EPERM;
+
+ msgbuf[0] = IXGBE_VF_GET_RSS_KEY;
+ err = hw->mbx.ops.write_posted(hw, msgbuf, 1);
+
+ if (err)
+ return err;
+
+ err = hw->mbx.ops.read_posted(hw, msgbuf, 11);
+
+ if (err)
+ return err;
+
+ msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
+
+ /* If we didn't get an ACK there must have been
+ * some sort of mailbox error so we should treat it
+ * as such.
+ */
+ if (msgbuf[0] != (IXGBE_VF_GET_RSS_KEY | IXGBE_VT_MSGTYPE_ACK))
+ return IXGBE_ERR_MBX;
+
+ memcpy(rss_key, msgbuf + 1, 40);
+
+ return 0;
+}
+
+/**
* ixgbevf_get_reta - get the RSS redirection table (RETA) contents.
* @hw: pointer to the HW structure
* @reta: buffer to fill with RETA contents.
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.h b/drivers/net/ethernet/intel/ixgbevf/vf.h
index 73c1b33..54f53f2b8 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.h
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.h
@@ -209,5 +209,6 @@ int ixgbevf_negotiate_api_version(struct ixgbe_hw *hw, int api);
int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
unsigned int *default_tc);
int ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *reta);
+int ixgbevf_get_rss_key(struct ixgbe_hw *hw, u8 *rss_key);
#endif /* __IXGBE_VF_H__ */
--
2.1.0
^ permalink raw reply related
* [PATCH net-next v4 5/5] ixgbevf: Add the appropriate ethtool ops to query RSS indirection table and key
From: Vlad Zolotarov @ 2015-01-05 14:46 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420469202-1847-1-git-send-email-vladz@cloudius-systems.com>
Added get_rxfh_indir_size, get_rxfh_key_size and get_rxfh ethtool_ops callbacks
implementations.
This enables the ethtool's "-x" and "-n rx-flow-hash" options for 82599 VF devices.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v4:
- Removed not needed braces in if-statement in ixgbevf_get_rxfh_indir_size().
New in v3:
- Added a proper support for x550 devices: return the correct redirection table size.
New in v2:
- Added a detailed description to the patch.
---
drivers/net/ethernet/intel/ixgbevf/ethtool.c | 42 ++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ethtool.c b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
index cc0e5b7..ddf2d82 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
@@ -792,6 +792,45 @@ static int ixgbevf_set_coalesce(struct net_device *netdev,
return 0;
}
+static u32 ixgbevf_get_rxfh_indir_size(struct net_device *netdev)
+{
+ struct ixgbevf_adapter *adapter = netdev_priv(netdev);
+
+ if (adapter->hw.mac.type >= ixgbe_mac_X550_vf)
+ return 64;
+ else
+ return 128;
+}
+
+static u32 ixgbevf_get_rxfh_key_size(struct net_device *netdev)
+{
+ return 40;
+}
+
+static int ixgbevf_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
+ u8 *hfunc)
+{
+ struct ixgbevf_adapter *adapter = netdev_priv(netdev);
+ int err;
+
+ if (hfunc)
+ *hfunc = ETH_RSS_HASH_TOP;
+
+ if (indir) {
+ err = ixgbevf_get_reta(&adapter->hw, indir);
+ if (err)
+ return err;
+ }
+
+ if (key) {
+ err = ixgbevf_get_rss_key(&adapter->hw, key);
+ if (err)
+ return err;
+ }
+
+ return 0;
+}
+
static const struct ethtool_ops ixgbevf_ethtool_ops = {
.get_settings = ixgbevf_get_settings,
.get_drvinfo = ixgbevf_get_drvinfo,
@@ -809,6 +848,9 @@ static const struct ethtool_ops ixgbevf_ethtool_ops = {
.get_ethtool_stats = ixgbevf_get_ethtool_stats,
.get_coalesce = ixgbevf_get_coalesce,
.set_coalesce = ixgbevf_set_coalesce,
+ .get_rxfh_indir_size = ixgbevf_get_rxfh_indir_size,
+ .get_rxfh_key_size = ixgbevf_get_rxfh_key_size,
+ .get_rxfh = ixgbevf_get_rxfh,
};
void ixgbevf_set_ethtool_ops(struct net_device *netdev)
--
2.1.0
^ permalink raw reply related
* Re: [PATCH net-next v3 0/5]: ixgbevf: Allow querying VFs RSS indirection table and key
From: Vlad Zolotarov @ 2015-01-05 14:47 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher
In-Reply-To: <1420467311-6680-1-git-send-email-vladz@cloudius-systems.com>
On 01/05/15 16:15, Vlad Zolotarov wrote:
> Add the ethtool ops to VF driver to allow querying the RSS indirection table
> and RSS Random Key.
>
> - PF driver: Add new VF-PF channel commands.
> - VF driver: Utilize these new commands and add the corresponding
> ethtool callbacks.
Oops - forgot to run checkpatch before sending and there were some
issues with styling... ;)
Have just sent v4 with all styling issues fixed... ;)
>
> New in v3:
> - Added a missing support for x550 devices.
> - Mask the indirection table values according to PSRTYPE[n].RQPL.
> - Minimized the number of added VF-PF commands.
>
> New in v2:
> - Added a detailed description to patches 4 and 5.
>
> New in v1 (compared to RFC):
> - Use "if-else" statement instead of a "switch-case" for a single option case.
> More specifically: in cases where the newly added API version is the only one
> allowed. We may consider using a "switch-case" back again when the list of
> allowed API versions in these specific places grows up.
>
> Vlad Zolotarov (5):
> ixgbe: Add a RETA query command to VF-PF channel API
> ixgbevf: Add a RETA query code
> ixgbe: Add GET_RSS_KEY command to VF-PF channel commands set
> ixgbevf: Add RSS Key query code
> ixgbevf: Add the appropriate ethtool ops to query RSS indirection
> table and key
>
> drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 10 ++
> drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 91 +++++++++++++++
> drivers/net/ethernet/intel/ixgbevf/ethtool.c | 43 +++++++
> drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 4 +-
> drivers/net/ethernet/intel/ixgbevf/mbx.h | 10 ++
> drivers/net/ethernet/intel/ixgbevf/vf.c | 132 ++++++++++++++++++++++
> drivers/net/ethernet/intel/ixgbevf/vf.h | 2 +
> 7 files changed, 291 insertions(+), 1 deletion(-)
>
^ permalink raw reply
* [PATCH net-next v4 2/5] ixgbevf: Add a RETA query code
From: Vlad Zolotarov @ 2015-01-05 14:46 UTC (permalink / raw)
To: netdev; +Cc: gleb, avi, jeffrey.t.kirsher, Vlad Zolotarov
In-Reply-To: <1420469202-1847-1-git-send-email-vladz@cloudius-systems.com>
- Added a new API version support.
- Added the query implementation in the ixgbevf.
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
---
New in v3:
- Adjusted to the new interface IXGBE_VF_GET_RETA command.
- Added a proper support for x550 devices.
New in v1 (compared to RFC):
- Use "if-else" statement instead of a "switch-case" for a single option case
(in ixgbevf_get_reta()).
---
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 4 +-
drivers/net/ethernet/intel/ixgbevf/mbx.h | 8 +++
drivers/net/ethernet/intel/ixgbevf/vf.c | 88 +++++++++++++++++++++++
drivers/net/ethernet/intel/ixgbevf/vf.h | 1 +
4 files changed, 100 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 62a0d8e..ba6ab61 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -1880,7 +1880,8 @@ static void ixgbevf_init_last_counter_stats(struct ixgbevf_adapter *adapter)
static void ixgbevf_negotiate_api(struct ixgbevf_adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
- int api[] = { ixgbe_mbox_api_11,
+ int api[] = { ixgbe_mbox_api_12,
+ ixgbe_mbox_api_11,
ixgbe_mbox_api_10,
ixgbe_mbox_api_unknown };
int err = 0, idx = 0;
@@ -3525,6 +3526,7 @@ static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu)
switch (adapter->hw.api_version) {
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE;
break;
default:
diff --git a/drivers/net/ethernet/intel/ixgbevf/mbx.h b/drivers/net/ethernet/intel/ixgbevf/mbx.h
index 0bc3005..951a506 100644
--- a/drivers/net/ethernet/intel/ixgbevf/mbx.h
+++ b/drivers/net/ethernet/intel/ixgbevf/mbx.h
@@ -86,6 +86,7 @@ enum ixgbe_pfvf_api_rev {
ixgbe_mbox_api_10, /* API version 1.0, linux/freebsd VF driver */
ixgbe_mbox_api_20, /* API version 2.0, solaris Phase1 VF driver */
ixgbe_mbox_api_11, /* API version 1.1, linux/freebsd VF driver */
+ ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */
/* This value should always be last */
ixgbe_mbox_api_unknown, /* indicates that API version is not known */
};
@@ -110,6 +111,13 @@ enum ixgbe_pfvf_api_rev {
#define IXGBE_VF_TRANS_VLAN 3 /* Indication of port vlan */
#define IXGBE_VF_DEF_QUEUE 4 /* Default queue offset */
+/* mailbox API, version 1.2 VF requests */
+#define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */
+
+/* GET_RETA request data indices within the mailbox */
+#define IXGBE_VF_RETA_SZ 1 /* Number of RETA DWs to bring */
+#define IXGBE_VF_RETA_OFFSET 2 /* Offset in RETA */
+
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
/* word in permanent address message with the current multicast type */
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c
index cdb53be..cb5a4cf 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.c
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.c
@@ -258,6 +258,93 @@ static s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr)
return ret_val;
}
+static inline int _ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *msgbuf,
+ u32 *reta, u32 reta_offset_dw, u32 dwords)
+{
+ int err;
+
+ msgbuf[0] = IXGBE_VF_GET_RETA;
+ msgbuf[IXGBE_VF_RETA_SZ] = dwords;
+ msgbuf[IXGBE_VF_RETA_OFFSET] = reta_offset_dw;
+
+ err = hw->mbx.ops.write_posted(hw, msgbuf, 3);
+
+ if (err)
+ return err;
+
+ err = hw->mbx.ops.read_posted(hw, msgbuf, 1 + dwords);
+
+ if (err)
+ return err;
+
+ msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
+
+ /* If we didn't get an ACK there must have been
+ * some sort of mailbox error so we should treat it
+ * as such.
+ */
+ if (msgbuf[0] != (IXGBE_VF_GET_RETA | IXGBE_VT_MSGTYPE_ACK))
+ return IXGBE_ERR_MBX;
+
+ memcpy(reta + reta_offset_dw, msgbuf + 1, 4 * dwords);
+
+ return 0;
+}
+
+/**
+ * ixgbevf_get_reta - get the RSS redirection table (RETA) contents.
+ * @hw: pointer to the HW structure
+ * @reta: buffer to fill with RETA contents.
+ *
+ * The "reta" buffer should be big enough to contain 32 registers.
+ *
+ * Returns: 0 on success.
+ * if API doesn't support this operation - (-EPERM).
+ */
+int ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *reta)
+{
+ int err;
+ u32 msgbuf[IXGBE_VFMAILBOX_SIZE];
+
+ /* Return an error if API doesn't RETA querying. */
+ if (hw->api_version != ixgbe_mbox_api_12)
+ return -EPERM;
+
+ /* x550 devices have a separate RETA for each VF: 64 bytes each.
+ *
+ * We'll get it in 2 steps due to mailbox size limitation - we can bring
+ * up to 15 dwords every time. Therefore we'll bring 12 and 4 dwords.
+ *
+ * Older devices share a RETA table with the PF: 128 bytes.
+ *
+ * For them we do it in 3 steps. Therefore we'll bring it in 3 steps:
+ * 12, 12 and 8 dwords in each step correspondingly.
+ */
+
+ /* RETA[0..11] */
+ err = _ixgbevf_get_reta(hw, msgbuf, reta, 0, 12);
+ if (err)
+ return err;
+
+ if (hw->mac.type >= ixgbe_mac_X550_vf) {
+ /* RETA[12..15] */
+ err = _ixgbevf_get_reta(hw, msgbuf, reta, 12, 4);
+ if (err)
+ return err;
+
+ } else {
+ /* RETA[12..23] */
+ err = _ixgbevf_get_reta(hw, msgbuf, reta, 12, 12);
+ if (err)
+ return err;
+
+ /* RETA[24..31] */
+ err = _ixgbevf_get_reta(hw, msgbuf, reta, 24, 8);
+ }
+
+ return err;
+}
+
/**
* ixgbevf_set_rar_vf - set device MAC address
* @hw: pointer to hardware structure
@@ -545,6 +632,7 @@ int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
/* do nothing if API doesn't support ixgbevf_get_queues */
switch (hw->api_version) {
case ixgbe_mbox_api_11:
+ case ixgbe_mbox_api_12:
break;
default:
return 0;
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.h b/drivers/net/ethernet/intel/ixgbevf/vf.h
index 5b17242..73c1b33 100644
--- a/drivers/net/ethernet/intel/ixgbevf/vf.h
+++ b/drivers/net/ethernet/intel/ixgbevf/vf.h
@@ -208,5 +208,6 @@ void ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size);
int ixgbevf_negotiate_api_version(struct ixgbe_hw *hw, int api);
int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
unsigned int *default_tc);
+int ixgbevf_get_reta(struct ixgbe_hw *hw, u32 *reta);
#endif /* __IXGBE_VF_H__ */
--
2.1.0
^ permalink raw reply related
* Re: [PATCH] Fix NUL (\0 or \x00) specification in string
From: David Sterba @ 2015-01-05 15:00 UTC (permalink / raw)
To: Giel van Schijndel
Cc: linux-kernel, Armin Schindler, Karsten Keil,
open list:ISDN SUBSYSTEM
In-Reply-To: <1420394722-20197-1-git-send-email-me@mortis.eu>
I'm replying to all your recent patches here as they are fixing things
reported in http://www.viva64.com/en/b/0299/ . I'ts a good practice to
give the credit the reporter.
The blogpost also contains analyses of the issues so it could help
reviewing the patches.
^ permalink raw reply
* Re: iproute2: Run over all netns
From: Nicolas Dichtel @ 2015-01-05 16:40 UTC (permalink / raw)
To: Vadim Kochan, netdev
In-Reply-To: <20150105122333.GA6646@angus-think.wlc.globallogic.com>
Le 05/01/2015 13:23, Vadim Kochan a écrit :
> Hi All,
>
> I have some piece of code which allow 'ip cmd'
> on each netns, I found it useful for getting some info
> from all the netns in one shot, BUT I faced with one issue
> which mostly related to the user interface design. The problem
> is that it would be good to print netns name only when
> user uses "show" command, but not for updating/adding (IMHO),
> but its hard to find the good way to implement this.
>
> To run each netns the 'ip -net all CMD ...' construction can be used.
>
> I see the following options for this:
>
> #1 Add additional option ( -N ? ) for show netns label on each executing of CMD:
>
> # ip -net all -N link
>
> [test_net]
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>
> [home0]
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>
> [lan0]
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>
> [wan0]
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
> 2: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
> link/ether 16:f7:cb:b6:7a:8e brd ff:ff:ff:ff:ff:ff
>
> [vnet0]
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>
>
> and w/o:
>
> # ip -net all link
>
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
> 2: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
> link/ether 16:f7:cb:b6:7a:8e brd ff:ff:ff:ff:ff:ff
>
> 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>
> the last one is not so useful right ?
>
> #2 Prints netns name by default if "-net all" was specified
> (add option to prevent this ?), so it will be printed even on the
> add/del/change commands ...
I vote for this one (I don't think the option to prevent it is needed, it's
better to be explicit).
>
> # ip -net all link add ...
>
> [home0]
> [lan0]
> [wan0]
> [vnet0]
>
> but does it really useless to see that it will shows all the netns
> on which cmd has been ran ?
I tend to say yes (another process may add/remove a netns in the same time).
Regards,
Nicolas
^ permalink raw reply
* Re: [PATCH] drivers:net:wireless: Add proper locking for the function, b43_op_beacon_set_tim in main.c
From: nick @ 2015-01-05 17:16 UTC (permalink / raw)
To: Kalle Valo
Cc: netdev-u79uwXL29TY76Z2rM5mHXA,
linux-wireless-u79uwXL29TY76Z2rM5mHXA,
b43-dev-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
stefano.brivio-hl5o88x/ua9eoWH0uzbU5w,
linux-kernel-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <87tx05378x.fsf-HodKDYzPHsUD5k0oWYwrnHL1okKdlPRT@public.gmane.org>
Kalle,
That's fine. On the other hand I am interested in the
reasons why this patch was dropped so I can send in a
version 2 of this patch.
Regards Nick
On 2015-01-05 04:29 AM, Kalle Valo wrote:
> Nicholas Krause <xerofoify-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> writes:
>
>> This adds proper locking for the function, b43_op_beacon_set_tim in
>> main.c by using the mutex lock in the structure pointer wl, as
>> embedded into this pointer as a mutex in order to protect against
>> multiple access to the pointer wl when updating the templates for this
>> pointer in the function, b43_update_templates internally in the
>> function, b43_op_beacon_set_tim.
>>
>> Signed-off-by: Nicholas Krause <xerofoify-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>
> Based on the discussion I have dropped this patch.
>
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox