From owner-p4-projects@FreeBSD.ORG Tue May 23 19:09:41 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 38E8816A5D7; Tue, 23 May 2006 19:09:41 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6DB1916A5AA for ; Tue, 23 May 2006 19:09:38 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 22C3E43D46 for ; Tue, 23 May 2006 19:09:38 +0000 (GMT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k4NJ8o00091905 for ; Tue, 23 May 2006 19:08:50 GMT (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k4NJ8oPl091901 for perforce@freebsd.org; Tue, 23 May 2006 19:08:50 GMT (envelope-from marcel@freebsd.org) Date: Tue, 23 May 2006 19:08:50 GMT Message-Id: <200605231908.k4NJ8oPl091901@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Cc: Subject: PERFORCE change 97694 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 May 2006 19:09:41 -0000 http://perforce.freebsd.org/chv.cgi?CH=97694 Change 97694 by marcel@marcel_nfs on 2006/05/23 19:08:16 IFC @97693 Affected files ... .. //depot/projects/uart/arm/sa11x0/assabet_machdep.c#7 integrate .. //depot/projects/uart/arm/sa11x0/sa11x0_io.c#5 integrate .. //depot/projects/uart/arm/sa11x0/sa11x0_reg.h#3 integrate .. //depot/projects/uart/arm/sa11x0/uart_cpu_sa1110.c#3 integrate .. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#45 integrate .. //depot/projects/uart/dev/ubsec/ubsec.c#11 integrate .. //depot/projects/uart/nfs4client/nfs4_vfsops.c#9 integrate .. //depot/projects/uart/nfsclient/nfs.h#7 integrate .. //depot/projects/uart/nfsclient/nfs_node.c#12 integrate .. //depot/projects/uart/nfsclient/nfs_socket.c#13 integrate .. //depot/projects/uart/nfsclient/nfs_vfsops.c#14 integrate .. //depot/projects/uart/nfsclient/nfsmount.h#6 integrate Differences ... ==== //depot/projects/uart/arm/sa11x0/assabet_machdep.c#7 (text+ko) ==== @@ -47,7 +47,7 @@ #include -__FBSDID("$FreeBSD: src/sys/arm/sa11x0/assabet_machdep.c,v 1.11 2006/05/22 23:25:34 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/sa11x0/assabet_machdep.c,v 1.12 2006/05/23 12:14:14 cognet Exp $"); #include "opt_md.h" @@ -156,6 +156,35 @@ void enable_mmu(vm_offset_t); static struct trapframe proc0_tf; +/* Static device mappings. */ +static const struct pmap_devmap assabet_devmap[] = { + /* + * Map the on-board devices VA == PA so that we can access them + * with the MMU on or off. + */ + { + SACOM1_VBASE, + SACOM1_BASE, + SACOM1_SIZE, + VM_PROT_READ|VM_PROT_WRITE, + PTE_NOCACHE, + }, + { + SAIPIC_BASE, + SAIPIC_BASE, + SAIPIC_SIZE, + VM_PROT_READ|VM_PROT_WRITE, + PTE_NOCACHE, + }, + { + 0, + 0, + 0, + 0, + 0, + } +}; + struct arm32_dma_range * bus_dma_get_range(void) { @@ -336,11 +365,8 @@ /* Map the vector page. */ pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); - /* Map SACOM1. */ - pmap_map_entry(l1pagetable, SACOM1_VBASE, SACOM1_BASE, - VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE); - pmap_map_entry(l1pagetable, 0x90050000, 0x90050000, - VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE); + /* Map the statically mapped devices. */ + pmap_devmap_bootstrap(l1pagetable, assabet_devmap); pmap_map_chunk(l1pagetable, sa1_cache_clean_addr, 0xf0000000, CPU_SA110_CACHE_CLEAN_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); ==== //depot/projects/uart/arm/sa11x0/sa11x0_io.c#5 (text+ko) ==== @@ -41,7 +41,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/arm/sa11x0/sa11x0_io.c,v 1.7 2006/05/18 22:03:47 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/sa11x0/sa11x0_io.c,v 1.8 2006/05/23 12:14:14 cognet Exp $"); #include #include #include @@ -146,6 +146,13 @@ u_long startpa, endpa, pa; vm_offset_t va; pt_entry_t *pte; + const struct pmap_devmap *pd; + + if ((pd = pmap_devmap_find_pa(bpa, size)) != NULL) { + /* Device was statically mapped. */ + *bshp = pd->pd_va + (bpa - pd->pd_pa); + return 0; + } startpa = trunc_page(bpa); endpa = round_page(bpa + size); ==== //depot/projects/uart/arm/sa11x0/sa11x0_reg.h#3 (text+ko) ==== @@ -34,7 +34,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/arm/sa11x0/sa11x0_reg.h,v 1.2 2006/05/22 23:25:34 cognet Exp $ + * $FreeBSD: src/sys/arm/sa11x0/sa11x0_reg.h,v 1.3 2006/05/23 12:14:14 cognet Exp $ * */ @@ -48,9 +48,11 @@ #define SARCR_BASE 0x90030000 /* Reset Controller */ #define SAGPIO_BASE 0x90040000 /* GPIO */ #define SAIPIC_BASE 0x90050000 /* Interrupt Controller */ +#define SAIPIC_SIZE 0x24 #define SAPPC_BASE 0x90060000 /* Peripheral Pin Controller */ #define SAUDC_BASE 0x80000000 /* USB Device Controller*/ #define SACOM1_BASE 0x80010000 /* GPCLK/UART 1 */ +#define SACOM1_SIZE 0x24 #define SACOM3_HW_BASE 0x80050000 /* UART 3 */ #define SAMCP_BASE 0x80060000 /* MCP Controller */ #define SASSP_BASE 0x80070000 /* Synchronous serial port */ ==== //depot/projects/uart/arm/sa11x0/uart_cpu_sa1110.c#3 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/arm/sa11x0/uart_cpu_sa1110.c,v 1.3 2005/01/05 21:58:48 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/sa11x0/uart_cpu_sa1110.c,v 1.4 2006/05/23 12:14:14 cognet Exp $"); #include #include @@ -36,6 +36,7 @@ #include #include +#include #include bus_space_tag_t uart_bus_space_io; @@ -57,7 +58,7 @@ di->ops = uart_sa1110_ops; di->bas.chan = 0; di->bas.bst = &sa11x0_bs_tag; - di->bas.bsh = 0x80010000; + di->bas.bsh = SACOM1_BASE; di->bas.regshft = 0; di->bas.rclk = 0; di->baudrate = 9600; ==== //depot/projects/uart/dev/uart/uart_dev_ns8250.c#45 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.22 2006/05/23 00:41:12 benno Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.23 2006/05/23 06:04:45 benno Exp $"); #include #include @@ -232,7 +232,7 @@ static int ns8250_probe(struct uart_bas *bas) { - u_char lcr, val; + u_char val; /* Check known 0 bits that don't depend on DLAB. */ val = uart_getreg(bas, REG_IIR); ==== //depot/projects/uart/dev/ubsec/ubsec.c#11 (text+ko) ==== @@ -39,7 +39,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/ubsec/ubsec.c,v 1.36 2006/05/22 16:18:21 pjd Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ubsec/ubsec.c,v 1.37 2006/05/23 09:02:14 pjd Exp $"); /* * uBsec 5[56]01, 58xx hardware crypto accelerator @@ -1552,7 +1552,6 @@ } if (q != NULL || err == ERESTART) { mtx_lock(&sc->sc_freeqlock); - SIMPLEQ_INSERT_TAIL(&sc->sc_freequeue, q, q_next); if (q != NULL) SIMPLEQ_INSERT_TAIL(&sc->sc_freequeue, q, q_next); if (err == ERESTART) ==== //depot/projects/uart/nfs4client/nfs4_vfsops.c#9 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/sys/nfs4client/nfs4_vfsops.c,v 1.24 2006/05/19 00:04:23 mohans Exp $ */ +/* $FreeBSD: src/sys/nfs4client/nfs4_vfsops.c,v 1.25 2006/05/23 18:48:06 cel Exp $ */ /* $Id: nfs_vfsops.c,v 1.38 2003/11/05 14:59:01 rees Exp $ */ /*- @@ -60,7 +60,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/nfs4client/nfs4_vfsops.c,v 1.24 2006/05/19 00:04:23 mohans Exp $"); +__FBSDID("$FreeBSD: src/sys/nfs4client/nfs4_vfsops.c,v 1.25 2006/05/23 18:48:06 cel Exp $"); #include "opt_bootp.h" #include "opt_nfsroot.h" @@ -245,12 +245,18 @@ int maxio; s = splnet(); + /* * Silently clear NFSMNT_NOCONN if it's a TCP mount, it makes - * no sense in that context. + * no sense in that context. Also, set appropriate retransmit + * and soft timeout behavior. */ - if (argp->sotype == SOCK_STREAM) + if (argp->sotype == SOCK_STREAM) { nmp->nm_flag &= ~NFSMNT_NOCONN; + nmp->nm_flag |= NFSMNT_DUMBTIMR; + nmp->nm_timeo = NFS_MAXTIMEO; + nmp->nm_retry = NFS_RETRANS_TCP; + } nmp->nm_flag &= ~NFSMNT_RDIRPLUS; ==== //depot/projects/uart/nfsclient/nfs.h#7 (text+ko) ==== @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * @(#)nfs.h 8.4 (Berkeley) 5/1/95 - * $FreeBSD: src/sys/nfsclient/nfs.h,v 1.92 2006/05/19 00:04:23 mohans Exp $ + * $FreeBSD: src/sys/nfsclient/nfs.h,v 1.94 2006/05/23 18:48:06 cel Exp $ */ #ifndef _NFSCLIENT_NFS_H_ @@ -53,7 +53,8 @@ #define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */ #define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/ #define NFS_MAXREXMIT 100 /* Stop counting after this many */ -#define NFS_RETRANS 10 /* Num of retrans for soft mounts */ +#define NFS_RETRANS 10 /* Num of retrans for UDP soft mounts */ +#define NFS_RETRANS_TCP 2 /* Num of retrans for TCP soft mounts */ #define NFS_MAXGRPS 16 /* Max. size of groups list */ #ifndef NFS_MINATTRTIMO #define NFS_MINATTRTIMO 3 /* VREG attrib cache timeout in sec */ @@ -257,6 +258,31 @@ #endif +/* + * On fast networks, the estimator will try to reduce the + * timeout lower than the latency of the server's disks, + * which results in too many timeouts, so cap the lower + * bound. + */ +#define NFS_MINRTO (NFS_HZ >> 2) + +/* + * Keep the RTO from increasing to unreasonably large values + * when a server is not responding. + */ +#define NFS_MAXRTO (20 * NFS_HZ) + +enum nfs_rto_timer_t { + NFS_DEFAULT_TIMER, + NFS_GETATTR_TIMER, + NFS_LOOKUP_TIMER, + NFS_READ_TIMER, + NFS_WRITE_TIMER, +}; +#define NFS_MAX_TIMER (NFS_WRITE_TIMER) + +#define NFS_INITRTT (NFS_HZ << 3) + vfs_init_t nfs_init; vfs_uninit_t nfs_uninit; int nfs_mountroot(struct mount *mp, struct thread *td); ==== //depot/projects/uart/nfsclient/nfs_node.c#12 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_node.c,v 1.80 2006/05/19 00:04:24 mohans Exp $"); +__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_node.c,v 1.81 2006/05/23 16:07:23 mohans Exp $"); #include #include @@ -148,6 +148,11 @@ vp->v_bufobj.bo_ops = &buf_ops_nfs; vp->v_data = np; np->n_vnode = vp; + /* + * NFS supports recursive and shared locking. + */ + vp->v_vnlock->lk_flags |= LK_CANRECURSE; + vp->v_vnlock->lk_flags &= ~LK_NOSHARE; error = vfs_hash_insert(vp, hash, LK_EXCLUSIVE, td, &nvp, nfs_vncmpf, &ncmp); if (error) ==== //depot/projects/uart/nfsclient/nfs_socket.c#13 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_socket.c,v 1.140 2006/05/19 00:04:24 mohans Exp $"); +__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_socket.c,v 1.141 2006/05/23 18:33:58 cel Exp $"); /* * Socket operations for use by nfs @@ -79,38 +79,6 @@ extern u_int32_t nfs_xid; -/* - * Estimate rto for an nfs rpc sent via. an unreliable datagram. - * Use the mean and mean deviation of rtt for the appropriate type of rpc - * for the frequent rpcs and a default for the others. - * The justification for doing "other" this way is that these rpcs - * happen so infrequently that timer est. would probably be stale. - * Also, since many of these rpcs are - * non-idempotent, a conservative timeout is desired. - * getattr, lookup - A+2D - * read, write - A+4D - * other - nm_timeo - */ -#define NFS_RTO(n, t) \ - ((t) == 0 ? (n)->nm_timeo : \ - ((t) < 3 ? \ - (((((n)->nm_srtt[t-1] + 3) >> 2) + (n)->nm_sdrtt[t-1] + 1) >> 1) : \ - ((((n)->nm_srtt[t-1] + 7) >> 3) + (n)->nm_sdrtt[t-1] + 1))) -#define NFS_SRTT(r) (r)->r_nmp->nm_srtt[proct[(r)->r_procnum] - 1] -#define NFS_SDRTT(r) (r)->r_nmp->nm_sdrtt[proct[(r)->r_procnum] - 1] - -/* - * Defines which timer to use for the procnum. - * 0 - default - * 1 - getattr - * 2 - lookup - * 3 - read - * 4 - write - */ -static int proct[NFS_NPROCS] = { - 0, 1, 0, 2, 1, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, -}; - static int nfs_realign_test; static int nfs_realign_count; static int nfs_bufpackets = 4; @@ -157,6 +125,132 @@ extern struct mtx nfs_reqq_mtx; /* + * RTT estimator + */ + +static enum nfs_rto_timer_t nfs_proct[NFS_NPROCS] = { + NFS_DEFAULT_TIMER, /* NULL */ + NFS_GETATTR_TIMER, /* GETATTR */ + NFS_DEFAULT_TIMER, /* SETATTR */ + NFS_LOOKUP_TIMER, /* LOOKUP */ + NFS_GETATTR_TIMER, /* ACCESS */ + NFS_READ_TIMER, /* READLINK */ + NFS_READ_TIMER, /* READ */ + NFS_WRITE_TIMER, /* WRITE */ + NFS_DEFAULT_TIMER, /* CREATE */ + NFS_DEFAULT_TIMER, /* MKDIR */ + NFS_DEFAULT_TIMER, /* SYMLINK */ + NFS_DEFAULT_TIMER, /* MKNOD */ + NFS_DEFAULT_TIMER, /* REMOVE */ + NFS_DEFAULT_TIMER, /* RMDIR */ + NFS_DEFAULT_TIMER, /* RENAME */ + NFS_DEFAULT_TIMER, /* LINK */ + NFS_READ_TIMER, /* READDIR */ + NFS_READ_TIMER, /* READDIRPLUS */ + NFS_DEFAULT_TIMER, /* FSSTAT */ + NFS_DEFAULT_TIMER, /* FSINFO */ + NFS_DEFAULT_TIMER, /* PATHCONF */ + NFS_DEFAULT_TIMER, /* COMMIT */ + NFS_DEFAULT_TIMER, /* NOOP */ +}; + +/* + * Choose the correct RTT timer for this NFS procedure. + */ +static inline enum nfs_rto_timer_t +nfs_rto_timer(u_int32_t procnum) +{ + return nfs_proct[procnum]; +} + +/* + * Initialize the RTT estimator state for a new mount point. + */ +static void +nfs_init_rtt(struct nfsmount *nmp) +{ + int i; + + for (i = 0; i < NFS_MAX_TIMER; i++) + nmp->nm_srtt[i] = NFS_INITRTT; + for (i = 0; i < NFS_MAX_TIMER; i++) + nmp->nm_sdrtt[i] = 0; +} + +/* + * Update a mount point's RTT estimator state using data from the + * passed-in request. + * + * Use a gain of 0.125 on the mean and a gain of 0.25 on the deviation. + * + * NB: Since the timer resolution of NFS_HZ is so course, it can often + * result in r_rtt == 0. Since r_rtt == N means that the actual RTT is + * between N + dt and N + 2 - dt ticks, add 1 before calculating the + * update values. + */ +static void +nfs_update_rtt(struct nfsreq *rep) +{ + int t1 = rep->r_rtt + 1; + int index = nfs_rto_timer(rep->r_procnum) - 1; + int *srtt = &rep->r_nmp->nm_srtt[index]; + int *sdrtt = &rep->r_nmp->nm_sdrtt[index]; + + t1 -= *srtt >> 3; + *srtt += t1; + if (t1 < 0) + t1 = -t1; + t1 -= *sdrtt >> 2; + *sdrtt += t1; +} + +/* + * Estimate RTO for an NFS RPC sent via an unreliable datagram. + * + * Use the mean and mean deviation of RTT for the appropriate type + * of RPC for the frequent RPCs and a default for the others. + * The justification for doing "other" this way is that these RPCs + * happen so infrequently that timer est. would probably be stale. + * Also, since many of these RPCs are non-idempotent, a conservative + * timeout is desired. + * + * getattr, lookup - A+2D + * read, write - A+4D + * other - nm_timeo + */ +static int +nfs_estimate_rto(struct nfsmount *nmp, u_int32_t procnum) +{ + enum nfs_rto_timer_t timer = nfs_rto_timer(procnum); + int index = timer - 1; + int rto; + + switch (timer) { + case NFS_GETATTR_TIMER: + case NFS_LOOKUP_TIMER: + rto = ((nmp->nm_srtt[index] + 3) >> 2) + + ((nmp->nm_sdrtt[index] + 1) >> 1); + break; + case NFS_READ_TIMER: + case NFS_WRITE_TIMER: + rto = ((nmp->nm_srtt[index] + 7) >> 3) + + (nmp->nm_sdrtt[index] + 1); + break; + default: + rto = nmp->nm_timeo; + return (rto); + } + + if (rto < NFS_MINRTO) + rto = NFS_MINRTO; + else if (rto > NFS_MAXRTO) + rto = NFS_MAXRTO; + + return (rto); +} + + +/* * Initialize sockets and congestion for a new NFS connection. * We do not free the sockaddr if error. */ @@ -357,10 +451,7 @@ mtx_lock(&nmp->nm_mtx); /* Initialize other non-zero congestion variables */ - nmp->nm_srtt[0] = nmp->nm_srtt[1] = nmp->nm_srtt[2] = - nmp->nm_srtt[3] = (NFS_TIMEO << 3); - nmp->nm_sdrtt[0] = nmp->nm_sdrtt[1] = nmp->nm_sdrtt[2] = - nmp->nm_sdrtt[3] = 0; + nfs_init_rtt(nmp); nmp->nm_cwnd = NFS_MAXCWND / 2; /* Initial send window */ nmp->nm_sent = 0; nmp->nm_timeouts = 0; @@ -685,7 +776,6 @@ caddr_t dpos; u_int32_t rxid, *tl; struct nfsreq *rep; - register int32_t t1; int error; /* @@ -743,27 +833,8 @@ rep->r_flags &= ~R_SENT; nmp->nm_sent -= NFS_CWNDSCALE; } - /* - * Update rtt using a gain of 0.125 on the mean - * and a gain of 0.25 on the deviation. - */ - if (rep->r_flags & R_TIMING) { - /* - * Since the timer resolution of - * NFS_HZ is so course, it can often - * result in r_rtt == 0. Since - * r_rtt == N means that the actual - * rtt is between N+dt and N+2-dt ticks, - * add 1. - */ - t1 = rep->r_rtt + 1; - t1 -= (NFS_SRTT(rep) >> 3); - NFS_SRTT(rep) += t1; - if (t1 < 0) - t1 = -t1; - t1 -= (NFS_SDRTT(rep) >> 2); - NFS_SDRTT(rep) += t1; - } + if (rep->r_flags & R_TIMING) + nfs_update_rtt(rep); nmp->nm_timeouts = 0; wakeup((caddr_t)rep); mtx_unlock(&rep->r_mtx); @@ -1073,7 +1144,7 @@ else rep->r_retry = NFS_MAXREXMIT + 1; /* past clip limit */ rep->r_rtt = rep->r_rexmit = 0; - if (proct[procnum] > 0) + if (nfs_rto_timer(procnum) != NFS_DEFAULT_TIMER) rep->r_flags = R_TIMING; else rep->r_flags = 0; @@ -1328,7 +1399,7 @@ if (nmp->nm_flag & NFSMNT_DUMBTIMR) timeo = nmp->nm_timeo; else - timeo = NFS_RTO(nmp, proct[rep->r_procnum]); + timeo = nfs_estimate_rto(nmp, rep->r_procnum); if (nmp->nm_timeouts > 0) timeo *= nfs_backoff[nmp->nm_timeouts - 1]; if (rep->r_rtt <= timeo) { ==== //depot/projects/uart/nfsclient/nfs_vfsops.c#14 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_vfsops.c,v 1.181 2006/05/19 00:04:24 mohans Exp $"); +__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_vfsops.c,v 1.182 2006/05/23 18:48:07 cel Exp $"); #include "opt_bootp.h" @@ -545,10 +545,15 @@ /* * Silently clear NFSMNT_NOCONN if it's a TCP mount, it makes - * no sense in that context. + * no sense in that context. Also, set up appropriate retransmit + * and soft timeout behavior. */ - if (argp->sotype == SOCK_STREAM) + if (argp->sotype == SOCK_STREAM) { nmp->nm_flag &= ~NFSMNT_NOCONN; + nmp->nm_flag |= NFSMNT_DUMBTIMR; + nmp->nm_timeo = NFS_MAXTIMEO; + nmp->nm_retry = NFS_RETRANS_TCP; + } /* Also clear RDIRPLUS if not NFSv3, it crashes some servers */ if ((argp->flags & NFSMNT_NFSV3) == 0) ==== //depot/projects/uart/nfsclient/nfsmount.h#6 (text+ko) ==== @@ -30,7 +30,7 @@ * SUCH DAMAGE. * * @(#)nfsmount.h 8.3 (Berkeley) 3/30/95 - * $FreeBSD: src/sys/nfsclient/nfsmount.h,v 1.31 2006/05/19 00:04:24 mohans Exp $ + * $FreeBSD: src/sys/nfsclient/nfsmount.h,v 1.32 2006/05/23 18:33:58 cel Exp $ */ #ifndef _NFSCLIENT_NFSMOUNT_H_ @@ -64,8 +64,8 @@ struct sockaddr *nm_nam; /* Addr of server */ int nm_timeo; /* Init timer for NFSMNT_DUMBTIMR */ int nm_retry; /* Max retries */ - int nm_srtt[4]; /* Timers for rpcs */ - int nm_sdrtt[4]; + int nm_srtt[NFS_MAX_TIMER], /* RTT Timers for rpcs */ + nm_sdrtt[NFS_MAX_TIMER]; int nm_sent; /* Request send count */ int nm_cwnd; /* Request send window */ int nm_timeouts; /* Request timeouts */