[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
PERFORCE change 90297 for review
http://perforce.freebsd.org/chv.cgi?CH=90297
Change 90297 by peter@peter_daintree on 2006/01/24 19:37:15
IFC @90295
Affected files ...
.. //depot/projects/hammer/contrib/bc/bc/main.c#4 integrate
.. //depot/projects/hammer/etc/rc.d/ipsec#10 integrate
.. //depot/projects/hammer/sbin/dhclient/dhclient-script#7 integrate
.. //depot/projects/hammer/sbin/mount/mount.c#24 integrate
.. //depot/projects/hammer/sys/dev/ata/ata-pci.c#37 integrate
.. //depot/projects/hammer/sys/dev/ath/if_ath.c#41 integrate
.. //depot/projects/hammer/sys/dev/sound/pcm/channel.c#19 integrate
.. //depot/projects/hammer/sys/dev/sound/pcm/feeder_rate.c#9 integrate
.. //depot/projects/hammer/sys/kern/kern_ktrace.c#23 integrate
.. //depot/projects/hammer/sys/kern/vfs_aio.c#41 integrate
.. //depot/projects/hammer/sys/net80211/ieee80211.c#22 integrate
.. //depot/projects/hammer/sys/net80211/ieee80211_input.c#29 integrate
.. //depot/projects/hammer/sys/net80211/ieee80211_proto.c#22 integrate
.. //depot/projects/hammer/sys/net80211/ieee80211_var.h#23 integrate
.. //depot/projects/hammer/sys/netinet/in.c#22 integrate
.. //depot/projects/hammer/sys/netinet/ip_fw2.c#73 integrate
.. //depot/projects/hammer/sys/netinet/ip_icmp.c#29 integrate
.. //depot/projects/hammer/sys/netinet/ip_input.c#58 integrate
.. //depot/projects/hammer/sys/netinet/ip_mroute.c#32 integrate
.. //depot/projects/hammer/sys/netinet/udp_usrreq.c#39 integrate
.. //depot/projects/hammer/sys/nfsserver/nfs_serv.c#26 integrate
.. //depot/projects/hammer/sys/vm/vm_page.c#48 integrate
.. //depot/projects/hammer/sys/vm/vm_page.h#24 integrate
.. //depot/projects/hammer/sys/vm/vm_pageq.c#13 integrate
Differences ...
==== //depot/projects/hammer/contrib/bc/bc/main.c#4 (text+ko) ====
@@ -26,7 +26,7 @@
Western Washington University
Bellingham, WA 98226-9062
-$FreeBSD: src/contrib/bc/bc/main.c,v 1.7 2005/09/27 18:52:17 brooks Exp $
+$FreeBSD: src/contrib/bc/bc/main.c,v 1.8 2006/01/24 06:38:35 brooks Exp $
*************************************************************************/
@@ -65,7 +65,7 @@
printf ("usage: %s [options] [file ...]\n%s%s%s%s%s%s%s", progname,
" -h --help print this usage and exit\n",
" -i --interactive force interactive mode\n",
- " -l --mathlib use the predefine math routines\n",
+ " -l --mathlib use the predefined math routines\n",
" -q --quiet don't print initial banner\n",
" -s --standard non-standard bc constructs are errors\n",
" -w --warn warn about non-standard bc constructs\n",
==== //depot/projects/hammer/etc/rc.d/ipsec#10 (text+ko) ====
@@ -1,7 +1,7 @@
#!/bin/sh
#
# $NetBSD: ipsec,v 1.7 2002/03/22 04:33:58 thorpej Exp $
-# $FreeBSD: src/etc/rc.d/ipsec,v 1.13 2005/10/12 22:14:44 pjd Exp $
+# $FreeBSD: src/etc/rc.d/ipsec,v 1.16 2006/01/24 15:16:55 pjd Exp $
#
# PROVIDE: ipsec
@@ -9,15 +9,13 @@
# BEFORE: DAEMON mountcritremote
# KEYWORD: nojail
-# it does not really require beforenetlkm.
-
. /etc/rc.subr
name="ipsec"
rcvar=`set_rcvar`
start_precmd="ipsec_prestart"
start_cmd="ipsec_start"
-stop_precmd="test -f /etc/ipsec.conf"
+stop_precmd="test -f $ipsec_file"
stop_cmd="ipsec_stop"
reload_cmd="ipsec_reload"
extra_commands="reload"
@@ -63,8 +61,6 @@
ipsec_reload()
{
echo "Reloading ipsec manual keys/policies."
- ${ipsec_program} -F
- ${ipsec_program} -FP
${ipsec_program} -f "$ipsec_file"
}
==== //depot/projects/hammer/sbin/dhclient/dhclient-script#7 (text+ko) ====
@@ -1,7 +1,7 @@
#!/bin/sh
#
# $OpenBSD: dhclient-script,v 1.6 2004/05/06 18:22:41 claudio Exp $
-# $FreeBSD: src/sbin/dhclient/dhclient-script,v 1.12 2006/01/23 05:42:59 wes Exp $
+# $FreeBSD: src/sbin/dhclient/dhclient-script,v 1.13 2006/01/24 06:11:55 brooks Exp $
#
# Copyright (c) 2003 Kenneth R Westerback <krw@xxxxxxxxxxx>
#
@@ -276,7 +276,7 @@
if [ -n "$new_routers" ]; then
$LOGGER "New Routers ($interface): $new_routers"
set "$new_routers"
- if ping -q -c 1 -w 1 "$1"; then
+ if ping -q -c 1 -t 1 "$1"; then
if [ "$new_ip_address" != "$alias_ip_address" ]; then
add_new_alias
fi
==== //depot/projects/hammer/sbin/mount/mount.c#24 (text+ko) ====
@@ -38,7 +38,7 @@
static char sccsid[] = "@(#)mount.c 8.25 (Berkeley) 5/8/95";
#endif
static const char rcsid[] =
- "$FreeBSD: src/sbin/mount/mount.c,v 1.80 2006/01/18 11:00:34 pjd Exp $";
+ "$FreeBSD: src/sbin/mount/mount.c,v 1.81 2006/01/24 15:26:36 pjd Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -717,7 +717,7 @@
void
remopt(string, opt)
char *string;
- const char *opt;
+ const char *opt;
{
char *o, *p, *r;
==== //depot/projects/hammer/sys/dev/ata/ata-pci.c#37 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/ata-pci.c,v 1.112 2006/01/18 13:10:17 sos Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/ata-pci.c,v 1.113 2006/01/24 12:34:56 sos Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -439,7 +439,8 @@
{
struct ata_channel *ch = device_get_softc(dev);
- if (ch->dma && ((ch->flags & ATA_ALWAYS_DMASTAT) ||
+ if (!ata_legacy(device_get_parent(dev)) &&
+ ch->dma && ((ch->flags & ATA_ALWAYS_DMASTAT) ||
(ch->dma->flags & ATA_DMA_ACTIVE))) {
int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
==== //depot/projects/hammer/sys/dev/ath/if_ath.c#41 (text+ko) ====
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.107 2006/01/09 17:13:20 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.108 2006/01/23 20:58:05 sam Exp $");
/*
* Driver for the Atheros Wireless LAN controller.
@@ -2143,7 +2143,7 @@
* TU's and then calculate based on the beacon interval.
* Note that we clamp the result to at most 10 beacons.
*/
- bs.bs_bmissthreshold = howmany(ic->ic_bmisstimeout, intval);
+ bs.bs_bmissthreshold = ic->ic_bmissthreshold;
if (bs.bs_bmissthreshold > 10)
bs.bs_bmissthreshold = 10;
else if (bs.bs_bmissthreshold <= 0)
==== //depot/projects/hammer/sys/dev/sound/pcm/channel.c#19 (text+ko) ====
@@ -31,11 +31,14 @@
#include "feeder_if.h"
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/channel.c,v 1.107 2006/01/22 15:06:49 ariff Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/channel.c,v 1.108 2006/01/24 01:10:07 ariff Exp $");
#define MIN_CHUNK_SIZE 256 /* for uiomove etc. */
+#if 0
#define DMA_ALIGN_THRESHOLD 4
#define DMA_ALIGN_MASK (~(DMA_ALIGN_THRESHOLD - 1))
+#endif
+#define DMA_ALIGN_MASK(bps) (~((bps) - 1))
#define CANCHANGE(c) (!(c->flags & CHN_F_TRIGGERED))
@@ -1253,7 +1256,10 @@
#if 1
hwptr &= ~a ; /* Apply channel align mask */
#endif
+#if 0
hwptr &= DMA_ALIGN_MASK; /* Apply DMA align mask */
+#endif
+ hwptr &= DMA_ALIGN_MASK(sndbuf_getbps(c->bufhard));
return hwptr;
}
==== //depot/projects/hammer/sys/dev/sound/pcm/feeder_rate.c#9 (text+ko) ====
@@ -66,7 +66,7 @@
#include <dev/sound/pcm/sound.h>
#include "feeder_if.h"
-SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/feeder_rate.c,v 1.15 2006/01/22 15:06:49 ariff Exp $");
+SND_DECLARE_FILE("$FreeBSD: src/sys/dev/sound/pcm/feeder_rate.c,v 1.16 2006/01/24 01:10:07 ariff Exp $");
#define RATE_ASSERT(x, y) /* KASSERT(x,y) */
#define RATE_TEST(x, y) /* if (!(x)) printf y */
@@ -100,6 +100,7 @@
uint32_t alpha; /* interpolation distance */
uint32_t pos, bpos; /* current sample / buffer positions */
uint32_t bufsz; /* total buffer size */
+ uint32_t stray; /* stray bytes */
int32_t scale, roll; /* scale / roll factor */
int16_t *buffer;
uint32_t (*convert)(struct feed_rate_info *, int16_t *, uint32_t);
@@ -350,6 +351,7 @@
info->pos = 2;
info->bpos = 4;
info->alpha = 0;
+ info->stray = 0;
feed_rate_reset(info);
if (info->src == info->dst) {
/*
@@ -710,12 +712,13 @@
slot = (((info->gx * (count >> 1)) + info->gy - info->alpha - 1) / info->gy) << 1;
RATE_TEST((slot & 1) == 0, ("%s: Slot count not sample integral (%d)\n",
__func__, slot));
- slot &= ~1;
/*
* Optimize buffer feeding aggresively to ensure calculated slot
* can be fitted nicely into available buffer free space, hence
* avoiding multiple feeding.
*/
+ RATE_TEST(info->stray == 0, ("%s: [1] Stray bytes: %u\n",
+ __func__,info->stray));
if (info->pos != 2 && info->bpos - info->pos == 2 &&
info->bpos + slot > info->bufsz) {
/*
@@ -734,25 +737,31 @@
i = 0;
for (;;) {
for (;;) {
- fetch = info->bufsz - info->bpos;
+ fetch = (info->bufsz - info->bpos) << 1;
+ fetch -= info->stray;
RATE_ASSERT(fetch >= 0,
("%s: [1] Buffer overrun: %d > %d\n",
__func__, info->bpos, info->bufsz));
- if (slot < fetch)
- fetch = slot;
- fetch &= ~1;
+ if ((slot << 1) < fetch)
+ fetch = slot << 1;
if (fetch > 0) {
- RATE_TEST((fetch & 1) == 0,
- ("%s: Fetch size not sample integral (%d)\n",
- __func__, fetch));
+ RATE_ASSERT(((info->bpos << 1) - info->stray) >= 0 &&
+ ((info->bpos << 1) - info->stray) < (info->bufsz << 1),
+ ("%s: DANGER - BUFFER OVERRUN! bufsz=%d, pos=%d\n", __func__,
+ info->bufsz << 1, (info->bpos << 1) - info->stray));
fetch = FEEDER_FEED(f->source, c,
- (uint8_t *)(info->buffer + info->bpos),
- fetch << 1, source);
+ (uint8_t *)(info->buffer) + (info->bpos << 1) - info->stray,
+ fetch, source);
+ info->stray = 0;
if (fetch == 0)
break;
RATE_TEST((fetch & 3) == 0,
("%s: Fetch size not byte integral (%d)\n",
__func__, fetch));
+ info->stray += fetch & 3;
+ RATE_TEST(info->stray == 0,
+ ("%s: Stray bytes detected (%d)\n",
+ __func__, info->stray));
fetch >>= 1;
fetch &= ~1;
info->bpos += fetch;
@@ -790,6 +799,7 @@
* to beginning of buffer so next cycle can
* interpolate using it.
*/
+ RATE_TEST(info->stray == 0, ("%s: [2] Stray bytes: %u\n", __func__, info->stray));
info->buffer[0] = info->buffer[info->pos - 2];
info->buffer[1] = info->buffer[info->pos - 1];
info->bpos = 2;
@@ -798,7 +808,10 @@
if (i == count)
break;
}
+#if 0
RATE_TEST(count == i, ("Expect: %u , Got: %u\n", count << 1, i << 1));
+#endif
+ RATE_TEST(info->stray == 0, ("%s: [3] Stray bytes: %u\n", __func__, info->stray));
return i << 1;
}
==== //depot/projects/hammer/sys/kern/kern_ktrace.c#23 (text+ko) ====
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_ktrace.c,v 1.105 2005/11/14 19:30:09 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_ktrace.c,v 1.106 2006/01/23 21:45:32 jhb Exp $");
#include "opt_ktrace.h"
#include "opt_mac.h"
@@ -952,6 +952,7 @@
error = VOP_WRITE(vp, &auio, IO_UNIT | IO_APPEND, cred);
VOP_UNLOCK(vp, 0, td);
vn_finished_write(mp);
+ vrele(vp);
mtx_unlock(&Giant);
if (!error)
return;
==== //depot/projects/hammer/sys/kern/vfs_aio.c#41 (text+ko) ====
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/vfs_aio.c,v 1.211 2006/01/23 10:27:15 davidxu Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/vfs_aio.c,v 1.215 2006/01/24 07:24:24 davidxu Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -184,24 +184,50 @@
struct __aiocb_private _aiocb_private;
} oaiocb_t;
+/*
+ * Below is a key of locks used to protect each member of struct aiocblist
+ * aioliojob and kaioinfo and any backends.
+ *
+ * * - need not protected
+ * a - locked by proc mtx
+ * b - locked by backend lock, the backend lock can be null in some cases,
+ * for example, BIO belongs to this type, in this case, proc lock is
+ * reused.
+ * c - locked by aio_job_mtx, the lock for the generic file I/O backend.
+ */
+
+/*
+ * Current, there is only two backends: BIO and generic file I/O.
+ * socket I/O is served by generic file I/O, this is not a good idea, since
+ * disk file I/O and any other types without O_NONBLOCK flag can block daemon
+ * threads, if there is no thread to serve socket I/O, the socket I/O will be
+ * delayed too long or starved, we should create some threads dedicated to
+ * sockets to do non-blocking I/O, same for pipe and fifo, for these I/O
+ * systems we really need non-blocking interface, fiddling O_NONBLOCK in file
+ * structure is not safe because there is race between userland and aio
+ * daemons.
+ */
+
struct aiocblist {
- TAILQ_ENTRY(aiocblist) list; /* List of jobs */
- TAILQ_ENTRY(aiocblist) plist; /* List of jobs for proc */
- TAILQ_ENTRY(aiocblist) allist;
- int jobflags;
- int jobstate;
- int inputcharge;
- int outputcharge;
- struct buf *bp; /* Buffer pointer */
- struct proc *userproc; /* User process */
- struct ucred *cred; /* Active credential when created */
- struct file *fd_file; /* Pointer to file structure */
- struct aioliojob *lio; /* Optional lio job */
- struct aiocb *uuaiocb; /* Pointer in userspace of aiocb */
- struct knlist klist; /* list of knotes */
- struct aiocb uaiocb; /* Kernel I/O control block */
- ksiginfo_t ksi; /* Realtime signal info */
- struct task biotask;
+ TAILQ_ENTRY(aiocblist) list; /* (b) internal list of for backend */
+ TAILQ_ENTRY(aiocblist) plist; /* (a) list of jobs for each backend */
+ TAILQ_ENTRY(aiocblist) allist; /* (a) list of all jobs in proc */
+ int jobflags; /* (a) job flags */
+ int jobstate; /* (b) job state */
+ int inputcharge; /* (*) input blockes */
+ int outputcharge; /* (*) output blockes */
+ struct buf *bp; /* (*) private to BIO backend,
+ * buffer pointer
+ */
+ struct proc *userproc; /* (*) user process */
+ struct ucred *cred; /* (*) active credential when created */
+ struct file *fd_file; /* (*) pointer to file structure */
+ struct aioliojob *lio; /* (*) optional lio job */
+ struct aiocb *uuaiocb; /* (*) pointer in userspace of aiocb */
+ struct knlist klist; /* (a) list of knotes */
+ struct aiocb uaiocb; /* (*) kernel I/O control block */
+ ksiginfo_t ksi; /* (a) realtime signal info */
+ struct task biotask; /* (*) private to BIO backend */
};
/* jobflags */
@@ -215,22 +241,22 @@
#define AIOP_FREE 0x1 /* proc on free queue */
struct aiothreadlist {
- int aiothreadflags; /* AIO proc flags */
- TAILQ_ENTRY(aiothreadlist) list; /* List of processes */
- struct thread *aiothread; /* The AIO thread */
+ int aiothreadflags; /* (c) AIO proc flags */
+ TAILQ_ENTRY(aiothreadlist) list; /* (c) list of processes */
+ struct thread *aiothread; /* (*) the AIO thread */
};
/*
* data-structure for lio signal management
*/
struct aioliojob {
- int lioj_flags;
- int lioj_count;
- int lioj_finished_count;
- struct sigevent lioj_signal; /* signal on all I/O done */
- TAILQ_ENTRY(aioliojob) lioj_list;
- struct knlist klist; /* list of knotes */
- ksiginfo_t lioj_ksi; /* Realtime signal info */
+ int lioj_flags; /* (a) listio flags */
+ int lioj_count; /* (a) listio flags */
+ int lioj_finished_count; /* (a) listio flags */
+ struct sigevent lioj_signal; /* (a) signal on all I/O done */
+ TAILQ_ENTRY(aioliojob) lioj_list; /* (a) lio list */
+ struct knlist klist; /* (a) list of knotes */
+ ksiginfo_t lioj_ksi; /* (a) Realtime signal info */
};
#define LIOJ_SIGNAL 0x1 /* signal on all done (lio) */
@@ -241,29 +267,31 @@
* per process aio data structure
*/
struct kaioinfo {
- int kaio_flags; /* per process kaio flags */
- int kaio_maxactive_count; /* maximum number of AIOs */
- int kaio_active_count; /* number of currently used AIOs */
- int kaio_qallowed_count; /* maxiumu size of AIO queue */
- int kaio_count; /* size of AIO queue */
- int kaio_ballowed_count; /* maximum number of buffers */
- int kaio_buffer_count; /* number of physio buffers */
- TAILQ_HEAD(,aiocblist) kaio_all; /* all AIOs in the process */
- TAILQ_HEAD(,aiocblist) kaio_done; /* done queue for process */
- TAILQ_HEAD(,aioliojob) kaio_liojoblist; /* list of lio jobs */
- TAILQ_HEAD(,aiocblist) kaio_jobqueue; /* job queue for process */
- TAILQ_HEAD(,aiocblist) kaio_bufqueue; /* buffer job queue for process */
- TAILQ_HEAD(,aiocblist) kaio_sockqueue; /* queue for aios waiting on sockets */
+ int kaio_flags; /* (a) per process kaio flags */
+ int kaio_maxactive_count; /* (*) maximum number of AIOs */
+ int kaio_active_count; /* (c) number of currently used AIOs */
+ int kaio_qallowed_count; /* (*) maxiumu size of AIO queue */
+ int kaio_count; /* (a) size of AIO queue */
+ int kaio_ballowed_count; /* (*) maximum number of buffers */
+ int kaio_buffer_count; /* (a) number of physio buffers */
+ TAILQ_HEAD(,aiocblist) kaio_all; /* (a) all AIOs in the process */
+ TAILQ_HEAD(,aiocblist) kaio_done; /* (a) done queue for process */
+ TAILQ_HEAD(,aioliojob) kaio_liojoblist; /* (a) list of lio jobs */
+ TAILQ_HEAD(,aiocblist) kaio_jobqueue; /* (a) job queue for process */
+ TAILQ_HEAD(,aiocblist) kaio_bufqueue; /* (a) buffer job queue for process */
+ TAILQ_HEAD(,aiocblist) kaio_sockqueue; /* (a) queue for aios waiting on sockets,
+ * not used yet.
+ */
};
#define KAIO_RUNDOWN 0x1 /* process is being run down */
#define KAIO_WAKEUP 0x2 /* wakeup process when there is a significant event */
-static TAILQ_HEAD(,aiothreadlist) aio_freeproc; /* Idle daemons */
+static TAILQ_HEAD(,aiothreadlist) aio_freeproc; /* (c) Idle daemons */
static struct sema aio_newproc_sem;
static struct mtx aio_job_mtx;
static struct mtx aio_sock_mtx;
-static TAILQ_HEAD(,aiocblist) aio_jobs; /* Async job list */
+static TAILQ_HEAD(,aiocblist) aio_jobs; /* (c) Async job list */
static struct unrhdr *aiod_unr;
static void aio_init_aioinfo(struct proc *p);
@@ -420,10 +448,18 @@
error = kqueue_del_filteropts(EVFILT_AIO);
if (error)
return error;
+ error = kqueue_del_filteropts(EVFILT_LIO);
+ if (error)
+ return error;
async_io_version = 0;
aio_swake = NULL;
taskqueue_free(taskqueue_aiod_bio);
delete_unrhdr(aiod_unr);
+ uma_zdestroy(kaio_zone);
+ uma_zdestroy(aiop_zone);
+ uma_zdestroy(aiocb_zone);
+ uma_zdestroy(aiol_zone);
+ uma_zdestroy(aiolio_zone);
EVENTHANDLER_DEREGISTER(process_exit, exit_tag);
EVENTHANDLER_DEREGISTER(process_exec, exec_tag);
mtx_destroy(&aio_job_mtx);
@@ -579,6 +615,7 @@
struct aiocblist *cbe, *cbn;
struct file *fp;
struct socket *so;
+ int remove;
KASSERT(curthread->td_proc == p,
("%s: called on non-curproc", __func__));
@@ -595,35 +632,30 @@
* Try to cancel all pending requests. This code simulates
* aio_cancel on all pending I/O requests.
*/
- while ((cbe = TAILQ_FIRST(&ki->kaio_sockqueue))) {
- fp = cbe->fd_file;
- so = fp->f_data;
- mtx_lock(&aio_sock_mtx);
- TAILQ_REMOVE(&so->so_aiojobq, cbe, list);
- mtx_unlock(&aio_sock_mtx);
- TAILQ_REMOVE(&ki->kaio_sockqueue, cbe, plist);
- TAILQ_INSERT_HEAD(&ki->kaio_jobqueue, cbe, plist);
- cbe->jobstate = JOBST_JOBQGLOBAL;
- }
-
TAILQ_FOREACH_SAFE(cbe, &ki->kaio_jobqueue, plist, cbn) {
+ remove = 0;
mtx_lock(&aio_job_mtx);
if (cbe->jobstate == JOBST_JOBQGLOBAL) {
TAILQ_REMOVE(&aio_jobs, cbe, list);
- mtx_unlock(&aio_job_mtx);
+ remove = 1;
+ } else if (cbe->jobstate == JOBST_JOBQSOCK) {
+ fp = cbe->fd_file;
+ MPASS(fp->f_type == DTYPE_SOCKET);
+ so = fp->f_data;
+ TAILQ_REMOVE(&so->so_aiojobq, cbe, list);
+ remove = 1;
+ }
+ mtx_unlock(&aio_job_mtx);
+
+ if (remove) {
cbe->jobstate = JOBST_JOBFINISHED;
cbe->uaiocb._aiocb_private.status = -1;
cbe->uaiocb._aiocb_private.error = ECANCELED;
TAILQ_REMOVE(&ki->kaio_jobqueue, cbe, plist);
aio_bio_done_notify(p, cbe, DONE_QUEUE);
- } else {
- mtx_unlock(&aio_job_mtx);
}
}
- if (TAILQ_FIRST(&ki->kaio_sockqueue))
- goto restart;
-
/* Wait for all running I/O to be finished */
if (TAILQ_FIRST(&ki->kaio_bufqueue) ||
TAILQ_FIRST(&ki->kaio_jobqueue)) {
@@ -685,14 +717,7 @@
* and this code should work in all instances for every type of file, including
* pipes, sockets, fifos, and regular files.
*
- * XXX I don't think these code work well with pipes, sockets and fifo, the
- * problem is the aiod threads can be blocked if there is not data or no
- * buffer space, and file was not opened with O_NONBLOCK, all aiod threads
- * will be blocked if there is couple of such processes. We need a FOF_OFFSET
- * like flag to override f_flag to tell low level system to do non-blocking
- * I/O, we can not muck O_NONBLOCK because there is full of race between
- * userland and aiod threads, although there is a trigger mechanism for socket,
- * but it also does not work well if userland is misbehaviored.
+ * XXX I don't think it works well for socket, pipe, and fifo.
*/
static void
aio_process(struct aiocblist *aiocbe)
@@ -833,8 +858,6 @@
struct proc *curcp, *mycp, *userp;
struct vmspace *myvm, *tmpvm;
struct thread *td = curthread;
- struct pgrp *newpgrp;
- struct session *newsess;
int id = (intptr_t)_id;
/*
@@ -867,14 +890,7 @@
fdfree(td);
/* The daemon resides in its own pgrp. */
- MALLOC(newpgrp, struct pgrp *, sizeof(struct pgrp), M_PGRP,
- M_WAITOK | M_ZERO);
- MALLOC(newsess, struct session *, sizeof(struct session), M_SESSION,
- M_WAITOK | M_ZERO);
-
- sx_xlock(&proctree_lock);
- enterpgrp(mycp, mycp->p_pid, newpgrp, newsess);
- sx_xunlock(&proctree_lock);
+ setsid(td, NULL);
/*
* Wakeup parent process. (Parent sleeps to keep from blasting away
@@ -1051,7 +1067,7 @@
mtx_lock(&aio_job_mtx);
num_aio_procs++;
if (start != NULL)
- *start--;
+ (*start)--;
mtx_unlock(&aio_job_mtx);
} else {
free_unr(aiod_unr, id);
@@ -1187,47 +1203,33 @@
aio_swake_cb(struct socket *so, struct sockbuf *sb)
{
struct aiocblist *cb, *cbn;
- struct proc *p;
- struct kaioinfo *ki = NULL;
int opcode, wakecount = 0;
struct aiothreadlist *aiop;
- if (sb == &so->so_snd) {
+ if (sb == &so->so_snd)
opcode = LIO_WRITE;
- SOCKBUF_LOCK(&so->so_snd);
- so->so_snd.sb_flags &= ~SB_AIO;
- SOCKBUF_UNLOCK(&so->so_snd);
- } else {
+ else
opcode = LIO_READ;
- SOCKBUF_LOCK(&so->so_rcv);
- so->so_rcv.sb_flags &= ~SB_AIO;
- SOCKBUF_UNLOCK(&so->so_rcv);
- }
- mtx_lock(&aio_sock_mtx);
+ SOCKBUF_LOCK(sb);
+ sb->sb_flags &= ~SB_AIO;
+ mtx_lock(&aio_job_mtx);
TAILQ_FOREACH_SAFE(cb, &so->so_aiojobq, list, cbn) {
if (opcode == cb->uaiocb.aio_lio_opcode) {
if (cb->jobstate != JOBST_JOBQSOCK)
panic("invalid queue value");
- p = cb->userproc;
- ki = p->p_aioinfo;
+ /* XXX
+ * We don't have actual sockets backend yet,
+ * so we simply move the requests to the generic
+ * file I/O backend.
+ */
TAILQ_REMOVE(&so->so_aiojobq, cb, list);
- PROC_LOCK(p);
- TAILQ_REMOVE(&ki->kaio_sockqueue, cb, plist);
- /*
- * XXX check AIO_RUNDOWN, and don't put on
- * jobqueue if it was set.
- */
- TAILQ_INSERT_TAIL(&ki->kaio_jobqueue, cb, plist);
- cb->jobstate = JOBST_JOBQGLOBAL;
- mtx_lock(&aio_job_mtx);
TAILQ_INSERT_TAIL(&aio_jobs, cb, list);
- mtx_unlock(&aio_job_mtx);
- PROC_UNLOCK(p);
wakecount++;
}
}
- mtx_unlock(&aio_sock_mtx);
+ mtx_unlock(&aio_job_mtx);
+ SOCKBUF_UNLOCK(sb);
while (wakecount--) {
mtx_lock(&aio_job_mtx);
@@ -1427,14 +1429,15 @@
SOCKBUF_LOCK(sb);
if (((opcode == LIO_READ) && (!soreadable(so))) || ((opcode ==
LIO_WRITE) && (!sowriteable(so)))) {
- mtx_lock(&aio_sock_mtx);
+ sb->sb_flags |= SB_AIO;
+
+ mtx_lock(&aio_job_mtx);
TAILQ_INSERT_TAIL(&so->so_aiojobq, aiocbe, list);
- mtx_unlock(&aio_sock_mtx);
+ mtx_unlock(&aio_job_mtx);
- sb->sb_flags |= SB_AIO;
PROC_LOCK(p);
- TAILQ_INSERT_TAIL(&ki->kaio_sockqueue, aiocbe, plist);
TAILQ_INSERT_TAIL(&ki->kaio_all, aiocbe, allist);
+ TAILQ_INSERT_TAIL(&ki->kaio_jobqueue, aiocbe, plist);
aiocbe->jobstate = JOBST_JOBQSOCK;
ki->kaio_count++;
if (lj)
@@ -1652,6 +1655,7 @@
struct file *fp;
struct socket *so;
int error;
+ int remove;
int cancelled = 0;
int notcancelled = 0;
struct vnode *vp;
@@ -1672,32 +1676,6 @@
td->td_retval[0] = AIO_NOTCANCELED;
return (0);
}
- } else if (fp->f_type == DTYPE_SOCKET) {
- so = fp->f_data;
- mtx_lock(&aio_sock_mtx);
- TAILQ_FOREACH_SAFE(cbe, &so->so_aiojobq, list, cbn) {
- if (cbe->userproc == p &&
- (uap->aiocbp == NULL ||
- uap->aiocbp == cbe->uuaiocb)) {
- TAILQ_REMOVE(&so->so_aiojobq, cbe, list);
- PROC_LOCK(p);
- TAILQ_REMOVE(&ki->kaio_sockqueue, cbe, plist);
- cbe->jobstate = JOBST_JOBRUNNING;
- cbe->uaiocb._aiocb_private.status = -1;
- cbe->uaiocb._aiocb_private.error = ECANCELED;
- aio_bio_done_notify(p, cbe, DONE_QUEUE);
- PROC_UNLOCK(p);
- cancelled++;
- if (uap->aiocbp != NULL)
- break;
- }
- }
- mtx_unlock(&aio_sock_mtx);
- if (cancelled && uap->aiocbp != NULL) {
- fdrop(fp, td);
- td->td_retval[0] = AIO_CANCELED;
- return (0);
- }
}
PROC_LOCK(p);
@@ -1705,33 +1683,55 @@
if ((uap->fd == cbe->uaiocb.aio_fildes) &&
((uap->aiocbp == NULL) ||
(uap->aiocbp == cbe->uuaiocb))) {
+ remove = 0;
+
mtx_lock(&aio_job_mtx);
if (cbe->jobstate == JOBST_JOBQGLOBAL) {
TAILQ_REMOVE(&aio_jobs, cbe, list);
- mtx_unlock(&aio_job_mtx);
+ remove = 1;
+ } else if (cbe->jobstate == JOBST_JOBQSOCK) {
+ MPASS(fp->f_type == DTYPE_SOCKET);
+ so = fp->f_data;
+ TAILQ_REMOVE(&so->so_aiojobq, cbe, list);
+ remove = 1;
+ }
+ mtx_unlock(&aio_job_mtx);
+
+ if (remove) {
TAILQ_REMOVE(&ki->kaio_jobqueue, cbe, plist);
cbe->uaiocb._aiocb_private.status = -1;
cbe->uaiocb._aiocb_private.error = ECANCELED;
aio_bio_done_notify(p, cbe, DONE_QUEUE);
cancelled++;
} else {
- mtx_unlock(&aio_job_mtx);
notcancelled++;
}
+ if (uap->aiocbp != NULL)
+ break;
}
}
PROC_UNLOCK(p);
done:
fdrop(fp, td);
+
+ if (uap->aiocbp != NULL) {
+ if (cancelled) {
+ td->td_retval[0] = AIO_CANCELED;
+ return (0);
+ }
+ }
+
if (notcancelled) {
td->td_retval[0] = AIO_NOTCANCELED;
return (0);
}
+
if (cancelled) {
td->td_retval[0] = AIO_CANCELED;
return (0);
}
+
td->td_retval[0] = AIO_ALLDONE;
return (0);
==== //depot/projects/hammer/sys/net80211/ieee80211.c#22 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net80211/ieee80211.c,v 1.26 2005/12/30 00:40:36 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/net80211/ieee80211.c,v 1.27 2006/01/23 20:57:30 sam Exp $");
/*
* IEEE 802.11 generic handler
@@ -190,7 +190,7 @@
if (ic->ic_bintval == 0)
ic->ic_bintval = IEEE80211_BINTVAL_DEFAULT;
- ic->ic_bmisstimeout = 7*ic->ic_bintval; /* default 7 beacons */
+ ic->ic_bmissthreshold = 7; /* default 7 beacons */
ic->ic_dtim_period = IEEE80211_DTIM_DEFAULT;
IEEE80211_BEACON_LOCK_INIT(ic, "beacon");
==== //depot/projects/hammer/sys/net80211/ieee80211_input.c#29 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.86 2006/01/23 19:31:00 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.87 2006/01/23 21:02:48 sam Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1901,6 +1901,9 @@
/* record tsf of last beacon */
memcpy(ni->ni_tstamp.data, scan.tstamp,
sizeof(ni->ni_tstamp));
+ /* count beacon frame for s/w bmiss handling */
+ ic->ic_swbmiss_count++;
+ ic->ic_bmiss_count = 0;
if (ni->ni_erp != scan.erp) {
IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC,
"[%s] erp change: was 0x%x, now 0x%x\n",
@@ -1944,7 +1947,6 @@
if (ic->ic_flags & IEEE80211_F_SCAN)
ieee80211_add_scan(ic, &scan, wh,
subtype, rssi, rstamp);
- ic->ic_bmiss_count = 0;
return;
}
/*
==== //depot/projects/hammer/sys/net80211/ieee80211_proto.c#22 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_proto.c,v 1.27 2006/01/02 17:16:27 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_proto.c,v 1.28 2006/01/23 21:02:49 sam Exp $");
/*
* IEEE 802.11 protocol support.
@@ -98,6 +98,7 @@
ic->ic_fragthreshold = IEEE80211_FRAG_DEFAULT;
ic->ic_fixed_rate = IEEE80211_FIXED_RATE_NONE;
ic->ic_bmiss_max = IEEE80211_BMISS_MAX;
+ callout_init(&ic->ic_swbmiss, CALLOUT_MPSAFE);
ic->ic_mcast_rate = IEEE80211_MCAST_RATE_DEFAULT;
ic->ic_protmode = IEEE80211_PROT_CTSONLY;
ic->ic_roaming = IEEE80211_ROAMING_AUTO;
@@ -855,7 +856,27 @@
ieee80211_new_state(ic, IEEE80211_S_SCAN, 0);
}
+/*
+ * Software beacon miss handling. Check if any beacons
+ * were received in the last period. If not post a
+ * beacon miss; otherwise reset the counter.
+ */
static void
+ieee80211_swbmiss(void *arg)
+{
+ struct ieee80211com *ic = arg;
+
+ if (ic->ic_swbmiss_count == 0) {
+ ieee80211_beacon_miss(ic);
+ if (ic->ic_bmiss_count == 0) /* don't re-arm timer */
+ return;
+ } else
+ ic->ic_swbmiss_count = 0;
+ callout_reset(&ic->ic_swbmiss, ic->ic_swbmiss_period,
+ ieee80211_swbmiss, ic);
+}
+
+static void
sta_disassoc(void *arg, struct ieee80211_node *ni)
{
struct ieee80211com *ic = arg;
@@ -888,6 +909,8 @@
ieee80211_state_name[ostate], ieee80211_state_name[nstate]);
ic->ic_state = nstate; /* state transition */
ni = ic->ic_bss; /* NB: no reference held */
+ if (ic->ic_flags_ext & IEEE80211_FEXT_SWBMISS)
+ callout_stop(&ic->ic_swbmiss);
switch (nstate) {
case IEEE80211_S_INIT:
switch (ostate) {
@@ -1093,6 +1116,20 @@
if_start(ifp); /* XXX not authorized yet */
break;
}
+ if (ostate != IEEE80211_S_RUN &&
+ ic->ic_opmode == IEEE80211_M_STA &&
+ (ic->ic_flags_ext & IEEE80211_FEXT_SWBMISS)) {
+ /*
+ * Start s/w beacon miss timer for devices w/o
+ * hardware support. We fudge a bit here since
+ * we're doing this in software.
+ */
+ ic->ic_swbmiss_period = IEEE80211_TU_TO_TICKS(
+ 2 * ic->ic_bmissthreshold * ni->ni_intval);
+ ic->ic_swbmiss_count = 0;
+ callout_reset(&ic->ic_swbmiss, ic->ic_swbmiss_period,
+ ieee80211_swbmiss, ic);
+ }
/*
* Start/stop the authenticator when operating as an
* AP. We delay until here to allow configuration to
==== //depot/projects/hammer/sys/net80211/ieee80211_var.h#23 (text+ko) ====
@@ -29,7 +29,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/net80211/ieee80211_var.h,v 1.36 2006/01/02 16:57:20 sam Exp $
+ * $FreeBSD: src/sys/net80211/ieee80211_var.h,v 1.38 2006/01/23 21:02:49 sam Exp $
*/
#ifndef _NET80211_IEEE80211_VAR_H_
#define _NET80211_IEEE80211_VAR_H_
@@ -71,6 +71,7 @@
#define IEEE80211_BINTVAL_DEFAULT 100 /* default beacon interval (TU's) */
#define IEEE80211_BMISS_MAX 2 /* maximum consecutive bmiss allowed */
+#define IEEE80211_SWBMISS_THRESHOLD 50 /* s/w bmiss threshold (TU's) */
#define IEEE80211_PS_SLEEP 0x1 /* STA is in power saving mode */
#define IEEE80211_PS_MAX_QUEUE 50 /* maximum saved packets */
@@ -83,6 +84,7 @@
#define IEEE80211_MS_TO_TU(x) (((x) * 1024) / 1000)
#define IEEE80211_TU_TO_MS(x) (((x) * 1000) / 1024)
+#define IEEE80211_TU_TO_TICKS(x)(((x) * hz) / 1024)
struct ieee80211_aclator;
struct sysctl_ctx_list;
@@ -144,8 +146,12 @@
int ic_mcast_rate; /* rate for mcast frames */
u_int16_t ic_rtsthreshold;
u_int16_t ic_fragthreshold;
+ u_int8_t ic_bmissthreshold;
u_int8_t ic_bmiss_count; /* current beacon miss count */
int ic_bmiss_max; /* max bmiss before scan */
+ u_int16_t ic_swbmiss_count;/* beacons in last period */
+ u_int16_t ic_swbmiss_period;/* s/w bmiss period */
+ struct callout ic_swbmiss; /* s/w beacon miss timer */
struct ieee80211_node *(*ic_node_alloc)(struct ieee80211_node_table*);
void (*ic_node_free)(struct ieee80211_node *);
void (*ic_node_cleanup)(struct ieee80211_node *);
@@ -157,7 +163,6 @@
u_int16_t ic_txmax; /* max tx retry count */
u_int16_t ic_txlifetime; /* tx lifetime */
u_int16_t ic_txpowlimit; /* global tx power limit */
- u_int16_t ic_bmisstimeout;/* beacon miss threshold (ms) */
u_int16_t ic_nonerpsta; /* # non-ERP stations */
u_int16_t ic_longslotsta; /* # long slot time stations */
int ic_mgt_timer; /* mgmt timeout */
@@ -247,6 +252,7 @@
/* 0x00000006 reserved */
#define IEEE80211_FEXT_BGSCAN 0x00000008 /* STATUS: enable full bgscan completion */
#define IEEE80211_FEXT_ERPUPDATE 0x00000200 /* STATUS: update ERP element */
+#define IEEE80211_FEXT_SWBMISS 0x00000400 /* CONF: do bmiss in s/w */
/* ic_caps */
#define IEEE80211_C_WEP 0x00000001 /* CAPABILITY: WEP available */
==== //depot/projects/hammer/sys/netinet/in.c#22 (text+ko) ====
@@ -28,7 +28,7 @@
* SUCH DAMAGE.
*
* @(#)in.c 8.4 (Berkeley) 1/9/95
- * $FreeBSD: src/sys/netinet/in.c,v 1.92 2005/10/28 20:29:42 glebius Exp $
+ * $FreeBSD: src/sys/netinet/in.c,v 1.93 2006/01/24 16:19:31 andre Exp $
*/
#include "opt_carp.h"
@@ -479,7 +479,8 @@
s = splnet();
TAILQ_REMOVE(&ifp->if_addrhead, &ia->ia_ifa, ifa_link);
TAILQ_REMOVE(&in_ifaddrhead, ia, ia_link);
- LIST_REMOVE(ia, ia_hash);
+ if (ia->ia_addr.sin_family == AF_INET)
+ LIST_REMOVE(ia, ia_hash);
IFAFREE(&ia->ia_ifa);
splx(s);
>>> TRUNCATED FOR MAIL (1000 lines) <<<