Page MenuHomeFreeBSD

D20539.diff
No OneTemporary

D20539.diff

Index: head/sys/dev/cxgbe/tom/t4_cpl_io.c
===================================================================
--- head/sys/dev/cxgbe/tom/t4_cpl_io.c
+++ head/sys/dev/cxgbe/tom/t4_cpl_io.c
@@ -74,7 +74,7 @@
#include "tom/t4_tom.h"
static void t4_aiotx_cancel(struct kaiocb *job);
-static void t4_aiotx_queue_toep(struct toepcb *toep);
+static void t4_aiotx_queue_toep(struct socket *so, struct toepcb *toep);
static size_t
aiotx_mbuf_pgoff(struct mbuf *m)
@@ -785,7 +785,7 @@
if (sowwakeup) {
if (!TAILQ_EMPTY(
&toep->aiotx_jobq))
- t4_aiotx_queue_toep(
+ t4_aiotx_queue_toep(so,
toep);
sowwakeup_locked(so);
} else
@@ -829,7 +829,7 @@
}
if (sowwakeup) {
if (!TAILQ_EMPTY(&toep->aiotx_jobq))
- t4_aiotx_queue_toep(toep);
+ t4_aiotx_queue_toep(so, toep);
sowwakeup_locked(so);
} else
SOCKBUF_UNLOCK(sb);
@@ -1821,7 +1821,7 @@
tls_ofld->sb_off -= plen;
}
if (!TAILQ_EMPTY(&toep->aiotx_jobq))
- t4_aiotx_queue_toep(toep);
+ t4_aiotx_queue_toep(so, toep);
sowwakeup_locked(so); /* unlocks so_snd */
}
SOCKBUF_UNLOCK_ASSERT(sb);
@@ -2195,10 +2195,10 @@
t4_aiotx_task(void *context, int pending)
{
struct toepcb *toep = context;
- struct inpcb *inp = toep->inp;
- struct socket *so = inp->inp_socket;
+ struct socket *so;
struct kaiocb *job;
+ so = toep->aiotx_so;
CURVNET_SET(toep->vnet);
SOCKBUF_LOCK(&so->so_snd);
while (!TAILQ_EMPTY(&toep->aiotx_jobq) && sowriteable(so)) {
@@ -2209,15 +2209,17 @@
t4_aiotx_process_job(toep, so, job);
}
- toep->aiotx_task_active = false;
+ toep->aiotx_so = NULL;
SOCKBUF_UNLOCK(&so->so_snd);
CURVNET_RESTORE();
free_toepcb(toep);
+ SOCK_LOCK(so);
+ sorele(so);
}
static void
-t4_aiotx_queue_toep(struct toepcb *toep)
+t4_aiotx_queue_toep(struct socket *so, struct toepcb *toep)
{
SOCKBUF_LOCK_ASSERT(&toep->inp->inp_socket->so_snd);
@@ -2225,9 +2227,10 @@
CTR3(KTR_CXGBE, "%s: queueing aiotx task for tid %d, active = %s",
__func__, toep->tid, toep->aiotx_task_active ? "true" : "false");
#endif
- if (toep->aiotx_task_active)
+ if (toep->aiotx_so != NULL)
return;
- toep->aiotx_task_active = true;
+ soref(so);
+ toep->aiotx_so = so;
hold_toepcb(toep);
soaio_enqueue(&toep->aiotx_task);
}
@@ -2284,7 +2287,7 @@
panic("new job was cancelled");
TAILQ_INSERT_TAIL(&toep->aiotx_jobq, job, list);
if (sowriteable(so))
- t4_aiotx_queue_toep(toep);
+ t4_aiotx_queue_toep(so, toep);
SOCKBUF_UNLOCK(&so->so_snd);
return (0);
}
Index: head/sys/dev/cxgbe/tom/t4_tom.h
===================================================================
--- head/sys/dev/cxgbe/tom/t4_tom.h
+++ head/sys/dev/cxgbe/tom/t4_tom.h
@@ -194,7 +194,7 @@
TAILQ_HEAD(, kaiocb) aiotx_jobq;
struct task aiotx_task;
- bool aiotx_task_active;
+ struct socket *aiotx_so;
/* Tx software descriptor */
uint8_t txsd_total;

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 21, 2:28 AM (11 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31880699
Default Alt Text
D20539.diff (2 KB)

Event Timeline