Patchwork drop_monitor: Add error code to detect duplicate state changes

login
register
mail settings
Submitter Neil Horman
Date July 20, 2010, 2:52 p.m.
Message ID <20100720145209.GE1995@hmsreliant.think-freely.org>
Download mbox | patch
Permalink /patch/59317/
State Accepted
Delegated to: David Miller
Headers show

Comments

Neil Horman - July 20, 2010, 2:52 p.m.
Hey-
	Patch to add -EAGAIN error to dropwatch netlink message handling code.
-EAGAIN will be returned anytime userspace attempts to transition the state of
the drop monitor service to a state that its already in.  That allows user space
to detect this condition, so it doesn't wait for a success ACK that will never
arrive.  Tested successfully by me

Signed-off-by: Neil Horman <nhorman@tuxdriver.com>


 drop_monitor.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - July 20, 2010, 8:28 p.m.
From: Neil Horman <nhorman@tuxdriver.com>
Date: Tue, 20 Jul 2010 10:52:09 -0400

> Hey-
> 	Patch to add -EAGAIN error to dropwatch netlink message handling code.
> -EAGAIN will be returned anytime userspace attempts to transition the state of
> the drop monitor service to a state that its already in.  That allows user space
> to detect this condition, so it doesn't wait for a success ACK that will never
> arrive.  Tested successfully by me
> 
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>

Applied.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
index ad41529..646ef3b 100644
--- a/net/core/drop_monitor.c
+++ b/net/core/drop_monitor.c
@@ -223,6 +223,11 @@  static int set_all_monitor_traces(int state)
 
 	spin_lock(&trace_state_lock);
 
+	if (state == trace_state) {
+		rc = -EAGAIN;
+		goto out_unlock;
+	}
+
 	switch (state) {
 	case TRACE_ON:
 		rc |= register_trace_kfree_skb(trace_kfree_skb_hit, NULL);
@@ -251,11 +256,12 @@  static int set_all_monitor_traces(int state)
 
 	if (!rc)
 		trace_state = state;
+	else
+		rc = -EINPROGRESS;
 
+out_unlock:
 	spin_unlock(&trace_state_lock);
 
-	if (rc)
-		return -EINPROGRESS;
 	return rc;
 }