From owner-svn-src-user@FreeBSD.ORG Sun Sep 6 01:03:20 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6E134106566C; Sun, 6 Sep 2009 01:03:20 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5B8188FC1D; Sun, 6 Sep 2009 01:03:20 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n8613KEH068643; Sun, 6 Sep 2009 01:03:20 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n8613KGD068634; Sun, 6 Sep 2009 01:03:20 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200909060103.n8613KGD068634@svn.freebsd.org> From: Kip Macy Date: Sun, 6 Sep 2009 01:03:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196875 - in user/kmacy/releng_7_2_fcs_1/sys: compat/freebsd32 kern sys X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Sep 2009 01:03:20 -0000 Author: kmacy Date: Sun Sep 6 01:03:19 2009 New Revision: 196875 URL: http://svn.freebsd.org/changeset/base/196875 Log: - make parallel sendfile request handling more robust - eliminate per-write memory allocation Modified: user/kmacy/releng_7_2_fcs_1/sys/compat/freebsd32/freebsd32_misc.c user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_sockbuf.c user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c user/kmacy/releng_7_2_fcs_1/sys/sys/sockbuf.h user/kmacy/releng_7_2_fcs_1/sys/sys/socket.h user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h user/kmacy/releng_7_2_fcs_1/sys/sys/syscallsubr.h Modified: user/kmacy/releng_7_2_fcs_1/sys/compat/freebsd32/freebsd32_misc.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/compat/freebsd32/freebsd32_misc.c Sat Sep 5 23:23:49 2009 (r196874) +++ user/kmacy/releng_7_2_fcs_1/sys/compat/freebsd32/freebsd32_misc.c Sun Sep 6 01:03:19 2009 (r196875) @@ -1861,7 +1861,8 @@ freebsd32_do_sendfile(struct thread *td, } } - error = kern_sendfile(td, &ap, hdr_uio, trl_uio, compat); + error = kern_sendfile(td, &ap, hdr_uio, trl_uio, compat, + NULL, NULL, NULL); out: if (hdr_uio) free(hdr_uio, M_IOV); Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_sockbuf.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_sockbuf.c Sat Sep 5 23:23:49 2009 (r196874) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_sockbuf.c Sun Sep 6 01:03:19 2009 (r196875) @@ -133,7 +133,7 @@ sbwait(struct sockbuf *sb) } int -sblock(struct sockbuf *sb, int flags) +_sblock(struct sockbuf *sb, int flags, const char *file, int line) { KASSERT((flags & SBL_VALID) == flags, @@ -142,12 +142,12 @@ sblock(struct sockbuf *sb, int flags) if (flags & SBL_WAIT) { if ((sb->sb_flags & SB_NOINTR) || (flags & SBL_NOINTR)) { - sx_xlock(&sb->sb_sx); + _sx_xlock(&sb->sb_sx, 0, file, line); return (0); } - return (sx_xlock_sig(&sb->sb_sx)); + return (_sx_xlock(&sb->sb_sx, SX_INTERRUPTIBLE, file, line)); } else { - if (sx_try_xlock(&sb->sb_sx) == 0) + if (_sx_try_xlock(&sb->sb_sx, file, line) == 0) return (EWOULDBLOCK); return (0); } @@ -882,8 +882,6 @@ sbdrop_internal(struct sockbuf *sb, int } } -extern void sosendingwakeup(void *unused __unused); - /* * Drop data from (the front of) a sockbuf. */ @@ -895,7 +893,7 @@ sbdrop_locked(struct sockbuf *sb, int le sbdrop_internal(sb, len); if (sb->sb_flags & SB_SENDING) - sosendingwakeup(NULL); + sosendingwakeup(sb); } void Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sat Sep 5 23:23:49 2009 (r196874) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sun Sep 6 01:03:19 2009 (r196875) @@ -133,6 +133,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -3108,45 +3109,77 @@ soisdisconnected(struct socket *so) struct socketref { struct proc *sr_proc; + struct ucred *sr_ucred; struct file *sr_sock_fp; struct file *sr_fp; + struct socket *sr_so; struct sendfile_args sr_uap; struct uio sr_hdr_uio; struct uio sr_trl_uio; - int sr_compat; + short sr_compat; int sr_magic; + struct task sr_task; TAILQ_ENTRY(socketref) entry; }; TAILQ_HEAD(srq, socketref); -struct socketref_object { - struct srq sro_srh; - struct task sro_task; -}; - struct srq *sendfile_bg_queue; struct mtx sendfile_bg_lock; struct callout *sendfile_callout; struct taskqueue *sendfile_tq; extern int getsock(struct filedesc *fdp, int fd, struct file **fpp, u_int *fflagp); +static void sendfile_task_func(void *context, int pending __unused); +static int srsendingwakeup(struct socketref *sr); MALLOC_DEFINE(M_SOCKREF, "sockref", "socket reference memory"); +#define SOCKBUF_LOCK_COND(sb, lockflag) do { \ + if ((lockflag)) \ + SOCKBUF_LOCK((sb)); \ +} while (0) + +#define SOCKBUF_UNLOCK_COND(sb, lockflag) do { \ + if ((lockflag)) \ + SOCKBUF_UNLOCK((sb)); \ +} while (0) + + +static void +socketref_free(struct socketref *sr) +{ + struct thread *td; + struct file *fp = sr->sr_fp; + struct file *sock_fp = sr->sr_sock_fp; + struct proc *p = sr->sr_proc; + struct ucred *cred = sr->sr_ucred; + + if (cred != NULL) + crfree(cred); + vrele(fp->f_vnode); + fdrop(fp, NULL); + fdrop(sock_fp, NULL); + PRELE(p); +#ifdef INVARIANTS + bzero(sr, sizeof(*sr)); +#endif + free(sr, M_SOCKREF); +} + void soissending(struct socket *so, struct thread *td, struct sendfile_args *uap, struct uio *hdr_uio, - struct uio *trl_uio, int compat) + struct uio *trl_uio, int compat, int sbytes) { struct socketref *ref; - struct srq *srh; int error; struct socket *refso; + struct vnode *vp; SOCKBUF_LOCK_ASSERT(&so->so_snd); ref = malloc(sizeof(struct socketref), - M_SOCKREF, M_NOWAIT); + M_SOCKREF, M_NOWAIT|M_ZERO); if (ref == NULL) return; /* @@ -3154,36 +3187,43 @@ soissending(struct socket *so, struct th * drop when done sending */ so->so_snd.sb_flags |= SB_SENDING; + PROC_LOCK(td->td_proc); + td->td_proc->p_lock++; + PROC_UNLOCK(td->td_proc); + ref->sr_proc = td->td_proc; if ((error = getsock(td->td_proc->p_fd, uap->s, &ref->sr_sock_fp, NULL)) != 0) { - free(ref, M_DEVBUF); - return; + goto error; } if (ref->sr_sock_fp->f_type != DTYPE_SOCKET) { printf("socket descriptor s=%d is not socket", uap->s); - free(ref, M_DEVBUF); - return; + goto error; } refso = ref->sr_sock_fp->f_data; if (refso != so) { printf("socket mismatch between refso: %p so: %p\n", refso, so); - free(ref, M_DEVBUF); - return; + goto error_sock_fp; } - + ref->sr_so = refso; + if ((error = fget(td, uap->fd, &ref->sr_fp)) != 0) { - fdrop(ref->sr_sock_fp, td); - free(ref, M_DEVBUF); - return; + goto error_sock_fp; + } else if (ref->sr_fp->f_vnode != NULL) { + vp = ref->sr_fp->f_vnode; + vref(vp); + } else { + goto error_fp; } bcopy(uap, &ref->sr_uap, sizeof(*uap)); ref->sr_uap.sbytes = NULL; - + ref->sr_uap.offset += sbytes; + if (uap->nbytes) + ref->sr_uap.nbytes -= sbytes; /* * XXX * We have to malloc memory for the uio data @@ -3196,231 +3236,192 @@ soissending(struct socket *so, struct th sizeof(*trl_uio)); ref->sr_compat = compat; ref->sr_magic = 0xCAFEBABE; + TASK_INIT(&ref->sr_task, 0, sendfile_task_func, ref); + CTR3(KTR_SPARE2, "enqueueing socket %p sock_fp %p s %d", so, ref->sr_sock_fp, uap->s); mtx_lock(&sendfile_bg_lock); - srh = sendfile_bg_queue; - TAILQ_INSERT_HEAD(srh, ref, entry); + TAILQ_INSERT_TAIL(sendfile_bg_queue, ref, entry); mtx_unlock(&sendfile_bg_lock); -} - -static void -socketref_free(struct socketref *sr) -{ - struct thread *td = curthread; - - fdrop(sr->sr_sock_fp, td); - fdrop(sr->sr_fp, td); - free(sr, M_SOCKREF); + return; +error_fp: + fdrop(ref->sr_fp, td); +error_sock_fp: + fdrop(ref->sr_sock_fp, td); +error: + free(ref, M_DEVBUF); } static void sendfile_task_func(void *context, int pending __unused) { - struct socketref_object *sro; - struct srq *sh; - struct socketref *sr, *srtmp; + struct socketref *sr; struct socket *so; struct sockbuf *sb; - struct proc *p; - struct thread *td; struct file *sock_fp, *fp; int error, writeable; + struct uio *hdr_uio = NULL, *trl_uio = NULL; + off_t sbytes; - sro = context; - sh = &sro->sro_srh; - td = curthread; - + sr = context; CTR0(KTR_SPARE2, "task_func running"); - while (!TAILQ_EMPTY(sh)) { - sr = TAILQ_FIRST(sh); - TAILQ_REMOVE(sh, sr, entry); - if (sr->sr_magic != 0xCAFEBABE) { - printf("bad magic! 0x%x\n", sr->sr_magic); - continue; - } - p = td->td_proc; - td->td_proc = sr->sr_proc; - sock_fp = sr->sr_sock_fp; - - CTR2(KTR_SPARE2, "processing sr %p sock_fp %p", sr, sock_fp); - if (sock_fp->f_type != DTYPE_SOCKET) - goto done; + if (sr->sr_magic != 0xCAFEBABE) { + printf("bad magic! 0x%x\n", sr->sr_magic); + /* XXX memory leak */ + return; + } + + sock_fp = sr->sr_sock_fp; + fp = sr->sr_fp; + CTR2(KTR_SPARE2, "processing sr %p sock_fp %p", sr, sock_fp); + if (sock_fp->f_type != DTYPE_SOCKET) + goto done; - so = sock_fp->f_data; - CTR1(KTR_SPARE2, "task processing socket %p", so); + so = sock_fp->f_data; + CTR1(KTR_SPARE2, "task processing socket %p", so); - if ((so->so_state & SS_ISCONNECTED) == 0) - goto done; - sb = &so->so_snd; - fp = sr->sr_fp; + if ((so->so_state & SS_ISCONNECTED) == 0) + goto done; - SOCKBUF_LOCK(sb); - sb->sb_flags &= ~SB_SENDING; - if (so->so_snd.sb_state & SBS_CANTSENDMORE) { - CTR1(KTR_SPARE2, "task expired socket %p", so); - sowwakeup_locked(so); - } else if (sowriteable(so)) { - off_t sbytes; + if (sr->sr_ucred == NULL && + (sr->sr_ucred = crdup(sr->sr_proc->p_ucred)) == NULL) + goto done; - sb->sb_flags |= SB_SENDING; + sb = &so->so_snd; + SOCKBUF_UNLOCK_ASSERT(sb); + SOCKBUF_LOCK(sb); + sb->sb_flags &= ~SB_SENDING; + if (sb->sb_state & SBS_CANTSENDMORE) { + CTR1(KTR_SPARE2, "SBS_CANTSENDMORE - socket %p", so); + sowwakeup_locked(so); + goto done; + } else if (sowriteable(so)) { + sb->sb_flags |= SB_SENDING; + SOCKBUF_UNLOCK(sb); + if (sr->sr_hdr_uio.uio_td != NULL) + hdr_uio = &sr->sr_hdr_uio; + if (sr->sr_trl_uio.uio_td != NULL) + trl_uio = &sr->sr_trl_uio; + + sr->sr_uap.sbytes = &sbytes; + sr->sr_uap.flags |= SF_TASKQ; + CTR1(KTR_SPARE2, "task sending on socket %p", so); + + error = kern_sendfile(curthread, &sr->sr_uap, + hdr_uio, trl_uio, + sr->sr_compat, fp, so, sr->sr_ucred); + atomic_add_long(&fp->f_sfbytes, sbytes); + sr->sr_uap.offset += sbytes; + if (sr->sr_uap.nbytes) + sr->sr_uap.nbytes -= sbytes; + /* + * XXX we have a race here + * - if sbdrop is called before a re-enqueue, + * we'll have a lost wakeup ... maybe call + * sosendingwakup? Or check for sowriteable(so) + */ + SOCKBUF_LOCK(sb); + if (error == EAGAIN && srsendingwakeup(sr) != ENOTCONN) { SOCKBUF_UNLOCK(sb); - sr->sr_uap.sbytes = &sbytes; - CTR1(KTR_SPARE2, "task sending on socket %p", so); - error = kern_sendfile(td, &sr->sr_uap, - &sr->sr_hdr_uio, &sr->sr_trl_uio, - sr->sr_compat); - atomic_add_long(&fp->f_sfbytes, sbytes); - if (error != EAGAIN) { - SOCKBUF_LOCK(sb); - sb->sb_flags &= ~SB_SENDING; - sowwakeup_locked(so); - } + return; } - td->td_proc = p; - done: - fdrop(fp, td); - fdrop(sr->sr_sock_fp, td); - free(sr, M_DEVBUF); - } - free(sro, M_DEVBUF); + } + sb->sb_flags &= ~SB_SENDING; + sowwakeup_locked(so); +done: + SOCKBUF_UNLOCK_ASSERT(sb); + socketref_free(sr); } -#define SOCKBUF_LOCK_COND(sb, lockflag) do { \ - if ((lockflag)) \ - SOCKBUF_LOCK((sb)); \ -} while (0) - -#define SOCKBUF_UNLOCK_COND(sb, lockflag) do { \ - if ((lockflag)) \ - SOCKBUF_UNLOCK((sb)); \ -} while (0) - - -void -sosendingwakeup(void *unused __unused) +static int +srsendingwakeup(struct socketref *sr) { - struct socketref *sr, *srtmp; - struct srq *srh_local, *srh_global, srh_tmp; - struct socketref_object *sro; - struct task *srh_task; struct socket *so; - struct sockbuf *sb; struct file *fp; - struct proc *p; - struct thread *td; - int writeable, sblockneeded; + struct sockbuf *sb; + + if (sr->sr_magic != 0xCAFEBABE) { + printf("bad magic! sr: %p magic : 0x%x in %s\n", + sr, sr->sr_magic, __FUNCTION__); + /* + * XXX leak - should be assert perhaps + * + */ + return (0); + } - srh_global = sendfile_bg_queue; - if (!TAILQ_EMPTY(srh_global)) { - TAILQ_INIT(&srh_tmp); + fp = sr->sr_sock_fp; + CTR2(KTR_SPARE2, "processing s %d sock_fp %p", sr->sr_uap.s, fp); + if (fp->f_type != DTYPE_SOCKET) { + CTR1(KTR_SPARE2, "not socket - type %d", fp->f_type); + goto error; + } + so = fp->f_data; + if ((so->so_state & SS_ISCONNECTED) == 0) { + CTR0(KTR_SPARE2, "not connected %p"); + goto error; + } + + CTR1(KTR_SPARE2, "processing socket %p", so); + sb = &so->so_snd; + SOCKBUF_LOCK_ASSERT(sb); + if (sb->sb_state & SBS_CANTSENDMORE) { + ; + } else if (sowriteable(so)) { + CTR2(KTR_SPARE2, "enqueue socket to task %p sr %p", so, sr); + sb->sb_flags |= SB_SENDING; + taskqueue_enqueue(sendfile_tq, &sr->sr_task); + } else { mtx_lock(&sendfile_bg_lock); - TAILQ_CONCAT(&srh_tmp, srh_global, entry); + TAILQ_INSERT_TAIL(sendfile_bg_queue, sr, entry); mtx_unlock(&sendfile_bg_lock); - if (TAILQ_EMPTY(&srh_tmp)) - goto done; + } + return (0); +error: + return (ENOTCONN); +} - if ((sro = malloc(sizeof(struct socketref_object), - M_DEVBUF, M_NOWAIT)) == NULL) - goto done; - - srh_local = &sro->sro_srh; - srh_task = &sro->sro_task; - TAILQ_INIT(srh_local); - TASK_INIT(srh_task, 0, sendfile_task_func, sro); - CTR0(KTR_SPARE2, "processing pcpu list"); - } else - goto done; +void +sosendingwakeup(struct sockbuf *sb) +{ + struct socketref *sr = NULL; - td = curthread; - p = td->td_proc; - TAILQ_FOREACH_SAFE(sr, &srh_tmp, entry, srtmp) { - fp = sr->sr_sock_fp; - td->td_proc = sr->sr_proc; - CTR2(KTR_SPARE2, "processing s %d sock_fp %p", sr->sr_uap.s, fp); - - if (fp->f_type != DTYPE_SOCKET) { - CTR1(KTR_SPARE2, "not socket - type %d", fp->f_type); - goto next; - } - so = fp->f_data; - if ((so->so_state & SS_ISCONNECTED) == 0) { - CTR0(KTR_SPARE2, "not connected %p"); - goto next; + SOCKBUF_LOCK_ASSERT(sb); + mtx_lock(&sendfile_bg_lock); + if (!TAILQ_EMPTY(sendfile_bg_queue)) { + TAILQ_FOREACH(sr, sendfile_bg_queue, entry) { + if (sb == &sr->sr_so->so_snd) { + sb->sb_flags &= ~SB_SENDING; + TAILQ_REMOVE(sendfile_bg_queue, sr, entry); + break; + } } - CTR1(KTR_SPARE2, "processing socket %p", so); - sb = &so->so_snd; - sblockneeded = !SOCKBUF_OWNED(sb); - writeable = 0; - SOCKBUF_LOCK_COND(sb, sblockneeded); - sb->sb_flags &= ~SB_SENDING; - if (sb->sb_state & SBS_CANTSENDMORE) { - SOCKBUF_UNLOCK_COND(sb, sblockneeded); - goto next; - } else { - writeable = sowriteable(so); - sb->sb_flags |= SB_SENDING; - SOCKBUF_UNLOCK_COND(sb, sblockneeded); - } - - if (writeable) { - CTR2(KTR_SPARE2, "enqueue socket to task %p sr %p", so, sr); - TAILQ_REMOVE(&srh_tmp, sr, entry); - TAILQ_INSERT_HEAD(srh_local, sr, entry); - } - if (sr->sr_magic != 0xCAFEBABE) - printf("bad magic! 0x%x in %s\n", - sr->sr_magic, __FUNCTION__); - - continue; - next: - CTR1(KTR_SPARE2, "freeing expired socket %p", so); - TAILQ_REMOVE(&srh_tmp, sr, entry); - socketref_free(sr); - } - td->td_proc = p; - if (!TAILQ_EMPTY(&srh_tmp)) { - mtx_lock(&sendfile_bg_lock); - TAILQ_CONCAT(srh_global, &srh_tmp, entry); - mtx_unlock(&sendfile_bg_lock); } + mtx_unlock(&sendfile_bg_lock); - if (!TAILQ_EMPTY(srh_local)) { - taskqueue_enqueue(sendfile_tq, srh_task); - } else { - free(sro, M_DEVBUF); + /* + * Buffer in flight + */ + if (sr != NULL && srsendingwakeup(sr) == ENOTCONN) { + CTR2(KTR_SPARE2, "freeing expired socket %p ref %p", + sr->sr_so, sr); + socketref_free(sr); } -done: - if (!callout_pending(sendfile_callout)) - callout_reset(sendfile_callout, MAX(hz/10, 1), - sosendingwakeup, NULL); } static void init_bgsend(void *unused __unused) { - struct srq *srh; sendfile_tq = taskqueue_create("sendfile background taskq", M_NOWAIT, taskqueue_thread_enqueue, &sendfile_tq); - taskqueue_start_threads(&sendfile_tq, 1, PI_NET, + taskqueue_start_threads(&sendfile_tq, 4, PI_SOFT, "sendfile background taskq"); - printf("init_bgsend mp_maxid: %d all_cpus 0x%x\n", - mp_maxid, all_cpus); - mtx_init(&sendfile_bg_lock, "sendfile bg", NULL, MTX_DEF); - sendfile_callout = malloc(sizeof(struct callout), + sendfile_bg_queue = malloc(sizeof(struct srq), M_DEVBUF, M_NOWAIT); - srh = sendfile_bg_queue = malloc(sizeof(struct srq), - M_DEVBUF, M_NOWAIT); - TAILQ_INIT(srh); - - callout_init(sendfile_callout, TRUE); - callout_reset(sendfile_callout, MAX(hz/10, 1), - sosendingwakeup, NULL); - - printf("init_bgsend done\n"); + TAILQ_INIT(sendfile_bg_queue); } SYSINIT(init_bgsend, SI_SUB_SMP, SI_ORDER_ANY, init_bgsend, NULL); Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Sat Sep 5 23:23:49 2009 (r196874) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Sun Sep 6 01:03:19 2009 (r196875) @@ -1747,7 +1747,8 @@ do_sendfile(struct thread *td, struct se } } - error = kern_sendfile(td, uap, hdr_uio, trl_uio, compat); + error = kern_sendfile(td, uap, hdr_uio, trl_uio, compat, + NULL, NULL, NULL); out: if (hdr_uio) free(hdr_uio, M_IOV); @@ -1776,7 +1777,8 @@ freebsd4_sendfile(struct thread *td, str int kern_sendfile(struct thread *td, struct sendfile_args *uap, - struct uio *hdr_uio, struct uio *trl_uio, int compat) + struct uio *hdr_uio, struct uio *trl_uio, int compat, + struct file *bgfp, struct socket *bgso, struct ucred *bgcred) { struct file *sock_fp, *fp = NULL; struct vnode *vp; @@ -1785,30 +1787,39 @@ kern_sendfile(struct thread *td, struct struct mbuf *m = NULL; struct sf_buf *sf; struct vm_page *pg; + struct ucred *cred; off_t off, xfsize, fsbytes = 0, sbytes = 0, rem = 0; int error, hdrlen = 0, mnw = 0; int vfslocked; + if (bgcred != NULL) + cred = bgcred; + else + cred = td->td_ucred; + /* * The file descriptor must be a regular file and have a * backing VM object. * File offset must be positive. If it goes beyond EOF * we send only the header/trailer and no payload data. */ - if ((error = fget_read(td, uap->fd, &fp)) != 0) - goto out; - else { - if (fp->f_vnode == NULL) { - fdrop(fp, td); - error = EINVAL; + if ((uap->flags & SF_TASKQ) == 0) { + if ((error = fget_read(td, uap->fd, &fp)) != 0) goto out; - } else { - vp = fp->f_vnode; - vref(vp); + else { + if (fp->f_vnode == NULL) { + fdrop(fp, td); + error = EINVAL; + goto out; + } else { + vp = fp->f_vnode; + vref(vp); + } } + } else { + vp = bgfp->f_vnode; } - - + vfslocked = VFS_LOCK_GIANT(vp->v_mount); vn_lock(vp, LK_SHARED | LK_RETRY, curthread); if (vp->v_type == VREG) { @@ -1841,30 +1852,35 @@ kern_sendfile(struct thread *td, struct goto out; } - /* - * The socket must be a stream socket and connected. - * Remember if it a blocking or non-blocking socket. - */ - if ((error = getsock(td->td_proc->p_fd, uap->s, &sock_fp, - NULL)) != 0) - goto out; - so = sock_fp->f_data; - if (so->so_type != SOCK_STREAM) { - error = EINVAL; - goto out; - } - if ((so->so_state & SS_ISCONNECTED) == 0) { - error = ENOTCONN; - goto out; + if ((uap->flags & SF_TASKQ) == 0) { + /* + * The socket must be a stream socket and connected. + * Remember if it a blocking or non-blocking socket. + */ + if ((error = getsock(td->td_proc->p_fd, uap->s, &sock_fp, + NULL)) != 0) + goto out; + so = sock_fp->f_data; + if (so->so_type != SOCK_STREAM) { + error = EINVAL; + goto out; + } + if ((so->so_state & SS_ISCONNECTED) == 0) { + error = ENOTCONN; + goto out; + } + } else { + so = bgso; } SOCKBUF_LOCK(&so->so_snd); - if (((so->so_snd.sb_flags & SB_SENDING) == 0) && fp->f_sfbytes != 0) { + if ((uap->flags & SF_TASKQ) == 0 && + sock_fp->f_sfbytes != 0) { SOCKBUF_UNLOCK(&so->so_snd); if (uap->sbytes != NULL) { copyout(&sbytes, uap->sbytes, sizeof(off_t)); + sock_fp->f_sfbytes = 0; } - fp->f_sfbytes = 0; error = 0; goto out; } @@ -1880,7 +1896,7 @@ kern_sendfile(struct thread *td, struct #ifdef MAC SOCK_LOCK(so); - error = mac_check_socket_send(td->td_ucred, so); + error = mac_check_socket_send(cred, so); SOCK_UNLOCK(so); if (error) goto out; @@ -1971,7 +1987,8 @@ retry_space: (space <= 0 || space < so->so_snd.sb_lowat)) { if (so->so_state & SS_NBIO) { - soissending(so, td, uap, hdr_uio, trl_uio, compat); + if ((so->so_snd.sb_flags & SB_SENDING) == 0) + soissending(so, td, uap, hdr_uio, trl_uio, compat, sbytes); SOCKBUF_UNLOCK(&so->so_snd); error = EAGAIN; goto done; @@ -2090,7 +2107,7 @@ retry_space: error = vn_rdwr(UIO_READ, vp, NULL, MAXBSIZE, trunc_page(off), UIO_NOCOPY, IO_NODELOCKED | IO_VMIO | ((MAXBSIZE / bsize) << IO_SEQSHIFT), - td->td_ucred, NOCRED, &resid, td); + cred, NOCRED, &resid, td); VOP_UNLOCK(vp, 0, curthread); VFS_UNLOCK_GIANT(vfslocked); VM_OBJECT_LOCK(obj); @@ -2233,15 +2250,17 @@ out: } if (obj != NULL) vm_object_deallocate(obj); - if (vp != NULL) { - vfslocked = VFS_LOCK_GIANT(vp->v_mount); - vrele(vp); - VFS_UNLOCK_GIANT(vfslocked); + if ((uap->flags & SF_TASKQ) == 0) { + if (vp != NULL) { + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + vrele(vp); + VFS_UNLOCK_GIANT(vfslocked); + } + if (so) + fdrop(sock_fp, td); + if (fp) + fdrop(fp, td); } - if (so) - fdrop(sock_fp, td); - if (fp) - fdrop(fp, td); if (m) m_freem(m); Modified: user/kmacy/releng_7_2_fcs_1/sys/sys/sockbuf.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/sys/sockbuf.h Sat Sep 5 23:23:49 2009 (r196874) +++ user/kmacy/releng_7_2_fcs_1/sys/sys/sockbuf.h Sun Sep 6 01:03:19 2009 (r196875) @@ -153,9 +153,12 @@ struct mbuf * sbsndptr(struct sockbuf *sb, u_int off, u_int len, u_int *moff); void sbtoxsockbuf(struct sockbuf *sb, struct xsockbuf *xsb); int sbwait(struct sockbuf *sb); -int sblock(struct sockbuf *sb, int flags); +int _sblock(struct sockbuf *sb, int flags, const char *file, int line); void sbunlock(struct sockbuf *sb); +#define sblock(sb, flags) \ + _sblock((sb), (flags), __FILE__, __LINE__) + /* * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? * This is problematical if the fields are unsigned, as the space might Modified: user/kmacy/releng_7_2_fcs_1/sys/sys/socket.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/sys/socket.h Sat Sep 5 23:23:49 2009 (r196874) +++ user/kmacy/releng_7_2_fcs_1/sys/sys/socket.h Sun Sep 6 01:03:19 2009 (r196875) @@ -616,6 +616,7 @@ struct sf_hdtr { */ #define SF_NODISKIO 0x00000001 #define SF_MNOWAIT 0x00000002 +#define SF_TASKQ 0x00000004 #endif #ifndef _KERNEL Modified: user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h Sat Sep 5 23:23:49 2009 (r196874) +++ user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h Sun Sep 6 01:03:19 2009 (r196875) @@ -80,7 +80,9 @@ void soisdisconnected(struct socket *so) void soisdisconnecting(struct socket *so); void soissending(struct socket *so, struct thread *td, struct sendfile_args *uap, - struct uio *hdr_uio, struct uio *trl_uio, int compat); + struct uio *hdr_uio, struct uio *trl_uio, + int compat, int sbytes); +void sosendingwakeup(struct sockbuf *sb); void socantrcvmore(struct socket *so); void socantrcvmore_locked(struct socket *so); void socantsendmore(struct socket *so); Modified: user/kmacy/releng_7_2_fcs_1/sys/sys/syscallsubr.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/sys/syscallsubr.h Sat Sep 5 23:23:49 2009 (r196874) +++ user/kmacy/releng_7_2_fcs_1/sys/sys/syscallsubr.h Sun Sep 6 01:03:19 2009 (r196875) @@ -144,7 +144,8 @@ int kern_semctl(struct thread *td, int s int kern_select(struct thread *td, int nd, fd_set *fd_in, fd_set *fd_ou, fd_set *fd_ex, struct timeval *tvp); int kern_sendfile(struct thread *td, struct sendfile_args *uap, - struct uio *hdr_uio, struct uio *trl_uio, int compat); + struct uio *hdr_uio, struct uio *trl_uio, int compat, + struct file *bgfp, struct socket *bgso, struct ucred *bgcred); int kern_sendit(struct thread *td, int s, struct msghdr *mp, int flags, struct mbuf *control, enum uio_seg segflg); int kern_setgroups(struct thread *td, u_int ngrp, gid_t *groups); From owner-svn-src-user@FreeBSD.ORG Sun Sep 6 18:49:45 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E4F79106566B; Sun, 6 Sep 2009 18:49:45 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D3A448FC13; Sun, 6 Sep 2009 18:49:45 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n86InjSb091606; Sun, 6 Sep 2009 18:49:45 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n86InjVw091602; Sun, 6 Sep 2009 18:49:45 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200909061849.n86InjVw091602@svn.freebsd.org> From: Kip Macy Date: Sun, 6 Sep 2009 18:49:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196899 - in user/kmacy/releng_7_2_fcs_1/sys: kern sys X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Sep 2009 18:49:46 -0000 Author: kmacy Date: Sun Sep 6 18:49:45 2009 New Revision: 196899 URL: http://svn.freebsd.org/changeset/base/196899 Log: clean up byte accounting Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sun Sep 6 18:48:18 2009 (r196898) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sun Sep 6 18:49:45 2009 (r196899) @@ -3170,7 +3170,7 @@ socketref_free(struct socketref *sr) void soissending(struct socket *so, struct thread *td, struct sendfile_args *uap, struct uio *hdr_uio, - struct uio *trl_uio, int compat, int sbytes) + struct uio *trl_uio, int compat, off_t sbytes) { struct socketref *ref; int error; @@ -3190,7 +3190,7 @@ soissending(struct socket *so, struct th PROC_LOCK(td->td_proc); td->td_proc->p_lock++; PROC_UNLOCK(td->td_proc); - + ref->sr_proc = td->td_proc; if ((error = getsock(td->td_proc->p_fd, uap->s, &ref->sr_sock_fp, @@ -3222,6 +3222,7 @@ soissending(struct socket *so, struct th bcopy(uap, &ref->sr_uap, sizeof(*uap)); ref->sr_uap.sbytes = NULL; ref->sr_uap.offset += sbytes; + ref->sr_sock_fp->f_sfbytes = 0; if (uap->nbytes) ref->sr_uap.nbytes -= sbytes; /* @@ -3237,6 +3238,8 @@ soissending(struct socket *so, struct th ref->sr_compat = compat; ref->sr_magic = 0xCAFEBABE; TASK_INIT(&ref->sr_task, 0, sendfile_task_func, ref); + CTR4(KTR_SPARE1, "sock %p off %ld sbytes %ld total_sbytes %ld", + so, ref->sr_uap.offset, sbytes, ref->sr_fp->f_sfbytes); CTR3(KTR_SPARE2, "enqueueing socket %p sock_fp %p s %d", so, ref->sr_sock_fp, uap->s); mtx_lock(&sendfile_bg_lock); @@ -3258,9 +3261,9 @@ sendfile_task_func(void *context, int pe struct socket *so; struct sockbuf *sb; struct file *sock_fp, *fp; - int error, writeable; + int error = EAGAIN; struct uio *hdr_uio = NULL, *trl_uio = NULL; - off_t sbytes; + off_t sbytes = 0; sr = context; CTR0(KTR_SPARE2, "task_func running"); @@ -3313,18 +3316,18 @@ sendfile_task_func(void *context, int pe sr->sr_uap.offset += sbytes; if (sr->sr_uap.nbytes) sr->sr_uap.nbytes -= sbytes; - /* - * XXX we have a race here - * - if sbdrop is called before a re-enqueue, - * we'll have a lost wakeup ... maybe call - * sosendingwakup? Or check for sowriteable(so) - */ + + CTR4(KTR_SPARE1, "sock %p off %ld sbytes %ld total_sbytes %ld", + so, sr->sr_uap.offset, sbytes, fp->f_sfbytes); SOCKBUF_LOCK(sb); - if (error == EAGAIN && srsendingwakeup(sr) != ENOTCONN) { - SOCKBUF_UNLOCK(sb); - return; - } - } + } + + if (error == EAGAIN && srsendingwakeup(sr) != ENOTCONN) { + SOCKBUF_UNLOCK(sb); + return; + } else if (error != EAGAIN) + CTR1(KTR_SPARE1, "error %d", error); + sb->sb_flags &= ~SB_SENDING; sowwakeup_locked(so); done: @@ -3352,25 +3355,27 @@ srsendingwakeup(struct socketref *sr) fp = sr->sr_sock_fp; CTR2(KTR_SPARE2, "processing s %d sock_fp %p", sr->sr_uap.s, fp); if (fp->f_type != DTYPE_SOCKET) { - CTR1(KTR_SPARE2, "not socket - type %d", fp->f_type); + CTR1(KTR_SPARE1, "not socket - type %d", fp->f_type); goto error; } so = fp->f_data; if ((so->so_state & SS_ISCONNECTED) == 0) { - CTR0(KTR_SPARE2, "not connected %p"); + CTR1(KTR_SPARE1, "not connected %p", so); goto error; } CTR1(KTR_SPARE2, "processing socket %p", so); sb = &so->so_snd; SOCKBUF_LOCK_ASSERT(sb); + sb->sb_flags &= ~SB_SENDING; if (sb->sb_state & SBS_CANTSENDMORE) { - ; + CTR1(KTR_SPARE1, "SBS_CANTSENDMORE %p", so); } else if (sowriteable(so)) { CTR2(KTR_SPARE2, "enqueue socket to task %p sr %p", so, sr); sb->sb_flags |= SB_SENDING; taskqueue_enqueue(sendfile_tq, &sr->sr_task); } else { + sb->sb_flags |= SB_SENDING; mtx_lock(&sendfile_bg_lock); TAILQ_INSERT_TAIL(sendfile_bg_queue, sr, entry); mtx_unlock(&sendfile_bg_lock); Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Sun Sep 6 18:48:18 2009 (r196898) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Sun Sep 6 18:49:45 2009 (r196899) @@ -1873,7 +1873,6 @@ kern_sendfile(struct thread *td, struct so = bgso; } - SOCKBUF_LOCK(&so->so_snd); if ((uap->flags & SF_TASKQ) == 0 && sock_fp->f_sfbytes != 0) { SOCKBUF_UNLOCK(&so->so_snd); @@ -1884,7 +1883,7 @@ kern_sendfile(struct thread *td, struct error = 0; goto out; } - SOCKBUF_UNLOCK(&so->so_snd); + /* * Do not wait on memory allocations but return ENOMEM for @@ -2246,7 +2245,10 @@ out: td->td_retval[0] = 0; } if (uap->sbytes != NULL) { - copyout(&sbytes, uap->sbytes, sizeof(off_t)); + if ((uap->flags & SF_TASKQ) == 0) + copyout(&sbytes, uap->sbytes, sizeof(off_t)); + else + *(uap->sbytes) = sbytes; } if (obj != NULL) vm_object_deallocate(obj); Modified: user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h Sun Sep 6 18:48:18 2009 (r196898) +++ user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h Sun Sep 6 18:49:45 2009 (r196899) @@ -81,7 +81,7 @@ void soisdisconnecting(struct socket *so void soissending(struct socket *so, struct thread *td, struct sendfile_args *uap, struct uio *hdr_uio, struct uio *trl_uio, - int compat, int sbytes); + int compat, off_t sbytes); void sosendingwakeup(struct sockbuf *sb); void socantrcvmore(struct socket *so); void socantrcvmore_locked(struct socket *so); From owner-svn-src-user@FreeBSD.ORG Sun Sep 6 19:45:38 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3CDD31065694; Sun, 6 Sep 2009 19:45:38 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2C57D8FC14; Sun, 6 Sep 2009 19:45:38 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n86Jjce8092853; Sun, 6 Sep 2009 19:45:38 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n86JjcP0092851; Sun, 6 Sep 2009 19:45:38 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200909061945.n86JjcP0092851@svn.freebsd.org> From: Kip Macy Date: Sun, 6 Sep 2009 19:45:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196905 - user/kmacy/releng_7_2_fcs_1/sys/kern X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Sep 2009 19:45:38 -0000 Author: kmacy Date: Sun Sep 6 19:45:37 2009 New Revision: 196905 URL: http://svn.freebsd.org/changeset/base/196905 Log: make bg sendfile a toggle Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Sun Sep 6 19:33:13 2009 (r196904) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Sun Sep 6 19:45:37 2009 (r196905) @@ -106,6 +106,10 @@ SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsp SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0, "Number of sendfile(2) sf_bufs in use"); +static int bg_sendfile_enable = 1; +SYSCTL_INT(_kern_ipc, OID_AUTO, bg_sendfile_enable, CTLFLAG_RW, + &bg_sendfile_enable, 0, "Enable background sendfile"); + /* * Convert a user file descriptor to a kernel file entry. A reference on the * file entry is held upon returning. This is lighter weight than @@ -1986,7 +1990,8 @@ retry_space: (space <= 0 || space < so->so_snd.sb_lowat)) { if (so->so_state & SS_NBIO) { - if ((so->so_snd.sb_flags & SB_SENDING) == 0) + if (bg_sendfile_enable && + (so->so_snd.sb_flags & SB_SENDING) == 0) soissending(so, td, uap, hdr_uio, trl_uio, compat, sbytes); SOCKBUF_UNLOCK(&so->so_snd); error = EAGAIN; From owner-svn-src-user@FreeBSD.ORG Sun Sep 6 20:32:17 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7E10C1065672; Sun, 6 Sep 2009 20:32:17 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6DC8B8FC1A; Sun, 6 Sep 2009 20:32:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n86KWHlj093863; Sun, 6 Sep 2009 20:32:17 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n86KWHiO093861; Sun, 6 Sep 2009 20:32:17 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200909062032.n86KWHiO093861@svn.freebsd.org> From: Kip Macy Date: Sun, 6 Sep 2009 20:32:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196906 - user/kmacy/releng_7_2_fcs_1/sys/kern X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Sep 2009 20:32:17 -0000 Author: kmacy Date: Sun Sep 6 20:32:16 2009 New Revision: 196906 URL: http://svn.freebsd.org/changeset/base/196906 Log: - bump taskqueue threads to ncpus - try to improve KTR logging Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sun Sep 6 19:45:37 2009 (r196905) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sun Sep 6 20:32:16 2009 (r196906) @@ -3321,13 +3321,20 @@ sendfile_task_func(void *context, int pe so, sr->sr_uap.offset, sbytes, fp->f_sfbytes); SOCKBUF_LOCK(sb); } - +#ifdef KTR + else + CTR2(KTR_SPARE1, "sock %p off %ld - not writeable in task_func", + so, sr->sr_uap.offset); +#endif if (error == EAGAIN && srsendingwakeup(sr) != ENOTCONN) { SOCKBUF_UNLOCK(sb); return; - } else if (error != EAGAIN) + } +#ifdef KTR + if (error && error != EAGAIN && error != EPIPE) CTR1(KTR_SPARE1, "error %d", error); - +#endif + sb->sb_flags &= ~SB_SENDING; sowwakeup_locked(so); done: @@ -3375,6 +3382,8 @@ srsendingwakeup(struct socketref *sr) sb->sb_flags |= SB_SENDING; taskqueue_enqueue(sendfile_tq, &sr->sr_task); } else { + CTR2(KTR_SPARE1, "sock %p off %ld - not writeable in srsendingwakeup", + so, sr->sr_uap.offset); sb->sb_flags |= SB_SENDING; mtx_lock(&sendfile_bg_lock); TAILQ_INSERT_TAIL(sendfile_bg_queue, sr, entry); @@ -3420,7 +3429,7 @@ init_bgsend(void *unused __unused) sendfile_tq = taskqueue_create("sendfile background taskq", M_NOWAIT, taskqueue_thread_enqueue, &sendfile_tq); - taskqueue_start_threads(&sendfile_tq, 4, PI_SOFT, + taskqueue_start_threads(&sendfile_tq, mp_ncpus, PI_SOFT, "sendfile background taskq"); mtx_init(&sendfile_bg_lock, "sendfile bg", NULL, MTX_DEF); From owner-svn-src-user@FreeBSD.ORG Sun Sep 6 22:50:22 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C67A11065679; Sun, 6 Sep 2009 22:50:22 +0000 (UTC) (envelope-from edwin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9C4258FC08; Sun, 6 Sep 2009 22:50:22 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n86MoMVE096484; Sun, 6 Sep 2009 22:50:22 GMT (envelope-from edwin@svn.freebsd.org) Received: (from edwin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n86MoMOW096481; Sun, 6 Sep 2009 22:50:22 GMT (envelope-from edwin@svn.freebsd.org) Message-Id: <200909062250.n86MoMOW096481@svn.freebsd.org> From: Edwin Groothuis Date: Sun, 6 Sep 2009 22:50:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196908 - in user/edwin/locale/share: . monetdef X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Sep 2009 22:50:22 -0000 Author: edwin Date: Sun Sep 6 22:50:22 2009 New Revision: 196908 URL: http://svn.freebsd.org/changeset/base/196908 Log: Manually translate the WON Currency sign and the EURO currency sign for certain locales. Modified: user/edwin/locale/share/Makefile.def.inc user/edwin/locale/share/monetdef/Makefile Modified: user/edwin/locale/share/Makefile.def.inc ============================================================================== --- user/edwin/locale/share/Makefile.def.inc Sun Sep 6 21:22:24 2009 (r196907) +++ user/edwin/locale/share/Makefile.def.inc Sun Sep 6 22:50:22 2009 (r196908) @@ -8,8 +8,8 @@ CMALIAS_ISCII-DEV= macdevanaga # libiconv doesn't understand iscii-dev, bsdiconv does -ICONV= /home/edwin/libiconv/bin/iconv -ICONV_hi_IN.ISCII-DEV= /usr/bin/iconv +ICONV= iconv +ICONV_hi_IN.ISCII-DEV= bsdiconv # # Calculated variables @@ -148,6 +148,13 @@ ICONV_${ccln}.${cms}= ${ICONV} . if !defined(CMALIAS_${cm}) CMALIAS_${cm}= ${cm} . endif + +. if !defined(TRANSLATION_${cm}) +TRANSLATION_${cm}= +. endif +. for TR in ${TRANSLATION_${cm}} +_TRANSLATION_${cm}+= | awk '{ gsub("${TR:C/:.*//:C/([0-9a-fA-F][0-9a-fA-F])/\\\\x\1/g}", "${TR:C/^.*://:C/([0-9a-fA-F][0-9a-fA-F])/\\\\x\1/g}"); print }' +. endfor .endfor # @@ -174,10 +181,12 @@ ${ccln}.UTF-8.out: ${ccln}.src . for cms in ${CMS_${ccln}} ${ccln}.${cms}.out: ${ccln}.src + cat ${.ALLSRC} \ + ${_TRANSLATION_${cms}} | \ ${ICONV_${ccln}.${cms}} \ -f UTF-8 \ -t ${CMALIAS_${cms}} \ - ${.ALLSRC} > ${.TARGET} \ + > ${.TARGET} \ || rm ${.TARGET} && exit 0 . endfor Modified: user/edwin/locale/share/monetdef/Makefile ============================================================================== --- user/edwin/locale/share/monetdef/Makefile Sun Sep 6 21:22:24 2009 (r196907) +++ user/edwin/locale/share/monetdef/Makefile Sun Sep 6 22:50:22 2009 (r196908) @@ -75,6 +75,11 @@ CCLNLINK_es_ES= eu_ES CCLNLINK_de_CH= fr_CH it_CH CCLNLINK_no_NO= nb_NO nn_NO +# Some locales are not fully one-on-one, therefore need to be +# translated manually. +TRANSLATION_eucKR= E282A9:5C +TRANSLATION_ISO8859-1= E282AC:455552 + # For these locales, create symlinks to the main locale for historical reasons. LEGLINK_ja_JP= jp_JP LEGLINK_zh_Hans_CN= zh_CN @@ -91,8 +96,8 @@ LEGLINK_zh_Hans_CN.GBK2312= zh_CN.GBK # Required variables LCTYPE= LC_NUMERIC LOCALEDIR= /usr/share/locale -ICONV_pt_PT.ISO8859-1= /usr/bin/iconv -ICONV_ko_KR.eucKR= /usr/bin/iconv +#ICONV_pt_PT.ISO8859-1= bsdiconv +#ICONV_ko_KR.eucKR= bsdiconv # For testing only DESTDIR= /home/edwin/locale/new/ From owner-svn-src-user@FreeBSD.ORG Sun Sep 6 22:56:07 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A63081065670; Sun, 6 Sep 2009 22:56:07 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 95BFD8FC12; Sun, 6 Sep 2009 22:56:07 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n86Mu7LC096680; Sun, 6 Sep 2009 22:56:07 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n86Mu7nj096678; Sun, 6 Sep 2009 22:56:07 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200909062256.n86Mu7nj096678@svn.freebsd.org> From: Kip Macy Date: Sun, 6 Sep 2009 22:56:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196909 - user/kmacy/releng_7_2_fcs_1/sys/kern X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Sep 2009 22:56:07 -0000 Author: kmacy Date: Sun Sep 6 22:56:07 2009 New Revision: 196909 URL: http://svn.freebsd.org/changeset/base/196909 Log: simplify KTR reporting Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sun Sep 6 22:50:22 2009 (r196908) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sun Sep 6 22:56:07 2009 (r196909) @@ -3221,8 +3221,10 @@ soissending(struct socket *so, struct th bcopy(uap, &ref->sr_uap, sizeof(*uap)); ref->sr_uap.sbytes = NULL; - ref->sr_uap.offset += sbytes; ref->sr_sock_fp->f_sfbytes = 0; + CTR4(KTR_SPARE1, "sock %p off %ld sbytes %ld total_sbytes %ld", + so, ref->sr_uap.offset, sbytes, ref->sr_fp->f_sfbytes); + ref->sr_uap.offset += sbytes; if (uap->nbytes) ref->sr_uap.nbytes -= sbytes; /* @@ -3238,8 +3240,6 @@ soissending(struct socket *so, struct th ref->sr_compat = compat; ref->sr_magic = 0xCAFEBABE; TASK_INIT(&ref->sr_task, 0, sendfile_task_func, ref); - CTR4(KTR_SPARE1, "sock %p off %ld sbytes %ld total_sbytes %ld", - so, ref->sr_uap.offset, sbytes, ref->sr_fp->f_sfbytes); CTR3(KTR_SPARE2, "enqueueing socket %p sock_fp %p s %d", so, ref->sr_sock_fp, uap->s); mtx_lock(&sendfile_bg_lock); @@ -3312,13 +3312,13 @@ sendfile_task_func(void *context, int pe error = kern_sendfile(curthread, &sr->sr_uap, hdr_uio, trl_uio, sr->sr_compat, fp, so, sr->sr_ucred); + CTR4(KTR_SPARE1, "sock %p off %ld sbytes %ld total_sbytes %ld", + so, sr->sr_uap.offset, sbytes, fp->f_sfbytes); atomic_add_long(&fp->f_sfbytes, sbytes); sr->sr_uap.offset += sbytes; if (sr->sr_uap.nbytes) sr->sr_uap.nbytes -= sbytes; - CTR4(KTR_SPARE1, "sock %p off %ld sbytes %ld total_sbytes %ld", - so, sr->sr_uap.offset, sbytes, fp->f_sfbytes); SOCKBUF_LOCK(sb); } #ifdef KTR From owner-svn-src-user@FreeBSD.ORG Mon Sep 7 00:49:01 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 57489106566B; Mon, 7 Sep 2009 00:49:01 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 467C08FC15; Mon, 7 Sep 2009 00:49:01 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n870n0uV098837; Mon, 7 Sep 2009 00:49:00 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n870n050098833; Mon, 7 Sep 2009 00:49:00 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200909070049.n870n050098833@svn.freebsd.org> From: Kip Macy Date: Mon, 7 Sep 2009 00:49:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196910 - in user/kmacy/releng_7_2_fcs_1/sys: kern sys X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Sep 2009 00:49:01 -0000 Author: kmacy Date: Mon Sep 7 00:49:00 2009 New Revision: 196910 URL: http://svn.freebsd.org/changeset/base/196910 Log: validate against file size Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Sun Sep 6 22:56:07 2009 (r196909) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_socket.c Mon Sep 7 00:49:00 2009 (r196910) @@ -3118,6 +3118,7 @@ struct socketref { struct uio sr_trl_uio; short sr_compat; int sr_magic; + off_t sr_vnp_size; struct task sr_task; TAILQ_ENTRY(socketref) entry; @@ -3170,7 +3171,8 @@ socketref_free(struct socketref *sr) void soissending(struct socket *so, struct thread *td, struct sendfile_args *uap, struct uio *hdr_uio, - struct uio *trl_uio, int compat, off_t sbytes) + struct uio *trl_uio, int compat, off_t sbytes, + off_t vnp_size) { struct socketref *ref; int error; @@ -3239,6 +3241,7 @@ soissending(struct socket *so, struct th sizeof(*trl_uio)); ref->sr_compat = compat; ref->sr_magic = 0xCAFEBABE; + ref->sr_vnp_size = vnp_size; TASK_INIT(&ref->sr_task, 0, sendfile_task_func, ref); CTR3(KTR_SPARE2, "enqueueing socket %p sock_fp %p s %d", so, ref->sr_sock_fp, uap->s); @@ -3319,6 +3322,11 @@ sendfile_task_func(void *context, int pe if (sr->sr_uap.nbytes) sr->sr_uap.nbytes -= sbytes; + if (error == EAGAIN && + (sr->sr_uap.offset + sbytes == sr->sr_vnp_size)) { + CTR0(KTR_SPARE1, "EAGAIN on full send"); + error = 0; + } SOCKBUF_LOCK(sb); } #ifdef KTR Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Sun Sep 6 22:56:07 2009 (r196909) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/uipc_syscalls.c Mon Sep 7 00:49:00 2009 (r196910) @@ -1792,7 +1792,7 @@ kern_sendfile(struct thread *td, struct struct sf_buf *sf; struct vm_page *pg; struct ucred *cred; - off_t off, xfsize, fsbytes = 0, sbytes = 0, rem = 0; + off_t off, xfsize, fsbytes = 0, sbytes = 0, rem = 0, vnp_size = 0; int error, hdrlen = 0, mnw = 0; int vfslocked; @@ -1992,7 +1992,7 @@ retry_space: if (so->so_state & SS_NBIO) { if (bg_sendfile_enable && (so->so_snd.sb_flags & SB_SENDING) == 0) - soissending(so, td, uap, hdr_uio, trl_uio, compat, sbytes); + soissending(so, td, uap, hdr_uio, trl_uio, compat, sbytes, vnp_size); SOCKBUF_UNLOCK(&so->so_snd); error = EAGAIN; goto done; @@ -2054,6 +2054,7 @@ retry_space: done = 1; /* all data sent */ break; } + vnp_size = obj->un_pager.vnp.vnp_size; /* * Don't overflow the send buffer. * Stop here and send out what we've Modified: user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h Sun Sep 6 22:56:07 2009 (r196909) +++ user/kmacy/releng_7_2_fcs_1/sys/sys/sockstate.h Mon Sep 7 00:49:00 2009 (r196910) @@ -81,7 +81,7 @@ void soisdisconnecting(struct socket *so void soissending(struct socket *so, struct thread *td, struct sendfile_args *uap, struct uio *hdr_uio, struct uio *trl_uio, - int compat, off_t sbytes); + int compat, off_t sbytes, off_t vnp_size); void sosendingwakeup(struct sockbuf *sb); void socantrcvmore(struct socket *so); void socantrcvmore_locked(struct socket *so); From owner-svn-src-user@FreeBSD.ORG Mon Sep 7 12:41:20 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D956610656A5; Mon, 7 Sep 2009 12:41:20 +0000 (UTC) (envelope-from edwin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E45628FC15; Mon, 7 Sep 2009 12:41:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n87CfJkW014834; Mon, 7 Sep 2009 12:41:19 GMT (envelope-from edwin@svn.freebsd.org) Received: (from edwin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n87CfJfZ014810; Mon, 7 Sep 2009 12:41:19 GMT (envelope-from edwin@svn.freebsd.org) Message-Id: <200909071241.n87CfJfZ014810@svn.freebsd.org> From: Edwin Groothuis Date: Mon, 7 Sep 2009 12:41:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r196923 - in user/edwin/locale/share: monetdef numericdef timedef X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Sep 2009 12:41:21 -0000 Author: edwin Date: Mon Sep 7 12:41:19 2009 New Revision: 196923 URL: http://svn.freebsd.org/changeset/base/196923 Log: Now that we have a properly working conversion system, we can compare the current FreeBSD locale data directories and compare it to the output we create and fix the differences. Mostly this is upper/lowercase in the timedef format strings plus a bunch of incorrect spaces in the thousand seperators. At this moment we concentrate on the correctness of the conversion, not on the correctness of the data! Modified: user/edwin/locale/share/monetdef/Makefile user/edwin/locale/share/numericdef/Makefile user/edwin/locale/share/numericdef/ca_ES.unicode user/edwin/locale/share/numericdef/de_DE.unicode user/edwin/locale/share/numericdef/es_ES.unicode user/edwin/locale/share/numericdef/fr_FR.unicode user/edwin/locale/share/numericdef/nl_NL.unicode user/edwin/locale/share/numericdef/sl_SI.unicode user/edwin/locale/share/timedef/Makefile user/edwin/locale/share/timedef/ca_ES.unicode user/edwin/locale/share/timedef/cs_CZ.unicode user/edwin/locale/share/timedef/da_DK.unicode user/edwin/locale/share/timedef/de_AT.unicode user/edwin/locale/share/timedef/fi_FI.unicode user/edwin/locale/share/timedef/hr_HR.unicode user/edwin/locale/share/timedef/is_IS.unicode user/edwin/locale/share/timedef/it_IT.unicode user/edwin/locale/share/timedef/ja_JP.unicode user/edwin/locale/share/timedef/mn_MN.unicode user/edwin/locale/share/timedef/pt_BR.unicode user/edwin/locale/share/timedef/ro_RO.unicode user/edwin/locale/share/timedef/sv_SE.unicode user/edwin/locale/share/timedef/tr_TR.unicode Modified: user/edwin/locale/share/monetdef/Makefile ============================================================================== --- user/edwin/locale/share/monetdef/Makefile Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/monetdef/Makefile Mon Sep 7 12:41:19 2009 (r196923) @@ -23,7 +23,7 @@ CMS_kk_KZ= PT154 CMS_ko_KR= eucKR CMS_pl_PL= ISO8859-2 CMS_pt_PT= ISO8859-1 ISO8859-15 -CMS_ru_RU= CP1251 CP855 ISO8859-5 KOI8-R +CMS_ru_RU= CP1251 CP866 ISO8859-5 KOI8-R CMS_uk_UA= CP1251 ISO8859-5 KOI8-U CMS_zh_Hans_CN= GB18030 GB2312 eucCN @@ -94,7 +94,7 @@ LEGLINK_zh_Hans_CN.GBK2312= zh_CN.GBK # # Required variables -LCTYPE= LC_NUMERIC +LCTYPE= LC_MONETARY LOCALEDIR= /usr/share/locale #ICONV_pt_PT.ISO8859-1= bsdiconv #ICONV_ko_KR.eucKR= bsdiconv Modified: user/edwin/locale/share/numericdef/Makefile ============================================================================== --- user/edwin/locale/share/numericdef/Makefile Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/numericdef/Makefile Mon Sep 7 12:41:19 2009 (r196923) @@ -61,7 +61,8 @@ CCLNLINK_de_DE= de_AT CCLNLINK_en_GB.UTF-8= en_IE.UTF-8 CCLNLINK_en_US= en_AU en_CA en_GB en_NZ CCLNLINK_en_US.UTF-8= he_IL.UTF-8 -CCLNLINK_fr_FR= fr_CA fr_CH nl_BE +CCLNLINK_fr_BE= nl_BE +CCLNLINK_fr_FR= fr_CA fr_CH CCLNLINK_it_IT= it_CH CCLNLINK_no_NO= nb_NO nn_NO CCLNLINK_zh_HK.UTF-8= zh_Hant_HK.Big5HKSCS zh_Hant_HK.UTF-8 zh_Hant_TW.Big5 zh_Hant_TW.UTF-8 Modified: user/edwin/locale/share/numericdef/ca_ES.unicode ============================================================================== --- user/edwin/locale/share/numericdef/ca_ES.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/numericdef/ca_ES.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -6,7 +6,7 @@ # decimal_point # thousands_sep - + # grouping, separated by ; -1 # EOF Modified: user/edwin/locale/share/numericdef/de_DE.unicode ============================================================================== --- user/edwin/locale/share/numericdef/de_DE.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/numericdef/de_DE.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -6,7 +6,7 @@ # decimal_point # thousands_sep - + # grouping, separated by ; -1 # EOF Modified: user/edwin/locale/share/numericdef/es_ES.unicode ============================================================================== --- user/edwin/locale/share/numericdef/es_ES.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/numericdef/es_ES.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -6,7 +6,7 @@ # decimal_point # thousands_sep - + # grouping, separated by ; -1 # EOF Modified: user/edwin/locale/share/numericdef/fr_FR.unicode ============================================================================== --- user/edwin/locale/share/numericdef/fr_FR.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/numericdef/fr_FR.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -6,7 +6,7 @@ # decimal_point # thousands_sep - + # grouping, separated by ; -1 # EOF Modified: user/edwin/locale/share/numericdef/nl_NL.unicode ============================================================================== --- user/edwin/locale/share/numericdef/nl_NL.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/numericdef/nl_NL.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -6,7 +6,7 @@ # decimal_point # thousands_sep - + # grouping, separated by ; -1 # EOF Modified: user/edwin/locale/share/numericdef/sl_SI.unicode ============================================================================== --- user/edwin/locale/share/numericdef/sl_SI.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/numericdef/sl_SI.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -6,7 +6,7 @@ # decimal_point # thousands_sep - + # grouping, separated by ; 0;0 # EOF Modified: user/edwin/locale/share/timedef/Makefile ============================================================================== --- user/edwin/locale/share/timedef/Makefile Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/Makefile Mon Sep 7 12:41:19 2009 (r196923) @@ -80,7 +80,7 @@ CMSLINK_sv_SE.ISO8859-1= sv_SE.ISO8859-1 CMSLINK_zh_Hans_CN.GB2312= zh_Hans_CN.GBK # For these locales, also create symlinks to the main locale. -CCLNLINK_en_US.UTF-8= af_ZA.UTF-8 +CCLNLINK_en_US.UTF-8= af_ZA.UTF-8 CCLNLINK_ca_ES= ca_AD ca_IT ca_IT CCLNLINK_de_DE= de_CH CCLNLINK_en_GB= en_AU en_CA en_NZ Modified: user/edwin/locale/share/timedef/ca_ES.unicode ============================================================================== --- user/edwin/locale/share/timedef/ca_ES.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/ca_ES.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -63,7 +63,7 @@ # # c_fmt # -%a%e%b>%X%Y +%a%e%b%X%Y # # am # Modified: user/edwin/locale/share/timedef/cs_CZ.unicode ============================================================================== --- user/edwin/locale/share/timedef/cs_CZ.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/cs_CZ.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -62,7 +62,7 @@ # # x_fmt # -%Y%M%D +%Y%m%d # # c_fmt # @@ -78,7 +78,7 @@ # # date_fmt # -%a>%e%B%Y%X%Z +%a%e%B%Y%X%Z # # Long month names (without case ending) # @@ -101,5 +101,5 @@ dm # # ampm_fmt # -%I%M%S%P +%I%M%S%p # EOF Modified: user/edwin/locale/share/timedef/da_DK.unicode ============================================================================== --- user/edwin/locale/share/timedef/da_DK.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/da_DK.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -98,5 +98,5 @@ dm # # ampm_fmt # -%I%M%S%P +%I%M%S%p # EOF Modified: user/edwin/locale/share/timedef/de_AT.unicode ============================================================================== --- user/edwin/locale/share/timedef/de_AT.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/de_AT.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -59,7 +59,7 @@ # # x_fmt # -%D%m%Y +%d%m%Y # # c_fmt # Modified: user/edwin/locale/share/timedef/fi_FI.unicode ============================================================================== --- user/edwin/locale/share/timedef/fi_FI.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/fi_FI.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -74,7 +74,7 @@ # # date_fmt # -%a%e%b%Y>%X%Z +%a%e%b%Y%X%Z # # Long month names (without case ending) # Modified: user/edwin/locale/share/timedef/hr_HR.unicode ============================================================================== --- user/edwin/locale/share/timedef/hr_HR.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/hr_HR.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -63,7 +63,7 @@ # # c_fmt # -%A%e%b%X%Y +%a%e%b%X%Y # # am # Modified: user/edwin/locale/share/timedef/is_IS.unicode ============================================================================== --- user/edwin/locale/share/timedef/is_IS.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/is_IS.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -59,7 +59,7 @@ # # x_fmt # -%d%M%Y +%d%m%Y # # c_fmt # @@ -75,7 +75,7 @@ # # date_fmt # -%a%e%b>%Y%X%Z +%a%e%b%Y%X%Z # # Long month names (without case ending) # Modified: user/edwin/locale/share/timedef/it_IT.unicode ============================================================================== --- user/edwin/locale/share/timedef/it_IT.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/it_IT.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -94,7 +94,7 @@ # # md_order # -md +dm # # ampm_fmt # Modified: user/edwin/locale/share/timedef/ja_JP.unicode ============================================================================== --- user/edwin/locale/share/timedef/ja_JP.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/ja_JP.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -64,17 +64,17 @@ # # just following tradition... # %a %b %e %H:%M:%S %Y -%a%b%E%T%Y +%a%b%e%T%Y # # am # #εˆε‰ - + # # pm # #午後 - + # # date_fmt # Modified: user/edwin/locale/share/timedef/mn_MN.unicode ============================================================================== --- user/edwin/locale/share/timedef/mn_MN.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/mn_MN.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -59,7 +59,7 @@ # # x_fmt # -%Y%M%D +%Y%m%d # # c_fmt # Modified: user/edwin/locale/share/timedef/pt_BR.unicode ============================================================================== --- user/edwin/locale/share/timedef/pt_BR.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/pt_BR.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -60,7 +60,7 @@ # # x_fmt # -%d%M%Y +%d%m%Y # # c_fmt # Modified: user/edwin/locale/share/timedef/ro_RO.unicode ============================================================================== --- user/edwin/locale/share/timedef/ro_RO.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/ro_RO.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -63,7 +63,7 @@ # # c_fmt # -%a%e%b%Y>%X +%a%e%b%Y%X # # am # Modified: user/edwin/locale/share/timedef/sv_SE.unicode ============================================================================== --- user/edwin/locale/share/timedef/sv_SE.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/sv_SE.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -62,7 +62,7 @@ # # c_fmt # -%a%e%b>%X%Y +%a%e%b%X%Y # # am # Modified: user/edwin/locale/share/timedef/tr_TR.unicode ============================================================================== --- user/edwin/locale/share/timedef/tr_TR.unicode Mon Sep 7 12:39:54 2009 (r196922) +++ user/edwin/locale/share/timedef/tr_TR.unicode Mon Sep 7 12:41:19 2009 (r196923) @@ -77,7 +77,7 @@ # # date_fmt # -%e%b%Y%A%Z%X +%e%b%Y%a%Z%X # # Long month names (without case ending) #