[PATCH net-next 0/2] strp: Minor fixes to strparser and kcm

STALE3645d

4 messages, 2 authors, 2016-08-23 · open the first message on its own page

[PATCH net-next 0/2] strp: Minor fixes to strparser and kcm

From: Tom Herbert <hidden>
Date: 2016-08-23 19:14:54

Fix locking issue in kcm and losing events when paused.

Tom Herbert (2):
  strparser: Queue work when being unpaused
  kcm: Fix locking issue

 include/net/strparser.h   |  5 +----
 net/kcm/kcmproc.c         | 20 +++++++++++++++-----
 net/kcm/kcmsock.c         | 13 ++++++++-----
 net/strparser/strparser.c | 11 +++++++++++
 4 files changed, 35 insertions(+), 14 deletions(-)

-- 
2.8.0.rc2

[PATCH net-next 1/2] strparser: Queue work when being unpaused

From: Tom Herbert <hidden>
Date: 2016-08-23 19:14:39

When the upper layer unpauses a stream parser connection we need to
queue rx_work to make sure no events are missed.

Signed-off-by: Tom Herbert <redacted>
---
 include/net/strparser.h   |  5 +----
 net/strparser/strparser.c | 11 +++++++++++
 2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/include/net/strparser.h b/include/net/strparser.h
index fdb3d67..91fa0b9 100644
--- a/include/net/strparser.h
+++ b/include/net/strparser.h
@@ -88,10 +88,7 @@ static inline void strp_pause(struct strparser *strp)
 }
 
 /* May be called without holding lock for attached socket */
-static inline void strp_unpause(struct strparser *strp)
-{
-	strp->rx_paused = 0;
-}
+void strp_unpause(struct strparser *strp);
 
 static inline void save_strp_stats(struct strparser *strp,
 				   struct strp_aggr_stats *agg_stats)
diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c
index 68334b5..4ecfc10 100644
--- a/net/strparser/strparser.c
+++ b/net/strparser/strparser.c
@@ -445,6 +445,17 @@ int strp_init(struct strparser *strp, struct sock *csk,
 }
 EXPORT_SYMBOL_GPL(strp_init);
 
+void strp_unpause(struct strparser *strp)
+{
+	strp->rx_paused = 0;
+
+	/* Sync setting rx_paused with RX work */
+	smp_mb();
+
+	queue_work(strp_wq, &strp->rx_work);
+}
+EXPORT_SYMBOL_GPL(strp_unpause);
+
 /* strp must already be stopped so that strp_tcp_recv will no longer be called.
  * Note that strp_done is not called with the lower socket held.
  */
-- 
2.8.0.rc2

[PATCH net-next 2/2] kcm: Fix locking issue

From: Tom Herbert <hidden>
Date: 2016-08-23 19:24:03

Lock the lower socket in kcm_unattach. Release during call to strp_done
since that function cancels the RX timers and work queue with sync.

Also added some status information in psock reporting.

Signed-off-by: Tom Herbert <redacted>
---
 net/kcm/kcmproc.c | 20 +++++++++++++++-----
 net/kcm/kcmsock.c | 13 ++++++++-----
 2 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/net/kcm/kcmproc.c b/net/kcm/kcmproc.c
index 47e4453..bf75c92 100644
--- a/net/kcm/kcmproc.c
+++ b/net/kcm/kcmproc.c
@@ -173,14 +173,24 @@ static void kcm_format_psock(struct kcm_psock *psock, struct seq_file *seq,
 	if (psock->strp.rx_stopped)
 		seq_puts(seq, "RxStop ");
 
-	if (psock->strp.rx_paused)
-		seq_puts(seq, "RxPause ");
-
 	if (psock->tx_kcm)
 		seq_printf(seq, "Rsvd-%d ", psock->tx_kcm->index);
 
-	if (psock->ready_rx_msg)
-		seq_puts(seq, "RdyRx ");
+	if (!psock->strp.rx_paused && !psock->ready_rx_msg) {
+		if (psock->sk->sk_receive_queue.qlen) {
+			if (psock->strp.rx_need_bytes)
+				seq_printf(seq, "RxWait=%u ",
+					   psock->strp.rx_need_bytes);
+			else
+				seq_printf(seq, "RxWait ");
+		}
+	} else  {
+		if (psock->strp.rx_paused)
+			seq_puts(seq, "RxPause ");
+
+		if (psock->ready_rx_msg)
+			seq_puts(seq, "RdyRx ");
+	}
 
 	seq_puts(seq, "\n");
 }
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
index eedbe40..eb731ca 100644
--- a/net/kcm/kcmsock.c
+++ b/net/kcm/kcmsock.c
@@ -1477,12 +1477,13 @@ out:
 	return err;
 }
 
-/* Lower socket lock held */
 static void kcm_unattach(struct kcm_psock *psock)
 {
 	struct sock *csk = psock->sk;
 	struct kcm_mux *mux = psock->mux;
 
+	lock_sock(csk);
+
 	/* Stop getting callbacks from TCP socket. After this there should
 	 * be no way to reserve a kcm for this psock.
 	 */
@@ -1514,7 +1515,10 @@ static void kcm_unattach(struct kcm_psock *psock)
 
 	write_unlock_bh(&csk->sk_callback_lock);
 
+	/* Call strp_done without sock lock */
+	release_sock(csk);
 	strp_done(&psock->strp);
+	lock_sock(csk);
 
 	bpf_prog_put(psock->bpf_prog);
 
@@ -1564,6 +1568,8 @@ no_reserved:
 		fput(csk->sk_socket->file);
 		kmem_cache_free(kcm_psockp, psock);
 	}
+
+	release_sock(csk);
 }
 
 static int kcm_unattach_ioctl(struct socket *sock, struct kcm_unattach *info)
@@ -1749,11 +1755,8 @@ static void release_mux(struct kcm_mux *mux)
 	/* Release psocks */
 	list_for_each_entry_safe(psock, tmp_psock,
 				 &mux->psocks, psock_list) {
-		if (!WARN_ON(psock->unattaching)) {
-			lock_sock(psock->strp.sk);
+		if (!WARN_ON(psock->unattaching))
 			kcm_unattach(psock);
-			release_sock(psock->strp.sk);
-		}
 	}
 
 	if (WARN_ON(mux->psocks_cnt))
-- 
2.8.0.rc2

Re: [PATCH net-next 0/2] strp: Minor fixes to strparser and kcm

From: David Miller <davem@davemloft.net>
Date: 2016-08-23 23:23:50

From: Tom Herbert <redacted>
Date: Tue, 23 Aug 2016 11:55:29 -0700
Fix locking issue in kcm and losing events when paused.
Series applied, thanks Tom.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help