All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] NET: ROSE: Fix neighbour reference counting issues. signoff
@ 2015-06-15 19:16 Ralf Baechle DL5RB
  2015-06-16 15:04 ` f6bvp
  0 siblings, 1 reply; 2+ messages in thread
From: Ralf Baechle DL5RB @ 2015-06-15 19:16 UTC (permalink / raw)
  To: Richard Stearn, Bernard Pidoux; +Cc: linux-hams

Richard,

I think there's another reference counting issues involving the
rose_neighbour structures' use member which was only a 16 bit integer.
The increment/decrement operations on this element will compile into
single instructions on x86 so will be atomic on uniprocessor systems
but bad things might happen on multiprocessor systems or load/store
architectures or just because GCC feels like it.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

diff --git a/include/net/rose.h b/include/net/rose.h
index 50811fe..ad163c1 100644
--- a/include/net/rose.h
+++ b/include/net/rose.h
@@ -7,6 +7,7 @@
 #ifndef _ROSE_H
 #define _ROSE_H 
 
+#include <linux/atomic.h>
 #include <linux/rose.h>
 #include <net/sock.h>
 
@@ -94,7 +95,7 @@ struct rose_neigh {
 	ax25_cb			*ax25;
 	struct net_device		*dev;
 	unsigned short		count;
-	unsigned short		use;
+	atomic_t		use;
 	unsigned int		number;
 	char			restarted;
 	char			dce_mode;
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
index 327f40e..8b8d0b0 100644
--- a/net/rose/af_rose.c
+++ b/net/rose/af_rose.c
@@ -10,6 +10,7 @@
  * Copyright (C) Tomi Manninen OH2BNS (oh2bns@sral.fi)
  */
 
+#include <linux/atomic.h>
 #include <linux/capability.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
@@ -172,7 +173,7 @@ void rose_kill_by_neigh(struct rose_neigh *neigh)
 
 		if (rose->neighbour == neigh) {
 			rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
-			rose->neighbour->use--;
+			atomic_dec(&rose->neighbour->use);
 			rose->neighbour = NULL;
 		}
 	}
@@ -193,7 +194,7 @@ static void rose_kill_by_device(struct net_device *dev)
 		if (rose->device == dev) {
 			rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
 			if (rose->neighbour)
-				rose->neighbour->use--;
+				atomic_dec(&rose->neighbour->use);
 			rose->device = NULL;
 		}
 	}
@@ -619,7 +620,7 @@ static int rose_release(struct socket *sock)
 		break;
 
 	case ROSE_STATE_2:
-		rose->neighbour->use--;
+		atomic_dec(&rose->neighbour->use);
 		release_sock(sk);
 		rose_disconnect(sk, 0, -1, -1);
 		lock_sock(sk);
@@ -833,7 +834,7 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le
 
 	rose->state = ROSE_STATE_1;
 
-	rose->neighbour->use++;
+	atomic_inc(&rose->neighbour->use);
 
 	rose_write_internal(sk, ROSE_CALL_REQUEST);
 	rose_start_heartbeat(sk);
@@ -1033,7 +1034,7 @@ int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct ros
 	make_rose->device        = dev;
 	make_rose->facilities    = facilities;
 
-	make_rose->neighbour->use++;
+	atomic_inc(&make_rose->neighbour->use);
 
 	if (rose_sk(sk)->defer) {
 		make_rose->state = ROSE_STATE_5;
diff --git a/net/rose/rose_in.c b/net/rose/rose_in.c
index 79c4abc..58c6882 100644
--- a/net/rose/rose_in.c
+++ b/net/rose/rose_in.c
@@ -11,6 +11,7 @@
  * but are mostly correct. Before you modify the code could you read the SDL
  * diagrams as the code is not obvious and probably very easy to break.
  */
+#include <linux/atomic.h>
 #include <linux/errno.h>
 #include <linux/types.h>
 #include <linux/socket.h>
@@ -58,7 +59,7 @@ static int rose_state1_machine(struct sock *sk, struct sk_buff *skb, int framety
 	case ROSE_CLEAR_REQUEST:
 		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
 		rose_disconnect(sk, ECONNREFUSED, skb->data[3], skb->data[4]);
-		rose->neighbour->use--;
+		atomic_dec(&rose->neighbour->use);
 		break;
 
 	default:
@@ -81,12 +82,12 @@ static int rose_state2_machine(struct sock *sk, struct sk_buff *skb, int framety
 	case ROSE_CLEAR_REQUEST:
 		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
 		rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
-		rose->neighbour->use--;
+		atomic_dec(&rose->neighbour->use);
 		break;
 
 	case ROSE_CLEAR_CONFIRMATION:
 		rose_disconnect(sk, 0, -1, -1);
-		rose->neighbour->use--;
+		atomic_dec(&rose->neighbour->use);
 		break;
 
 	default:
@@ -122,7 +123,7 @@ static int rose_state3_machine(struct sock *sk, struct sk_buff *skb, int framety
 	case ROSE_CLEAR_REQUEST:
 		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
 		rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
-		rose->neighbour->use--;
+		atomic_dec(&rose->neighbour->use);
 		break;
 
 	case ROSE_RR:
@@ -233,7 +234,7 @@ static int rose_state4_machine(struct sock *sk, struct sk_buff *skb, int framety
 	case ROSE_CLEAR_REQUEST:
 		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
 		rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
-		rose->neighbour->use--;
+		atomic_dec(&rose->neighbour->use);
 		break;
 
 	default:
@@ -253,7 +254,7 @@ static int rose_state5_machine(struct sock *sk, struct sk_buff *skb, int framety
 	if (frametype == ROSE_CLEAR_REQUEST) {
 		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
 		rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
-		rose_sk(sk)->neighbour->use--;
+		atomic_dec(&rose_sk(sk)->neighbour->use);
 	}
 
 	return 0;
diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c
index 46505317..869e201 100644
--- a/net/rose/rose_route.c
+++ b/net/rose/rose_route.c
@@ -7,6 +7,7 @@
  * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
  * Copyright (C) Terry Dawson VK2KTJ (terry@animats.net)
  */
+#include <linux/atomic.h>
 #include <linux/errno.h>
 #include <linux/types.h>
 #include <linux/socket.h>
@@ -97,7 +98,7 @@ static int __must_check rose_add_node(struct rose_route_struct *rose_route,
 		rose_neigh->ax25      = NULL;
 		rose_neigh->dev       = dev;
 		rose_neigh->count     = 0;
-		rose_neigh->use       = 0;
+		atomic_set(&rose_neigh->use, 0);
 		rose_neigh->dce_mode  = 0;
 		rose_neigh->loopback  = 0;
 		rose_neigh->number    = rose_neigh_no++;
@@ -267,10 +268,10 @@ static void rose_remove_route(struct rose_route *rose_route)
 	struct rose_route *s;
 
 	if (rose_route->neigh1 != NULL)
-		rose_route->neigh1->use--;
+		atomic_dec(&rose_route->neigh1->use);
 
 	if (rose_route->neigh2 != NULL)
-		rose_route->neigh2->use--;
+		atomic_dec(&rose_route->neigh2->use);
 
 	if ((s = rose_route_list) == rose_route) {
 		rose_route_list = rose_route->next;
@@ -335,7 +336,7 @@ static int rose_del_node(struct rose_route_struct *rose_route,
 		if (rose_node->neighbour[i] == rose_neigh) {
 			rose_neigh->count--;
 
-			if (rose_neigh->count == 0 && rose_neigh->use == 0)
+			if (rose_neigh->count == 0 && atomic_read(&rose_neigh->use) == 0)
 				rose_remove_neigh(rose_neigh);
 
 			rose_node->count--;
@@ -383,7 +384,7 @@ void rose_add_loopback_neigh(void)
 	sn->ax25      = NULL;
 	sn->dev       = NULL;
 	sn->count     = 0;
-	sn->use       = 0;
+	atomic_set(&sn->use, 0);
 	sn->dce_mode  = 1;
 	sn->loopback  = 1;
 	sn->number    = rose_neigh_no++;
@@ -573,7 +574,7 @@ static int rose_clear_routes(void)
 		s          = rose_neigh;
 		rose_neigh = rose_neigh->next;
 
-		if (s->use == 0 && !s->loopback) {
+		if (atomic_read(&s->use) && !s->loopback) {
 			s->count = 0;
 			rose_remove_neigh(s);
 		}
@@ -793,13 +794,13 @@ static void rose_del_route_by_neigh(struct rose_neigh *rose_neigh)
 		}
 
 		if (rose_route->neigh1 == rose_neigh) {
-			rose_route->neigh1->use--;
+			atomic_dec(&rose_route->neigh1->use);
 			rose_route->neigh1 = NULL;
 			rose_transmit_clear_request(rose_route->neigh2, rose_route->lci2, ROSE_OUT_OF_ORDER, 0);
 		}
 
 		if (rose_route->neigh2 == rose_neigh) {
-			rose_route->neigh2->use--;
+			atomic_dec(&rose_route->neigh2->use);
 			rose_route->neigh2 = NULL;
 			rose_transmit_clear_request(rose_route->neigh1, rose_route->lci1, ROSE_OUT_OF_ORDER, 0);
 		}
@@ -923,7 +924,7 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 			rose_clear_queues(sk);
 			rose->cause	 = ROSE_NETWORK_CONGESTION;
 			rose->diagnostic = 0;
-			rose->neighbour->use--;
+			atomic_dec(&rose->neighbour->use);
 			rose->neighbour	 = NULL;
 			rose->lci	 = 0;
 			rose->state	 = ROSE_STATE_0;
@@ -1066,8 +1067,8 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 	rose_route->lci2      = new_lci;
 	rose_route->neigh2    = new_neigh;
 
-	rose_route->neigh1->use++;
-	rose_route->neigh2->use++;
+	atomic_inc(&rose_route->neigh1->use);
+	atomic_inc(&rose_route->neigh2->use);
 
 	rose_route->next = rose_route_list;
 	rose_route_list  = rose_route;
@@ -1214,7 +1215,7 @@ static int rose_neigh_show(struct seq_file *seq, void *v)
 			   (rose_neigh->loopback) ? "RSLOOP-0" : ax2asc(buf, &rose_neigh->callsign),
 			   rose_neigh->dev ? rose_neigh->dev->name : "???",
 			   rose_neigh->count,
-			   rose_neigh->use,
+			   atomic_read(&rose_neigh->use),
 			   (rose_neigh->dce_mode) ? "DCE" : "DTE",
 			   (rose_neigh->restarted) ? "yes" : "no",
 			   ax25_display_timer(&rose_neigh->t0timer) / HZ,
diff --git a/net/rose/rose_timer.c b/net/rose/rose_timer.c
index bc5469d..f508102 100644
--- a/net/rose/rose_timer.c
+++ b/net/rose/rose_timer.c
@@ -7,6 +7,7 @@
  * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
  * Copyright (C) 2002 Ralf Baechle DO1GRB (ralf@gnu.org)
  */
+#include <linux/atomic.h>
 #include <linux/errno.h>
 #include <linux/types.h>
 #include <linux/socket.h>
@@ -178,7 +179,7 @@ static void rose_timer_expiry(unsigned long param)
 		break;
 
 	case ROSE_STATE_2:	/* T3 */
-		rose->neighbour->use--;
+		atomic_dec(&rose->neighbour->use);
 		rose_disconnect(sk, ETIMEDOUT, -1, -1);
 		break;
 

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] NET: ROSE: Fix neighbour reference counting issues. signoff
  2015-06-15 19:16 [PATCH] NET: ROSE: Fix neighbour reference counting issues. signoff Ralf Baechle DL5RB
@ 2015-06-16 15:04 ` f6bvp
  0 siblings, 0 replies; 2+ messages in thread
