summaryrefslogtreecommitdiffstats
path: root/sys/dev/softraid.c
diff options
context:
space:
mode:
authorjsing <jsing@openbsd.org>2014-01-21 03:50:44 +0000
committerjsing <jsing@openbsd.org>2014-01-21 03:50:44 +0000
commit98b789a956090c106a2e9e38493f14a51bfa4cbb (patch)
treeeae36d99c70391a78b6a96d581ba1b7523226abb /sys/dev/softraid.c
parentdtucker@ pointed out i suck at grep. (diff)
downloadwireguard-openbsd-98b789a956090c106a2e9e38493f14a51bfa4cbb.tar.xz
wireguard-openbsd-98b789a956090c106a2e9e38493f14a51bfa4cbb.zip
Use a TAILQ for tracking work units, rather than an array. This will allow
for variable size work units. While here, remove some pointless checks. ok krw@
Diffstat (limited to 'sys/dev/softraid.c')
-rw-r--r--sys/dev/softraid.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c
index 3ad6d4d5842..002ef5bb6c8 100644
--- a/sys/dev/softraid.c
+++ b/sys/dev/softraid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid.c,v 1.322 2014/01/21 03:27:38 jsing Exp $ */
+/* $OpenBSD: softraid.c,v 1.323 2014/01/21 03:50:44 jsing Exp $ */
/*
* Copyright (c) 2007, 2008, 2009 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
@@ -2107,26 +2107,22 @@ sr_wu_alloc(struct sr_discipline *sd)
struct sr_workunit *wu;
int i, no_wu;
- if (!sd)
- return (1);
-
DNPRINTF(SR_D_WU, "%s: sr_wu_alloc %p %d\n", DEVNAME(sd->sd_sc),
sd, sd->sd_max_wu);
- if (sd->sd_wu)
- return (1);
-
no_wu = sd->sd_max_wu;
sd->sd_wu_pending = no_wu;
- sd->sd_wu = malloc(sizeof(struct sr_workunit) * no_wu,
- M_DEVBUF, M_WAITOK | M_ZERO);
mtx_init(&sd->sd_wu_mtx, IPL_BIO);
+ TAILQ_INIT(&sd->sd_wu);
TAILQ_INIT(&sd->sd_wu_freeq);
TAILQ_INIT(&sd->sd_wu_pendq);
TAILQ_INIT(&sd->sd_wu_defq);
+
for (i = 0; i < no_wu; i++) {
- wu = &sd->sd_wu[i];
+ wu = malloc(sizeof(struct sr_workunit),
+ M_DEVBUF, M_WAITOK | M_ZERO);
+ TAILQ_INSERT_TAIL(&sd->sd_wu, wu, swu_next);
TAILQ_INIT(&wu->swu_ccb);
task_set(&wu->swu_task, sr_wu_done_callback, sd, wu);
wu->swu_dis = sd;
@@ -2141,9 +2137,6 @@ sr_wu_free(struct sr_discipline *sd)
{
struct sr_workunit *wu;
- if (!sd)
- return;
-
DNPRINTF(SR_D_WU, "%s: sr_wu_free %p\n", DEVNAME(sd->sd_sc), sd);
while ((wu = TAILQ_FIRST(&sd->sd_wu_freeq)) != NULL)
@@ -2153,8 +2146,10 @@ sr_wu_free(struct sr_discipline *sd)
while ((wu = TAILQ_FIRST(&sd->sd_wu_defq)) != NULL)
TAILQ_REMOVE(&sd->sd_wu_defq, wu, swu_link);
- if (sd->sd_wu)
- free(sd->sd_wu, M_DEVBUF);
+ while ((wu = TAILQ_FIRST(&sd->sd_wu)) != NULL) {
+ TAILQ_REMOVE(&sd->sd_wu, wu, swu_link);
+ free(wu, M_DEVBUF);
+ }
}
void *