diff mbox series

[net-next] liquidio: Fix an issue with multiple switchdev enable disables

Message ID 20171103191744.GA25280@felix-thinkpad.cavium.com
State Accepted, archived
Delegated to: David Miller
Headers show
Series [net-next] liquidio: Fix an issue with multiple switchdev enable disables | expand

Commit Message

Manlunas, Felix Nov. 3, 2017, 7:17 p.m. UTC
From: Vijaya Mohan Guvva <vijaya.guvva@cavium.com>

Return success if the same dispatch function is being registered for
a given opcode and subcode, there by allow multiple switchdev enable
and disables.

Signed-off-by: Vijaya Mohan Guvva <vijaya.guvva@cavium.com>
Signed-off-by: Satanand Burla <satananda.burla@cavium.com>
Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com>
---
 drivers/net/ethernet/cavium/liquidio/octeon_device.c | 4 ++++
 drivers/net/ethernet/cavium/liquidio/octeon_droq.c   | 4 ++--
 drivers/net/ethernet/cavium/liquidio/octeon_droq.h   | 3 +++
 3 files changed, 9 insertions(+), 2 deletions(-)

Comments

David Miller Nov. 4, 2017, 12:18 a.m. UTC | #1
From: Felix Manlunas <felix.manlunas@cavium.com>
Date: Fri, 3 Nov 2017 12:17:44 -0700

> From: Vijaya Mohan Guvva <vijaya.guvva@cavium.com>
> 
> Return success if the same dispatch function is being registered for
> a given opcode and subcode, there by allow multiple switchdev enable
> and disables.
> 
> Signed-off-by: Vijaya Mohan Guvva <vijaya.guvva@cavium.com>
> Signed-off-by: Satanand Burla <satananda.burla@cavium.com>
> Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com>

Applied, thanks.

But I do have a question, are you properly reference counting these
dispatch function objects?  I can't see how you can properly handle
multiple enable/disable otherwise.

Thank you.
Guvva, Vijaya Nov. 6, 2017, 11:36 p.m. UTC | #2
>Applied, thanks.
>
>But I do have a question, are you properly reference counting these dispatch
>function objects?  I can't see how you can properly handle multiple
>enable/disable otherwise.
>
LiquidIO doesn't reference count dispatch function as no two LiquidIO components
registers for the same opcode/subcode combination and every physical function
will have its own dispatch functions list.
Right now, we don't have an implementation to unregister dispatch functions selectively,
which we supposed to do for switchdev disable. So, we allow multiple switchdev
enable/disables (in a sequence) by not failing the registration for opcode/subcode if the
new dispatch functions matches with the old one.

We will submit implementation for unregistering dispatch function in future patch.
diff mbox series

Patch

diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_device.c b/drivers/net/ethernet/cavium/liquidio/octeon_device.c
index e4aa339..2c615ab 100644
--- a/drivers/net/ethernet/cavium/liquidio/octeon_device.c
+++ b/drivers/net/ethernet/cavium/liquidio/octeon_device.c
@@ -1180,6 +1180,10 @@  void octeon_delete_dispatch_list(struct octeon_device *oct)
 		spin_unlock_bh(&oct->dispatch.lock);
 
 	} else {
+		if (pfn == fn &&
+		    octeon_get_dispatch_arg(oct, opcode, subcode) == fn_arg)
+			return 0;
+
 		dev_err(&oct->pci_dev->dev,
 			"Found previously registered dispatch fn for opcode/subcode: %x/%x\n",
 			opcode, subcode);
diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_droq.c b/drivers/net/ethernet/cavium/liquidio/octeon_droq.c
index 9372d4c..3461d65 100644
--- a/drivers/net/ethernet/cavium/liquidio/octeon_droq.c
+++ b/drivers/net/ethernet/cavium/liquidio/octeon_droq.c
@@ -52,8 +52,8 @@  struct __dispatch {
  *  @return  Failure: NULL
  *
  */
-static inline void *octeon_get_dispatch_arg(struct octeon_device *octeon_dev,
-					    u16 opcode, u16 subcode)
+void *octeon_get_dispatch_arg(struct octeon_device *octeon_dev,
+			      u16 opcode, u16 subcode)
 {
 	int idx;
 	struct list_head *dispatch;
diff --git a/drivers/net/ethernet/cavium/liquidio/octeon_droq.h b/drivers/net/ethernet/cavium/liquidio/octeon_droq.h
index f91bc84..815a9f5 100644
--- a/drivers/net/ethernet/cavium/liquidio/octeon_droq.h
+++ b/drivers/net/ethernet/cavium/liquidio/octeon_droq.h
@@ -400,6 +400,9 @@  int octeon_register_dispatch_fn(struct octeon_device *oct,
 				u16 subcode,
 				octeon_dispatch_fn_t fn, void *fn_arg);
 
+void *octeon_get_dispatch_arg(struct octeon_device *oct,
+			      u16 opcode, u16 subcode);
+
 void octeon_droq_print_stats(void);
 
 u32 octeon_droq_check_hw_for_pkts(struct octeon_droq *droq);