From: f6bvp @ 2015-06-16 15:04 UTC (permalink / raw)
  To: Ralf Baechle DL5RB, Richard Stearn, linux-hams

Hello Ralf,

Patch downloaded and applied.
Rose is working ok.

Thanks,

Bernard
f6bvp.org

Le 15/06/2015 21:16, Ralf Baechle DL5RB a écrit :
> Richard,
>
> I think there's another reference counting issues involving the
> rose_neighbour structures' use member which was only a 16 bit integer.
> The increment/decrement operations on this element will compile into
> single instructions on x86 so will be atomic on uniprocessor systems
> but bad things might happen on multiprocessor systems or load/store
> architectures or just because GCC feels like it.
>
> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
>
> diff --git a/include/net/rose.h b/include/net/rose.h
> index 50811fe..ad163c1 100644
> --- a/include/net/rose.h
> +++ b/include/net/rose.h
> @@ -7,6 +7,7 @@
>   #ifndef _ROSE_H
>   #define _ROSE_H
>   
> +#include <linux/atomic.h>
>   #include <linux/rose.h>
>   #include <net/sock.h>
>   
> @@ -94,7 +95,7 @@ struct rose_neigh {
>   	ax25_cb			*ax25;
>   	struct net_device		*dev;
>   	unsigned short		count;
> -	unsigned short		use;
> +	atomic_t		use;
>   	unsigned int		number;
>   	char			restarted;
>   	char			dce_mode;
> diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
> index 327f40e..8b8d0b0 100644
> --- a/net/rose/af_rose.c
> +++ b/net/rose/af_rose.c
> @@ -10,6 +10,7 @@
>    * Copyright (C) Tomi Manninen OH2BNS (oh2bns@sral.fi)
>    */
>   
> +#include <linux/atomic.h>
>   #include <linux/capability.h>
>   #include <linux/module.h>
>   #include <linux/moduleparam.h>
> @@ -172,7 +173,7 @@ void rose_kill_by_neigh(struct rose_neigh *neigh)
>   
>   		if (rose->neighbour == neigh) {
>   			rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
> -			rose->neighbour->use--;
> +			atomic_dec(&rose->neighbour->use);
>   			rose->neighbour = NULL;
>   		}
>   	}
> @@ -193,7 +194,7 @@ static void rose_kill_by_device(struct net_device *dev)
>   		if (rose->device == dev) {
>   			rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
>   			if (rose->neighbour)
> -				rose->neighbour->use--;
> +				atomic_dec(&rose->neighbour->use);
>   			rose->device = NULL;
>   		}
>   	}
> @@ -619,7 +620,7 @@ static int rose_release(struct socket *sock)
>   		break;
>   
>   	case ROSE_STATE_2:
> -		rose->neighbour->use--;
> +		atomic_dec(&rose->neighbour->use);
>   		release_sock(sk);
>   		rose_disconnect(sk, 0, -1, -1);
>   		lock_sock(sk);
> @@ -833,7 +834,7 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le
>   
>   	rose->state = ROSE_STATE_1;
>   
> -	rose->neighbour->use++;
> +	atomic_inc(&rose->neighbour->use);
>   
>   	rose_write_internal(sk, ROSE_CALL_REQUEST);
>   	rose_start_heartbeat(sk);
> @@ -1033,7 +1034,7 @@ int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct ros
>   	make_rose->device        = dev;
>   	make_rose->facilities    = facilities;
>   
> -	make_rose->neighbour->use++;
> +	atomic_inc(&make_rose->neighbour->use);
>   
>   	if (rose_sk(sk)->defer) {
>   		make_rose->state = ROSE_STATE_5;
> diff --git a/net/rose/rose_in.c b/net/rose/rose_in.c
> index 79c4abc..58c6882 100644
> --- a/net/rose/rose_in.c
> +++ b/net/rose/rose_in.c
> @@ -11,6 +11,7 @@
>    * but are mostly correct. Before you modify the code could you read the SDL
>    * diagrams as the code is not obvious and probably very easy to break.
>    */
> +#include <linux/atomic.h>
>   #include <linux/errno.h>
>   #include <linux/types.h>
>   #include <linux/socket.h>
> @@ -58,7 +59,7 @@ static int rose_state1_machine(struct sock *sk, struct sk_buff *skb, int framety
>   	case ROSE_CLEAR_REQUEST:
>   		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
>   		rose_disconnect(sk, ECONNREFUSED, skb->data[3], skb->data[4]);
> -		rose->neighbour->use--;
> +		atomic_dec(&rose->neighbour->use);
>   		break;
>   
>   	default:
> @@ -81,12 +82,12 @@ static int rose_state2_machine(struct sock *sk, struct sk_buff *skb, int framety
>   	case ROSE_CLEAR_REQUEST:
>   		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
>   		rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
> -		rose->neighbour->use--;
> +		atomic_dec(&rose->neighbour->use);
>   		break;
>   
>   	case ROSE_CLEAR_CONFIRMATION:
>   		rose_disconnect(sk, 0, -1, -1);
> -		rose->neighbour->use--;
> +		atomic_dec(&rose->neighbour->use);
>   		break;
>   
>   	default:
> @@ -122,7 +123,7 @@ static int rose_state3_machine(struct sock *sk, struct sk_buff *skb, int framety
>   	case ROSE_CLEAR_REQUEST:
>   		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
>   		rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
> -		rose->neighbour->use--;
> +		atomic_dec(&rose->neighbour->use);
>   		break;
>   
>   	case ROSE_RR:
> @@ -233,7 +234,7 @@ static int rose_state4_machine(struct sock *sk, struct sk_buff *skb, int framety
>   	case ROSE_CLEAR_REQUEST:
>   		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
>   		rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
> -		rose->neighbour->use--;
> +		atomic_dec(&rose->neighbour->use);
>   		break;
>   
>   	default:
> @@ -253,7 +254,7 @@ static int rose_state5_machine(struct sock *sk, struct sk_buff *skb, int framety
>   	if (frametype == ROSE_CLEAR_REQUEST) {
>   		rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
>   		rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
> -		rose_sk(sk)->neighbour->use--;
> +		atomic_dec(&rose_sk(sk)->neighbour->use);
>   	}
>   
>   	return 0;
> diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c
> index 46505317..869e201 100644
> --- a/net/rose/rose_route.c
> +++ b/net/rose/rose_route.c
> @@ -7,6 +7,7 @@
>    * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
>    * Copyright (C) Terry Dawson VK2KTJ (terry@animats.net)
>    */
> +#include <linux/atomic.h>
>   #include <linux/errno.h>
>   #include <linux/types.h>
>   #include <linux/socket.h>
> @@ -97,7 +98,7 @@ static int __must_check rose_add_node(struct rose_route_struct *rose_route,
>   		rose_neigh->ax25      = NULL;
>   		rose_neigh->dev       = dev;
>   		rose_neigh->count     = 0;
> -		rose_neigh->use       = 0;
> +		atomic_set(&rose_neigh->use, 0);
>   		rose_neigh->dce_mode  = 0;
>   		rose_neigh->loopback  = 0;
>   		rose_neigh->number    = rose_neigh_no++;
> @@ -267,10 +268,10 @@ static void rose_remove_route(struct rose_route *rose_route)
>   	struct rose_route *s;
>   
>   	if (rose_route->neigh1 != NULL)
> -		rose_route->neigh1->use--;
> +		atomic_dec(&rose_route->neigh1->use);
>   
>   	if (rose_route->neigh2 != NULL)
> -		rose_route->neigh2->use--;
> +		atomic_dec(&rose_route->neigh2->use);
>   
>   	if ((s = rose_route_list) == rose_route) {
>   		rose_route_list = rose_route->next;
> @@ -335,7 +336,7 @@ static int rose_del_node(struct rose_route_struct *rose_route,
>   		if (rose_node->neighbour[i] == rose_neigh) {
>   			rose_neigh->count--;
>   
> -			if (rose_neigh->count == 0 && rose_neigh->use == 0)
> +			if (rose_neigh->count == 0 && atomic_read(&rose_neigh->use) == 0)
>   				rose_remove_neigh(rose_neigh);
>   
>   			rose_node->count--;
> @@ -383,7 +384,7 @@ void rose_add_loopback_neigh(void)
>   	sn->ax25      = NULL;
>   	sn->dev       = NULL;
>   	sn->count     = 0;
> -	sn->use       = 0;
> +	atomic_set(&sn->use, 0);
>   	sn->dce_mode  = 1;
>   	sn->loopback  = 1;
>   	sn->number    = rose_neigh_no++;
> @@ -573,7 +574,7 @@ static int rose_clear_routes(void)
>   		s          = rose_neigh;
>   		rose_neigh = rose_neigh->next;
>   
> -		if (s->use == 0 && !s->loopback) {
> +		if (atomic_read(&s->use) && !s->loopback) {
>   			s->count = 0;
>   			rose_remove_neigh(s);
>   		}
> @@ -793,13 +794,13 @@ static void rose_del_route_by_neigh(struct rose_neigh *rose_neigh)
>   		}
>   
>   		if (rose_route->neigh1 == rose_neigh) {
> -			rose_route->neigh1->use--;
> +			atomic_dec(&rose_route->neigh1->use);
>   			rose_route->neigh1 = NULL;
>   			rose_transmit_clear_request(rose_route->neigh2, rose_route->lci2, ROSE_OUT_OF_ORDER, 0);
>   		}
>   
>   		if (rose_route->neigh2 == rose_neigh) {
> -			rose_route->neigh2->use--;
> +			atomic_dec(&rose_route->neigh2->use);
>   			rose_route->neigh2 = NULL;
>   			rose_transmit_clear_request(rose_route->neigh1, rose_route->lci1, ROSE_OUT_OF_ORDER, 0);
>   		}
> @@ -923,7 +924,7 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
>   			rose_clear_queues(sk);
>   			rose->cause	 = ROSE_NETWORK_CONGESTION;
>   			rose->diagnostic = 0;
> -			rose->neighbour->use--;
> +			atomic_dec(&rose->neighbour->use);
>   			rose->neighbour	 = NULL;
>   			rose->lci	 = 0;
>   			rose->state	 = ROSE_STATE_0;
> @@ -1066,8 +1067,8 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
>   	rose_route->lci2      = new_lci;
>   	rose_route->neigh2    = new_neigh;
>   
> -	rose_route->neigh1->use++;
> -	rose_route->neigh2->use++;
> +	atomic_inc(&rose_route->neigh1->use);
> +	atomic_inc(&rose_route->neigh2->use);
>   
>   	rose_route->next = rose_route_list;
>   	rose_route_list  = rose_route;
> @@ -1214,7 +1215,7 @@ static int rose_neigh_show(struct seq_file *seq, void *v)
>   			   (rose_neigh->loopback) ? "RSLOOP-0" : ax2asc(buf, &rose_neigh->callsign),
>   			   rose_neigh->dev ? rose_neigh->dev->name : "???",
>   			   rose_neigh->count,
> -			   rose_neigh->use,
> +			   atomic_read(&rose_neigh->use),
>   			   (rose_neigh->dce_mode) ? "DCE" : "DTE",
>   			   (rose_neigh->restarted) ? "yes" : "no",
>   			   ax25_display_timer(&rose_neigh->t0timer) / HZ,
> diff --git a/net/rose/rose_timer.c b/net/rose/rose_timer.c
> index bc5469d..f508102 100644
> --- a/net/rose/rose_timer.c
> +++ b/net/rose/rose_timer.c
> @@ -7,6 +7,7 @@
>    * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
>    * Copyright (C) 2002 Ralf Baechle DO1GRB (ralf@gnu.org)
>    */
> +#include <linux/atomic.h>
>   #include <linux/errno.h>
>   #include <linux/types.h>
>   #include <linux/socket.h>
> @@ -178,7 +179,7 @@ static void rose_timer_expiry(unsigned long param)
>   		break;
>   
>   	case ROSE_STATE_2:	/* T3 */
> -		rose->neighbour->use--;
> +		atomic_dec(&rose->neighbour->use);
>   		rose_disconnect(sk, ETIMEDOUT, -1, -1);
>   		break;
>   

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-06-16 15:04 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-15 19:16 [PATCH] NET: ROSE: Fix neighbour reference counting issues. signoff Ralf Baechle DL5RB
2015-06-16 15:04 ` f6bvp

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.