From owner-svn-src-projects@FreeBSD.ORG Sun Jan 29 01:01:42 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 56A4C1065786; Sun, 29 Jan 2012 01:01:42 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3F4B48FC18; Sun, 29 Jan 2012 01:01:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0T11g1Q009023; Sun, 29 Jan 2012 01:01:42 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0T11g2f009016; Sun, 29 Jan 2012 01:01:42 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201201290101.q0T11g2f009016@svn.freebsd.org> From: Rick Macklem Date: Sun, 29 Jan 2012 01:01:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230713 - in projects/nfsv4.1-client/sys/fs: nfs nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 29 Jan 2012 01:01:42 -0000 Author: rmacklem Date: Sun Jan 29 01:01:41 2012 New Revision: 230713 URL: http://svn.freebsd.org/changeset/base/230713 Log: Try and fix the NFSv4.1 client so that it performs server crash recovery correctly. Mainly required the addition of NFSERR_BADSESSION to the NFSv4.0 errors (NFSERR_STALECLIENTID, NFSERR_STALESTATEID) that indicate recovery is required. Also needed to re-initialize the session slot fields and an extra argument to nfsrpc_setclient(), so that it doesn't do a RECLAIM_COMPLETE for the recovery case. Tested minimally against the Linux NFSv4.1 server. Modified: projects/nfsv4.1-client/sys/fs/nfs/nfs_commonkrpc.c projects/nfsv4.1-client/sys/fs/nfs/nfs_var.h projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clport.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Modified: projects/nfsv4.1-client/sys/fs/nfs/nfs_commonkrpc.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfs_commonkrpc.c Sun Jan 29 01:01:35 2012 (r230712) +++ projects/nfsv4.1-client/sys/fs/nfs/nfs_commonkrpc.c Sun Jan 29 01:01:41 2012 (r230713) @@ -975,6 +975,7 @@ if (j >= 10000) printf("n2op=%d n2st=%d\ * reply, so that recovery isn't initiated. */ if ((nd->nd_repstat == NFSERR_STALECLIENTID || + nd->nd_repstat == NFSERR_BADSESSION || nd->nd_repstat == NFSERR_STALESTATEID) && rep != NULL && (rep->r_flags & R_DONTRECOVER)) nd->nd_repstat = NFSERR_STALEDONTRECOVER; Modified: projects/nfsv4.1-client/sys/fs/nfs/nfs_var.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfs_var.h Sun Jan 29 01:01:35 2012 (r230712) +++ projects/nfsv4.1-client/sys/fs/nfs/nfs_var.h Sun Jan 29 01:01:41 2012 (r230713) @@ -367,7 +367,7 @@ int nfsrpc_closerpc(struct nfsrv_descrip struct nfsclopen *, struct ucred *, NFSPROC_T *, int); int nfsrpc_openconfirm(vnode_t, u_int8_t *, int, struct nfsclopen *, struct ucred *, NFSPROC_T *); -int nfsrpc_setclient(struct nfsmount *, struct nfsclclient *, +int nfsrpc_setclient(struct nfsmount *, struct nfsclclient *, int, struct ucred *, NFSPROC_T *); int nfsrpc_getattr(vnode_t, struct ucred *, NFSPROC_T *, struct nfsvattr *, void *); Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sun Jan 29 01:01:35 2012 (r230712) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sun Jan 29 01:01:41 2012 (r230713) @@ -148,7 +148,9 @@ #define NFSERR_CBPATHDOWN 10048 /* NFSv4.1 specific errors. */ +#define NFSERR_BADSESSION 10052 #define NFSERR_BADSLOT 10053 +#define NFSERR_COMPLETEALREADY 10054 #define NFSERR_LAYOUTTRYLATER 10058 #define NFSERR_SEQMISORDERED 10063 #define NFSERR_SEQUENCEPOS 10064 Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clport.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clport.c Sun Jan 29 01:01:35 2012 (r230712) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clport.c Sun Jan 29 01:01:41 2012 (r230713) @@ -1119,6 +1119,7 @@ nfscl_maperr(struct thread *td, int erro case NFSERR_STALESTATEID: case NFSERR_EXPIRED: case NFSERR_BADSTATEID: + case NFSERR_BADSESSION: printf("nfsv4 recover err returned %d\n", error); return (EIO); case NFSERR_BADHANDLE: Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Sun Jan 29 01:01:35 2012 (r230712) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Sun Jan 29 01:01:41 2012 (r230713) @@ -89,6 +89,7 @@ static int nfsrpc_getlayout(struct nfsmo nfsv4stateid_t *, struct ucred *, NFSPROC_T *); static int nfsrpc_fillsa(struct nfsmount *, struct nfsclds *, struct sockaddr_storage *, NFSPROC_T *); +static void nfscl_initsessionslots(struct nfsclsession *); /* * nfs null call from vfs. @@ -326,7 +327,8 @@ else printf(" fhl=0\n"); op->nfso_opencnt++; nfscl_openrelease(op, error, newone); if (error == NFSERR_GRACE || error == NFSERR_STALECLIENTID || - error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY) { + error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || + error == NFSERR_BADSESSION) { (void) nfs_catnap(PZERO, error, "nfs_open"); } else if ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && clidrev != 0) { @@ -335,6 +337,7 @@ else printf(" fhl=0\n"); } } while (error == NFSERR_GRACE || error == NFSERR_STALECLIENTID || error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || + error == NFSERR_BADSESSION || ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && expireret == 0 && clidrev != 0 && retrycnt < 4)); if (error && retrycnt >= 4) @@ -519,14 +522,15 @@ nfsrpc_openrpc(struct nfsmount *nmp, vno if (ndp != NULL) FREE((caddr_t)ndp, M_NFSCLDELEG); if (ret == NFSERR_STALECLIENTID || - ret == NFSERR_STALEDONTRECOVER) + ret == NFSERR_STALEDONTRECOVER || + ret == NFSERR_BADSESSION) error = ret; } } } if (nd->nd_repstat != 0 && error == 0) error = nd->nd_repstat; - if (error == NFSERR_STALECLIENTID) + if (error == NFSERR_STALECLIENTID || error == NFSERR_BADSESSION) nfscl_initiate_recovery(op->nfso_own->nfsow_clp); nfsmout: if (!error) @@ -570,7 +574,7 @@ nfsrpc_opendowngrade(vnode_t vp, u_int32 } if (nd->nd_repstat && error == 0) error = nd->nd_repstat; - if (error == NFSERR_STALESTATEID) + if (error == NFSERR_STALESTATEID || error == NFSERR_BADSESSION) nfscl_initiate_recovery(op->nfso_own->nfsow_clp); nfsmout: mbuf_freem(nd->nd_mrep); @@ -725,7 +729,7 @@ nfsrpc_closerpc(struct nfsrv_descript *n if (nd->nd_repstat == 0) NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID); error = nd->nd_repstat; - if (error == NFSERR_STALESTATEID) + if (error == NFSERR_STALESTATEID || error == NFSERR_BADSESSION) nfscl_initiate_recovery(op->nfso_own->nfsow_clp); nfsmout: mbuf_freem(nd->nd_mrep); @@ -766,7 +770,7 @@ nfsrpc_openconfirm(vnode_t vp, u_int8_t op->nfso_stateid.other[2] = *tl; } error = nd->nd_repstat; - if (error == NFSERR_STALESTATEID) + if (error == NFSERR_STALESTATEID || error == NFSERR_BADSESSION) nfscl_initiate_recovery(op->nfso_own->nfsow_clp); nfsmout: mbuf_freem(nd->nd_mrep); @@ -778,7 +782,7 @@ nfsmout: * when a mount has just occurred and when the server replies NFSERR_EXPIRED. */ APPLESTATIC int -nfsrpc_setclient(struct nfsmount *nmp, struct nfsclclient *clp, +nfsrpc_setclient(struct nfsmount *nmp, struct nfsclclient *clp, int reclaim, struct ucred *cred, NFSPROC_T *p) { u_int32_t *tl; @@ -799,13 +803,19 @@ nfsrpc_setclient(struct nfsmount *nmp, s error = nfsrpc_exchangeid(nmp, clp, &nmp->nm_sess, NFSV4EXCH_USEPNFSMDS | NFSV4EXCH_USENONPNFS, cred, p); if (error) printf("exch=%d\n",error); - if (error == 0) + if (error == 0) { + nfscl_initsessionslots(&nmp->nm_sess); error = nfsrpc_createsession(nmp, &nmp->nm_sess, cred, p); if (error) printf("aft crs=%d\n",error); - if (error == 0) + } + if (error == 0 && reclaim == 0) { error = nfsrpc_reclaimcomplete(nmp, cred, p); if (error) printf("aft reclcom=%d\n",error); + if (error == NFSERR_COMPLETEALREADY) + /* Ignore this error. */ + error = 0; + } return (error); } nfscl_reqstart(nd, NFSPROC_SETCLIENTID, nmp, NULL, 0, NULL, NULL); @@ -1042,7 +1052,7 @@ nfsrpc_setattr(vnode_t vp, struct vattr else error = nfsrpc_setaclrpc(vp, cred, p, aclp, &stateid, stuff); - if (error == NFSERR_STALESTATEID) + if (error == NFSERR_STALESTATEID || error == NFSERR_BADSESSION) nfscl_initiate_recovery(nmp->nm_clp); if (lckp != NULL) nfscl_lockderef(lckp); @@ -1050,7 +1060,7 @@ nfsrpc_setattr(vnode_t vp, struct vattr (void) nfsrpc_close(vp, 0, p); if (error == NFSERR_GRACE || error == NFSERR_STALESTATEID || error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || - error == NFSERR_OLDSTATEID) { + error == NFSERR_OLDSTATEID || error == NFSERR_BADSESSION) { (void) nfs_catnap(PZERO, error, "nfs_setattr"); } else if ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && clidrev != 0) { @@ -1059,6 +1069,7 @@ nfsrpc_setattr(vnode_t vp, struct vattr retrycnt++; } while (error == NFSERR_GRACE || error == NFSERR_STALESTATEID || error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || + error == NFSERR_BADSESSION || (error == NFSERR_OLDSTATEID && retrycnt < 20) || ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && expireret == 0 && clidrev != 0 && retrycnt < 4)); @@ -1288,13 +1299,13 @@ nfsrpc_read(vnode_t vp, struct uio *uiop NFSV4OPEN_ACCESSREAD, newcred, p, &stateid, &lckp); error = nfsrpc_readrpc(vp, uiop, newcred, &stateid, p, nap, attrflagp, stuff); - if (error == NFSERR_STALESTATEID) + if (error == NFSERR_STALESTATEID || error == NFSERR_BADSESSION) nfscl_initiate_recovery(nmp->nm_clp); if (lckp != NULL) nfscl_lockderef(lckp); if (error == NFSERR_GRACE || error == NFSERR_STALESTATEID || error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || - error == NFSERR_OLDSTATEID) { + error == NFSERR_OLDSTATEID || error == NFSERR_BADSESSION) { (void) nfs_catnap(PZERO, error, "nfs_read"); } else if ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && clidrev != 0) { @@ -1303,6 +1314,7 @@ nfsrpc_read(vnode_t vp, struct uio *uiop retrycnt++; } while (error == NFSERR_GRACE || error == NFSERR_STALESTATEID || error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || + error == NFSERR_BADSESSION || (error == NFSERR_OLDSTATEID && retrycnt < 20) || ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && expireret == 0 && clidrev != 0 && retrycnt < 4)); @@ -1456,13 +1468,13 @@ nfsrpc_write(vnode_t vp, struct uio *uio else error = nfsrpc_writerpc(vp, uiop, iomode, must_commit, newcred, &stateid, p, nap, attrflagp, stuff); - if (error == NFSERR_STALESTATEID) + if (error == NFSERR_STALESTATEID || error == NFSERR_BADSESSION) nfscl_initiate_recovery(nmp->nm_clp); if (lckp != NULL) nfscl_lockderef(lckp); if (error == NFSERR_GRACE || error == NFSERR_STALESTATEID || error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || - error == NFSERR_OLDSTATEID) { + error == NFSERR_OLDSTATEID || error == NFSERR_BADSESSION) { (void) nfs_catnap(PZERO, error, "nfs_write"); } else if ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && clidrev != 0) { @@ -1470,13 +1482,13 @@ nfsrpc_write(vnode_t vp, struct uio *uio } retrycnt++; } while (error == NFSERR_GRACE || error == NFSERR_DELAY || - ((error == NFSERR_STALESTATEID || + ((error == NFSERR_STALESTATEID || error == NFSERR_BADSESSION || error == NFSERR_STALEDONTRECOVER) && called_from_strategy == 0) || (error == NFSERR_OLDSTATEID && retrycnt < 20) || ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && expireret == 0 && clidrev != 0 && retrycnt < 4)); if (error != 0 && (retrycnt >= 4 || - ((error == NFSERR_STALESTATEID || + ((error == NFSERR_STALESTATEID || error == NFSERR_BADSESSION || error == NFSERR_STALEDONTRECOVER) && called_from_strategy != 0))) error = EIO; if (NFSHASNFSV4(nmp)) @@ -1790,7 +1802,8 @@ nfsrpc_create(vnode_t dvp, char *name, i (*nfhpp)->nfh_fh, (*nfhpp)->nfh_len, cred, p, &dp); nfscl_ownerrelease(owp, error, newone, unlocked); if (error == NFSERR_GRACE || error == NFSERR_STALECLIENTID || - error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY) { + error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || + error == NFSERR_BADSESSION) { (void) nfs_catnap(PZERO, error, "nfs_open"); } else if ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && clidrev != 0) { @@ -1799,6 +1812,7 @@ nfsrpc_create(vnode_t dvp, char *name, i } } while (error == NFSERR_GRACE || error == NFSERR_STALECLIENTID || error == NFSERR_STALEDONTRECOVER || error == NFSERR_DELAY || + error == NFSERR_BADSESSION || ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && expireret == 0 && clidrev != 0 && retrycnt < 4)); if (error && retrycnt >= 4) @@ -2054,7 +2068,8 @@ nfsrpc_createv4(vnode_t dvp, char *name, if (dp != NULL) FREE((caddr_t)dp, M_NFSCLDELEG); if (ret == NFSERR_STALECLIENTID || - ret == NFSERR_STALEDONTRECOVER) + ret == NFSERR_STALEDONTRECOVER || + ret == NFSERR_BADSESSION) error = ret; } } @@ -2063,7 +2078,7 @@ nfsrpc_createv4(vnode_t dvp, char *name, } if (nd->nd_repstat != 0 && error == 0) error = nd->nd_repstat; - if (error == NFSERR_STALECLIENTID) + if (error == NFSERR_STALECLIENTID || error == NFSERR_BADSESSION) nfscl_initiate_recovery(owp->nfsow_clp); nfsmout: if (!error) @@ -3646,7 +3661,8 @@ nfsrpc_advlock(vnode_t vp, off_t size, i error = nd->nd_repstat; if (error == NFSERR_GRACE || error == NFSERR_STALESTATEID || error == NFSERR_STALEDONTRECOVER || - error == NFSERR_STALECLIENTID || error == NFSERR_DELAY) { + error == NFSERR_STALECLIENTID || error == NFSERR_DELAY || + error == NFSERR_BADSESSION) { (void) nfs_catnap(PZERO, error, "nfs_advlock"); } else if ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && clidrev != 0) { @@ -3656,6 +3672,7 @@ nfsrpc_advlock(vnode_t vp, off_t size, i } while (error == NFSERR_GRACE || error == NFSERR_STALECLIENTID || error == NFSERR_DELAY || error == NFSERR_STALEDONTRECOVER || error == NFSERR_STALESTATEID || + error == NFSERR_BADSESSION || ((error == NFSERR_EXPIRED || error == NFSERR_BADSTATEID) && expireret == 0 && clidrev != 0 && retrycnt < 4)); if (error && retrycnt >= 4) @@ -3729,7 +3746,8 @@ nfsrpc_lockt(struct nfsrv_descript *nd, error = EBADRPC; if (!error) error = nfsm_advance(nd, NFSM_RNDUP(size), -1); - } else if (nd->nd_repstat == NFSERR_STALECLIENTID) + } else if (nd->nd_repstat == NFSERR_STALECLIENTID || + nd->nd_repstat == NFSERR_BADSESSION) nfscl_initiate_recovery(clp); nfsmout: mbuf_freem(nd->nd_mrep); @@ -3776,7 +3794,8 @@ nfsrpc_locku(struct nfsrv_descript *nd, lp->nfsl_stateid.other[0] = *tl++; lp->nfsl_stateid.other[1] = *tl++; lp->nfsl_stateid.other[2] = *tl; - } else if (nd->nd_repstat == NFSERR_STALESTATEID) + } else if (nd->nd_repstat == NFSERR_STALESTATEID || + nd->nd_repstat == NFSERR_BADSESSION) nfscl_initiate_recovery(lp->nfsl_open->nfso_own->nfsow_clp); nfsmout: mbuf_freem(nd->nd_mrep); @@ -3856,7 +3875,8 @@ nfsrpc_lock(struct nfsrv_descript *nd, s error = EBADRPC; if (!error) error = nfsm_advance(nd, NFSM_RNDUP(size), -1); - } else if (nd->nd_repstat == NFSERR_STALESTATEID) + } else if (nd->nd_repstat == NFSERR_STALESTATEID || + nd->nd_repstat == NFSERR_BADSESSION) nfscl_initiate_recovery(lp->nfsl_open->nfso_own->nfsow_clp); nfsmout: mbuf_freem(nd->nd_mrep); @@ -5013,9 +5033,11 @@ nfsrpc_fillsa(struct nfsmount *nmp, stru if (error == 0) error = nfsrpc_exchangeid(nmp, clp, &dsp->nfsclds_sess, NFSV4EXCH_USEPNFSDS, dsp->nfsclds_sock.nr_cred, p); - if (error == 0) + if (error == 0) { + nfscl_initsessionslots(&dsp->nfsclds_sess); error = nfsrpc_createsession(nmp, &dsp->nfsclds_sess, dsp->nfsclds_sock.nr_cred, p); + } if (error != 0) { NFSFREECRED(dsp->nfsclds_sock.nr_cred); free(dsp->nfsclds_sock.nr_nam, M_SONAME); @@ -5048,3 +5070,21 @@ nfsrpc_reclaimcomplete(struct nfsmount * return (error); } +/* + * Initialize the slot tables for a session. + */ +static void +nfscl_initsessionslots(struct nfsclsession *sep) +{ + int i; + + for (i = 0; i < NFSV4_CBSLOTS; i++) { + if (sep->nfsess_cbslots[i].nfssl_reply != NULL) + m_freem(sep->nfsess_cbslots[i].nfssl_reply); + NFSBZERO(&sep->nfsess_cbslots[i], sizeof(struct nfsslot)); + } + for (i = 0; i < 64; i++) + sep->nfsess_slotseq[i] = 0; + sep->nfsess_slots = 0; +} + Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Sun Jan 29 01:01:35 2012 (r230712) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Sun Jan 29 01:01:41 2012 (r230713) @@ -830,13 +830,15 @@ nfscl_getcl(struct mount *mp, struct ucr clidinusedelay = 120; trystalecnt = 3; do { - error = nfsrpc_setclient(nmp, clp, cred, p); + error = nfsrpc_setclient(nmp, clp, 0, cred, p); if (error == NFSERR_STALECLIENTID || error == NFSERR_STALEDONTRECOVER || + error == NFSERR_BADSESSION || error == NFSERR_CLIDINUSE) { (void) nfs_catnap(PZERO, error, "nfs_setcl"); } } while (((error == NFSERR_STALECLIENTID || + error == NFSERR_BADSESSION || error == NFSERR_STALEDONTRECOVER) && --trystalecnt > 0) || (error == NFSERR_CLIDINUSE && --clidinusedelay > 0)); if (error) { @@ -1840,7 +1842,7 @@ nfscl_umount(struct nfsmount *nmp, NFSPR (void)nfsrpc_destroysession(nmp, clp, cred, p); (void)nfsrpc_destroyclient(nmp, clp, cred, p); } else - (void)nfsrpc_setclient(nmp, clp, cred, p); + (void)nfsrpc_setclient(nmp, clp, 0, cred, p); nfscl_cleanclient(clp); nmp->nm_clp = NULL; NFSFREECRED(cred); @@ -1851,8 +1853,9 @@ nfscl_umount(struct nfsmount *nmp, NFSPR /* * This function is called when a server replies with NFSERR_STALECLIENTID - * or NFSERR_STALESTATEID. It traverses the clientid lists, doing Opens - * and Locks with reclaim. If these fail, it deletes the corresponding state. + * NFSERR_STALESTATEID or NFSERR_BADSESSION. It traverses the clientid lists, + * doing Opens and Locks with reclaim. If these fail, it deletes the + * corresponding state. */ static void nfscl_recover(struct nfsclclient *clp, struct ucred *cred, NFSPROC_T *p) @@ -1888,8 +1891,9 @@ nfscl_recover(struct nfsclclient *clp, s panic("nfscl recover"); trycnt = 5; do { - error = nfsrpc_setclient(nmp, clp, cred, p); + error = nfsrpc_setclient(nmp, clp, 1, cred, p); } while ((error == NFSERR_STALECLIENTID || + error == NFSERR_BADSESSION || error == NFSERR_STALEDONTRECOVER) && --trycnt > 0); if (error) { nfscl_cleanclient(clp); @@ -1908,9 +1912,10 @@ nfscl_recover(struct nfsclclient *clp, s * Mark requests already queued on the server, so that they don't * initiate another recovery cycle. Any requests already in the * queue that handle state information will have the old stale - * clientid/stateid and will get a NFSERR_STALESTATEID or - * NFSERR_STALECLIENTID reply from the server. This will be - * translated to NFSERR_STALEDONTRECOVER when R_DONTRECOVER is set. + * clientid/stateid and will get a NFSERR_STALESTATEID, + * NFSERR_STALECLIENTID or NFSERR_BADSESSION reply from the server. + * This will be translated to NFSERR_STALEDONTRECOVER when + * R_DONTRECOVER is set. */ s = splsoftclock(); NFSLOCKREQ(); @@ -2209,8 +2214,9 @@ nfscl_hasexpired(struct nfsclclient *clp cred = newnfs_getcred(); trycnt = 5; do { - error = nfsrpc_setclient(nmp, clp, cred, p); + error = nfsrpc_setclient(nmp, clp, 0, cred, p); } while ((error == NFSERR_STALECLIENTID || + error == NFSERR_BADSESSION || error == NFSERR_STALEDONTRECOVER) && --trycnt > 0); if (error) { /* @@ -2447,7 +2453,8 @@ nfscl_renewthread(struct nfsclclient *cl error = nfsrpc_renew(clp, cred, p); if (error == NFSERR_CBPATHDOWN) cbpathdown = 1; - else if (error == NFSERR_STALECLIENTID) { + else if (error == NFSERR_STALECLIENTID || + error == NFSERR_BADSESSION) { NFSLOCKCLSTATE(); clp->nfsc_flags |= NFSCLFLAGS_RECOVER; NFSUNLOCKCLSTATE(); @@ -2618,8 +2625,8 @@ tryagain: } /* - * Initiate state recovery. Called when NFSERR_STALECLIENTID or - * NFSERR_STALESTATEID is received. + * Initiate state recovery. Called when NFSERR_STALECLIENTID, + * NFSERR_STALESTATEID or NFSERR_BADSESSION is received. */ APPLESTATIC void nfscl_initiate_recovery(struct nfsclclient *clp) @@ -3574,7 +3581,8 @@ nfscl_recalldeleg(struct nfsclclient *cl ret = nfscl_moveopen(vp, clp, nmp, lop, owp, dp, cred, p); if (ret == NFSERR_STALECLIENTID || - ret == NFSERR_STALEDONTRECOVER) { + ret == NFSERR_STALEDONTRECOVER || + ret == NFSERR_BADSESSION) { if (gotvp) vrele(vp); return (ret); @@ -3605,7 +3613,8 @@ nfscl_recalldeleg(struct nfsclclient *cl if (ret) { nfscl_freeopenowner(owp, 0); if (ret == NFSERR_STALECLIENTID || - ret == NFSERR_STALEDONTRECOVER) { + ret == NFSERR_STALEDONTRECOVER || + ret == NFSERR_BADSESSION) { if (gotvp) vrele(vp); return (ret); @@ -3629,7 +3638,8 @@ nfscl_recalldeleg(struct nfsclclient *cl ret = nfscl_relock(vp, clp, nmp, lp, lckp, cred, p); if (ret == NFSERR_STALESTATEID || ret == NFSERR_STALEDONTRECOVER || - ret == NFSERR_STALECLIENTID) { + ret == NFSERR_STALECLIENTID || + ret == NFSERR_BADSESSION) { if (gotvp) vrele(vp); return (ret); From owner-svn-src-projects@FreeBSD.ORG Sun Jan 29 01:50:27 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4D3F2106566B; Sun, 29 Jan 2012 01:50:27 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 37C838FC0C; Sun, 29 Jan 2012 01:50:27 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0T1oRXA010996; Sun, 29 Jan 2012 01:50:27 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0T1oRRT010994; Sun, 29 Jan 2012 01:50:27 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201201290150.q0T1oRRT010994@svn.freebsd.org> From: Rick Macklem Date: Sun, 29 Jan 2012 01:50:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230721 - projects/nfsv4.1-client/sys/fs/nfs X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 29 Jan 2012 01:50:27 -0000 Author: rmacklem Date: Sun Jan 29 01:50:26 2012 New Revision: 230721 URL: http://svn.freebsd.org/changeset/base/230721 Log: Add the rest of the NFSv4.1 error codes to nfsproto.h. Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sun Jan 29 01:40:39 2012 (r230720) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sun Jan 29 01:50:26 2012 (r230721) @@ -148,13 +148,44 @@ #define NFSERR_CBPATHDOWN 10048 /* NFSv4.1 specific errors. */ +#define NFSERR_BADIOMODE 10049 +#define NFSERR_BADLAYOUT 10050 +#define NFSERR_BADSESSIONDIGEST 10051 #define NFSERR_BADSESSION 10052 #define NFSERR_BADSLOT 10053 #define NFSERR_COMPLETEALREADY 10054 +#define NFSERR_NOTBNDTOSESS 10055 +#define NFSERR_DELEGALREADYWANT 10056 +#define NFSERR_BACKCHANBUSY 10057 #define NFSERR_LAYOUTTRYLATER 10058 +#define NFSERR_LAYOUTUNAVAIL 10059 +#define NFSERR_NOMATCHLAYOUT 10060 +#define NFSERR_RECALLCONFLICT 10061 +#define NFSERR_UNKNLAYOUTTYPE 10062 #define NFSERR_SEQMISORDERED 10063 #define NFSERR_SEQUENCEPOS 10064 +#define NFSERR_REQTOOBIG 10065 +#define NFSERR_REPTOOBIG 10066 +#define NFSERR_REPTOOBIGTOCACHE 10067 +#define NFSERR_RETRYUNCACHEDREP 10068 +#define NFSERR_UNSAFECOMPOUND 10069 +#define NFSERR_TOOMANYOPS 10070 #define NFSERR_OPNOTINSESS 10071 +#define NFSERR_HASHALGUNSUPP 10072 +#define NFSERR_CLIENTIDBUSY 10074 +#define NFSERR_PNFSIOHOLE 10075 +#define NFSERR_SEQFALSERETRY 10076 +#define NFSERR_BADHIGHSLOT 10077 +#define NFSERR_DEADSESSION 10078 +#define NFSERR_ENCRALGUNSUPP 10079 +#define NFSERR_PNFSNOLAYOUT 10080 +#define NFSERR_NOTONLYOP 10081 +#define NFSERR_WRONGCRED 10082 +#define NFSERR_WRONGTYPE 10083 +#define NFSERR_DIRDELEGUNAVAIL 10084 +#define NFSERR_REJECTDELEG 10085 +#define NFSERR_RETURNCONFLICT 10086 +#define NFSERR_DELEGREVOKED 10087 #define NFSERR_STALEWRITEVERF 30001 /* Fake return for nfs_commit() */ #define NFSERR_DONTREPLY 30003 /* Don't process request */ From owner-svn-src-projects@FreeBSD.ORG Sun Jan 29 02:13:02 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 90A96106564A; Sun, 29 Jan 2012 02:13:02 +0000 (UTC) (envelope-from andrew@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7B2968FC18; Sun, 29 Jan 2012 02:13:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0T2D2KK011745; Sun, 29 Jan 2012 02:13:02 GMT (envelope-from andrew@svn.freebsd.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0T2D2Rb011743; Sun, 29 Jan 2012 02:13:02 GMT (envelope-from andrew@svn.freebsd.org) Message-Id: <201201290213.q0T2D2Rb011743@svn.freebsd.org> From: Andrew Turner Date: Sun, 29 Jan 2012 02:13:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230722 - projects/arm_eabi/contrib/libstdc++/include/std X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 29 Jan 2012 02:13:02 -0000 Author: andrew Date: Sun Jan 29 02:13:01 2012 New Revision: 230722 URL: http://svn.freebsd.org/changeset/base/230722 Log: Fix a warning where a left shift is greater than the width of an unsigned type in __glibcxx_{min,max}. The code is unused because __glibcxx_signed is false. __glibcxx_max came from libstdc++ r138078, the last GPLv2 revision. Modified: projects/arm_eabi/contrib/libstdc++/include/std/std_limits.h Modified: projects/arm_eabi/contrib/libstdc++/include/std/std_limits.h ============================================================================== --- projects/arm_eabi/contrib/libstdc++/include/std/std_limits.h Sun Jan 29 01:50:26 2012 (r230721) +++ projects/arm_eabi/contrib/libstdc++/include/std/std_limits.h Sun Jan 29 02:13:01 2012 (r230722) @@ -134,10 +134,11 @@ #define __glibcxx_signed(T) ((T)(-1) < 0) #define __glibcxx_min(T) \ - (__glibcxx_signed (T) ? (T)1 << __glibcxx_digits (T) : (T)0) + (__glibcxx_signed (T) ? (((T)1 << (__glibcxx_digits (T) - 1)) << 1) : (T)0) #define __glibcxx_max(T) \ - (__glibcxx_signed (T) ? ((T)1 << __glibcxx_digits (T)) - 1 : ~(T)0) + (__glibcxx_signed (T) ? \ + (((((T)1 << (__glibcxx_digits (T) - 1)) - 1) << 1) + 1) : ~(T)0) #define __glibcxx_digits(T) \ (sizeof(T) * __CHAR_BIT__ - __glibcxx_signed (T)) From owner-svn-src-projects@FreeBSD.ORG Mon Jan 30 00:27:03 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 841FE106566C; Mon, 30 Jan 2012 00:27:03 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 694238FC08; Mon, 30 Jan 2012 00:27:03 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0U0R3l5059482; Mon, 30 Jan 2012 00:27:03 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0U0R3mS059469; Mon, 30 Jan 2012 00:27:03 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201201300027.q0U0R3mS059469@svn.freebsd.org> From: Rick Macklem Date: Mon, 30 Jan 2012 00:27:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230761 - in projects/nfsv4.1-client/sys: amd64/acpica amd64/amd64 amd64/ia32 amd64/include arm/arm arm/include boot/forth boot/powerpc/boot1.chrp cam cam/scsi cddl/compat/opensolaris/s... X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Jan 2012 00:27:03 -0000 Author: rmacklem Date: Mon Jan 30 00:27:02 2012 New Revision: 230761 URL: http://svn.freebsd.org/changeset/base/230761 Log: Merge in an up to date head/sys. Added: projects/nfsv4.1-client/sys/amd64/amd64/ptrace_machdep.c - copied unchanged from r230760, head/sys/amd64/amd64/ptrace_machdep.c projects/nfsv4.1-client/sys/dev/mps/mps_config.c - copied unchanged from r230760, head/sys/dev/mps/mps_config.c projects/nfsv4.1-client/sys/dev/mps/mps_mapping.c - copied unchanged from r230760, head/sys/dev/mps/mps_mapping.c projects/nfsv4.1-client/sys/dev/mps/mps_mapping.h - copied unchanged from r230760, head/sys/dev/mps/mps_mapping.h projects/nfsv4.1-client/sys/dev/mps/mps_sas.h - copied unchanged from r230760, head/sys/dev/mps/mps_sas.h projects/nfsv4.1-client/sys/dev/mps/mps_sas_lsi.c - copied unchanged from r230760, head/sys/dev/mps/mps_sas_lsi.c projects/nfsv4.1-client/sys/dev/usb/controller/dwc_otg.c - copied unchanged from r230760, head/sys/dev/usb/controller/dwc_otg.c projects/nfsv4.1-client/sys/dev/usb/controller/dwc_otg.h - copied unchanged from r230760, head/sys/dev/usb/controller/dwc_otg.h projects/nfsv4.1-client/sys/dev/usb/controller/dwc_otg_atmelarm.c - copied unchanged from r230760, head/sys/dev/usb/controller/dwc_otg_atmelarm.c projects/nfsv4.1-client/sys/dev/xen/netback/netback_unit_tests.c - copied unchanged from r230760, head/sys/dev/xen/netback/netback_unit_tests.c Modified: projects/nfsv4.1-client/sys/amd64/acpica/acpi_switch.S projects/nfsv4.1-client/sys/amd64/acpica/acpi_wakecode.S projects/nfsv4.1-client/sys/amd64/acpica/acpi_wakeup.c projects/nfsv4.1-client/sys/amd64/amd64/cpu_switch.S projects/nfsv4.1-client/sys/amd64/amd64/fpu.c projects/nfsv4.1-client/sys/amd64/amd64/genassym.c projects/nfsv4.1-client/sys/amd64/amd64/initcpu.c projects/nfsv4.1-client/sys/amd64/amd64/machdep.c projects/nfsv4.1-client/sys/amd64/amd64/minidump_machdep.c projects/nfsv4.1-client/sys/amd64/amd64/mp_machdep.c projects/nfsv4.1-client/sys/amd64/amd64/sys_machdep.c projects/nfsv4.1-client/sys/amd64/amd64/trap.c projects/nfsv4.1-client/sys/amd64/amd64/uma_machdep.c projects/nfsv4.1-client/sys/amd64/amd64/vm_machdep.c projects/nfsv4.1-client/sys/amd64/ia32/ia32_reg.c projects/nfsv4.1-client/sys/amd64/ia32/ia32_signal.c projects/nfsv4.1-client/sys/amd64/include/cpufunc.h projects/nfsv4.1-client/sys/amd64/include/float.h projects/nfsv4.1-client/sys/amd64/include/fpu.h projects/nfsv4.1-client/sys/amd64/include/frame.h projects/nfsv4.1-client/sys/amd64/include/md_var.h projects/nfsv4.1-client/sys/amd64/include/pcb.h projects/nfsv4.1-client/sys/amd64/include/ptrace.h projects/nfsv4.1-client/sys/amd64/include/sysarch.h projects/nfsv4.1-client/sys/amd64/include/ucontext.h projects/nfsv4.1-client/sys/arm/arm/machdep.c projects/nfsv4.1-client/sys/arm/include/float.h projects/nfsv4.1-client/sys/boot/forth/menu.rc projects/nfsv4.1-client/sys/boot/powerpc/boot1.chrp/Makefile projects/nfsv4.1-client/sys/cam/cam_ccb.h projects/nfsv4.1-client/sys/cam/cam_periph.c projects/nfsv4.1-client/sys/cam/cam_xpt.c projects/nfsv4.1-client/sys/cam/cam_xpt_internal.h projects/nfsv4.1-client/sys/cam/scsi/scsi_all.c projects/nfsv4.1-client/sys/cam/scsi/scsi_all.h projects/nfsv4.1-client/sys/cam/scsi/scsi_da.c projects/nfsv4.1-client/sys/cam/scsi/scsi_xpt.c projects/nfsv4.1-client/sys/cddl/compat/opensolaris/sys/kmem.h projects/nfsv4.1-client/sys/cddl/compat/opensolaris/sys/sid.h projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_fm.c projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c projects/nfsv4.1-client/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c projects/nfsv4.1-client/sys/compat/ia32/ia32_signal.h projects/nfsv4.1-client/sys/conf/files projects/nfsv4.1-client/sys/conf/files.amd64 projects/nfsv4.1-client/sys/conf/kern.pre.mk projects/nfsv4.1-client/sys/crypto/aesni/aesni.c projects/nfsv4.1-client/sys/crypto/aesni/aesni.h projects/nfsv4.1-client/sys/crypto/aesni/aesni_wrap.c projects/nfsv4.1-client/sys/crypto/via/padlock.c projects/nfsv4.1-client/sys/crypto/via/padlock.h projects/nfsv4.1-client/sys/crypto/via/padlock_cipher.c projects/nfsv4.1-client/sys/crypto/via/padlock_hash.c projects/nfsv4.1-client/sys/dev/ata/chipsets/ata-acerlabs.c projects/nfsv4.1-client/sys/dev/ata/chipsets/ata-siliconimage.c projects/nfsv4.1-client/sys/dev/ath/ath_dfs/null/dfs_null.c projects/nfsv4.1-client/sys/dev/ath/if_ath.c projects/nfsv4.1-client/sys/dev/ath/if_athdfs.h projects/nfsv4.1-client/sys/dev/ath/if_athvar.h projects/nfsv4.1-client/sys/dev/ciss/ciss.c projects/nfsv4.1-client/sys/dev/e1000/README projects/nfsv4.1-client/sys/dev/firewire/sbp_targ.c projects/nfsv4.1-client/sys/dev/fxp/if_fxp.c projects/nfsv4.1-client/sys/dev/hwpmc/hwpmc_x86.c projects/nfsv4.1-client/sys/dev/iwn/if_iwn.c projects/nfsv4.1-client/sys/dev/ixgbe/ixgbe.c projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_cnfg.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_hbd.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_history.txt projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_init.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_ioc.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_ra.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_raid.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_sas.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_targ.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_tool.h projects/nfsv4.1-client/sys/dev/mps/mpi/mpi2_type.h projects/nfsv4.1-client/sys/dev/mps/mps.c projects/nfsv4.1-client/sys/dev/mps/mps_ioctl.h projects/nfsv4.1-client/sys/dev/mps/mps_pci.c projects/nfsv4.1-client/sys/dev/mps/mps_sas.c projects/nfsv4.1-client/sys/dev/mps/mps_table.c projects/nfsv4.1-client/sys/dev/mps/mps_user.c projects/nfsv4.1-client/sys/dev/mps/mpsvar.h projects/nfsv4.1-client/sys/dev/netmap/ixgbe_netmap.h projects/nfsv4.1-client/sys/dev/netmap/netmap.c projects/nfsv4.1-client/sys/dev/netmap/netmap_kern.h projects/nfsv4.1-client/sys/dev/ofw/openfirm.c projects/nfsv4.1-client/sys/dev/pccbb/pccbb.c projects/nfsv4.1-client/sys/dev/random/nehemiah.c projects/nfsv4.1-client/sys/dev/sound/pci/csa.c projects/nfsv4.1-client/sys/dev/sound/pci/csareg.h projects/nfsv4.1-client/sys/dev/sound/pci/hda/hdaa.c projects/nfsv4.1-client/sys/dev/sound/pci/hda/hdaa.h projects/nfsv4.1-client/sys/dev/sound/pci/hda/hdaa_patches.c projects/nfsv4.1-client/sys/dev/sound/pci/hda/hdac.c projects/nfsv4.1-client/sys/dev/sound/pci/hda/hdac.h projects/nfsv4.1-client/sys/dev/sound/pci/hda/hdacc.c projects/nfsv4.1-client/sys/dev/sound/pcm/channel.c projects/nfsv4.1-client/sys/dev/usb/usb_transfer.c projects/nfsv4.1-client/sys/dev/wi/if_wi.c projects/nfsv4.1-client/sys/dev/xen/blkback/blkback.c projects/nfsv4.1-client/sys/dev/xen/netback/netback.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clbio.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clnode.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clport.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clvfsops.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clvnops.c projects/nfsv4.1-client/sys/fs/nfsclient/nfsmount.h projects/nfsv4.1-client/sys/geom/geom_bsd.c projects/nfsv4.1-client/sys/geom/geom_mbr.c projects/nfsv4.1-client/sys/geom/geom_pc98.c projects/nfsv4.1-client/sys/geom/mountver/g_mountver.c projects/nfsv4.1-client/sys/geom/part/g_part_mbr.c projects/nfsv4.1-client/sys/i386/i386/machdep.c projects/nfsv4.1-client/sys/i386/include/float.h projects/nfsv4.1-client/sys/i386/include/npx.h projects/nfsv4.1-client/sys/i386/include/ptrace.h projects/nfsv4.1-client/sys/i386/include/sysarch.h projects/nfsv4.1-client/sys/i386/include/ucontext.h projects/nfsv4.1-client/sys/i386/isa/npx.c projects/nfsv4.1-client/sys/ia64/include/float.h projects/nfsv4.1-client/sys/kern/init_main.c projects/nfsv4.1-client/sys/kern/kern_proc.c projects/nfsv4.1-client/sys/kern/kern_resource.c projects/nfsv4.1-client/sys/kern/kern_shutdown.c projects/nfsv4.1-client/sys/kern/subr_hash.c projects/nfsv4.1-client/sys/kern/subr_scanf.c projects/nfsv4.1-client/sys/kern/uipc_mbuf.c projects/nfsv4.1-client/sys/kern/vfs_aio.c projects/nfsv4.1-client/sys/kern/vfs_cache.c projects/nfsv4.1-client/sys/kern/vfs_subr.c projects/nfsv4.1-client/sys/mips/include/float.h projects/nfsv4.1-client/sys/modules/Makefile projects/nfsv4.1-client/sys/modules/ipdivert/Makefile projects/nfsv4.1-client/sys/modules/mps/Makefile projects/nfsv4.1-client/sys/net/flowtable.c projects/nfsv4.1-client/sys/net/if_llatbl.c projects/nfsv4.1-client/sys/net/route.c projects/nfsv4.1-client/sys/net80211/ieee80211.c projects/nfsv4.1-client/sys/net80211/ieee80211_hwmp.c projects/nfsv4.1-client/sys/netgraph/ng_base.c projects/nfsv4.1-client/sys/netgraph/ng_socket.c projects/nfsv4.1-client/sys/netgraph/ng_socketvar.h projects/nfsv4.1-client/sys/netinet/if_ether.c projects/nfsv4.1-client/sys/netinet/in_mcast.c projects/nfsv4.1-client/sys/netinet/in_pcb.c projects/nfsv4.1-client/sys/netinet/ip_divert.c projects/nfsv4.1-client/sys/netinet/ip_gre.c projects/nfsv4.1-client/sys/netinet/ip_ipsec.c projects/nfsv4.1-client/sys/netinet/ipfw/dn_sched_qfq.c projects/nfsv4.1-client/sys/netinet/ipfw/ip_fw2.c projects/nfsv4.1-client/sys/netinet6/in6.c projects/nfsv4.1-client/sys/netinet6/in6.h projects/nfsv4.1-client/sys/netinet6/ip6_ipsec.c projects/nfsv4.1-client/sys/netinet6/nd6.c projects/nfsv4.1-client/sys/netipsec/xform_ipip.c projects/nfsv4.1-client/sys/nfsclient/nfs_bio.c projects/nfsv4.1-client/sys/nfsclient/nfs_vfsops.c projects/nfsv4.1-client/sys/nfsclient/nfs_vnops.c projects/nfsv4.1-client/sys/nfsclient/nfsmount.h projects/nfsv4.1-client/sys/pc98/pc98/machdep.c projects/nfsv4.1-client/sys/powerpc/include/float.h projects/nfsv4.1-client/sys/sparc64/include/clock.h projects/nfsv4.1-client/sys/sparc64/include/cpu.h projects/nfsv4.1-client/sys/sparc64/include/float.h projects/nfsv4.1-client/sys/sparc64/include/ofw_machdep.h projects/nfsv4.1-client/sys/sparc64/include/vmparam.h projects/nfsv4.1-client/sys/sparc64/pci/schizo.c projects/nfsv4.1-client/sys/sparc64/pci/schizovar.h projects/nfsv4.1-client/sys/sparc64/sparc64/cache.c projects/nfsv4.1-client/sys/sparc64/sparc64/clock.c projects/nfsv4.1-client/sys/sparc64/sparc64/machdep.c projects/nfsv4.1-client/sys/sparc64/sparc64/ofw_machdep.c projects/nfsv4.1-client/sys/sparc64/sparc64/pmap.c projects/nfsv4.1-client/sys/sparc64/sparc64/support.S projects/nfsv4.1-client/sys/sys/diskmbr.h projects/nfsv4.1-client/sys/sys/elf_common.h projects/nfsv4.1-client/sys/sys/malloc.h projects/nfsv4.1-client/sys/sys/mdioctl.h projects/nfsv4.1-client/sys/sys/param.h projects/nfsv4.1-client/sys/sys/proc.h projects/nfsv4.1-client/sys/sys/resourcevar.h projects/nfsv4.1-client/sys/sys/systm.h projects/nfsv4.1-client/sys/sys/ucontext.h projects/nfsv4.1-client/sys/vm/uma.h projects/nfsv4.1-client/sys/vm/uma_core.c projects/nfsv4.1-client/sys/vm/vm_contig.c projects/nfsv4.1-client/sys/vm/vm_kern.c projects/nfsv4.1-client/sys/vm/vm_page.c projects/nfsv4.1-client/sys/vm/vm_page.h projects/nfsv4.1-client/sys/xen/interface/io/netif.h Directory Properties: projects/nfsv4.1-client/sys/ (props changed) projects/nfsv4.1-client/sys/conf/ (props changed) projects/nfsv4.1-client/sys/contrib/dev/acpica/ (props changed) Modified: projects/nfsv4.1-client/sys/amd64/acpica/acpi_switch.S ============================================================================== --- projects/nfsv4.1-client/sys/amd64/acpica/acpi_switch.S Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/acpica/acpi_switch.S Mon Jan 30 00:27:02 2012 (r230761) @@ -146,11 +146,22 @@ ENTRY(acpi_restorecpu) /* Restore FPU state. */ fninit - fxrstor PCB_USERFPU(%rdi) + movq WAKEUP_CTX(fpusave),%rdi + cmpl $0,use_xsave + jne 1f + fxrstor (%rdi) + jmp 2f +1: movl xsave_mask,%eax + movl xsave_mask+4,%edx +/* xrstor (%rdi) */ + .byte 0x0f,0xae,0x2f +2: /* Reload CR0. */ movq %rcx, %cr0 + movq WAKEUP_CTX(pcb),%rdi + /* Restore return address. */ movq PCB_RIP(%rdi), %rax movq %rax, (%rsp) Modified: projects/nfsv4.1-client/sys/amd64/acpica/acpi_wakecode.S ============================================================================== --- projects/nfsv4.1-client/sys/amd64/acpica/acpi_wakecode.S Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/acpica/acpi_wakecode.S Mon Jan 30 00:27:02 2012 (r230761) @@ -270,6 +270,8 @@ wakeup_pcb: wakeup_gdt: .word 0 .quad 0 +wakeup_fpusave: + .quad 0 ALIGN_DATA wakeup_efer: Modified: projects/nfsv4.1-client/sys/amd64/acpica/acpi_wakeup.c ============================================================================== --- projects/nfsv4.1-client/sys/amd64/acpica/acpi_wakeup.c Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/acpica/acpi_wakeup.c Mon Jan 30 00:27:02 2012 (r230761) @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #ifdef SMP #include @@ -67,8 +68,10 @@ extern int acpi_reset_video; #ifdef SMP extern struct pcb **susppcbs; +extern void **suspfpusave; #else static struct pcb **susppcbs; +static void **suspfpusave; #endif int acpi_restorecpu(vm_offset_t, struct pcb *); @@ -105,6 +108,7 @@ acpi_wakeup_ap(struct acpi_softc *sc, in int ms; WAKECODE_FIXUP(wakeup_pcb, struct pcb *, susppcbs[cpu]); + WAKECODE_FIXUP(wakeup_fpusave, void *, suspfpusave[cpu]); WAKECODE_FIXUP(wakeup_gdt, uint16_t, susppcbs[cpu]->pcb_gdt.rd_limit); WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, susppcbs[cpu]->pcb_gdt.rd_base); @@ -244,6 +248,7 @@ acpi_sleep_machdep(struct acpi_softc *sc load_cr3(KPML4phys); if (savectx(susppcbs[0])) { + ctx_fpusave(suspfpusave[0]); #ifdef SMP if (!CPU_EMPTY(&wakeup_cpus) && suspend_cpus(wakeup_cpus) == 0) { @@ -256,6 +261,7 @@ acpi_sleep_machdep(struct acpi_softc *sc WAKECODE_FIXUP(reset_video, uint8_t, (acpi_reset_video != 0)); WAKECODE_FIXUP(wakeup_pcb, struct pcb *, susppcbs[0]); + WAKECODE_FIXUP(wakeup_fpusave, void *, suspfpusave[0]); WAKECODE_FIXUP(wakeup_gdt, uint16_t, susppcbs[0]->pcb_gdt.rd_limit); WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, @@ -333,8 +339,11 @@ acpi_alloc_wakeup_handler(void) return (NULL); } susppcbs = malloc(mp_ncpus * sizeof(*susppcbs), M_DEVBUF, M_WAITOK); - for (i = 0; i < mp_ncpus; i++) + suspfpusave = malloc(mp_ncpus * sizeof(void *), M_DEVBUF, M_WAITOK); + for (i = 0; i < mp_ncpus; i++) { susppcbs[i] = malloc(sizeof(**susppcbs), M_DEVBUF, M_WAITOK); + suspfpusave[i] = alloc_fpusave(M_WAITOK); + } return (wakeaddr); } Modified: projects/nfsv4.1-client/sys/amd64/amd64/cpu_switch.S ============================================================================== --- projects/nfsv4.1-client/sys/amd64/amd64/cpu_switch.S Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/amd64/cpu_switch.S Mon Jan 30 00:27:02 2012 (r230761) @@ -112,16 +112,25 @@ done_store_dr: /* have we used fp, and need a save? */ cmpq %rdi,PCPU(FPCURTHREAD) - jne 1f + jne 3f movq PCB_SAVEFPU(%r8),%r8 clts + cmpl $0,use_xsave + jne 1f fxsave (%r8) - smsw %ax + jmp 2f +1: movq %rdx,%rcx + movl xsave_mask,%eax + movl xsave_mask+4,%edx +/* xsave (%r8) */ + .byte 0x41,0x0f,0xae,0x20 + movq %rcx,%rdx +2: smsw %ax orb $CR0_TS,%al lmsw %ax xorl %eax,%eax movq %rax,PCPU(FPCURTHREAD) -1: +3: /* Save is done. Now fire up new thread. Leave old vmspace. */ movq TD_PCB(%rsi),%r8 @@ -354,10 +363,19 @@ ENTRY(savectx) sldt PCB_LDT(%rdi) str PCB_TR(%rdi) - clts - fxsave PCB_USERFPU(%rdi) - movq %rsi,%cr0 /* The previous %cr0 is saved in %rsi. */ +2: movq %rsi,%cr0 /* The previous %cr0 is saved in %rsi. */ movl $1,%eax ret END(savectx) + +/* + * Wrapper around fpusave to care about TS0_CR. + */ +ENTRY(ctx_fpusave) + movq %cr0,%rsi + clts + call fpusave + movq %rsi,%cr0 + ret +END(ctx_fpusave) Modified: projects/nfsv4.1-client/sys/amd64/amd64/fpu.c ============================================================================== --- projects/nfsv4.1-client/sys/amd64/amd64/fpu.c Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/amd64/fpu.c Mon Jan 30 00:27:02 2012 (r230761) @@ -96,19 +96,97 @@ void stop_emulating(void); #define GET_FPU_CW(thread) ((thread)->td_pcb->pcb_save->sv_env.en_cw) #define GET_FPU_SW(thread) ((thread)->td_pcb->pcb_save->sv_env.en_sw) -typedef u_char bool_t; +CTASSERT(sizeof(struct savefpu) == 512); +CTASSERT(sizeof(struct xstate_hdr) == 64); +CTASSERT(sizeof(struct savefpu_ymm) == 832); + +/* + * This requirement is to make it easier for asm code to calculate + * offset of the fpu save area from the pcb address. FPU save area + * must by 64-bytes aligned. + */ +CTASSERT(sizeof(struct pcb) % XSAVE_AREA_ALIGN == 0); static void fpu_clean_state(void); SYSCTL_INT(_hw, HW_FLOATINGPT, floatingpoint, CTLFLAG_RD, NULL, 1, "Floating point instructions executed in hardware"); -static struct savefpu fpu_initialstate; +int use_xsave; /* non-static for cpu_switch.S */ +uint64_t xsave_mask; /* the same */ +static struct savefpu *fpu_initialstate; + +void +fpusave(void *addr) +{ + + if (use_xsave) + xsave((char *)addr, xsave_mask); + else + fxsave((char *)addr); +} + +static void +fpurestore(void *addr) +{ + + if (use_xsave) + xrstor((char *)addr, xsave_mask); + else + fxrstor((char *)addr); +} + +/* + * Enable XSAVE if supported and allowed by user. + * Calculate the xsave_mask. + */ +static void +fpuinit_bsp1(void) +{ + u_int cp[4]; + uint64_t xsave_mask_user; + + if ((cpu_feature2 & CPUID2_XSAVE) != 0) { + use_xsave = 1; + TUNABLE_INT_FETCH("hw.use_xsave", &use_xsave); + } + if (!use_xsave) + return; + + cpuid_count(0xd, 0x0, cp); + xsave_mask = XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE; + if ((cp[0] & xsave_mask) != xsave_mask) + panic("CPU0 does not support X87 or SSE: %x", cp[0]); + xsave_mask = ((uint64_t)cp[3] << 32) | cp[0]; + xsave_mask_user = xsave_mask; + TUNABLE_ULONG_FETCH("hw.xsave_mask", &xsave_mask_user); + xsave_mask_user |= XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE; + xsave_mask &= xsave_mask_user; +} /* - * Initialize the floating point unit. On the boot CPU we generate a - * clean state that is used to initialize the floating point unit when - * it is first used by a process. + * Calculate the fpu save area size. + */ +static void +fpuinit_bsp2(void) +{ + u_int cp[4]; + + if (use_xsave) { + cpuid_count(0xd, 0x0, cp); + cpu_max_ext_state_size = cp[1]; + + /* + * Reload the cpu_feature2, since we enabled OSXSAVE. + */ + do_cpuid(1, cp); + cpu_feature2 = cp[2]; + } else + cpu_max_ext_state_size = sizeof(struct savefpu); +} + +/* + * Initialize the floating point unit. */ void fpuinit(void) @@ -117,6 +195,20 @@ fpuinit(void) u_int mxcsr; u_short control; + if (IS_BSP()) + fpuinit_bsp1(); + + if (use_xsave) { + load_cr4(rcr4() | CR4_XSAVE); + xsetbv(XCR0, xsave_mask); + } + + /* + * XCR0 shall be set up before CPU can report the save area size. + */ + if (IS_BSP()) + fpuinit_bsp2(); + /* * It is too early for critical_enter() to work on AP. */ @@ -127,20 +219,46 @@ fpuinit(void) fldcw(control); mxcsr = __INITIAL_MXCSR__; ldmxcsr(mxcsr); - if (PCPU_GET(cpuid) == 0) { - fxsave(&fpu_initialstate); - if (fpu_initialstate.sv_env.en_mxcsr_mask) - cpu_mxcsr_mask = fpu_initialstate.sv_env.en_mxcsr_mask; - else - cpu_mxcsr_mask = 0xFFBF; - bzero(fpu_initialstate.sv_fp, sizeof(fpu_initialstate.sv_fp)); - bzero(fpu_initialstate.sv_xmm, sizeof(fpu_initialstate.sv_xmm)); - } start_emulating(); intr_restore(saveintr); } /* + * On the boot CPU we generate a clean state that is used to + * initialize the floating point unit when it is first used by a + * process. + */ +static void +fpuinitstate(void *arg __unused) +{ + register_t saveintr; + + fpu_initialstate = malloc(cpu_max_ext_state_size, M_DEVBUF, + M_WAITOK | M_ZERO); + saveintr = intr_disable(); + stop_emulating(); + + fpusave(fpu_initialstate); + if (fpu_initialstate->sv_env.en_mxcsr_mask) + cpu_mxcsr_mask = fpu_initialstate->sv_env.en_mxcsr_mask; + else + cpu_mxcsr_mask = 0xFFBF; + + /* + * The fninit instruction does not modify XMM registers. The + * fpusave call dumped the garbage contained in the registers + * after reset to the initial state saved. Clear XMM + * registers file image to make the startup program state and + * signal handler XMM register content predictable. + */ + bzero(&fpu_initialstate->sv_xmm[0], sizeof(struct xmmacc)); + + start_emulating(); + intr_restore(saveintr); +} +SYSINIT(fpuinitstate, SI_SUB_DRIVERS, SI_ORDER_ANY, fpuinitstate, NULL); + +/* * Free coprocessor (if we have it). */ void @@ -150,7 +268,7 @@ fpuexit(struct thread *td) critical_enter(); if (curthread == PCPU_GET(fpcurthread)) { stop_emulating(); - fxsave(PCPU_GET(curpcb)->pcb_save); + fpusave(PCPU_GET(curpcb)->pcb_save); start_emulating(); PCPU_SET(fpcurthread, 0); } @@ -423,7 +541,7 @@ fpudna(void) * the PCB doesn't contain a clean FPU state. Explicitly * load an initial state. */ - fxrstor(&fpu_initialstate); + fpurestore(fpu_initialstate); if (pcb->pcb_initial_fpucw != __INITIAL_FPUCW__) fldcw(pcb->pcb_initial_fpucw); if (PCB_USER_FPU(pcb)) @@ -432,7 +550,7 @@ fpudna(void) else set_pcb_flags(pcb, PCB_FPUINITDONE); } else - fxrstor(pcb->pcb_save); + fpurestore(pcb->pcb_save); critical_exit(); } @@ -461,15 +579,16 @@ fpugetregs(struct thread *td) pcb = td->td_pcb; if ((pcb->pcb_flags & PCB_USERFPUINITDONE) == 0) { - bcopy(&fpu_initialstate, &pcb->pcb_user_save, - sizeof(fpu_initialstate)); - pcb->pcb_user_save.sv_env.en_cw = pcb->pcb_initial_fpucw; + bcopy(fpu_initialstate, get_pcb_user_save_pcb(pcb), + cpu_max_ext_state_size); + get_pcb_user_save_pcb(pcb)->sv_env.en_cw = + pcb->pcb_initial_fpucw; fpuuserinited(td); return (_MC_FPOWNED_PCB); } critical_enter(); if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) { - fxsave(&pcb->pcb_user_save); + fpusave(get_pcb_user_save_pcb(pcb)); critical_exit(); return (_MC_FPOWNED_FPU); } else { @@ -491,25 +610,78 @@ fpuuserinited(struct thread *td) set_pcb_flags(pcb, PCB_FPUINITDONE); } +int +fpusetxstate(struct thread *td, char *xfpustate, size_t xfpustate_size) +{ + struct xstate_hdr *hdr, *ehdr; + size_t len, max_len; + uint64_t bv; + + /* XXXKIB should we clear all extended state in xstate_bv instead ? */ + if (xfpustate == NULL) + return (0); + if (!use_xsave) + return (EOPNOTSUPP); + + len = xfpustate_size; + if (len < sizeof(struct xstate_hdr)) + return (EINVAL); + max_len = cpu_max_ext_state_size - sizeof(struct savefpu); + if (len > max_len) + return (EINVAL); + + ehdr = (struct xstate_hdr *)xfpustate; + bv = ehdr->xstate_bv; + + /* + * Avoid #gp. + */ + if (bv & ~xsave_mask) + return (EINVAL); + if ((bv & (XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE)) != + (XFEATURE_ENABLED_X87 | XFEATURE_ENABLED_SSE)) + return (EINVAL); + + hdr = (struct xstate_hdr *)(get_pcb_user_save_td(td) + 1); + + hdr->xstate_bv = bv; + bcopy(xfpustate + sizeof(struct xstate_hdr), + (char *)(hdr + 1), len - sizeof(struct xstate_hdr)); + + return (0); +} + /* * Set the state of the FPU. */ -void -fpusetregs(struct thread *td, struct savefpu *addr) +int +fpusetregs(struct thread *td, struct savefpu *addr, char *xfpustate, + size_t xfpustate_size) { struct pcb *pcb; + int error; pcb = td->td_pcb; critical_enter(); if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) { - fxrstor(addr); + error = fpusetxstate(td, xfpustate, xfpustate_size); + if (error != 0) { + critical_exit(); + return (error); + } + bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr)); + fpurestore(get_pcb_user_save_td(td)); critical_exit(); set_pcb_flags(pcb, PCB_FPUINITDONE | PCB_USERFPUINITDONE); } else { critical_exit(); - bcopy(addr, &td->td_pcb->pcb_user_save, sizeof(*addr)); + error = fpusetxstate(td, xfpustate, xfpustate_size); + if (error != 0) + return (error); + bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr)); fpuuserinited(td); } + return (0); } /* @@ -599,20 +771,62 @@ static devclass_t fpupnp_devclass; DRIVER_MODULE(fpupnp, acpi, fpupnp_driver, fpupnp_devclass, 0, 0); #endif /* DEV_ISA */ +static MALLOC_DEFINE(M_FPUKERN_CTX, "fpukern_ctx", + "Kernel contexts for FPU state"); + +#define FPU_KERN_CTX_FPUINITDONE 0x01 + +struct fpu_kern_ctx { + struct savefpu *prev; + uint32_t flags; + char hwstate1[]; +}; + +struct fpu_kern_ctx * +fpu_kern_alloc_ctx(u_int flags) +{ + struct fpu_kern_ctx *res; + size_t sz; + + sz = sizeof(struct fpu_kern_ctx) + XSAVE_AREA_ALIGN + + cpu_max_ext_state_size; + res = malloc(sz, M_FPUKERN_CTX, ((flags & FPU_KERN_NOWAIT) ? + M_NOWAIT : M_WAITOK) | M_ZERO); + return (res); +} + +void +fpu_kern_free_ctx(struct fpu_kern_ctx *ctx) +{ + + /* XXXKIB clear the memory ? */ + free(ctx, M_FPUKERN_CTX); +} + +static struct savefpu * +fpu_kern_ctx_savefpu(struct fpu_kern_ctx *ctx) +{ + vm_offset_t p; + + p = (vm_offset_t)&ctx->hwstate1; + p = roundup2(p, XSAVE_AREA_ALIGN); + return ((struct savefpu *)p); +} + int fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, u_int flags) { struct pcb *pcb; pcb = td->td_pcb; - KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save == &pcb->pcb_user_save, - ("mangled pcb_save")); + KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save == + get_pcb_user_save_pcb(pcb), ("mangled pcb_save")); ctx->flags = 0; if ((pcb->pcb_flags & PCB_FPUINITDONE) != 0) ctx->flags |= FPU_KERN_CTX_FPUINITDONE; fpuexit(td); ctx->prev = pcb->pcb_save; - pcb->pcb_save = &ctx->hwstate; + pcb->pcb_save = fpu_kern_ctx_savefpu(ctx); set_pcb_flags(pcb, PCB_KERNFPU); clear_pcb_flags(pcb, PCB_FPUINITDONE); return (0); @@ -629,7 +843,7 @@ fpu_kern_leave(struct thread *td, struct fpudrop(); critical_exit(); pcb->pcb_save = ctx->prev; - if (pcb->pcb_save == &pcb->pcb_user_save) { + if (pcb->pcb_save == get_pcb_user_save_pcb(pcb)) { if ((pcb->pcb_flags & PCB_USERFPUINITDONE) != 0) { set_pcb_flags(pcb, PCB_FPUINITDONE); clear_pcb_flags(pcb, PCB_KERNFPU); @@ -653,7 +867,8 @@ fpu_kern_thread(u_int flags) pcb = PCPU_GET(curpcb); KASSERT((curthread->td_pflags & TDP_KTHREAD) != 0, ("Only kthread may use fpu_kern_thread")); - KASSERT(pcb->pcb_save == &pcb->pcb_user_save, ("mangled pcb_save")); + KASSERT(pcb->pcb_save == get_pcb_user_save_pcb(pcb), + ("mangled pcb_save")); KASSERT(PCB_USER_FPU(pcb), ("recursive call")); set_pcb_flags(pcb, PCB_KERNFPU); Modified: projects/nfsv4.1-client/sys/amd64/amd64/genassym.c ============================================================================== --- projects/nfsv4.1-client/sys/amd64/amd64/genassym.c Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/amd64/genassym.c Mon Jan 30 00:27:02 2012 (r230761) @@ -156,7 +156,7 @@ ASSYM(PCB_GS32SD, offsetof(struct pcb, p ASSYM(PCB_TSSP, offsetof(struct pcb, pcb_tssp)); ASSYM(PCB_SAVEFPU, offsetof(struct pcb, pcb_save)); ASSYM(PCB_SAVEFPU_SIZE, sizeof(struct savefpu)); -ASSYM(PCB_USERFPU, offsetof(struct pcb, pcb_user_save)); +ASSYM(PCB_USERFPU, sizeof(struct pcb)); ASSYM(PCB_SIZE, sizeof(struct pcb)); ASSYM(PCB_FULL_IRET, PCB_FULL_IRET); ASSYM(PCB_DBREGS, PCB_DBREGS); Modified: projects/nfsv4.1-client/sys/amd64/amd64/initcpu.c ============================================================================== --- projects/nfsv4.1-client/sys/amd64/amd64/initcpu.c Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/amd64/initcpu.c Mon Jan 30 00:27:02 2012 (r230761) @@ -72,6 +72,7 @@ u_int cpu_vendor_id; /* CPU vendor ID * u_int cpu_fxsr; /* SSE enabled */ u_int cpu_mxcsr_mask; /* Valid bits in mxcsr */ u_int cpu_clflush_line_size = 32; +u_int cpu_max_ext_state_size; SYSCTL_UINT(_hw, OID_AUTO, via_feature_rng, CTLFLAG_RD, &via_feature_rng, 0, "VIA RNG feature available in CPU"); Modified: projects/nfsv4.1-client/sys/amd64/amd64/machdep.c ============================================================================== --- projects/nfsv4.1-client/sys/amd64/amd64/machdep.c Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/amd64/machdep.c Mon Jan 30 00:27:02 2012 (r230761) @@ -154,8 +154,10 @@ extern void panicifcpuunsupported(void); #define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0) static void cpu_startup(void *); -static void get_fpcontext(struct thread *td, mcontext_t *mcp); -static int set_fpcontext(struct thread *td, const mcontext_t *mcp); +static void get_fpcontext(struct thread *td, mcontext_t *mcp, + char *xfpusave, size_t xfpusave_len); +static int set_fpcontext(struct thread *td, const mcontext_t *mcp, + char *xfpustate, size_t xfpustate_len); SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL); /* @@ -315,6 +317,8 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, struct sigacts *psp; char *sp; struct trapframe *regs; + char *xfpusave; + size_t xfpusave_len; int sig; int oonstack; @@ -328,6 +332,14 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, regs = td->td_frame; oonstack = sigonstack(regs->tf_rsp); + if (cpu_max_ext_state_size > sizeof(struct savefpu) && use_xsave) { + xfpusave_len = cpu_max_ext_state_size - sizeof(struct savefpu); + xfpusave = __builtin_alloca(xfpusave_len); + } else { + xfpusave_len = 0; + xfpusave = NULL; + } + /* Save user context. */ bzero(&sf, sizeof(sf)); sf.sf_uc.uc_sigmask = *mask; @@ -337,7 +349,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sf.sf_uc.uc_mcontext.mc_onstack = (oonstack) ? 1 : 0; bcopy(regs, &sf.sf_uc.uc_mcontext.mc_rdi, sizeof(*regs)); sf.sf_uc.uc_mcontext.mc_len = sizeof(sf.sf_uc.uc_mcontext); /* magic */ - get_fpcontext(td, &sf.sf_uc.uc_mcontext); + get_fpcontext(td, &sf.sf_uc.uc_mcontext, xfpusave, xfpusave_len); fpstate_drop(td); sf.sf_uc.uc_mcontext.mc_fsbase = pcb->pcb_fsbase; sf.sf_uc.uc_mcontext.mc_gsbase = pcb->pcb_gsbase; @@ -348,13 +360,18 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, /* Allocate space for the signal handler context. */ if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack && SIGISMEMBER(psp->ps_sigonstack, sig)) { - sp = td->td_sigstk.ss_sp + - td->td_sigstk.ss_size - sizeof(struct sigframe); + sp = td->td_sigstk.ss_sp + td->td_sigstk.ss_size; #if defined(COMPAT_43) td->td_sigstk.ss_flags |= SS_ONSTACK; #endif } else - sp = (char *)regs->tf_rsp - sizeof(struct sigframe) - 128; + sp = (char *)regs->tf_rsp - 128; + if (xfpusave != NULL) { + sp -= xfpusave_len; + sp = (char *)((unsigned long)sp & ~0x3Ful); + sf.sf_uc.uc_mcontext.mc_xfpustate = (register_t)sp; + } + sp -= sizeof(struct sigframe); /* Align to 16 bytes. */ sfp = (struct sigframe *)((unsigned long)sp & ~0xFul); @@ -387,7 +404,10 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, /* * Copy the sigframe out to the user's stack. */ - if (copyout(&sf, sfp, sizeof(*sfp)) != 0) { + if (copyout(&sf, sfp, sizeof(*sfp)) != 0 || + (xfpusave != NULL && copyout(xfpusave, + (void *)sf.sf_uc.uc_mcontext.mc_xfpustate, xfpusave_len) + != 0)) { #ifdef DEBUG printf("process %ld has trashed its stack\n", (long)p->p_pid); #endif @@ -432,6 +452,8 @@ sys_sigreturn(td, uap) struct proc *p; struct trapframe *regs; ucontext_t *ucp; + char *xfpustate; + size_t xfpustate_len; long rflags; int cs, error, ret; ksiginfo_t ksi; @@ -490,7 +512,28 @@ sys_sigreturn(td, uap) return (EINVAL); } - ret = set_fpcontext(td, &ucp->uc_mcontext); + if ((uc.uc_mcontext.mc_flags & _MC_HASFPXSTATE) != 0) { + xfpustate_len = uc.uc_mcontext.mc_xfpustate_len; + if (xfpustate_len > cpu_max_ext_state_size - + sizeof(struct savefpu)) { + uprintf("pid %d (%s): sigreturn xfpusave_len = 0x%zx\n", + p->p_pid, td->td_name, xfpustate_len); + return (EINVAL); + } + xfpustate = __builtin_alloca(xfpustate_len); + error = copyin((const void *)uc.uc_mcontext.mc_xfpustate, + xfpustate, xfpustate_len); + if (error != 0) { + uprintf( + "pid %d (%s): sigreturn copying xfpustate failed\n", + p->p_pid, td->td_name); + return (error); + } + } else { + xfpustate = NULL; + xfpustate_len = 0; + } + ret = set_fpcontext(td, &ucp->uc_mcontext, xfpustate, xfpustate_len); if (ret != 0) { uprintf("pid %d (%s): sigreturn set_fpcontext err %d\n", p->p_pid, td->td_name, ret); @@ -1592,6 +1635,7 @@ hammer_time(u_int64_t modulep, u_int64_t int gsel_tss, x; struct pcpu *pc; struct nmi_pcpu *np; + struct xstate_hdr *xhdr; u_int64_t msr; char *env; size_t kstack0_sz; @@ -1601,7 +1645,6 @@ hammer_time(u_int64_t modulep, u_int64_t kstack0_sz = thread0.td_kstack_pages * PAGE_SIZE; bzero((void *)thread0.td_kstack, kstack0_sz); physfree += kstack0_sz; - thread0.td_pcb = (struct pcb *)(thread0.td_kstack + kstack0_sz) - 1; /* * This may be done better later if it gets more high level @@ -1650,7 +1693,6 @@ hammer_time(u_int64_t modulep, u_int64_t physfree += DPCPU_SIZE; PCPU_SET(prvspace, pc); PCPU_SET(curthread, &thread0); - PCPU_SET(curpcb, thread0.td_pcb); PCPU_SET(tssp, &common_tss[0]); PCPU_SET(commontssp, &common_tss[0]); PCPU_SET(tss, (struct system_segment_descriptor *)&gdt[GPROC0_SEL]); @@ -1742,13 +1784,6 @@ hammer_time(u_int64_t modulep, u_int64_t initializecpu(); /* Initialize CPU registers */ initializecpucache(); - /* make an initial tss so cpu can get interrupt stack on syscall! */ - common_tss[0].tss_rsp0 = thread0.td_kstack + - kstack0_sz - sizeof(struct pcb); - /* Ensure the stack is aligned to 16 bytes */ - common_tss[0].tss_rsp0 &= ~0xFul; - PCPU_SET(rsp0, common_tss[0].tss_rsp0); - /* doublefault stack space, runs on ist1 */ common_tss[0].tss_ist1 = (long)&dblfault_stack[sizeof(dblfault_stack)]; @@ -1785,6 +1820,25 @@ hammer_time(u_int64_t modulep, u_int64_t msgbufinit(msgbufp, msgbufsize); fpuinit(); + /* + * Set up thread0 pcb after fpuinit calculated pcb + fpu save + * area size. Zero out the extended state header in fpu save + * area. + */ + thread0.td_pcb = get_pcb_td(&thread0); + bzero(get_pcb_user_save_td(&thread0), cpu_max_ext_state_size); + if (use_xsave) { + xhdr = (struct xstate_hdr *)(get_pcb_user_save_td(&thread0) + + 1); + xhdr->xstate_bv = xsave_mask; + } + /* make an initial tss so cpu can get interrupt stack on syscall! */ + common_tss[0].tss_rsp0 = (vm_offset_t)thread0.td_pcb; + /* Ensure the stack is aligned to 16 bytes */ + common_tss[0].tss_rsp0 &= ~0xFul; + PCPU_SET(rsp0, common_tss[0].tss_rsp0); + PCPU_SET(curpcb, thread0.td_pcb); + /* transfer to user mode */ _ucodesel = GSEL(GUCODE_SEL, SEL_UPL); @@ -2054,7 +2108,7 @@ fill_fpregs(struct thread *td, struct fp P_SHOULDSTOP(td->td_proc), ("not suspended thread %p", td)); fpugetregs(td); - fill_fpregs_xmm(&td->td_pcb->pcb_user_save, fpregs); + fill_fpregs_xmm(get_pcb_user_save_td(td), fpregs); return (0); } @@ -2063,7 +2117,7 @@ int set_fpregs(struct thread *td, struct fpreg *fpregs) { - set_fpregs_xmm(fpregs, &td->td_pcb->pcb_user_save); + set_fpregs_xmm(fpregs, get_pcb_user_save_td(td)); fpuuserinited(td); return (0); } @@ -2114,9 +2168,11 @@ get_mcontext(struct thread *td, mcontext mcp->mc_gs = tp->tf_gs; mcp->mc_flags = tp->tf_flags; mcp->mc_len = sizeof(*mcp); - get_fpcontext(td, mcp); + get_fpcontext(td, mcp, NULL, 0); mcp->mc_fsbase = pcb->pcb_fsbase; mcp->mc_gsbase = pcb->pcb_gsbase; + mcp->mc_xfpustate = 0; + mcp->mc_xfpustate_len = 0; bzero(mcp->mc_spare, sizeof(mcp->mc_spare)); return (0); } @@ -2132,6 +2188,7 @@ set_mcontext(struct thread *td, const mc { struct pcb *pcb; struct trapframe *tp; + char *xfpustate; long rflags; int ret; @@ -2142,7 +2199,18 @@ set_mcontext(struct thread *td, const mc return (EINVAL); rflags = (mcp->mc_rflags & PSL_USERCHANGE) | (tp->tf_rflags & ~PSL_USERCHANGE); - ret = set_fpcontext(td, mcp); + if (mcp->mc_flags & _MC_HASFPXSTATE) { + if (mcp->mc_xfpustate_len > cpu_max_ext_state_size - + sizeof(struct savefpu)) + return (EINVAL); + xfpustate = __builtin_alloca(mcp->mc_xfpustate_len); + ret = copyin((void *)mcp->mc_xfpustate, xfpustate, + mcp->mc_xfpustate_len); + if (ret != 0) + return (ret); + } else + xfpustate = NULL; + ret = set_fpcontext(td, mcp, xfpustate, mcp->mc_xfpustate_len); if (ret != 0) return (ret); tp->tf_r15 = mcp->mc_r15; @@ -2180,35 +2248,51 @@ set_mcontext(struct thread *td, const mc } static void -get_fpcontext(struct thread *td, mcontext_t *mcp) +get_fpcontext(struct thread *td, mcontext_t *mcp, char *xfpusave, + size_t xfpusave_len) { + size_t max_len, len; mcp->mc_ownedfp = fpugetregs(td); - bcopy(&td->td_pcb->pcb_user_save, &mcp->mc_fpstate, + bcopy(get_pcb_user_save_td(td), &mcp->mc_fpstate, sizeof(mcp->mc_fpstate)); mcp->mc_fpformat = fpuformat(); + if (!use_xsave || xfpusave_len == 0) + return; + max_len = cpu_max_ext_state_size - sizeof(struct savefpu); + len = xfpusave_len; + if (len > max_len) { + len = max_len; + bzero(xfpusave + max_len, len - max_len); + } + mcp->mc_flags |= _MC_HASFPXSTATE; + mcp->mc_xfpustate_len = len; + bcopy(get_pcb_user_save_td(td) + 1, xfpusave, len); } static int -set_fpcontext(struct thread *td, const mcontext_t *mcp) +set_fpcontext(struct thread *td, const mcontext_t *mcp, char *xfpustate, + size_t xfpustate_len) { struct savefpu *fpstate; + int error; if (mcp->mc_fpformat == _MC_FPFMT_NODEV) return (0); else if (mcp->mc_fpformat != _MC_FPFMT_XMM) return (EINVAL); - else if (mcp->mc_ownedfp == _MC_FPOWNED_NONE) + else if (mcp->mc_ownedfp == _MC_FPOWNED_NONE) { /* We don't care what state is left in the FPU or PCB. */ fpstate_drop(td); - else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU || + error = 0; + } else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU || mcp->mc_ownedfp == _MC_FPOWNED_PCB) { fpstate = (struct savefpu *)&mcp->mc_fpstate; fpstate->sv_env.en_mxcsr &= cpu_mxcsr_mask; - fpusetregs(td, fpstate); + error = fpusetregs(td, fpstate, xfpustate, xfpustate_len); } else return (EINVAL); - return (0); + return (error); } void Modified: projects/nfsv4.1-client/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- projects/nfsv4.1-client/sys/amd64/amd64/minidump_machdep.c Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/amd64/minidump_machdep.c Mon Jan 30 00:27:02 2012 (r230761) @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #endif #include +#include #include #include #include @@ -75,8 +76,11 @@ CTASSERT(sizeof(*vm_page_dump) == 8); static int is_dumpable(vm_paddr_t pa) { + vm_page_t m; int i; + if ((m = vm_phys_paddr_to_vm_page(pa)) != NULL) + return ((m->flags & PG_NODUMP) == 0); for (i = 0; dump_avail[i] != 0 || dump_avail[i + 1] != 0; i += 2) { if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) return (1); Modified: projects/nfsv4.1-client/sys/amd64/amd64/mp_machdep.c ============================================================================== --- projects/nfsv4.1-client/sys/amd64/amd64/mp_machdep.c Sun Jan 29 23:04:29 2012 (r230760) +++ projects/nfsv4.1-client/sys/amd64/amd64/mp_machdep.c Mon Jan 30 00:27:02 2012 (r230761) @@ -99,7 +99,8 @@ char *nmi_stack; void *dpcpu; struct pcb stoppcbs[MAXCPU]; -struct pcb **susppcbs = NULL; +struct pcb **susppcbs; +void **suspfpusave; /* Variables needed for SMP tlb shootdown. */ vm_offset_t smp_tlb_addr1; @@ -1422,6 +1423,7 @@ cpususpend_handler(void) cr3 = rcr3(); if (savectx(susppcbs[cpu])) { + ctx_fpusave(suspfpusave[cpu]); wbinvd(); CPU_SET_ATOMIC(cpu, &stopped_cpus); } else { Copied: projects/nfsv4.1-client/sys/amd64/amd64/ptrace_machdep.c (from r230760, head/sys/amd64/amd64/ptrace_machdep.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/nfsv4.1-client/sys/amd64/amd64/ptrace_machdep.c Mon Jan 30 00:27:02 2012 (r230761, copy of r230760, head/sys/amd64/amd64/ptrace_machdep.c) @@ -0,0 +1,141 @@ +/*- + * Copyright (c) 2011 Konstantin Belousov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_compat.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +static int +cpu_ptrace_xstate(struct thread *td, int req, void *addr, int data) +{ + char *savefpu; + int error; + + if (!use_xsave) + return (EOPNOTSUPP); + + switch (req) { + case PT_GETXSTATE: + savefpu = (char *)(get_pcb_user_save_td(td) + 1); + error = copyout(savefpu, addr, + cpu_max_ext_state_size - sizeof(struct savefpu)); + break; + + case PT_SETXSTATE: + if (data > cpu_max_ext_state_size - sizeof(struct savefpu)) { + error = EINVAL; + break; + } + savefpu = malloc(data, M_TEMP, M_WAITOK); + error = copyin(addr, savefpu, data); + if (error == 0) + error = fpusetxstate(td, savefpu, data); + free(savefpu, M_TEMP); + break; + + default: + error = EINVAL; + break; + } + + return (error); +} + +#ifdef COMPAT_FREEBSD32 +#define PT_I386_GETXMMREGS (PT_FIRSTMACH + 0) +#define PT_I386_SETXMMREGS (PT_FIRSTMACH + 1) +#define PT_I386_GETXSTATE (PT_FIRSTMACH + 2) +#define PT_I386_SETXSTATE (PT_FIRSTMACH + 3) + +static int *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Mon Jan 30 17:17:32 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 619EF106564A; Mon, 30 Jan 2012 17:17:32 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 35A4D8FC1A; Mon, 30 Jan 2012 17:17:32 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0UHHWNE095044; Mon, 30 Jan 2012 17:17:32 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0UHHVa1095040; Mon, 30 Jan 2012 17:17:31 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201201301717.q0UHHVa1095040@svn.freebsd.org> From: Nathan Whitehorn Date: Mon, 30 Jan 2012 17:17:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230776 - in projects/pseries/powerpc: aim powerpc pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Jan 2012 17:17:32 -0000 Author: nwhitehorn Date: Mon Jan 30 17:17:31 2012 New Revision: 230776 URL: http://svn.freebsd.org/changeset/base/230776 Log: Allow up to 2^24 IRQs on xics PICs, as the spec requires. Also use multipass to make sure xics is registered first so that the interrupt layer knows to expect potentially very large IRQ numbers. Some more rototilling is in order here later. Modified: projects/pseries/powerpc/aim/nexus.c projects/pseries/powerpc/powerpc/intr_machdep.c projects/pseries/powerpc/pseries/xics.c Modified: projects/pseries/powerpc/aim/nexus.c ============================================================================== --- projects/pseries/powerpc/aim/nexus.c Mon Jan 30 16:42:02 2012 (r230775) +++ projects/pseries/powerpc/aim/nexus.c Mon Jan 30 17:17:31 2012 (r230776) @@ -195,7 +195,8 @@ static driver_t nexus_driver = { static devclass_t nexus_devclass; -DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0); +EARLY_DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0, + BUS_PASS_BUS); static int nexus_probe(device_t dev) Modified: projects/pseries/powerpc/powerpc/intr_machdep.c ============================================================================== --- projects/pseries/powerpc/powerpc/intr_machdep.c Mon Jan 30 16:42:02 2012 (r230775) +++ projects/pseries/powerpc/powerpc/intr_machdep.c Mon Jan 30 17:17:31 2012 (r230776) @@ -176,7 +176,7 @@ intrcnt_add(const char *name, u_long **c static struct powerpc_intr * intr_lookup(u_int irq) { - char intrname[8]; + char intrname[16]; struct powerpc_intr *i, *iscan; int vector; Modified: projects/pseries/powerpc/pseries/xics.c ============================================================================== --- projects/pseries/powerpc/pseries/xics.c Mon Jan 30 16:42:02 2012 (r230775) +++ projects/pseries/powerpc/pseries/xics.c Mon Jan 30 17:17:31 2012 (r230776) @@ -50,7 +50,7 @@ #define XICS_PRIORITY 5 /* Random non-zero number */ #define XICS_IPI 2 -#define MAX_XICS_IRQS 255 /* XXX: Should be 2^24, but causes problem */ +#define MAX_XICS_IRQS (1<<24) /* 24-bit XIRR field */ static int xics_probe(device_t); static int xics_attach(device_t); @@ -104,7 +104,8 @@ static driver_t xics_driver = { static devclass_t xics_devclass; -DRIVER_MODULE(xics, nexus, xics_driver, xics_devclass, 0, 0); +EARLY_DRIVER_MODULE(xics, nexus, xics_driver, xics_devclass, 0, 0, + BUS_PASS_INTERRUPT); static int xics_probe(device_t dev) From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:19:03 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6F2DF106566C; Tue, 31 Jan 2012 15:19:03 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5E7DA8FC12; Tue, 31 Jan 2012 15:19:03 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFJ3RY041591; Tue, 31 Jan 2012 15:19:03 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFJ3Fx041589; Tue, 31 Jan 2012 15:19:03 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311519.q0VFJ3Fx041589@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:19:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230809 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:19:03 -0000 Author: gber Date: Tue Jan 31 15:19:02 2012 New Revision: 230809 URL: http://svn.freebsd.org/changeset/base/230809 Log: pj4b: Fix data corruption in WB mode pj4b_idcache_wbinv_range function cleaned and invalidated wrong data range, thus causing data corruption. Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Modified: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Tue Jan 31 13:00:40 2012 (r230808) +++ projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Tue Jan 31 15:19:02 2012 (r230809) @@ -94,8 +94,6 @@ ENTRY(armv6_dcache_wbinv_all) RET ENTRY(pj4b_idcache_wbinv_range) - sub r1, r1, #1 - add r1, r0, r1 ldr ip, .Lpj4b_cache_line_size ldr ip, [ip] sub r1, r1, #1 /* Don't overrun */ From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:23:46 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 50A97106564A; Tue, 31 Jan 2012 15:23:46 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4021B8FC16; Tue, 31 Jan 2012 15:23:46 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFNkXj041773; Tue, 31 Jan 2012 15:23:46 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFNkQC041771; Tue, 31 Jan 2012 15:23:46 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311523.q0VFNkQC041771@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:23:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230810 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:23:46 -0000 Author: gber Date: Tue Jan 31 15:23:45 2012 New Revision: 230810 URL: http://svn.freebsd.org/changeset/base/230810 Log: Remove unnecessary clean and invalidate cache operations Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/mp_machdep.c Modified: projects/armv6/sys/arm/arm/mp_machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:19:02 2012 (r230809) +++ projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:23:45 2012 (r230810) @@ -270,10 +270,10 @@ release_aps(void *dummy __unused) arm_unmask_irq(0); atomic_store_rel_int(&aps_ready, 1); - cpu_dcache_wbinv_all(); + printf("Release APs\n"); + while (smp_started == 0) { - cpu_dcache_wbinv_all(); DELAY(5000); } } From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:25:00 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E5F31106564A; Tue, 31 Jan 2012 15:25:00 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D22C08FC0A; Tue, 31 Jan 2012 15:25:00 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFP0v1041845; Tue, 31 Jan 2012 15:25:00 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFP0xa041843; Tue, 31 Jan 2012 15:25:00 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311525.q0VFP0xa041843@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:25:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230811 - projects/armv6/sys/arm/mv/armadaxp X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:25:01 -0000 Author: gber Date: Tue Jan 31 15:25:00 2012 New Revision: 230811 URL: http://svn.freebsd.org/changeset/base/230811 Log: armadaxp: Fix generation of mask for coherency fabric initialization Mask was set for wrong number of cores (one less than real number), thus causing problems with proper initialization. Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Modified: projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c ============================================================================== --- projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Tue Jan 31 15:23:45 2012 (r230810) +++ projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Tue Jan 31 15:25:00 2012 (r230811) @@ -109,7 +109,7 @@ initialize_coherency_fabric(void) { uint32_t val, cpus, mask; - cpus = platform_get_ncpus() - 1; + cpus = platform_get_ncpus(); mask = (1 << cpus) - 1; val = read_coher_fabric(COHER_FABRIC_CTRL); val |= (mask << 24); From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:36:22 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 422251065675; Tue, 31 Jan 2012 15:36:22 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DE4DC8FC12; Tue, 31 Jan 2012 15:36:21 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFaLLT042259; Tue, 31 Jan 2012 15:36:21 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFaLX5042255; Tue, 31 Jan 2012 15:36:21 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311536.q0VFaLX5042255@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:36:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230813 - in projects/armv6/sys/arm: arm include mv/armadaxp X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:36:22 -0000 Author: gber Date: Tue Jan 31 15:36:21 2012 New Revision: 230813 URL: http://svn.freebsd.org/changeset/base/230813 Log: Change AP cores startup procedure Cores were initialized and started one-by-one, thus causing problems with coherency fabric initialization. Now all AP cores are started at the same moment. Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/mp_machdep.c projects/armv6/sys/arm/include/smp.h projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Modified: projects/armv6/sys/arm/arm/mp_machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:32:05 2012 (r230812) +++ projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:36:21 2012 (r230813) @@ -63,7 +63,7 @@ static int ipi_handler(void *arg); void set_stackptrs(int cpu); /* Temporary variables for init_secondary() */ -void *dpcpu; +void *dpcpu[MAXCPU - 1]; /* Determine if we running MP machine */ int @@ -76,19 +76,12 @@ cpu_mp_probe(void) /* Start Application Processor via platform specific function */ static int -start_ap(int cpu) +check_ap(void) { - int cpus, ms; - - cpus = mp_naps; - - dpcpu = (void *)kmem_alloc(kernel_map, DPCPU_SIZE); - if (platform_mp_start_ap(cpu) != 0) - return (-1); /* could not start AP */ + uint32_t ms; for (ms = 0; ms < 5000; ++ms) { - cpu_dcache_wbinv_all(); - if (mp_naps > cpus) + if ((mp_naps + 1) == mp_ncpus) return (0); /* success */ else DELAY(1000); @@ -105,16 +98,22 @@ cpu_mp_start(void) mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN); - for (i = 1; i < mp_ncpus; i++) { - error = start_ap(i); - if (error) { - printf("AP #%d failed to start\n", i); - continue; - } + /* Reserve memory for application processors */ + for(i = 0; i < (mp_ncpus - 1); i++) + dpcpu[i] = (void *)kmem_alloc(kernel_map, DPCPU_SIZE); + + /* Initialize boot code and start up processors */ + platform_mp_start_ap(); + + /* Check if ap's started properly */ + error = check_ap(); + if (error) + printf("WARNING: Some AP's failed to start\n"); + else + for (i = 1; i < mp_ncpus; i++) + CPU_SET(i, &all_cpus); - printf("AP #%d started\n", i); - CPU_SET(i, &all_cpus); - } + printf("%d AP started\n", mp_naps); } /* Introduce rest of cores to the world */ @@ -139,7 +138,7 @@ init_secondary(int cpu) set_pcpu(pc); pcpu_init(pc, cpu, sizeof(struct pcpu)); - dpcpu_init(dpcpu, cpu); + dpcpu_init(dpcpu[cpu - 1], cpu); /* Provide stack pointers for other processor modes. */ set_stackptrs(cpu); Modified: projects/armv6/sys/arm/include/smp.h ============================================================================== --- projects/armv6/sys/arm/include/smp.h Tue Jan 31 15:32:05 2012 (r230812) +++ projects/armv6/sys/arm/include/smp.h Tue Jan 31 15:36:21 2012 (r230813) @@ -27,7 +27,7 @@ int pic_ipi_get(void); /* Platform interface */ void platform_mp_setmaxid(void); int platform_mp_probe(void); -int platform_mp_start_ap(int cpuid); +void platform_mp_start_ap(void); void platform_ipi_send(cpuset_t cpus, u_int ipi); Modified: projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c ============================================================================== --- projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Tue Jan 31 15:32:05 2012 (r230812) +++ projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Tue Jan 31 15:36:21 2012 (r230813) @@ -121,65 +121,65 @@ initialize_coherency_fabric(void) } -int -platform_mp_start_ap(int cpuid) +void +platform_mp_start_ap(void) { - uint32_t reg, *ptr; + uint32_t reg, *ptr, cpu_num; - if (cpuid == 1) { - /* Copy boot code to SRAM */ - *((unsigned int*)(0xf1020240)) = 0xffff0101; - *((unsigned int*)(0xf1008500)) = 0xffff0003; - - pmap_kenter_nocache(0x880f0000, 0xffff0000); - reg = 0x880f0000; - - for (ptr = (uint32_t *)mptramp; ptr < (uint32_t *)mpentry; - ptr++, reg += 4) - *((uint32_t *)reg) = *ptr; - - if (mp_ncpus > 1) { - reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL0); - reg &= 0x00ffffff; - reg |= 0x01000000; - write_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL0, reg); - } - if (mp_ncpus > 2) { - reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1); - reg &= 0xff00ffff; - reg |= 0x00010000; - write_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1, reg); - } - if (mp_ncpus > 3) { - reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1); - reg &= 0x00ffffff; - reg |= 0x01000000; - write_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1, reg); - } - - reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL0); - reg |= ((0x1 << (mp_ncpus - 1)) - 1) << 21; - write_cpu_clkdiv(CPU_DIVCLK_CTRL0, reg); - reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL0); + /* Copy boot code to SRAM */ + *((unsigned int*)(0xf1020240)) = 0xffff0101; + *((unsigned int*)(0xf1008500)) = 0xffff0003; + + pmap_kenter_nocache(0x880f0000, 0xffff0000); + reg = 0x880f0000; + + for (ptr = (uint32_t *)mptramp; ptr < (uint32_t *)mpentry; + ptr++, reg += 4) + *((uint32_t *)reg) = *ptr; + + if (mp_ncpus > 1) { + reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL0); + reg &= 0x00ffffff; reg |= 0x01000000; - write_cpu_clkdiv(CPU_DIVCLK_CTRL0, reg); - - DELAY(100); - reg &= ~(0xf << 21); - write_cpu_clkdiv(CPU_DIVCLK_CTRL0, reg); - DELAY(100); - - bus_space_write_4(fdtbus_bs_tag, MV_BASE, CPU_RESUME_CONTROL, 0); + write_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL0, reg); + } + if (mp_ncpus > 2) { + reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1); + reg &= 0xff00ffff; + reg |= 0x00010000; + write_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1, reg); + } + if (mp_ncpus > 3) { + reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1); + reg &= 0x00ffffff; + reg |= 0x01000000; + write_cpu_clkdiv(CPU_DIVCLK_CTRL2_RATIO_FULL1, reg); + } - initialize_coherency_fabric(); + reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL0); + reg |= ((0x1 << (mp_ncpus - 1)) - 1) << 21; + write_cpu_clkdiv(CPU_DIVCLK_CTRL0, reg); + reg = read_cpu_clkdiv(CPU_DIVCLK_CTRL0); + reg |= 0x01000000; + write_cpu_clkdiv(CPU_DIVCLK_CTRL0, reg); + + DELAY(100); + reg &= ~(0xf << 21); + write_cpu_clkdiv(CPU_DIVCLK_CTRL0, reg); + DELAY(100); + + bus_space_write_4(fdtbus_bs_tag, MV_BASE, CPU_RESUME_CONTROL, 0); + + for (cpu_num = 1; cpu_num < mp_ncpus; cpu_num++ ) + bus_space_write_4(fdtbus_bs_tag, CPU_PMU(cpu_num), CPU_PMU_BOOT, + pmap_kextract(mpentry)); - } + cpu_idcache_wbinv_all(); - bus_space_write_4(fdtbus_bs_tag, CPU_PMU(cpuid), CPU_PMU_BOOT, - pmap_kextract(mpentry)); - bus_space_write_4(fdtbus_bs_tag, MP, MP_SW_RESET(cpuid), 0); + for (cpu_num = 1; cpu_num < mp_ncpus; cpu_num++ ) + bus_space_write_4(fdtbus_bs_tag, MP, MP_SW_RESET(cpu_num), 0); - return (0); + initialize_coherency_fabric(); } static int From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:38:06 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 74A8E106566C; Tue, 31 Jan 2012 15:38:06 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 63CDB8FC13; Tue, 31 Jan 2012 15:38:06 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFc6Gr042367; Tue, 31 Jan 2012 15:38:06 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFc6G6042364; Tue, 31 Jan 2012 15:38:06 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311538.q0VFc6G6042364@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:38:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230814 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:38:06 -0000 Author: gber Date: Tue Jan 31 15:38:06 2012 New Revision: 230814 URL: http://svn.freebsd.org/changeset/base/230814 Log: Fix TTB setup When multiprocessor system is used, shareable flag must be set when TTB is stored in CP15 register. Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S projects/armv6/sys/arm/arm/locore.S Modified: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Tue Jan 31 15:36:21 2012 (r230813) +++ projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Tue Jan 31 15:38:06 2012 (r230814) @@ -40,6 +40,9 @@ __FBSDID("$FreeBSD$"); ENTRY(pj4b_setttb) /* Cache synchronization is not required as this core has PIPT caches */ mcr p15, 0, r1, c7, c10, 4 /* drain the write buffer */ +#ifdef SMP + orr r0, r0, #2 /* Set TTB shared memory flag */ +#endif mcr p15, 0, r0, c2, c0, 0 /* load new TTB */ mcr p15, 0, r0, c8, c7, 0 /* invalidate I+D TLBs */ RET Modified: projects/armv6/sys/arm/arm/locore.S ============================================================================== --- projects/armv6/sys/arm/arm/locore.S Tue Jan 31 15:36:21 2012 (r230813) +++ projects/armv6/sys/arm/arm/locore.S Tue Jan 31 15:38:06 2012 (r230814) @@ -160,6 +160,9 @@ Lunmapped: orrne r5, r5, #PHYSADDR movne pc, r5 +#if defined(SMP) + orr r0, r0, #2 /* Set TTB shared memory flag */ +#endif mcr p15, 0, r0, c2, c0, 0 /* Set TTB */ mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */ @@ -335,6 +338,9 @@ ASENTRY_NP(mpentry) Ltag: ldr r0, Lstartup_pagetable +#if defined(SMP) + orr r0, r0, #2 /* Set TTB shared memory flag */ +#endif mcr p15, 0, r0, c2, c0, 0 /* Set TTB */ mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */ From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:39:06 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E6690106566B; Tue, 31 Jan 2012 15:39:06 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D5B9B8FC12; Tue, 31 Jan 2012 15:39:06 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFd68x042432; Tue, 31 Jan 2012 15:39:06 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFd6PG042430; Tue, 31 Jan 2012 15:39:06 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311539.q0VFd6PG042430@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:39:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230815 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:39:07 -0000 Author: gber Date: Tue Jan 31 15:39:06 2012 New Revision: 230815 URL: http://svn.freebsd.org/changeset/base/230815 Log: armv7: Fix TTB setup, little cleanup When TTB is written to CP15 register, proper memory model must be set. Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Tue Jan 31 15:38:06 2012 (r230814) +++ projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Tue Jan 31 15:39:06 2012 (r230815) @@ -32,8 +32,6 @@ #include __FBSDID("$FreeBSD$"); -#define TTB (0x59) - .Lcoherency_level: .word _C_LABEL(arm_cache_loc) .Lcache_type: @@ -50,6 +48,19 @@ ENTRY(armv7_setttb) bl _C_LABEL(armv7_idcache_wbinv_all) /* clean the D cache */ ldmia sp!, {r0, lr} dsb +#if defined(SMP) + /* + * Settings for architecture with SMP extension: + * PT memory: inner WBWA, shareable; outer WBWA, non-shareable + */ + orr r0, r0, #106 +#else + /* + * Settings for architecture without SMP extension: + * PT memory: inner-cacheable, non-shareable; outer WB, non-shareable + */ + orr r0, r0, #25 +#endif mcr p15, 0, r0, c2, c0, 0 /* Translation Table Base Register 0 (TTBR0) */ mcr p15, 0, r0, c8, c7, 0 /* invalidate I+D TLBs */ dsb From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:40:18 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8BEA91065744; Tue, 31 Jan 2012 15:40:18 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7AF2B8FC18; Tue, 31 Jan 2012 15:40:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFeIwB042509; Tue, 31 Jan 2012 15:40:18 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFeITR042507; Tue, 31 Jan 2012 15:40:18 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311540.q0VFeITR042507@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:40:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230816 - projects/armv6/sys/arm/mv/armadaxp X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:40:18 -0000 Author: gber Date: Tue Jan 31 15:40:18 2012 New Revision: 230816 URL: http://svn.freebsd.org/changeset/base/230816 Log: pj4b: Add workaround for hangup after releasing AP's in WT mode Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Modified: projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c ============================================================================== --- projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Tue Jan 31 15:39:06 2012 (r230815) +++ projects/armv6/sys/arm/mv/armadaxp/armadaxp_mp.c Tue Jan 31 15:40:18 2012 (r230816) @@ -179,6 +179,10 @@ platform_mp_start_ap(void) for (cpu_num = 1; cpu_num < mp_ncpus; cpu_num++ ) bus_space_write_4(fdtbus_bs_tag, MP, MP_SW_RESET(cpu_num), 0); + /* XXX: Temporary workaround for hangup after releasing AP's */ + wmb(); + DELAY(10); + initialize_coherency_fabric(); } From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:41:32 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 15937106566B; Tue, 31 Jan 2012 15:41:32 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 04C108FC15; Tue, 31 Jan 2012 15:41:32 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFfVbw042588; Tue, 31 Jan 2012 15:41:31 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFfVwS042586; Tue, 31 Jan 2012 15:41:31 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311541.q0VFfVwS042586@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:41:31 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230817 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:41:32 -0000 Author: gber Date: Tue Jan 31 15:41:31 2012 New Revision: 230817 URL: http://svn.freebsd.org/changeset/base/230817 Log: Add flag shared to page table Page table may be used by more than one processor,so flag shared must be set. Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/locore.S Modified: projects/armv6/sys/arm/arm/locore.S ============================================================================== --- projects/armv6/sys/arm/arm/locore.S Tue Jan 31 15:40:18 2012 (r230816) +++ projects/armv6/sys/arm/arm/locore.S Tue Jan 31 15:41:31 2012 (r230817) @@ -237,9 +237,9 @@ mmu_init_table: /* map VA 0xc0000000..0xc3ffffff to PA */ MMU_INIT(KERNBASE, PHYSADDR, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW)) #else - MMU_INIT(PHYSADDR, PHYSADDR , 64, L1_TYPE_S|L1_SHARED|L1_S_AP(AP_KRW)) + MMU_INIT(PHYSADDR, PHYSADDR , 64, L1_TYPE_S|L1_SHARED|L1_S_C|L1_S_AP(AP_KRW)) /* map VA 0xc0000000..0xc3ffffff to PA */ - MMU_INIT(KERNBASE, PHYSADDR, 64, L1_TYPE_S|L1_SHARED|L1_S_AP(AP_KRW)) + MMU_INIT(KERNBASE, PHYSADDR, 64, L1_TYPE_S|L1_SHARED|L1_S_C|L1_S_AP(AP_KRW)) #endif .word 0 /* end of table */ #endif From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:45:11 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4A4D9106566B; Tue, 31 Jan 2012 15:45:11 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 398518FC17; Tue, 31 Jan 2012 15:45:11 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFjBpG042760; Tue, 31 Jan 2012 15:45:11 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFjB0f042758; Tue, 31 Jan 2012 15:45:11 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311545.q0VFjB0f042758@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:45:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230818 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:45:11 -0000 Author: gber Date: Tue Jan 31 15:45:10 2012 New Revision: 230818 URL: http://svn.freebsd.org/changeset/base/230818 Log: pj4b: Add memory barriers to cache operations Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Modified: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Tue Jan 31 15:41:31 2012 (r230817) +++ projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Tue Jan 31 15:45:10 2012 (r230818) @@ -75,6 +75,8 @@ ENTRY(pj4b_dcache_inv_range) and r2, r0, r3 add r1, r1, r2 bic r0, r0, r3 + + mcr p15, 0, r0, c7, c10, 5 /* Data Memory Barrier err:4413 */ 1: mcr p15, 0, r0, c7, c6, 1 add r0, r0, ip @@ -104,6 +106,8 @@ ENTRY(pj4b_idcache_wbinv_range) and r2, r0, r3 add r1, r1, r2 bic r0, r0, r3 + + mcr p15, 0, r0, c7, c10, 5 /* Data Memory Barrier err:4611 */ 1: #ifdef SMP /* Request for ownership */ @@ -126,6 +130,8 @@ ENTRY(pj4b_dcache_wbinv_range) and r2, r0, r3 add r1, r1, r2 bic r0, r0, r3 + + mcr p15, 0, r0, c7, c10, 5 /* Data Memory Barrier err:4611 */ 1: #ifdef SMP /* Request for ownership */ @@ -147,6 +153,8 @@ ENTRY(pj4b_dcache_wb_range) and r2, r0, r3 add r1, r1, r2 bic r0, r0, r3 + + mcr p15, 0, r0, c7, c10, 5 /* Data Memory Barrier err:4611 */ 1: #ifdef SMP /* Request for ownership */ From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:46:30 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3448F106564A; Tue, 31 Jan 2012 15:46:30 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 23A038FC0A; Tue, 31 Jan 2012 15:46:30 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFkUJD042835; Tue, 31 Jan 2012 15:46:30 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFkUoL042833; Tue, 31 Jan 2012 15:46:30 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311546.q0VFkUoL042833@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:46:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230819 - projects/armv6/sys/arm/mv X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:46:30 -0000 Author: gber Date: Tue Jan 31 15:46:29 2012 New Revision: 230819 URL: http://svn.freebsd.org/changeset/base/230819 Log: mpic: Fix IPI sending - Change Target List Filter to All And Self from All No Self (val = 0x00000000), sending interrupt to core causing it should not be disabled by default - CPUISSET return 1 if core is present in cpuset structure, so should not be negated - Remove setting all cores as signal receivers (ipi | 0xf00) Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/mv/mpic.c Modified: projects/armv6/sys/arm/mv/mpic.c ============================================================================== --- projects/armv6/sys/arm/mv/mpic.c Tue Jan 31 15:45:10 2012 (r230818) +++ projects/armv6/sys/arm/mv/mpic.c Tue Jan 31 15:46:29 2012 (r230819) @@ -271,14 +271,13 @@ pic_ipi_send(cpuset_t cpus, u_int ipi) { uint32_t val, i; - val = 0x01000000; + val = 0x00000000; for (i = 0; i < MAXCPU; i++) - if (!CPU_ISSET(i, &cpus)) + if (CPU_ISSET(i, &cpus)) val |= (1 << (8 + i)); - val |= ipi | 0xf00; + val |= ipi; bus_space_write_4(mv_mpic_sc->mpic_bst, mv_mpic_sc->mpic_bsh, MPIC_SOFT_INT, val); - } int From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:47:16 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 38B63106566B; Tue, 31 Jan 2012 15:47:16 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 281578FC14; Tue, 31 Jan 2012 15:47:16 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFlGqb042892; Tue, 31 Jan 2012 15:47:16 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFlGfD042890; Tue, 31 Jan 2012 15:47:16 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311547.q0VFlGfD042890@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:47:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230820 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:47:16 -0000 Author: gber Date: Tue Jan 31 15:47:15 2012 New Revision: 230820 URL: http://svn.freebsd.org/changeset/base/230820 Log: Initialize cpuset structure with zero value before using it Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/mp_machdep.c Modified: projects/armv6/sys/arm/arm/mp_machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:46:29 2012 (r230819) +++ projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:47:15 2012 (r230820) @@ -310,6 +310,7 @@ ipi_cpu(int cpu, u_int ipi) { cpuset_t cpus; + CPU_ZERO(&cpus); CPU_SET(cpu, &cpus); CTR3(KTR_SMP, "%s: cpu: %d, ipi: %x", __func__, cpu, ipi); From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:48:33 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D3125106564A; Tue, 31 Jan 2012 15:48:33 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C23EB8FC13; Tue, 31 Jan 2012 15:48:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFmX7V042969; Tue, 31 Jan 2012 15:48:33 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFmXVZ042967; Tue, 31 Jan 2012 15:48:33 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311548.q0VFmXVZ042967@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:48:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230821 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:48:33 -0000 Author: gber Date: Tue Jan 31 15:48:33 2012 New Revision: 230821 URL: http://svn.freebsd.org/changeset/base/230821 Log: Refactor infinitive loops If additional cores won't signal startup, notification will be sent instead of hangup. Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/mp_machdep.c Modified: projects/armv6/sys/arm/arm/mp_machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:47:15 2012 (r230820) +++ projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:48:33 2012 (r230821) @@ -80,7 +80,7 @@ check_ap(void) { uint32_t ms; - for (ms = 0; ms < 5000; ++ms) { + for (ms = 0; ms < 2000; ++ms) { if ((mp_naps + 1) == mp_ncpus) return (0); /* success */ else @@ -128,6 +128,7 @@ void init_secondary(int cpu) { struct pcpu *pc; + uint32_t loop_counter; cpu_setup(NULL); @@ -172,9 +173,13 @@ init_secondary(int cpu) arm_unmask_irq(0); enable_interrupts(I32_bit); - cpu_dcache_wbinv_all(); - while (smp_started == 0) - cpu_dcache_wbinv_all(); + loop_counter = 0; + while (smp_started == 0) { + DELAY(100); + loop_counter++; + if (loop_counter == 1000) + CTR0(KTR_SMP, "AP still wait for smp_started"); + } /* Start per-CPU event timers. */ cpu_initclocks_ap(); @@ -255,6 +260,7 @@ ipi_handler(void *arg) static void release_aps(void *dummy __unused) { + uint32_t loop_counter; if (mp_ncpus == 1) return; @@ -272,9 +278,13 @@ release_aps(void *dummy __unused) printf("Release APs\n"); - while (smp_started == 0) { - DELAY(5000); + for (loop_counter = 0; loop_counter < 2000; loop_counter++) { + if (smp_started) + return; + DELAY(1000); } + + printf("AP's not started\n"); } SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL); From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:50:18 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B7165106564A; Tue, 31 Jan 2012 15:50:18 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A62EC8FC13; Tue, 31 Jan 2012 15:50:18 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFoIpZ043099; Tue, 31 Jan 2012 15:50:18 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFoIih043096; Tue, 31 Jan 2012 15:50:18 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311550.q0VFoIih043096@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:50:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230823 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:50:18 -0000 Author: gber Date: Tue Jan 31 15:50:18 2012 New Revision: 230823 URL: http://svn.freebsd.org/changeset/base/230823 Log: Remove pj4b_sleep function WFI instruction requires snoop filter and coherency fabric disabled before entering low power mode. This fix is temporary workaround over problems when SMP with WBWA cache is enabled. Submitted by: Lukasz Plachno Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/cpufunc.c projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Modified: projects/armv6/sys/arm/arm/cpufunc.c ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc.c Tue Jan 31 15:48:40 2012 (r230822) +++ projects/armv6/sys/arm/arm/cpufunc.c Tue Jan 31 15:50:18 2012 (r230823) @@ -524,7 +524,7 @@ struct cpu_functions pj4bv7_cpufuncs = { pj4b_flush_brnchtgt_all, /* flush_brnchtgt_C */ pj4b_flush_brnchtgt_va, /* flush_brnchtgt_E */ - pj4b_sleep, /* sleep */ + (void *)cpufunc_nullop, /* sleep */ /* Soft functions */ @@ -583,7 +583,7 @@ struct cpu_functions pj4bv6_cpufuncs = { pj4b_flush_brnchtgt_all, /* flush_brnchtgt_C */ pj4b_flush_brnchtgt_va, /* flush_brnchtgt_E */ - pj4b_sleep, /* sleep */ + (void *)cpufunc_nullop, /* sleep */ /* Soft functions */ Modified: projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Tue Jan 31 15:48:40 2012 (r230822) +++ projects/armv6/sys/arm/arm/cpufunc_asm_pj4b.S Tue Jan 31 15:50:18 2012 (r230823) @@ -180,11 +180,6 @@ ENTRY(pj4b_flush_brnchtgt_va) mcr p15, 0, r0, c7, c5, 7 /* flush branch target cache by VA */ RET -ENTRY(pj4b_sleep) - mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */ - mcr p15, 0, r0, c7, c0, 4 /* wait for interrupt */ - RET - ENTRY(get_core_id) mrc p15, 0, r0, c0, c0, 5 RET From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:51:34 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 87C771065687; Tue, 31 Jan 2012 15:51:34 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 76B098FC0A; Tue, 31 Jan 2012 15:51:34 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFpYMo043179; Tue, 31 Jan 2012 15:51:34 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFpYOY043175; Tue, 31 Jan 2012 15:51:34 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311551.q0VFpYOY043175@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:51:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230824 - in projects/armv6: share/mk sys/arm/include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:51:34 -0000 Author: gber Date: Tue Jan 31 15:51:34 2012 New Revision: 230824 URL: http://svn.freebsd.org/changeset/base/230824 Log: Correct building world with/without CPUTYPE=armv6 Obtained from: Marvell, Semihalf Modified: projects/armv6/share/mk/bsd.cpu.mk projects/armv6/sys/arm/include/atomic.h projects/armv6/sys/arm/include/cpuconf.h Modified: projects/armv6/share/mk/bsd.cpu.mk ============================================================================== --- projects/armv6/share/mk/bsd.cpu.mk Tue Jan 31 15:50:18 2012 (r230823) +++ projects/armv6/share/mk/bsd.cpu.mk Tue Jan 31 15:51:34 2012 (r230824) @@ -99,7 +99,7 @@ _CPUCFLAGS = -march=${CPUTYPE} #_CPUCFLAGS = -mcpu=xscale _CPUCFLAGS = -march=armv5te -D__XSCALE__ . elif ${CPUTYPE} == "armv6" -_CPUCFLAGS = -march=${CPUTYPE} -DARM_ARCH_6 +_CPUCFLAGS = -march=${CPUTYPE} -DARM_ARCH_6=1 . else _CPUCFLAGS = -mcpu=${CPUTYPE} . endif Modified: projects/armv6/sys/arm/include/atomic.h ============================================================================== --- projects/armv6/sys/arm/include/atomic.h Tue Jan 31 15:50:18 2012 (r230823) +++ projects/armv6/sys/arm/include/atomic.h Tue Jan 31 15:51:34 2012 (r230824) @@ -61,7 +61,7 @@ #endif /* XXX: Rethink for userland later as those won't be defined */ -#if defined(ARM_ARCH_6) || defined(ARM_ARCH_7) +#if ARM_ARCH_6 || ARM_ARCH_7A static __inline void atomic_set_32(volatile uint32_t *address, uint32_t setmask) Modified: projects/armv6/sys/arm/include/cpuconf.h ============================================================================== --- projects/armv6/sys/arm/include/cpuconf.h Tue Jan 31 15:50:18 2012 (r230823) +++ projects/armv6/sys/arm/include/cpuconf.h Tue Jan 31 15:51:34 2012 (r230824) @@ -88,11 +88,13 @@ #define ARM_ARCH_5 0 #endif +#if !defined(ARM_ARCH_6) #if defined(CPU_ARM11) || defined(CPU_MV_PJ4B) #define ARM_ARCH_6 1 #else #define ARM_ARCH_6 0 #endif +#endif #if defined(CPU_CORTEXA) #define ARM_ARCH_7A 1 From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:52:17 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 72BB9106564A; Tue, 31 Jan 2012 15:52:17 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 61F048FC08; Tue, 31 Jan 2012 15:52:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFqHQb043241; Tue, 31 Jan 2012 15:52:17 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFqHm7043239; Tue, 31 Jan 2012 15:52:17 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311552.q0VFqHm7043239@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:52:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230825 - projects/armv6/sys/arm/include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:52:17 -0000 Author: gber Date: Tue Jan 31 15:52:17 2012 New Revision: 230825 URL: http://svn.freebsd.org/changeset/base/230825 Log: Split pmap settings between arm archs. Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/include/pmap.h Modified: projects/armv6/sys/arm/include/pmap.h ============================================================================== --- projects/armv6/sys/arm/include/pmap.h Tue Jan 31 15:51:34 2012 (r230824) +++ projects/armv6/sys/arm/include/pmap.h Tue Jan 31 15:52:17 2012 (r230825) @@ -55,6 +55,7 @@ /* * Pte related macros */ +#if ARM_ARCH_6 || ARM_ARCH_7A #ifdef SMP #define PTE_NOCACHE 2 #else @@ -62,6 +63,11 @@ #endif #define PTE_CACHE 4 #define PTE_PAGETABLE 4 +#else +#define PTE_NOCACHE 1 +#define PTE_CACHE 2 +#define PTE_PAGETABLE 3 +#endif enum mem_type { STRONG_ORD = 0, From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:53:12 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1FD071065670; Tue, 31 Jan 2012 15:53:12 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 033EE8FC14; Tue, 31 Jan 2012 15:53:12 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFrBnY043304; Tue, 31 Jan 2012 15:53:11 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFrBpk043298; Tue, 31 Jan 2012 15:53:11 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311553.q0VFrBpk043298@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:53:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230826 - in projects/armv6/sys/arm: arm include X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:53:12 -0000 Author: gber Date: Tue Jan 31 15:53:11 2012 New Revision: 230826 URL: http://svn.freebsd.org/changeset/base/230826 Log: Fix set/get pcpu for pre-armv6 cores. - bring back old pcpu function for pre-armv6 cores - move pcpu related functions to common file. Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S projects/armv6/sys/arm/arm/machdep.c projects/armv6/sys/arm/include/cpufunc.h projects/armv6/sys/arm/include/pcpu.h Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Tue Jan 31 15:52:17 2012 (r230825) +++ projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Tue Jan 31 15:53:11 2012 (r230826) @@ -241,20 +241,3 @@ ENTRY(armv7_drain_writebuf) dsb RET -/* Use Privileged Thread Id register as a holder for pcpu pointer */ -ENTRY(get_pcpu) - mrc p15, 0, r0, c13, c0, 4 - RET - -ENTRY(set_pcpu) - mcr p15, 0, r0, c13, c0, 4 - RET - -/* Use Privileged Thread Id register as a holder for tls pointer */ -ENTRY(get_tls) - mrc p15, 0, r0, c13, c0, 3 - RET - -ENTRY(set_tls) - mcr p15, 0, r0, c13, c0, 3 - RET Modified: projects/armv6/sys/arm/arm/machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/machdep.c Tue Jan 31 15:52:17 2012 (r230825) +++ projects/armv6/sys/arm/arm/machdep.c Tue Jan 31 15:53:11 2012 (r230826) @@ -729,8 +729,9 @@ fake_preload_metadata(void) void pcpu0_init(void) { - +#if ARM_ARCH_7A || defined(CPU_MV_PJ4B) set_pcpu(pcpup); +#endif pcpu_init(pcpup, 0, sizeof(struct pcpu)); PCPU_SET(curthread, &thread0); } Modified: projects/armv6/sys/arm/include/cpufunc.h ============================================================================== --- projects/armv6/sys/arm/include/cpufunc.h Tue Jan 31 15:52:17 2012 (r230825) +++ projects/armv6/sys/arm/include/cpufunc.h Tue Jan 31 15:53:11 2012 (r230826) @@ -510,10 +510,7 @@ void pj4bv7_setup (char *string); void pj4bv6_setup (char *string); void pj4b_config (void); -int get_core_id (void); -void set_pcpu (void *); -void set_tls (void *); -void *get_tls (void); +int get_core_id (void); void armadaxp_idcache_wbinv_all (void); Modified: projects/armv6/sys/arm/include/pcpu.h ============================================================================== --- projects/armv6/sys/arm/include/pcpu.h Tue Jan 31 15:52:17 2012 (r230825) +++ projects/armv6/sys/arm/include/pcpu.h Tue Jan 31 15:53:11 2012 (r230826) @@ -32,6 +32,7 @@ #ifdef _KERNEL +#include #include #define ALT_STACK_SIZE 128 @@ -48,14 +49,44 @@ struct pcb; struct pcpu; extern struct pcpu *pcpup; +#if ARM_ARCH_6 || ARM_ARCH_7A +static inline struct pcpu * +get_pcpu(void) +{ + void *pcpu; + + __asm __volatile("mrc p15, 0, %0, c13, c0, 4" : "=r" (pcpu)); + return (pcpu); +} + +static inline void +set_pcpu(void *pcpu) +{ + + __asm __volatile("mcr p15, 0, %0, c13, c0, 4" : : "r" (pcpu)); +} + +static inline void * +get_tls(void) +{ + void *tls; + + __asm __volatile("mrc p15, 0, %0, c13, c0, 3" : "=r" (tls)); + return (tls); +} + +static inline void +set_tls(void *tls) +{ + + __asm __volatile("mcr p15, 0, %0, c13, c0, 3" : : "r" (tls)); +} +#else +#define get_pcpu() pcpup +#endif -#define PCPU_GET(member) (pcpup->pc_ ## member) - -/* - * XXX The implementation of this operation should be made atomic - * with respect to preemption. - */ -#define PCPU_ADD(member, value) (pcpup->pc_ ## member += (value)) +#define PCPU_GET(member) (get_pcpu()->pc_ ## member) +#define PCPU_ADD(member, value) (get_pcpu()->pc_ ## member += (value)) #define PCPU_INC(member) PCPU_ADD(member, 1) #define PCPU_PTR(member) (&pcpup->pc_ ## member) #define PCPU_SET(member,value) (pcpup->pc_ ## member = (value)) From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 15:53:55 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1A33E1065675; Tue, 31 Jan 2012 15:53:55 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 097C68FC0A; Tue, 31 Jan 2012 15:53:55 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VFrsmI043360; Tue, 31 Jan 2012 15:53:54 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VFrsGe043358; Tue, 31 Jan 2012 15:53:54 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201201311553.q0VFrsGe043358@svn.freebsd.org> From: Grzegorz Bernacki Date: Tue, 31 Jan 2012 15:53:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230827 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 15:53:55 -0000 Author: gber Date: Tue Jan 31 15:53:54 2012 New Revision: 230827 URL: http://svn.freebsd.org/changeset/base/230827 Log: Properly update mp_naps and smp_cpus. Obtained from: Marvell, Semihalf Modified: projects/armv6/sys/arm/arm/mp_machdep.c Modified: projects/armv6/sys/arm/arm/mp_machdep.c ============================================================================== --- projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:53:11 2012 (r230826) +++ projects/armv6/sys/arm/arm/mp_machdep.c Tue Jan 31 15:53:54 2012 (r230827) @@ -145,12 +145,11 @@ init_secondary(int cpu) set_stackptrs(cpu); /* Signal our startup to BSP */ - mp_naps++; - cpu_dcache_wbinv_all(); + atomic_add_rel_32(&mp_naps, 1); /* Spin until the BSP releases the APs */ while (!aps_ready) - cpu_dcache_wbinv_all(); + ; /* Initialize curthread */ KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread")); @@ -159,7 +158,7 @@ init_secondary(int cpu) mtx_lock_spin(&ap_boot_mtx); - atomic_store_rel_int(&smp_cpus, 1); + atomic_add_rel_32(&smp_cpus, 1); if (smp_cpus == mp_ncpus) { /* enable IPI's, tlb shootdown, freezes etc */ From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 18:48:54 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B213E1065674; Tue, 31 Jan 2012 18:48:54 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9F8CA8FC0A; Tue, 31 Jan 2012 18:48:54 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VImsa5049995; Tue, 31 Jan 2012 18:48:54 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VIms6v049992; Tue, 31 Jan 2012 18:48:54 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201201311848.q0VIms6v049992@svn.freebsd.org> From: Nathan Whitehorn Date: Tue, 31 Jan 2012 18:48:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230839 - in projects/pseries/powerpc: aim pseries X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 18:48:54 -0000 Author: nwhitehorn Date: Tue Jan 31 18:48:54 2012 New Revision: 230839 URL: http://svn.freebsd.org/changeset/base/230839 Log: Properly handle the multi-domain interrupt system found on pSeries hardware by providing aliases for the XICP on all XICS nodes. This should all the cross-routing working. Note that this involves the creation of multiple interrupt domains with 24-bit ranges, meaning that some devices will get extraordinarily high IRQs (in the 100000000 range) assigned to them. Should MAP_IRQ start just returning vector numbers, like on Linux? Modified: projects/pseries/powerpc/aim/nexus.c projects/pseries/powerpc/pseries/xics.c Modified: projects/pseries/powerpc/aim/nexus.c ============================================================================== --- projects/pseries/powerpc/aim/nexus.c Tue Jan 31 18:44:01 2012 (r230838) +++ projects/pseries/powerpc/aim/nexus.c Tue Jan 31 18:48:54 2012 (r230839) @@ -217,7 +217,7 @@ nexus_attach(device_t dev) sc = device_get_softc(dev); start = 0; - end = MAX_PICS*INTR_VECTORS - 1; + end = ~0; sc->sc_rman.rm_start = start; sc->sc_rman.rm_end = end; Modified: projects/pseries/powerpc/pseries/xics.c ============================================================================== --- projects/pseries/powerpc/pseries/xics.c Tue Jan 31 18:44:01 2012 (r230838) +++ projects/pseries/powerpc/pseries/xics.c Tue Jan 31 18:48:54 2012 (r230839) @@ -48,39 +48,49 @@ #include "phyp-hvcall.h" #include "pic_if.h" -#define XICS_PRIORITY 5 /* Random non-zero number */ -#define XICS_IPI 2 -#define MAX_XICS_IRQS (1<<24) /* 24-bit XIRR field */ +#define XICP_PRIORITY 5 /* Random non-zero number */ +#define XICP_IPI 2 +#define MAX_XICP_IRQS (1<<24) /* 24-bit XIRR field */ +static int xicp_probe(device_t); +static int xicp_attach(device_t); static int xics_probe(device_t); static int xics_attach(device_t); -static void xics_bind(device_t dev, u_int irq, cpuset_t cpumask); -static void xics_dispatch(device_t, struct trapframe *); -static void xics_enable(device_t, u_int, u_int); -static void xics_eoi(device_t, u_int); -static void xics_ipi(device_t, u_int); -static void xics_mask(device_t, u_int); -static void xics_unmask(device_t, u_int); +static void xicp_bind(device_t dev, u_int irq, cpuset_t cpumask); +static void xicp_dispatch(device_t, struct trapframe *); +static void xicp_enable(device_t, u_int, u_int); +static void xicp_eoi(device_t, u_int); +static void xicp_ipi(device_t, u_int); +static void xicp_mask(device_t, u_int); +static void xicp_unmask(device_t, u_int); + +static device_method_t xicp_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, xicp_probe), + DEVMETHOD(device_attach, xicp_attach), + + /* PIC interface */ + DEVMETHOD(pic_bind, xicp_bind), + DEVMETHOD(pic_dispatch, xicp_dispatch), + DEVMETHOD(pic_enable, xicp_enable), + DEVMETHOD(pic_eoi, xicp_eoi), + DEVMETHOD(pic_ipi, xicp_ipi), + DEVMETHOD(pic_mask, xicp_mask), + DEVMETHOD(pic_unmask, xicp_unmask), + + { 0, 0 }, +}; static device_method_t xics_methods[] = { /* Device interface */ DEVMETHOD(device_probe, xics_probe), DEVMETHOD(device_attach, xics_attach), - /* PIC interface */ - DEVMETHOD(pic_bind, xics_bind), - DEVMETHOD(pic_dispatch, xics_dispatch), - DEVMETHOD(pic_enable, xics_enable), - DEVMETHOD(pic_eoi, xics_eoi), - DEVMETHOD(pic_ipi, xics_ipi), - DEVMETHOD(pic_mask, xics_mask), - DEVMETHOD(pic_unmask, xics_unmask), - { 0, 0 }, }; -struct xics_softc { +struct xicp_softc { struct mtx sc_mtx; int ibm_int_on; @@ -96,19 +106,28 @@ struct xics_softc { int nintvecs; }; +static driver_t xicp_driver = { + "xicp", + xicp_methods, + sizeof(struct xicp_softc) +}; + static driver_t xics_driver = { "xics", xics_methods, - sizeof(struct xics_softc) + 0 }; +static devclass_t xicp_devclass; static devclass_t xics_devclass; +EARLY_DRIVER_MODULE(xicp, nexus, xicp_driver, xicp_devclass, 0, 0, + BUS_PASS_INTERRUPT-1); EARLY_DRIVER_MODULE(xics, nexus, xics_driver, xics_devclass, 0, 0, BUS_PASS_INTERRUPT); static int -xics_probe(device_t dev) +xicp_probe(device_t dev) { if (ofw_bus_get_name(dev) == NULL || strcmp(ofw_bus_get_name(dev), "interrupt-controller") != 0) @@ -122,11 +141,26 @@ xics_probe(device_t dev) } static int -xics_attach(device_t dev) +xics_probe(device_t dev) { - struct xics_softc *sc = device_get_softc(dev); + if (ofw_bus_get_name(dev) == NULL || strcmp(ofw_bus_get_name(dev), + "interrupt-controller") != 0) + return (ENXIO); + + if (!ofw_bus_is_compatible(dev, "ibm,ppc-xics")) + return (ENXIO); - mtx_init(&sc->sc_mtx, "XICS", NULL, MTX_DEF); + device_set_desc(dev, "PAPR virtual interrupt source"); + return (BUS_PROBE_GENERIC); +} + +static int +xicp_attach(device_t dev) +{ + struct xicp_softc *sc = device_get_softc(dev); + phandle_t phandle = ofw_bus_get_node(dev); + + mtx_init(&sc->sc_mtx, "XICP", NULL, MTX_DEF); sc->nintvecs = 0; sc->ibm_int_on = rtas_token_lookup("ibm,int-on"); @@ -134,8 +168,28 @@ xics_attach(device_t dev) sc->ibm_set_xive = rtas_token_lookup("ibm,set-xive"); sc->ibm_get_xive = rtas_token_lookup("ibm,get-xive"); - powerpc_register_pic(dev, ofw_bus_get_node(dev), MAX_XICS_IRQS, + if (OF_getproplen(phandle, "ibm,phandle") > 0) + OF_getprop(phandle, "ibm,phandle", &phandle, sizeof(phandle)); + + powerpc_register_pic(dev, phandle, MAX_XICP_IRQS, + 1 /* Number of IPIs */, FALSE); + root_pic = dev; + + return (0); +} + +static int +xics_attach(device_t dev) +{ + phandle_t phandle = ofw_bus_get_node(dev); + + if (OF_getproplen(phandle, "ibm,phandle") > 0) + OF_getprop(phandle, "ibm,phandle", &phandle, sizeof(phandle)); + + /* The XICP (root PIC) will handle all our interrupts */ + powerpc_register_pic(root_pic, phandle, MAX_XICP_IRQS, 1 /* Number of IPIs */, FALSE); + return (0); } @@ -144,9 +198,9 @@ xics_attach(device_t dev) */ static void -xics_bind(device_t dev, u_int irq, cpuset_t cpumask) +xicp_bind(device_t dev, u_int irq, cpuset_t cpumask) { - struct xics_softc *sc = device_get_softc(dev); + struct xicp_softc *sc = device_get_softc(dev); cell_t status, cpu; /* @@ -156,14 +210,14 @@ xics_bind(device_t dev, u_int irq, cpuse CPU_FOREACH(cpu) if (CPU_ISSET(cpu, &cpumask)) break; - rtas_call_method(sc->ibm_set_xive, 3, 1, irq, cpu, XICS_PRIORITY, + rtas_call_method(sc->ibm_set_xive, 3, 1, irq, cpu, XICP_PRIORITY, &status); } static void -xics_dispatch(device_t dev, struct trapframe *tf) +xicp_dispatch(device_t dev, struct trapframe *tf) { - struct xics_softc *sc; + struct xicp_softc *sc; uint64_t xirr, junk; int i; @@ -177,8 +231,8 @@ xics_dispatch(device_t dev, struct trapf phyp_hcall(H_CPPR, (uint64_t)0xff); break; } - if (xirr == XICS_IPI) { /* Magic number for IPIs */ - xirr = MAX_XICS_IRQS; /* Map to FreeBSD magic */ + if (xirr == XICP_IPI) { /* Magic number for IPIs */ + xirr = MAX_XICP_IRQS; /* Map to FreeBSD magic */ phyp_hcall(H_IPI, (uint64_t)(PCPU_GET(cpuid)), 0xff); /* Clear IPI */ } @@ -195,15 +249,15 @@ xics_dispatch(device_t dev, struct trapf } static void -xics_enable(device_t dev, u_int irq, u_int vector) +xicp_enable(device_t dev, u_int irq, u_int vector) { - struct xics_softc *sc; + struct xicp_softc *sc; cell_t status, cpu; sc = device_get_softc(dev); KASSERT(sc->nintvecs + 1 < sizeof(sc->intvecs)/sizeof(sc->intvecs[0]), - ("Too many XICS interrupts")); + ("Too many XICP interrupts")); mtx_lock(&sc->sc_mtx); sc->intvecs[sc->nintvecs].irq = irq; @@ -213,54 +267,54 @@ xics_enable(device_t dev, u_int irq, u_i mtx_unlock(&sc->sc_mtx); /* IPIs are also enabled */ - if (irq == MAX_XICS_IRQS) + if (irq == MAX_XICP_IRQS) return; /* Bind to this CPU to start: distrib. ID is last entry in gserver# */ cpu = PCPU_GET(cpuid); - rtas_call_method(sc->ibm_set_xive, 3, 1, irq, cpu, XICS_PRIORITY, + rtas_call_method(sc->ibm_set_xive, 3, 1, irq, cpu, XICP_PRIORITY, &status); - xics_unmask(dev, irq); + xicp_unmask(dev, irq); } static void -xics_eoi(device_t dev, u_int irq) +xicp_eoi(device_t dev, u_int irq) { uint64_t xirr; - if (irq == MAX_XICS_IRQS) /* Remap IPI interrupt to internal value */ - irq = XICS_IPI; - xirr = irq | (XICS_PRIORITY << 24); + if (irq == MAX_XICP_IRQS) /* Remap IPI interrupt to internal value */ + irq = XICP_IPI; + xirr = irq | (XICP_PRIORITY << 24); phyp_hcall(H_EOI, xirr); } static void -xics_ipi(device_t dev, u_int cpu) +xicp_ipi(device_t dev, u_int cpu) { - phyp_hcall(H_IPI, (uint64_t)cpu, XICS_PRIORITY); + phyp_hcall(H_IPI, (uint64_t)cpu, XICP_PRIORITY); } static void -xics_mask(device_t dev, u_int irq) +xicp_mask(device_t dev, u_int irq) { - struct xics_softc *sc = device_get_softc(dev); + struct xicp_softc *sc = device_get_softc(dev); cell_t status; - if (irq == MAX_XICS_IRQS) + if (irq == MAX_XICP_IRQS) return; rtas_call_method(sc->ibm_int_off, 1, 1, irq, &status); } static void -xics_unmask(device_t dev, u_int irq) +xicp_unmask(device_t dev, u_int irq) { - struct xics_softc *sc = device_get_softc(dev); + struct xicp_softc *sc = device_get_softc(dev); cell_t status; - if (irq == MAX_XICS_IRQS) + if (irq == MAX_XICP_IRQS) return; rtas_call_method(sc->ibm_int_on, 1, 1, irq, &status); From owner-svn-src-projects@FreeBSD.ORG Tue Jan 31 19:45:33 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 818F11065674; Tue, 31 Jan 2012 19:45:33 +0000 (UTC) (envelope-from jamie@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 70AF98FC0A; Tue, 31 Jan 2012 19:45:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q0VJjXoo052090; Tue, 31 Jan 2012 19:45:33 GMT (envelope-from jamie@svn.freebsd.org) Received: (from jamie@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q0VJjXtX052088; Tue, 31 Jan 2012 19:45:33 GMT (envelope-from jamie@svn.freebsd.org) Message-Id: <201201311945.q0VJjXtX052088@svn.freebsd.org> From: Jamie Gritton Date: Tue, 31 Jan 2012 19:45:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230844 - projects/jailconf/usr.sbin/jail X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Jan 2012 19:45:33 -0000 Author: jamie Date: Tue Jan 31 19:45:32 2012 New Revision: 230844 URL: http://svn.freebsd.org/changeset/base/230844 Log: Better communicate the purpose of "-r *". Modified: projects/jailconf/usr.sbin/jail/jail.8 Modified: projects/jailconf/usr.sbin/jail/jail.8 ============================================================================== --- projects/jailconf/usr.sbin/jail/jail.8 Tue Jan 31 19:38:18 2012 (r230843) +++ projects/jailconf/usr.sbin/jail/jail.8 Tue Jan 31 19:45:32 2012 (r230844) @@ -207,8 +207,10 @@ file, specified by name or jid. .P An argument of .Dq * -is a wildcard that will operate on all jails. To prevent errors, -this is the only way for +is a wildcard that will operate on all jails, regardless of whether +they appear in +.Xr jail.conf 5 ; +this is the surest way for .Fl r to remove all jails. If hierarchical jails exist, a partial-matching wildcard definition may From owner-svn-src-projects@FreeBSD.ORG Wed Feb 1 02:16:16 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9F711106566C; Wed, 1 Feb 2012 02:16:16 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8CE248FC14; Wed, 1 Feb 2012 02:16:16 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q112GG6h065395; Wed, 1 Feb 2012 02:16:16 GMT (envelope-from gonzo@svn.freebsd.org) Received: (from gonzo@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q112GGso065377; Wed, 1 Feb 2012 02:16:16 GMT (envelope-from gonzo@svn.freebsd.org) Message-Id: <201202010216.q112GGso065377@svn.freebsd.org> From: Oleksandr Tymoshenko Date: Wed, 1 Feb 2012 02:16:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230856 - in projects/armv6/sys/arm: conf omap ti ti/omap4 ti/omap4/pandaboard X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Feb 2012 02:16:16 -0000 Author: gonzo Date: Wed Feb 1 02:16:15 2012 New Revision: 230856 URL: http://svn.freebsd.org/changeset/base/230856 Log: Change directory layout: use manufacturer as a top-level directory, not SoC family. The plan is to get more TI products on board. Suggested by: Damjan Marion Added: projects/armv6/sys/arm/ti/ - copied from r230844, projects/armv6/sys/arm/omap/ Deleted: projects/armv6/sys/arm/omap/ Modified: projects/armv6/sys/arm/conf/PANDABOARD projects/armv6/sys/arm/ti/omap.c projects/armv6/sys/arm/ti/omap4/files.omap44xx projects/armv6/sys/arm/ti/omap4/omap44xx.c projects/armv6/sys/arm/ti/omap4/omap4_intr.c projects/armv6/sys/arm/ti/omap4/omap4_prcm_clks.c projects/armv6/sys/arm/ti/omap4/omap4_scm_padconf.c projects/armv6/sys/arm/ti/omap4/omap4_timer.c projects/armv6/sys/arm/ti/omap4/pandaboard/files.pandaboard projects/armv6/sys/arm/ti/omap4/pandaboard/pandaboard.c projects/armv6/sys/arm/ti/omap4/pandaboard/std.pandaboard projects/armv6/sys/arm/ti/omap4/std.omap44xx projects/armv6/sys/arm/ti/omap4/uart_cpu_omap4.c projects/armv6/sys/arm/ti/omap_cpuid.c projects/armv6/sys/arm/ti/omap_machdep.c projects/armv6/sys/arm/ti/omap_prcm.c projects/armv6/sys/arm/ti/omapvar.h Modified: projects/armv6/sys/arm/conf/PANDABOARD ============================================================================== --- projects/armv6/sys/arm/conf/PANDABOARD Wed Feb 1 01:36:46 2012 (r230855) +++ projects/armv6/sys/arm/conf/PANDABOARD Wed Feb 1 02:16:15 2012 (r230856) @@ -28,7 +28,7 @@ ident PANDABOARD hints "PANDABOARD.hints" -include "../omap/omap4/pandaboard/std.pandaboard" +include "../ti/omap4/pandaboard/std.pandaboard" #To statically compile in device wiring instead of /boot/device.hints makeoptions MODULES_OVERRIDE="" Modified: projects/armv6/sys/arm/ti/omap.c ============================================================================== --- projects/armv6/sys/arm/omap/omap.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap.c Wed Feb 1 02:16:15 2012 (r230856) @@ -55,7 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include static int omap_probe(device_t); static void omap_identify(driver_t *, device_t); Modified: projects/armv6/sys/arm/ti/omap4/files.omap44xx ============================================================================== --- projects/armv6/sys/arm/omap/omap4/files.omap44xx Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/files.omap44xx Wed Feb 1 02:16:15 2012 (r230856) @@ -10,20 +10,20 @@ arm/arm/cpufunc_asm_arm11.S standard arm/arm/cpufunc_asm_armv7.S standard arm/arm/irq_dispatch.S standard -arm/omap/omap_machdep.c standard -arm/omap/omap.c standard -arm/omap/omap_cpuid.c standard -arm/omap/omap_prcm.c standard -arm/omap/omap_scm.c standard -arm/omap/omap_if.m standard +arm/ti/omap_machdep.c standard +arm/ti/omap.c standard +arm/ti/omap_cpuid.c standard +arm/ti/omap_prcm.c standard +arm/ti/omap_scm.c standard +arm/ti/omap_if.m standard -arm/omap/omap4/omap4_if.m standard -arm/omap/omap4/omap44xx.c standard -arm/omap/omap4/omap4_intr.c standard -arm/omap/omap4/omap4_prcm_clks.c standard -arm/omap/omap4/omap4_scm_padconf.c standard -arm/omap/omap4/omap4_timer.c standard +arm/ti/omap4/omap4_if.m standard +arm/ti/omap4/omap44xx.c standard +arm/ti/omap4/omap4_intr.c standard +arm/ti/omap4/omap4_prcm_clks.c standard +arm/ti/omap4/omap4_scm_padconf.c standard +arm/ti/omap4/omap4_timer.c standard -arm/omap/omap4/uart_cpu_omap4.c optional uart +arm/ti/omap4/uart_cpu_omap4.c optional uart dev/uart/uart_dev_ns8250.c optional uart Modified: projects/armv6/sys/arm/ti/omap4/omap44xx.c ============================================================================== --- projects/armv6/sys/arm/omap/omap4/omap44xx.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/omap44xx.c Wed Feb 1 02:16:15 2012 (r230856) @@ -40,10 +40,10 @@ __FBSDID("$FreeBSD$"); #define _ARM32_BUS_DMA_PRIVATE #include -#include -#include -#include -#include +#include +#include +#include +#include #include "omap_if.h" #include "omap4_if.h" Modified: projects/armv6/sys/arm/ti/omap4/omap4_intr.c ============================================================================== --- projects/armv6/sys/arm/omap/omap4/omap4_intr.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/omap4_intr.c Wed Feb 1 02:16:15 2012 (r230856) @@ -36,9 +36,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include +#include #include "omap4_if.h" Modified: projects/armv6/sys/arm/ti/omap4/omap4_prcm_clks.c ============================================================================== --- projects/armv6/sys/arm/omap/omap4/omap4_prcm_clks.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/omap4_prcm_clks.c Wed Feb 1 02:16:15 2012 (r230856) @@ -47,9 +47,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include +#include #include "omap_if.h" Modified: projects/armv6/sys/arm/ti/omap4/omap4_scm_padconf.c ============================================================================== --- projects/armv6/sys/arm/omap/omap4/omap4_scm_padconf.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/omap4_scm_padconf.c Wed Feb 1 02:16:15 2012 (r230856) @@ -46,10 +46,10 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include -#include +#include +#include +#include +#include /* Modified: projects/armv6/sys/arm/ti/omap4/omap4_timer.c ============================================================================== --- projects/armv6/sys/arm/omap/omap4/omap4_timer.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/omap4_timer.c Wed Feb 1 02:16:15 2012 (r230856) @@ -47,10 +47,10 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include +#include +#include -#include +#include #include "omap4_if.h" Modified: projects/armv6/sys/arm/ti/omap4/pandaboard/files.pandaboard ============================================================================== --- projects/armv6/sys/arm/omap/omap4/pandaboard/files.pandaboard Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/pandaboard/files.pandaboard Wed Feb 1 02:16:15 2012 (r230856) @@ -1,3 +1,3 @@ # $FreeBSD$ -arm/omap/omap4/pandaboard/pandaboard.c standard +arm/ti/omap4/pandaboard/pandaboard.c standard Modified: projects/armv6/sys/arm/ti/omap4/pandaboard/pandaboard.c ============================================================================== --- projects/armv6/sys/arm/omap/omap4/pandaboard/pandaboard.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/pandaboard/pandaboard.c Wed Feb 1 02:16:15 2012 (r230856) @@ -42,9 +42,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include +#include /* Registers in the SCRM that control the AUX clocks */ #define SCRM_ALTCLKSRC (OMAP44XX_SCRM_VBASE + 0x110) Modified: projects/armv6/sys/arm/ti/omap4/pandaboard/std.pandaboard ============================================================================== --- projects/armv6/sys/arm/omap/omap4/pandaboard/std.pandaboard Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/pandaboard/std.pandaboard Wed Feb 1 02:16:15 2012 (r230856) @@ -1,4 +1,4 @@ # $FreeBSD$ -include "../omap/omap4/std.omap44xx" -files "../omap/omap4/pandaboard/files.pandaboard" +include "../ti/omap4/std.omap44xx" +files "../ti/omap4/pandaboard/files.pandaboard" Modified: projects/armv6/sys/arm/ti/omap4/std.omap44xx ============================================================================== --- projects/armv6/sys/arm/omap/omap4/std.omap44xx Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/std.omap44xx Wed Feb 1 02:16:15 2012 (r230856) @@ -1,7 +1,7 @@ # Omap4430 generic configuration #$FreeBSD$ -files "../omap/omap4/files.omap44xx" -include "../omap/std.omap" +files "../ti/omap4/files.omap44xx" +include "../ti/std.omap" makeoption ARM_LITTLE_ENDIAN # Physical memory starts at 0x80000000. We assume images are loaded at Modified: projects/armv6/sys/arm/ti/omap4/uart_cpu_omap4.c ============================================================================== --- projects/armv6/sys/arm/omap/omap4/uart_cpu_omap4.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap4/uart_cpu_omap4.c Wed Feb 1 02:16:15 2012 (r230856) @@ -39,8 +39,8 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include +#include +#include bus_space_tag_t uart_bus_space_io; bus_space_tag_t uart_bus_space_mem; Modified: projects/armv6/sys/arm/ti/omap_cpuid.c ============================================================================== --- projects/armv6/sys/arm/omap/omap_cpuid.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap_cpuid.c Wed Feb 1 02:16:15 2012 (r230856) @@ -45,11 +45,11 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include +#include +#include -#include -#include +#include +#include #define OMAP4_STD_FUSE_DIE_ID_0 0x2200 #define OMAP4_ID_CODE 0x2204 Modified: projects/armv6/sys/arm/ti/omap_machdep.c ============================================================================== --- projects/armv6/sys/arm/omap/omap_machdep.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap_machdep.c Wed Feb 1 02:16:15 2012 (r230856) @@ -57,11 +57,11 @@ __FBSDID("$FreeBSD$"); #define DEBUG_INITARM #define VERBOSE_INIT_ARM -#include -#include +#include +#include #if defined(SOC_OMAP4) -#include +#include const struct pmap_devmap omap_devmap[] = { /* * Add the main memory areas, @@ -118,7 +118,7 @@ const struct pmap_devmap omap_devmap[] = }; #elif defined(SOC_OMAP3) -#include +#include const struct pmap_devmap omap_devmap[] = { /* * For the moment, map devices with PA==VA. Modified: projects/armv6/sys/arm/ti/omap_prcm.c ============================================================================== --- projects/armv6/sys/arm/omap/omap_prcm.c Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omap_prcm.c Wed Feb 1 02:16:15 2012 (r230856) @@ -58,7 +58,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include "omap_if.h" Modified: projects/armv6/sys/arm/ti/omapvar.h ============================================================================== --- projects/armv6/sys/arm/omap/omapvar.h Tue Jan 31 19:45:32 2012 (r230844) +++ projects/armv6/sys/arm/ti/omapvar.h Wed Feb 1 02:16:15 2012 (r230856) @@ -50,7 +50,7 @@ #include #include -#include +#include /* From owner-svn-src-projects@FreeBSD.ORG Wed Feb 1 03:49:56 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B38B8106566B; Wed, 1 Feb 2012 03:49:56 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9EE218FC0A; Wed, 1 Feb 2012 03:49:56 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q113nuf8068897; Wed, 1 Feb 2012 03:49:56 GMT (envelope-from gonzo@svn.freebsd.org) Received: (from gonzo@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q113nuFY068895; Wed, 1 Feb 2012 03:49:56 GMT (envelope-from gonzo@svn.freebsd.org) Message-Id: <201202010349.q113nuFY068895@svn.freebsd.org> From: Oleksandr Tymoshenko Date: Wed, 1 Feb 2012 03:49:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230860 - projects/armv6/sys/arm/ti X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Feb 2012 03:49:56 -0000 Author: gonzo Date: Wed Feb 1 03:49:56 2012 New Revision: 230860 URL: http://svn.freebsd.org/changeset/base/230860 Log: Use pcpu0_init in order to initialize pcpu properly Modified: projects/armv6/sys/arm/ti/omap_machdep.c Modified: projects/armv6/sys/arm/ti/omap_machdep.c ============================================================================== --- projects/armv6/sys/arm/ti/omap_machdep.c Wed Feb 1 03:42:14 2012 (r230859) +++ projects/armv6/sys/arm/ti/omap_machdep.c Wed Feb 1 03:49:56 2012 (r230860) @@ -264,8 +264,7 @@ initarm_boilerplate(void *arg1, void *ar /* * Initialize the MI portions of a struct per cpu structure. */ - pcpu_init(pcpup, 0, sizeof(struct pcpu)); - PCPU_SET(curthread, &thread0); + pcpu0_init(); init_param1(); /* From owner-svn-src-projects@FreeBSD.ORG Thu Feb 2 04:20:33 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D9648106564A; Thu, 2 Feb 2012 04:20:33 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C87B18FC08; Thu, 2 Feb 2012 04:20:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q124KXqh018926; Thu, 2 Feb 2012 04:20:33 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q124KXkj018923; Thu, 2 Feb 2012 04:20:33 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201202020420.q124KXkj018923@svn.freebsd.org> From: Rick Macklem Date: Thu, 2 Feb 2012 04:20:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230899 - in projects/nfsv4.1-client/sys/fs: nfs nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Feb 2012 04:20:33 -0000 Author: rmacklem Date: Thu Feb 2 04:20:33 2012 New Revision: 230899 URL: http://svn.freebsd.org/changeset/base/230899 Log: Add a flag to nfsm_stateidtom() so that it will put the stateid on the wire with a seqid == 0. This is needed for NFSv4.1, where stateid.seqid == 0 defines the stateid as the most recent incarnation of the stateid. Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clcomsubs.c Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Thu Feb 2 00:10:20 2012 (r230898) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Thu Feb 2 04:20:33 2012 (r230899) @@ -468,6 +468,7 @@ #define NFSSTATEID_PUTALLZERO 0 #define NFSSTATEID_PUTALLONE 1 #define NFSSTATEID_PUTSTATEID 2 +#define NFSSTATEID_PUTSEQIDZERO 3 /* * Bits for share access and deny. Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clcomsubs.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clcomsubs.c Thu Feb 2 00:10:20 2012 (r230898) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clcomsubs.c Thu Feb 2 04:20:33 2012 (r230899) @@ -496,6 +496,11 @@ nfsm_stateidtom(struct nfsrv_descript *n st->other[0] = 0xffffffff; st->other[1] = 0xffffffff; st->other[2] = 0xffffffff; + } else if (flag == NFSSTATEID_PUTSEQIDZERO) { + st->seqid = 0; + st->other[0] = stateidp->other[0]; + st->other[1] = stateidp->other[1]; + st->other[2] = stateidp->other[2]; } else { st->seqid = stateidp->seqid; st->other[0] = stateidp->other[0]; From owner-svn-src-projects@FreeBSD.ORG Thu Feb 2 12:22:22 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8DB981065670; Thu, 2 Feb 2012 12:22:22 +0000 (UTC) (envelope-from gber@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 78B938FC1C; Thu, 2 Feb 2012 12:22:22 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q12CMMTF037326; Thu, 2 Feb 2012 12:22:22 GMT (envelope-from gber@svn.freebsd.org) Received: (from gber@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q12CMMcK037323; Thu, 2 Feb 2012 12:22:22 GMT (envelope-from gber@svn.freebsd.org) Message-Id: <201202021222.q12CMMcK037323@svn.freebsd.org> From: Grzegorz Bernacki Date: Thu, 2 Feb 2012 12:22:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230911 - projects/armv6/sys/arm/arm X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Feb 2012 12:22:22 -0000 Author: gber Date: Thu Feb 2 12:22:22 2012 New Revision: 230911 URL: http://svn.freebsd.org/changeset/base/230911 Log: Fix getting cache level of coherency and remove Marvell specific code. Submitted by: Damjan Marion Modified: projects/armv6/sys/arm/arm/cpufunc.c projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Modified: projects/armv6/sys/arm/arm/cpufunc.c ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc.c Thu Feb 2 11:18:34 2012 (r230910) +++ projects/armv6/sys/arm/arm/cpufunc.c Thu Feb 2 12:22:22 2012 (r230911) @@ -1083,7 +1083,7 @@ get_cachetype_cp15() __asm __volatile("mrc p15, 1, %0, c0, c0, 1" : "=r" (clevel)); arm_cache_level = clevel; - arm_cache_loc = CPU_CLIDR_LOC(arm_cache_level) + 1; + arm_cache_loc = CPU_CLIDR_LOC(arm_cache_level); i = 0; while ((type = (clevel & 0x7)) && i < 7) { if (type == CACHE_DCACHE || type == CACHE_UNI_CACHE || Modified: projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S ============================================================================== --- projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Thu Feb 2 11:18:34 2012 (r230910) +++ projects/armv6/sys/arm/arm/cpufunc_asm_armv7.S Thu Feb 2 12:22:22 2012 (r230911) @@ -97,6 +97,7 @@ ENTRY(armv7_dcache_wbinv_all) Loop1: /* Get cache type for given level */ mov r2, r8, lsl #2 + add r2, r2, r2 ldr r0, .Lcache_type ldr r1, [r0, r2] @@ -131,7 +132,6 @@ Skip: bne Loop1 Finished: isb - mcr p15, 0, r0, c7, c5, 5 ldmia sp!, {r4, r5, r6, r7, r8, r9} RET From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 01:59:17 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 07C59106566C; Fri, 3 Feb 2012 01:59:17 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EB5DF8FC08; Fri, 3 Feb 2012 01:59:16 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q131xGnX064879; Fri, 3 Feb 2012 01:59:16 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q131xGCH064877; Fri, 3 Feb 2012 01:59:16 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201202030159.q131xGCH064877@svn.freebsd.org> From: Rick Macklem Date: Fri, 3 Feb 2012 01:59:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230925 - projects/nfsv4.1-client/sys/fs/nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 01:59:17 -0000 Author: rmacklem Date: Fri Feb 3 01:59:16 2012 New Revision: 230925 URL: http://svn.freebsd.org/changeset/base/230925 Log: Fix a couple of "if (error)" cases for the new NFSv4.1 code. Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Fri Feb 3 01:36:02 2012 (r230924) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Fri Feb 3 01:59:16 2012 (r230925) @@ -4544,7 +4544,7 @@ nfsrpc_layoutget(struct nfsmount *nmp, u nd->nd_flag |= ND_USEGSSNAME; error = newnfs_request(nd, nmp, NULL, &nmp->nm_sockreq, NULL, p, cred, NFS_PROG, NFS_VER4, NULL, 1, NULL, NULL); - if (error) + if (error != 0) return (error); if (nd->nd_repstat == 0) { NFSM_DISSECT(tl, uint32_t *, 2 * NFSX_UNSIGNED + NFSX_STATEID); @@ -4854,7 +4854,7 @@ nfsrpc_layoutcommit(vnode_t vp, off_t of } nd->nd_flag |= ND_USEGSSNAME; error = nfscl_request(nd, vp, p, cred, stuff); - if (error) + if (error != 0) return (error); if (nd->nd_repstat == 0) { NFSM_DISSECT(tl, uint32_t *, NFSX_UNSIGNED); @@ -4917,7 +4917,7 @@ nfsrpc_layoutreturn(vnode_t vp, int recl } nd->nd_flag |= ND_USEGSSNAME; error = nfscl_request(nd, vp, p, cred, stuff); - if (error) + if (error != 0) return (error); if (nd->nd_repstat == 0) { NFSM_DISSECT(tl, uint32_t *, NFSX_UNSIGNED); From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 02:15:59 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DA3E1106567D; Fri, 3 Feb 2012 02:15:59 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C98C78FC08; Fri, 3 Feb 2012 02:15:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q132Fxtk065478; Fri, 3 Feb 2012 02:15:59 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q132Fx43065475; Fri, 3 Feb 2012 02:15:59 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201202030215.q132Fx43065475@svn.freebsd.org> From: Rick Macklem Date: Fri, 3 Feb 2012 02:15:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230927 - projects/nfsv4.1-client/sys/fs/nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 02:15:59 -0000 Author: rmacklem Date: Fri Feb 3 02:15:59 2012 New Revision: 230927 URL: http://svn.freebsd.org/changeset/base/230927 Log: Add the macro that does mtx_destroy() to the code that frees up Date Server (DS) information structures. Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Fri Feb 3 02:06:14 2012 (r230926) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Fri Feb 3 02:15:59 2012 (r230927) @@ -5040,6 +5040,7 @@ nfsrpc_fillsa(struct nfsmount *nmp, stru } if (error != 0) { NFSFREECRED(dsp->nfsclds_sock.nr_cred); + NFSFREEMUTEX(&dsp->nfsclds_sock.nr_mtx); free(dsp->nfsclds_sock.nr_nam, M_SONAME); NFSBZERO(dsp, sizeof(*dsp)); } Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Fri Feb 3 02:06:14 2012 (r230926) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Fri Feb 3 02:15:59 2012 (r230927) @@ -4631,8 +4631,9 @@ nfscl_freedevinfo(struct nfscldevinfo *d for (i = 0; i < dip->nfsdi_addrcnt; i++) { dsp = nfsfldi_addr(dip, i); if (dsp->nfsclds_sock.nr_nam != NULL) { - /* Both are set or both are NULL. */ + /* All are set or none are. */ NFSFREECRED(dsp->nfsclds_sock.nr_cred); + NFSFREEMUTEX(&dsp->nfsclds_sock.nr_mtx); free(dsp->nfsclds_sock.nr_nam, M_SONAME); } } From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 03:11:09 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F3D79106564A; Fri, 3 Feb 2012 03:11:08 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C9CD88FC15; Fri, 3 Feb 2012 03:11:08 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q133B8xQ067614; Fri, 3 Feb 2012 03:11:08 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q133B8Ht067613; Fri, 3 Feb 2012 03:11:08 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202030311.q133B8Ht067613@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 03:11:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230929 - projects/multi-fibv6 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 03:11:09 -0000 Author: bz Date: Fri Feb 3 03:11:08 2012 New Revision: 230929 URL: http://svn.freebsd.org/changeset/base/230929 Log: Create a working branch for the implementation of multi-FIB IPv6 support. Sponsored by: Cisco Systems, Inc. Added: projects/multi-fibv6/ - copied from r230928, head/ Directory Properties: projects/multi-fibv6/head/ (props changed) From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 08:50:19 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DCA78106564A; Fri, 3 Feb 2012 08:50:19 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C2E418FC0C; Fri, 3 Feb 2012 08:50:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q138oJh9078264; Fri, 3 Feb 2012 08:50:19 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q138oJxE078262; Fri, 3 Feb 2012 08:50:19 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202030850.q138oJxE078262@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 08:50:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230932 - projects/multi-fibv6/head/sys/netinet6 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 08:50:19 -0000 Author: bz Date: Fri Feb 3 08:50:19 2012 New Revision: 230932 URL: http://svn.freebsd.org/changeset/base/230932 Log: In preparation for multi-FIB IPv6 support, factor the code for joining and leaving multicast groups out from in6_update_ifa() and in6_purgeaddr(). Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/netinet6/in6.c Modified: projects/multi-fibv6/head/sys/netinet6/in6.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6.c Fri Feb 3 05:00:43 2012 (r230931) +++ projects/multi-fibv6/head/sys/netinet6/in6.c Fri Feb 3 08:50:19 2012 (r230932) @@ -821,6 +821,169 @@ out: } /* + * Join necessary multicast groups. Factored out from in6_update_ifa(). + * This entire work should only be done once, for the default FIB. + */ +static int +in6_update_ifa_join_mc(struct ifnet *ifp, struct in6_aliasreq *ifra, + struct in6_ifaddr *ia, int flags, struct in6_multi **in6m_sol) +{ + char ip6buf[INET6_ADDRSTRLEN]; + struct sockaddr_in6 mltaddr, mltmask; + struct in6_addr llsol; + struct in6_multi_mship *imm; + struct rtentry *rt; + int delay, error; + + KASSERT(in6m_sol != NULL, ("%s: in6m_sol is NULL", __func__)); + + /* Join solicited multicast addr for new host id. */ + bzero(&llsol, sizeof(struct in6_addr)); + llsol.s6_addr32[0] = IPV6_ADDR_INT32_MLL; + llsol.s6_addr32[1] = 0; + llsol.s6_addr32[2] = htonl(1); + llsol.s6_addr32[3] = ifra->ifra_addr.sin6_addr.s6_addr32[3]; + llsol.s6_addr8[12] = 0xff; + if ((error = in6_setscope(&llsol, ifp, NULL)) != 0) { + /* XXX: should not happen */ + log(LOG_ERR, "%s: in6_setscope failed\n", __func__); + goto cleanup; + } + delay = 0; + if ((flags & IN6_IFAUPDATE_DADDELAY)) { + /* + * We need a random delay for DAD on the address being + * configured. It also means delaying transmission of the + * corresponding MLD report to avoid report collision. + * [RFC 4861, Section 6.3.7] + */ + delay = arc4random() % (MAX_RTR_SOLICITATION_DELAY * hz); + } + imm = in6_joingroup(ifp, &llsol, &error, delay); + if (imm == NULL) { + nd6log((LOG_WARNING, "%s: addmulti failed for %s on %s " + "(errno=%d)\n", __func__, ip6_sprintf(ip6buf, &llsol), + if_name(ifp), error)); + goto cleanup; + } + LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain); + *in6m_sol = imm->i6mm_maddr; + + bzero(&mltmask, sizeof(mltmask)); + mltmask.sin6_len = sizeof(struct sockaddr_in6); + mltmask.sin6_family = AF_INET6; + mltmask.sin6_addr = in6mask32; +#define MLTMASK_LEN 4 /* mltmask's masklen (=32bit=4octet) */ + + /* + * Join link-local all-nodes address. + */ + bzero(&mltaddr, sizeof(mltaddr)); + mltaddr.sin6_len = sizeof(struct sockaddr_in6); + mltaddr.sin6_family = AF_INET6; + mltaddr.sin6_addr = in6addr_linklocal_allnodes; + if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != 0) + goto cleanup; /* XXX: should not fail */ + + /* + * XXX: do we really need this automatic routes? We should probably + * reconsider this stuff. Most applications actually do not need the + * routes, since they usually specify the outgoing interface. + */ + rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); + if (rt != NULL) { + /* XXX: only works in !SCOPEDROUTING case. */ + if (memcmp(&mltaddr.sin6_addr, + &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr, + MLTMASK_LEN)) { + RTFREE_LOCKED(rt); + rt = NULL; + } + } + if (rt == NULL) { + error = rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, + (struct sockaddr *)&ia->ia_addr, + (struct sockaddr *)&mltmask, RTF_UP, + (struct rtentry **)0); + if (error) + goto cleanup; + } else + RTFREE_LOCKED(rt); + + imm = in6_joingroup(ifp, &mltaddr.sin6_addr, &error, 0); + if (imm == NULL) { + nd6log((LOG_WARNING, "%s: addmulti failed for %s on %s " + "(errno=%d)\n", __func__, ip6_sprintf(ip6buf, + &mltaddr.sin6_addr), if_name(ifp), error)); + goto cleanup; + } + LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain); + + /* + * Join node information group address. + */ + delay = 0; + if ((flags & IN6_IFAUPDATE_DADDELAY)) { + /* + * The spec does not say anything about delay for this group, + * but the same logic should apply. + */ + delay = arc4random() % (MAX_RTR_SOLICITATION_DELAY * hz); + } + if (in6_nigroup(ifp, NULL, -1, &mltaddr.sin6_addr) == 0) { + /* XXX jinmei */ + imm = in6_joingroup(ifp, &mltaddr.sin6_addr, &error, delay); + if (imm == NULL) + nd6log((LOG_WARNING, "%s: addmulti failed for %s on %s " + "(errno=%d)\n", __func__, ip6_sprintf(ip6buf, + &mltaddr.sin6_addr), if_name(ifp), error)); + /* XXX not very fatal, go on... */ + else + LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain); + } + + /* + * Join interface-local all-nodes address. + * (ff01::1%ifN, and ff01::%ifN/32) + */ + mltaddr.sin6_addr = in6addr_nodelocal_allnodes; + if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != 0) + goto cleanup; /* XXX: should not fail */ + /* XXX: again, do we really need the route? */ + rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); + if (rt != NULL) { + if (memcmp(&mltaddr.sin6_addr, + &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr, + MLTMASK_LEN)) { + RTFREE_LOCKED(rt); + rt = NULL; + } + } + if (rt == NULL) { + error = rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, + (struct sockaddr *)&ia->ia_addr, + (struct sockaddr *)&mltmask, RTF_UP, + (struct rtentry **)0); + if (error) + goto cleanup; + } else + RTFREE_LOCKED(rt); + + imm = in6_joingroup(ifp, &mltaddr.sin6_addr, &error, 0); + if (imm == NULL) { + nd6log((LOG_WARNING, "%s: addmulti failed for %s on %s " + "(errno=%d)\n", __func__, ip6_sprintf(ip6buf, + &mltaddr.sin6_addr), if_name(ifp), error)); + goto cleanup; + } + LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain); +#undef MLTMASK_LEN + +cleanup: + return (error); +} + +/* * Update parameters of an IPv6 interface address. * If necessary, a new entry is created and linked into address chains. * This function is separated from in6_control(). @@ -833,9 +996,7 @@ in6_update_ifa(struct ifnet *ifp, struct int error = 0, hostIsNew = 0, plen = -1; struct sockaddr_in6 dst6; struct in6_addrlifetime *lt; - struct in6_multi_mship *imm; struct in6_multi *in6m_sol; - struct rtentry *rt; int delay; char ip6buf[INET6_ADDRSTRLEN]; @@ -1083,172 +1244,12 @@ in6_update_ifa(struct ifnet *ifp, struct * not just go to unlink. */ - /* Join necessary multicast groups */ + /* Join necessary multicast groups. */ in6m_sol = NULL; if ((ifp->if_flags & IFF_MULTICAST) != 0) { - struct sockaddr_in6 mltaddr, mltmask; - struct in6_addr llsol; - - /* join solicited multicast addr for new host id */ - bzero(&llsol, sizeof(struct in6_addr)); - llsol.s6_addr32[0] = IPV6_ADDR_INT32_MLL; - llsol.s6_addr32[1] = 0; - llsol.s6_addr32[2] = htonl(1); - llsol.s6_addr32[3] = ifra->ifra_addr.sin6_addr.s6_addr32[3]; - llsol.s6_addr8[12] = 0xff; - if ((error = in6_setscope(&llsol, ifp, NULL)) != 0) { - /* XXX: should not happen */ - log(LOG_ERR, "in6_update_ifa: " - "in6_setscope failed\n"); - goto cleanup; - } - delay = 0; - if ((flags & IN6_IFAUPDATE_DADDELAY)) { - /* - * We need a random delay for DAD on the address - * being configured. It also means delaying - * transmission of the corresponding MLD report to - * avoid report collision. - * [RFC 4861, Section 6.3.7] - */ - delay = arc4random() % - (MAX_RTR_SOLICITATION_DELAY * hz); - } - imm = in6_joingroup(ifp, &llsol, &error, delay); - if (imm == NULL) { - nd6log((LOG_WARNING, - "in6_update_ifa: addmulti failed for " - "%s on %s (errno=%d)\n", - ip6_sprintf(ip6buf, &llsol), if_name(ifp), - error)); - goto cleanup; - } - LIST_INSERT_HEAD(&ia->ia6_memberships, - imm, i6mm_chain); - in6m_sol = imm->i6mm_maddr; - - bzero(&mltmask, sizeof(mltmask)); - mltmask.sin6_len = sizeof(struct sockaddr_in6); - mltmask.sin6_family = AF_INET6; - mltmask.sin6_addr = in6mask32; -#define MLTMASK_LEN 4 /* mltmask's masklen (=32bit=4octet) */ - - /* - * join link-local all-nodes address - */ - bzero(&mltaddr, sizeof(mltaddr)); - mltaddr.sin6_len = sizeof(struct sockaddr_in6); - mltaddr.sin6_family = AF_INET6; - mltaddr.sin6_addr = in6addr_linklocal_allnodes; - if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != - 0) - goto cleanup; /* XXX: should not fail */ - - /* - * XXX: do we really need this automatic routes? - * We should probably reconsider this stuff. Most applications - * actually do not need the routes, since they usually specify - * the outgoing interface. - */ - rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); - if (rt) { - /* XXX: only works in !SCOPEDROUTING case. */ - if (memcmp(&mltaddr.sin6_addr, - &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr, - MLTMASK_LEN)) { - RTFREE_LOCKED(rt); - rt = NULL; - } - } - if (!rt) { - error = rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, - (struct sockaddr *)&ia->ia_addr, - (struct sockaddr *)&mltmask, RTF_UP, - (struct rtentry **)0); - if (error) - goto cleanup; - } else { - RTFREE_LOCKED(rt); - } - - imm = in6_joingroup(ifp, &mltaddr.sin6_addr, &error, 0); - if (!imm) { - nd6log((LOG_WARNING, - "in6_update_ifa: addmulti failed for " - "%s on %s (errno=%d)\n", - ip6_sprintf(ip6buf, &mltaddr.sin6_addr), - if_name(ifp), error)); - goto cleanup; - } - LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain); - - /* - * join node information group address - */ - delay = 0; - if ((flags & IN6_IFAUPDATE_DADDELAY)) { - /* - * The spec doesn't say anything about delay for this - * group, but the same logic should apply. - */ - delay = arc4random() % - (MAX_RTR_SOLICITATION_DELAY * hz); - } - if (in6_nigroup(ifp, NULL, -1, &mltaddr.sin6_addr) == 0) { - imm = in6_joingroup(ifp, &mltaddr.sin6_addr, &error, - delay); /* XXX jinmei */ - if (!imm) { - nd6log((LOG_WARNING, "in6_update_ifa: " - "addmulti failed for %s on %s " - "(errno=%d)\n", - ip6_sprintf(ip6buf, &mltaddr.sin6_addr), - if_name(ifp), error)); - /* XXX not very fatal, go on... */ - } else { - LIST_INSERT_HEAD(&ia->ia6_memberships, - imm, i6mm_chain); - } - } - - /* - * join interface-local all-nodes address. - * (ff01::1%ifN, and ff01::%ifN/32) - */ - mltaddr.sin6_addr = in6addr_nodelocal_allnodes; - if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) - != 0) - goto cleanup; /* XXX: should not fail */ - /* XXX: again, do we really need the route? */ - rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); - if (rt) { - if (memcmp(&mltaddr.sin6_addr, - &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr, - MLTMASK_LEN)) { - RTFREE_LOCKED(rt); - rt = NULL; - } - } - if (!rt) { - error = rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, - (struct sockaddr *)&ia->ia_addr, - (struct sockaddr *)&mltmask, RTF_UP, - (struct rtentry **)0); - if (error) - goto cleanup; - } else - RTFREE_LOCKED(rt); - - imm = in6_joingroup(ifp, &mltaddr.sin6_addr, &error, 0); - if (!imm) { - nd6log((LOG_WARNING, "in6_update_ifa: " - "addmulti failed for %s on %s " - "(errno=%d)\n", - ip6_sprintf(ip6buf, &mltaddr.sin6_addr), - if_name(ifp), error)); + error = in6_update_ifa_join_mc(ifp, ifra, ia, flags, &in6m_sol); + if (error) goto cleanup; - } - LIST_INSERT_HEAD(&ia->ia6_memberships, imm, i6mm_chain); -#undef MLTMASK_LEN } /* @@ -1312,58 +1313,20 @@ in6_update_ifa(struct ifnet *ifp, struct return error; } -void -in6_purgeaddr(struct ifaddr *ifa) +/* + * Leave multicast groups. Factored out from in6_purgeaddr(). + * This entire work should only be done once, for the default FIB. + */ +static int +in6_purgeaddr_mc(struct ifnet *ifp, struct in6_ifaddr *ia, struct ifaddr *ifa0) { - struct ifnet *ifp = ifa->ifa_ifp; - struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa; - struct in6_multi_mship *imm; struct sockaddr_in6 mltaddr, mltmask; - int plen, error; + struct in6_multi_mship *imm; struct rtentry *rt; - struct ifaddr *ifa0; - - if (ifa->ifa_carp) - (*carp_detach_p)(ifa); + int error; /* - * find another IPv6 address as the gateway for the - * link-local and node-local all-nodes multicast - * address routes - */ - IF_ADDR_RLOCK(ifp); - TAILQ_FOREACH(ifa0, &ifp->if_addrhead, ifa_link) { - if ((ifa0->ifa_addr->sa_family != AF_INET6) || - memcmp(&satosin6(ifa0->ifa_addr)->sin6_addr, - &ia->ia_addr.sin6_addr, - sizeof(struct in6_addr)) == 0) - continue; - else - break; - } - if (ifa0 != NULL) - ifa_ref(ifa0); - IF_ADDR_RUNLOCK(ifp); - - /* - * Remove the loopback route to the interface address. - * The check for the current setting of "nd6_useloopback" - * is not needed. - */ - if (ia->ia_flags & IFA_RTSELF) { - error = ifa_del_loopback_route((struct ifaddr *)ia, - (struct sockaddr *)&ia->ia_addr); - if (error == 0) - ia->ia_flags &= ~IFA_RTSELF; - } - - /* stop DAD processing */ - nd6_dad_stop(ifa); - - in6_ifremloop(ifa); - - /* - * leave from multicast groups we have joined for the interface + * Leave from multicast groups we have joined for the interface. */ while ((imm = LIST_FIRST(&ia->ia6_memberships)) != NULL) { LIST_REMOVE(imm, i6mm_chain); @@ -1371,7 +1334,7 @@ in6_purgeaddr(struct ifaddr *ifa) } /* - * remove the link-local all-nodes address + * Remove the link-local all-nodes address. */ bzero(&mltmask, sizeof(mltmask)); mltmask.sin6_len = sizeof(struct sockaddr_in6); @@ -1384,7 +1347,7 @@ in6_purgeaddr(struct ifaddr *ifa) mltaddr.sin6_addr = in6addr_linklocal_allnodes; if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != 0) - goto cleanup; + return (error); rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); if (rt != NULL && rt->rt_gateway != NULL && @@ -1392,23 +1355,25 @@ in6_purgeaddr(struct ifaddr *ifa) &ia->ia_addr.sin6_addr, sizeof(ia->ia_addr.sin6_addr)) == 0)) { /* - * if no more IPv6 address exists on this interface - * then remove the multicast address route + * If no more IPv6 address exists on this interface then + * remove the multicast address route. */ if (ifa0 == NULL) { memcpy(&mltaddr.sin6_addr, &satosin6(rt_key(rt))->sin6_addr, sizeof(mltaddr.sin6_addr)); RTFREE_LOCKED(rt); - error = rtrequest(RTM_DELETE, (struct sockaddr *)&mltaddr, - (struct sockaddr *)&ia->ia_addr, - (struct sockaddr *)&mltmask, RTF_UP, - (struct rtentry **)0); + error = rtrequest(RTM_DELETE, + (struct sockaddr *)&mltaddr, + (struct sockaddr *)&ia->ia_addr, + (struct sockaddr *)&mltmask, RTF_UP, + (struct rtentry **)0); if (error) - log(LOG_INFO, "in6_purgeaddr: link-local all-nodes" - "multicast address deletion error\n"); + log(LOG_INFO, "%s: link-local all-nodes " + "multicast address deletion error\n", + __func__); } else { /* - * replace the gateway of the route + * Replace the gateway of the route. */ struct sockaddr_in6 sa; @@ -1427,12 +1392,11 @@ in6_purgeaddr(struct ifaddr *ifa) } /* - * remove the node-local all-nodes address + * Remove the node-local all-nodes address. */ mltaddr.sin6_addr = in6addr_nodelocal_allnodes; - if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != - 0) - goto cleanup; + if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != 0) + return (error); rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); if (rt != NULL && rt->rt_gateway != NULL && @@ -1440,25 +1404,26 @@ in6_purgeaddr(struct ifaddr *ifa) &ia->ia_addr.sin6_addr, sizeof(ia->ia_addr.sin6_addr)) == 0)) { /* - * if no more IPv6 address exists on this interface - * then remove the multicast address route + * If no more IPv6 address exists on this interface then + * remove the multicast address route. */ if (ifa0 == NULL) { memcpy(&mltaddr.sin6_addr, &satosin6(rt_key(rt))->sin6_addr, sizeof(mltaddr.sin6_addr)); RTFREE_LOCKED(rt); - error = rtrequest(RTM_DELETE, (struct sockaddr *)&mltaddr, - (struct sockaddr *)&ia->ia_addr, - (struct sockaddr *)&mltmask, RTF_UP, - (struct rtentry **)0); - + error = rtrequest(RTM_DELETE, + (struct sockaddr *)&mltaddr, + (struct sockaddr *)&ia->ia_addr, + (struct sockaddr *)&mltmask, RTF_UP, + (struct rtentry **)0); if (error) - log(LOG_INFO, "in6_purgeaddr: node-local all-nodes" - "multicast address deletion error\n"); + log(LOG_INFO, "%s: node-local all-nodes" + "multicast address deletion error\n", + __func__); } else { /* - * replace the gateway of the route + * Replace the gateway of the route. */ struct sockaddr_in6 sa; @@ -1476,7 +1441,59 @@ in6_purgeaddr(struct ifaddr *ifa) RTFREE_LOCKED(rt); } -cleanup: + return (0); +} + +void +in6_purgeaddr(struct ifaddr *ifa) +{ + struct ifnet *ifp = ifa->ifa_ifp; + struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa; + int plen, error; + struct ifaddr *ifa0; + + if (ifa->ifa_carp) + (*carp_detach_p)(ifa); + + /* + * find another IPv6 address as the gateway for the + * link-local and node-local all-nodes multicast + * address routes + */ + IF_ADDR_RLOCK(ifp); + TAILQ_FOREACH(ifa0, &ifp->if_addrhead, ifa_link) { + if ((ifa0->ifa_addr->sa_family != AF_INET6) || + memcmp(&satosin6(ifa0->ifa_addr)->sin6_addr, + &ia->ia_addr.sin6_addr, + sizeof(struct in6_addr)) == 0) + continue; + else + break; + } + if (ifa0 != NULL) + ifa_ref(ifa0); + IF_ADDR_RUNLOCK(ifp); + + /* + * Remove the loopback route to the interface address. + * The check for the current setting of "nd6_useloopback" + * is not needed. + */ + if (ia->ia_flags & IFA_RTSELF) { + error = ifa_del_loopback_route((struct ifaddr *)ia, + (struct sockaddr *)&ia->ia_addr); + if (error == 0) + ia->ia_flags &= ~IFA_RTSELF; + } + + /* stop DAD processing */ + nd6_dad_stop(ifa); + + in6_ifremloop(ifa); + + /* Leave multicast groups. */ + error = in6_purgeaddr_mc(ifp, ia, ifa0); + if (ifa0 != NULL) ifa_free(ifa0); From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 09:06:25 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3BC2C106564A; Fri, 3 Feb 2012 09:06:25 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2B0638FC0C; Fri, 3 Feb 2012 09:06:25 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q1396P30078797; Fri, 3 Feb 2012 09:06:25 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q1396PXc078795; Fri, 3 Feb 2012 09:06:25 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202030906.q1396PXc078795@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 09:06:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230933 - projects/multi-fibv6/head/sys/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 09:06:25 -0000 Author: bz Date: Fri Feb 3 09:06:24 2012 New Revision: 230933 URL: http://svn.freebsd.org/changeset/base/230933 Log: Rather than putting magic 0s as FIB argument into the rt* calls, provide a macro RT_DEFAULT_FIB defined to 0 to more easily identify the cases tied to the default FIB. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/net/route.h Modified: projects/multi-fibv6/head/sys/net/route.h ============================================================================== --- projects/multi-fibv6/head/sys/net/route.h Fri Feb 3 08:50:19 2012 (r230932) +++ projects/multi-fibv6/head/sys/net/route.h Fri Feb 3 09:06:24 2012 (r230933) @@ -111,6 +111,7 @@ struct rt_metrics { #endif #endif +#define RT_DEFAULT_FIB 0 /* Explicitly mark fib=0 restricted cases */ extern u_int rt_numfibs; /* number fo usable routing tables */ /* * XXX kernel function pointer `rt_output' is visible to applications. From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 09:23:55 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id ED75B1065673; Fri, 3 Feb 2012 09:23:55 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DC5058FC13; Fri, 3 Feb 2012 09:23:55 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q139Nt65079380; Fri, 3 Feb 2012 09:23:55 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q139NtoY079378; Fri, 3 Feb 2012 09:23:55 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202030923.q139NtoY079378@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 09:23:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230935 - projects/multi-fibv6/head/sys/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 09:23:56 -0000 Author: bz Date: Fri Feb 3 09:23:55 2012 New Revision: 230935 URL: http://svn.freebsd.org/changeset/base/230935 Log: Allow for IPv6 to allocate (and in the VIMAGE case free) as many routing tables (FIBs) as IPv4. Prepare various general rt* functions for multi-FIB IPv6 handling in addition to already existing multi-FIB IPv4 cases. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/net/route.c Modified: projects/multi-fibv6/head/sys/net/route.c ============================================================================== --- projects/multi-fibv6/head/sys/net/route.c Fri Feb 3 09:07:53 2012 (r230934) +++ projects/multi-fibv6/head/sys/net/route.c Fri Feb 3 09:23:55 2012 (r230935) @@ -196,27 +196,23 @@ vnet_route_init(const void *unused __unu V_rtzone = uma_zcreate("rtentry", sizeof(struct rtentry), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); for (dom = domains; dom; dom = dom->dom_next) { - if (dom->dom_rtattach) { - for (table = 0; table < rt_numfibs; table++) { - if ( (fam = dom->dom_family) == AF_INET || - table == 0) { - /* for now only AF_INET has > 1 table */ - /* XXX MRT - * rtattach will be also called - * from vfs_export.c but the - * offset will be 0 - * (only for AF_INET and AF_INET6 - * which don't need it anyhow) - */ - rnh = rt_tables_get_rnh_ptr(table, fam); - if (rnh == NULL) - panic("%s: rnh NULL", __func__); - dom->dom_rtattach((void **)rnh, - dom->dom_rtoffset); - } else { - break; - } - } + if (dom->dom_rtattach == NULL) + continue; + + for (table = 0; table < rt_numfibs; table++) { + fam = dom->dom_family; + if (table != 0 && fam != AF_INET6 && fam != AF_INET) + break; + + /* + * XXX MRT rtattach will be also called from + * vfs_export.c but the offset will be 0 (only for + * AF_INET and AF_INET6 which don't need it anyhow). + */ + rnh = rt_tables_get_rnh_ptr(table, fam); + if (rnh == NULL) + panic("%s: rnh NULL", __func__); + dom->dom_rtattach((void **)rnh, dom->dom_rtoffset); } } } @@ -233,20 +229,19 @@ vnet_route_uninit(const void *unused __u struct radix_node_head **rnh; for (dom = domains; dom; dom = dom->dom_next) { - if (dom->dom_rtdetach) { - for (table = 0; table < rt_numfibs; table++) { - if ( (fam = dom->dom_family) == AF_INET || - table == 0) { - /* For now only AF_INET has > 1 tbl. */ - rnh = rt_tables_get_rnh_ptr(table, fam); - if (rnh == NULL) - panic("%s: rnh NULL", __func__); - dom->dom_rtdetach((void **)rnh, - dom->dom_rtoffset); - } else { - break; - } - } + if (dom->dom_rtdetach == NULL) + continue; + + for (table = 0; table < rt_numfibs; table++) { + fam = dom->dom_family; + + if (table != 0 && fam != AF_INET6 && fam != AF_INET) + break; + + rnh = rt_tables_get_rnh_ptr(table, fam); + if (rnh == NULL) + panic("%s: rnh NULL", __func__); + dom->dom_rtdetach((void **)rnh, dom->dom_rtoffset); } } } @@ -339,8 +334,15 @@ rtalloc1_fib(struct sockaddr *dst, int r int needlock; KASSERT((fibnum < rt_numfibs), ("rtalloc1_fib: bad fibnum")); - if (dst->sa_family != AF_INET) /* Only INET supports > 1 fib now */ - fibnum = 0; + switch (dst->sa_family) { + case AF_INET6: + case AF_INET: + /* We support multiple FIBs. */ + break; + default: + fibnum = RT_DEFAULT_FIB; + break; + } rnh = rt_tables_get_rnh(fibnum, dst->sa_family); newrt = NULL; if (rnh == NULL) @@ -1029,8 +1031,16 @@ rtrequest1_fib(int req, struct rt_addrin #define senderr(x) { error = x ; goto bad; } KASSERT((fibnum < rt_numfibs), ("rtrequest1_fib: bad fibnum")); - if (dst->sa_family != AF_INET) /* Only INET supports > 1 fib now */ - fibnum = 0; + switch (dst->sa_family) { + case AF_INET6: + case AF_INET: + /* We support multiple FIBs. */ + break; + default: + fibnum = RT_DEFAULT_FIB; + break; + } + /* * Find the correct routing tree to use for this Address Family */ @@ -1383,8 +1393,15 @@ rtinit1(struct ifaddr *ifa, int cmd, int dst = ifa->ifa_addr; netmask = ifa->ifa_netmask; } - if ( dst->sa_family != AF_INET) - fibnum = 0; + switch (dst->sa_family) { + case AF_INET6: + case AF_INET: + /* We support multiple FIBs. */ + break; + default: + fibnum = RT_DEFAULT_FIB; + break; + } if (fibnum == -1) { if (rt_add_addr_allfibs == 0 && cmd == (int)RTM_ADD) { startfib = endfib = curthread->td_proc->p_fibnum; @@ -1587,7 +1604,12 @@ rtinit(struct ifaddr *ifa, int cmd, int dst = ifa->ifa_addr; } - if (dst->sa_family == AF_INET) + switch (dst->sa_family) { + case AF_INET6: + case AF_INET: + /* We do support multiple FIBs. */ fib = -1; + break; + } return (rtinit1(ifa, cmd, flags, fib)); } From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 09:33:58 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E6BE2106566C; Fri, 3 Feb 2012 09:33:58 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id BB5D68FC15; Fri, 3 Feb 2012 09:33:58 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q139XwTc079724; Fri, 3 Feb 2012 09:33:58 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q139Xwg0079721; Fri, 3 Feb 2012 09:33:58 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202030933.q139Xwg0079721@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 09:33:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230936 - projects/multi-fibv6/head/sys/netinet6 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 09:33:59 -0000 Author: bz Date: Fri Feb 3 09:33:58 2012 New Revision: 230936 URL: http://svn.freebsd.org/changeset/base/230936 Log: Provide the IPv6 counterpart to the extended IPv4 rtalloc(9) KPI. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/netinet6/in6_rmx.c projects/multi-fibv6/head/sys/netinet6/in6_var.h Modified: projects/multi-fibv6/head/sys/netinet6/in6_rmx.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6_rmx.c Fri Feb 3 09:23:55 2012 (r230935) +++ projects/multi-fibv6/head/sys/netinet6/in6_rmx.c Fri Feb 3 09:33:58 2012 (r230936) @@ -445,3 +445,43 @@ in6_detachhead(void **head, int off) return (1); } #endif + +/* + * Extended API for IPv6 FIB support. + */ +void +in6_rtredirect(struct sockaddr *dst, struct sockaddr *gw, struct sockaddr *nm, + int flags, struct sockaddr *src, u_int fibnum) +{ + + rtredirect_fib(dst, gw, nm, flags, src, fibnum); +} + +int +in6_rtrequest(int req, struct sockaddr *dst, struct sockaddr *gw, + struct sockaddr *mask, int flags, struct rtentry **ret_nrt, u_int fibnum) +{ + + return (rtrequest_fib(req, dst, gw, mask, flags, ret_nrt, fibnum)); +} + +void +in6_rtalloc(struct route_in6 *ro, u_int fibnum) +{ + + rtalloc_ign_fib((struct route *)ro, 0ul, fibnum); +} + +void +in6_rtalloc_ign(struct route_in6 *ro, u_long ignflags, u_int fibnum) +{ + + rtalloc_ign_fib((struct route *)ro, ignflags, fibnum); +} + +struct rtentry * +in6_rtalloc1(struct sockaddr *dst, int report, u_long ignflags, u_int fibnum) +{ + + return (rtalloc1_fib(dst, report, ignflags, fibnum)); +} Modified: projects/multi-fibv6/head/sys/netinet6/in6_var.h ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6_var.h Fri Feb 3 09:23:55 2012 (r230935) +++ projects/multi-fibv6/head/sys/netinet6/in6_var.h Fri Feb 3 09:33:58 2012 (r230936) @@ -792,6 +792,17 @@ void in6_ifaddloop(struct ifaddr *); int in6_is_addr_deprecated __P((struct sockaddr_in6 *)); int in6_src_ioctl __P((u_long, caddr_t)); + +/* + * Extended API for IPv6 FIB support. + */ +void in6_rtredirect(struct sockaddr *, struct sockaddr *, struct sockaddr *, + int, struct sockaddr *, u_int); +int in6_rtrequest(int, struct sockaddr *, struct sockaddr *, + struct sockaddr *, int, struct rtentry **, u_int); +void in6_rtalloc(struct route_in6 *, u_int); +void in6_rtalloc_ign(struct route_in6 *, u_long, u_int); +struct rtentry *in6_rtalloc1(struct sockaddr *, int, u_long, u_int); #endif /* _KERNEL */ #endif /* _NETINET6_IN6_VAR_H_ */ From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 10:17:35 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 64D3B1065676; Fri, 3 Feb 2012 10:17:35 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 49B618FC0A; Fri, 3 Feb 2012 10:17:35 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13AHZ8L081188; Fri, 3 Feb 2012 10:17:35 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13AHZws081185; Fri, 3 Feb 2012 10:17:35 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031017.q13AHZws081185@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 10:17:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230937 - projects/multi-fibv6/head/sys/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 10:17:35 -0000 Author: bz Date: Fri Feb 3 10:17:34 2012 New Revision: 230937 URL: http://svn.freebsd.org/changeset/base/230937 Log: Fix FLOWTABLE IPv6 handling in route.c missed in r205066. While doing so, for consistency with the rtalloc_ign_fib(9) interface called, remove the "in_" prefix from rtalloc_ign_wrapper() no longer indicating that it would only handle the INET case. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/net/flowtable.c projects/multi-fibv6/head/sys/net/route.c Modified: projects/multi-fibv6/head/sys/net/flowtable.c ============================================================================== --- projects/multi-fibv6/head/sys/net/flowtable.c Fri Feb 3 09:33:58 2012 (r230936) +++ projects/multi-fibv6/head/sys/net/flowtable.c Fri Feb 3 10:17:34 2012 (r230937) @@ -374,7 +374,7 @@ SYSCTL_VNET_PROC(_net_inet_flowtable, OI #ifndef RADIX_MPATH static void -in_rtalloc_ign_wrapper(struct route *ro, uint32_t hash, u_int fibnum) +rtalloc_ign_wrapper(struct route *ro, uint32_t hash, u_int fibnum) { rtalloc_ign_fib(ro, 0, fibnum); @@ -1315,7 +1315,7 @@ flowtable_alloc(char *name, int nentry, #ifdef RADIX_MPATH ft->ft_rtalloc = rtalloc_mpath_fib; #else - ft->ft_rtalloc = in_rtalloc_ign_wrapper; + ft->ft_rtalloc = rtalloc_ign_wrapper; #endif if (flags & FL_PCPU) { ft->ft_lock = flowtable_pcpu_lock; Modified: projects/multi-fibv6/head/sys/net/route.c ============================================================================== --- projects/multi-fibv6/head/sys/net/route.c Fri Feb 3 09:33:58 2012 (r230936) +++ projects/multi-fibv6/head/sys/net/route.c Fri Feb 3 10:17:34 2012 (r230937) @@ -35,6 +35,7 @@ ***********************************************************************/ #include "opt_inet.h" +#include "opt_inet6.h" #include "opt_route.h" #include "opt_mrouting.h" #include "opt_mpath.h" @@ -1192,12 +1193,15 @@ rtrequest1_fib(int req, struct rt_addrin #ifdef FLOWTABLE rt0 = NULL; - /* XXX - * "flow-table" only support IPv4 at the moment. - * XXX-BZ as of r205066 it would support IPv6. - */ + /* "flow-table" only supports IPv6 and IPv4 at the moment. */ + switch (dst->sa_family) { +#ifdef INET6 + case AF_INET6: +#endif #ifdef INET - if (dst->sa_family == AF_INET) { + case AF_INET: +#endif +#if defined(INET6) || defined(INET) rn = rnh->rnh_matchaddr(dst, rnh); if (rn && ((rn->rn_flags & RNF_ROOT) == 0)) { struct sockaddr *mask; @@ -1236,9 +1240,9 @@ rtrequest1_fib(int req, struct rt_addrin } } } +#endif/* INET6 || INET */ } -#endif -#endif +#endif /* FLOWTABLE */ /* XXX mtu manipulation will be done in rnh_addaddr -- itojun */ rn = rnh->rnh_addaddr(ndst, netmask, rnh, rt->rt_nodes); @@ -1259,9 +1263,18 @@ rtrequest1_fib(int req, struct rt_addrin } #ifdef FLOWTABLE else if (rt0 != NULL) { + switch (dst->sa_family) { +#ifdef INET6 + case AF_INET6: + flowtable_route_flush(V_ip6_ft, rt0); + break; +#endif #ifdef INET - flowtable_route_flush(V_ip_ft, rt0); + case AF_INET: + flowtable_route_flush(V_ip_ft, rt0); + break; #endif + } RTFREE(rt0); } #endif From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 11:00:54 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 39A1C106566C; Fri, 3 Feb 2012 11:00:54 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1A0448FC0A; Fri, 3 Feb 2012 11:00:54 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13B0rDo084363; Fri, 3 Feb 2012 11:00:53 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13B0rw2084359; Fri, 3 Feb 2012 11:00:53 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031100.q13B0rw2084359@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 11:00:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230938 - in projects/multi-fibv6/head/sys: kern netinet6 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 11:00:54 -0000 Author: bz Date: Fri Feb 3 11:00:53 2012 New Revision: 230938 URL: http://svn.freebsd.org/changeset/base/230938 Log: Add SO_SETFIB option support on PF_INET6 sockets and allow inheriting the FIB number from the process, as set by setfib(2), on socket creation. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/kern/uipc_socket.c projects/multi-fibv6/head/sys/netinet6/ip6_output.c projects/multi-fibv6/head/sys/netinet6/raw_ip6.c Modified: projects/multi-fibv6/head/sys/kern/uipc_socket.c ============================================================================== --- projects/multi-fibv6/head/sys/kern/uipc_socket.c Fri Feb 3 10:17:34 2012 (r230937) +++ projects/multi-fibv6/head/sys/kern/uipc_socket.c Fri Feb 3 11:00:53 2012 (r230938) @@ -392,6 +392,7 @@ socreate(int dom, struct socket **aso, i so->so_type = type; so->so_cred = crhold(cred); if ((prp->pr_domain->dom_family == PF_INET) || + (prp->pr_domain->dom_family == PF_INET6) || (prp->pr_domain->dom_family == PF_ROUTE)) so->so_fibnum = td->td_proc->p_fibnum; else @@ -2498,12 +2499,13 @@ sosetopt(struct socket *so, struct socko case SO_SETFIB: error = sooptcopyin(sopt, &optval, sizeof optval, sizeof optval); - if (optval < 0 || optval > rt_numfibs) { + if (optval < 0 || optval >= rt_numfibs) { error = EINVAL; goto bad; } if (so->so_proto != NULL && ((so->so_proto->pr_domain->dom_family == PF_INET) || + (so->so_proto->pr_domain->dom_family == PF_INET6) || (so->so_proto->pr_domain->dom_family == PF_ROUTE))) { so->so_fibnum = optval; /* Note: ignore error */ Modified: projects/multi-fibv6/head/sys/netinet6/ip6_output.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/ip6_output.c Fri Feb 3 10:17:34 2012 (r230937) +++ projects/multi-fibv6/head/sys/netinet6/ip6_output.c Fri Feb 3 11:00:53 2012 (r230938) @@ -1448,6 +1448,12 @@ ip6_ctloutput(struct socket *so, struct INP_WUNLOCK(in6p); error = 0; break; + case SO_SETFIB: + INP_WLOCK(in6p); + in6p->inp_inc.inc_fibnum = so->so_fibnum; + INP_WUNLOCK(in6p); + error = 0; + break; default: break; } Modified: projects/multi-fibv6/head/sys/netinet6/raw_ip6.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/raw_ip6.c Fri Feb 3 10:17:34 2012 (r230937) +++ projects/multi-fibv6/head/sys/netinet6/raw_ip6.c Fri Feb 3 11:00:53 2012 (r230938) @@ -582,6 +582,7 @@ rip6_output(m, va_alist) int rip6_ctloutput(struct socket *so, struct sockopt *sopt) { + struct inpcb *inp; int error; if (sopt->sopt_level == IPPROTO_ICMPV6) @@ -590,8 +591,17 @@ rip6_ctloutput(struct socket *so, struct * from protosw? */ return (icmp6_ctloutput(so, sopt)); - else if (sopt->sopt_level != IPPROTO_IPV6) + else if (sopt->sopt_level != IPPROTO_IPV6) { + if (sopt->sopt_level == SOL_SOCKET && + sopt->sopt_name == SO_SETFIB) { + inp = sotoinpcb(so); + INP_WLOCK(inp); + inp->inp_inc.inc_fibnum = so->so_fibnum; + INP_WUNLOCK(inp); + return (0); + } return (EINVAL); + } error = 0; From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 11:20:11 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 90C791065670; Fri, 3 Feb 2012 11:20:11 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7C2E98FC1B; Fri, 3 Feb 2012 11:20:11 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13BKBNS084993; Fri, 3 Feb 2012 11:20:11 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13BKBF2084991; Fri, 3 Feb 2012 11:20:11 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031120.q13BKBF2084991@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 11:20:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230939 - projects/multi-fibv6/head/sys/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 11:20:11 -0000 Author: bz Date: Fri Feb 3 11:20:11 2012 New Revision: 230939 URL: http://svn.freebsd.org/changeset/base/230939 Log: Minor optimization doing input validation with a possible early return before doing further work. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/net/route.c Modified: projects/multi-fibv6/head/sys/net/route.c ============================================================================== --- projects/multi-fibv6/head/sys/net/route.c Fri Feb 3 11:00:53 2012 (r230938) +++ projects/multi-fibv6/head/sys/net/route.c Fri Feb 3 11:20:11 2012 (r230939) @@ -1406,6 +1406,8 @@ rtinit1(struct ifaddr *ifa, int cmd, int dst = ifa->ifa_addr; netmask = ifa->ifa_netmask; } + if (dst->sa_len == 0) + return(EINVAL); switch (dst->sa_family) { case AF_INET6: case AF_INET: @@ -1427,8 +1429,6 @@ rtinit1(struct ifaddr *ifa, int cmd, int startfib = fibnum; endfib = fibnum; } - if (dst->sa_len == 0) - return(EINVAL); /* * If it's a delete, check that if it exists, From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 12:25:14 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8A8A5106566B; Fri, 3 Feb 2012 12:25:14 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 74EC18FC17; Fri, 3 Feb 2012 12:25:14 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13CPEA3087110; Fri, 3 Feb 2012 12:25:14 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13CPE8O087107; Fri, 3 Feb 2012 12:25:14 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031225.q13CPE8O087107@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 12:25:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230940 - projects/multi-fibv6/head/sys/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 12:25:14 -0000 Author: bz Date: Fri Feb 3 12:25:14 2012 New Revision: 230940 URL: http://svn.freebsd.org/changeset/base/230940 Log: Move a comment from rtinit1() to the top of the file where dealing with the (maximum) number of FIBs trying to clarify that evetually FIBs should probably attached to domain(9) specific storage. [1] Add a comment on a limitimation on the rt_add_addr_allfibs option. Use RT_DEFAULT_FIB instead of 0 where applicable. Add empty line to functions without local variables per style. Put public yet unused in-tree function rtinit_fib() under BURN_BRIDGES to indicate that it might go away in the future. No functional change. Discussed with: julian [1] (clarification on what the original one meant) Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/net/route.c projects/multi-fibv6/head/sys/net/route.h Modified: projects/multi-fibv6/head/sys/net/route.c ============================================================================== --- projects/multi-fibv6/head/sys/net/route.c Fri Feb 3 11:20:11 2012 (r230939) +++ projects/multi-fibv6/head/sys/net/route.c Fri Feb 3 12:25:14 2012 (r230940) @@ -73,7 +73,11 @@ SYSCTL_UINT(_net, OID_AUTO, fibs, CTLFLA /* * Allow the boot code to allow LESS than RT_MAXFIBS to be used. * We can't do more because storage is statically allocated for now. - * (for compatibility reasons.. this will change). + * (for compatibility reasons.. this will change. When this changes, code should + * be refactored to protocol independent parts and protocol dependent parts, + * probably hanging of domain(9) specific storage to not need the full + * fib * af RNH allocation etc. but allow tuning the number of tables per + * address family). */ TUNABLE_INT("net.fibs", &rt_numfibs); @@ -83,6 +87,9 @@ TUNABLE_INT("net.fibs", &rt_numfibs); * changes for the FIB of the caller when adding a new set of addresses * to an interface. XXX this is a shotgun aproach to a problem that needs * a more fine grained solution.. that will come. + * XXX also has the problems getting the FIB from curthread which will not + * always work given the fib can be overridden and prefixes can be added + * from the network stack context. */ u_int rt_add_addr_allfibs = 1; SYSCTL_UINT(_net, OID_AUTO, add_addr_allfibs, CTLFLAG_RW, @@ -270,7 +277,8 @@ sys_setfib(struct thread *td, struct set void rtalloc(struct route *ro) { - rtalloc_ign_fib(ro, 0UL, 0); + + rtalloc_ign_fib(ro, 0UL, RT_DEFAULT_FIB); } void @@ -290,7 +298,7 @@ rtalloc_ign(struct route *ro, u_long ign RTFREE(rt); ro->ro_rt = NULL; } - ro->ro_rt = rtalloc1_fib(&ro->ro_dst, 1, ignore, 0); + ro->ro_rt = rtalloc1_fib(&ro->ro_dst, 1, ignore, RT_DEFAULT_FIB); if (ro->ro_rt) RT_UNLOCK(ro->ro_rt); } @@ -320,7 +328,8 @@ rtalloc_ign_fib(struct route *ro, u_long struct rtentry * rtalloc1(struct sockaddr *dst, int report, u_long ignflags) { - return (rtalloc1_fib(dst, report, ignflags, 0)); + + return (rtalloc1_fib(dst, report, ignflags, RT_DEFAULT_FIB)); } struct rtentry * @@ -489,7 +498,8 @@ rtredirect(struct sockaddr *dst, int flags, struct sockaddr *src) { - rtredirect_fib(dst, gateway, netmask, flags, src, 0); + + rtredirect_fib(dst, gateway, netmask, flags, src, RT_DEFAULT_FIB); } void @@ -620,7 +630,8 @@ out: int rtioctl(u_long req, caddr_t data) { - return (rtioctl_fib(req, data, 0)); + + return (rtioctl_fib(req, data, RT_DEFAULT_FIB)); } /* @@ -650,7 +661,8 @@ rtioctl_fib(u_long req, caddr_t data, u_ struct ifaddr * ifa_ifwithroute(int flags, struct sockaddr *dst, struct sockaddr *gateway) { - return (ifa_ifwithroute_fib(flags, dst, gateway, 0)); + + return (ifa_ifwithroute_fib(flags, dst, gateway, RT_DEFAULT_FIB)); } struct ifaddr * @@ -735,7 +747,9 @@ rtrequest(int req, int flags, struct rtentry **ret_nrt) { - return (rtrequest_fib(req, dst, gateway, netmask, flags, ret_nrt, 0)); + + return (rtrequest_fib(req, dst, gateway, netmask, flags, ret_nrt, + RT_DEFAULT_FIB)); } int @@ -774,7 +788,8 @@ rtrequest_fib(int req, int rt_getifa(struct rt_addrinfo *info) { - return (rt_getifa_fib(info, 0)); + + return (rt_getifa_fib(info, RT_DEFAULT_FIB)); } /* @@ -1146,8 +1161,7 @@ rtrequest1_fib(int req, struct rt_addrin rt->rt_flags = RTF_UP | flags; rt->rt_fibnum = fibnum; /* - * Add the gateway. Possibly re-malloc-ing the storage for it - * + * Add the gateway. Possibly re-malloc-ing the storage for it. */ RT_LOCK(rt); if ((error = rt_setgate(rt, dst, gateway)) != 0) { @@ -1452,9 +1466,7 @@ rtinit1(struct ifaddr *ifa, int cmd, int * Now go through all the requested tables (fibs) and do the * requested action. Realistically, this will either be fib 0 * for protocols that don't do multiple tables or all the - * tables for those that do. XXX For this version only AF_INET. - * When that changes code should be refactored to protocol - * independent parts and protocol dependent parts. + * tables for those that do. */ for ( fibnum = startfib; fibnum <= endfib; fibnum++) { if (cmd == RTM_DELETE) { @@ -1594,12 +1606,14 @@ rtinit1(struct ifaddr *ifa, int cmd, int return (error); } +#ifndef BURN_BRIDGES /* special one for inet internal use. may not use. */ int rtinit_fib(struct ifaddr *ifa, int cmd, int flags) { return (rtinit1(ifa, cmd, flags, -1)); } +#endif /* * Set up a routing table entry, normally @@ -1609,7 +1623,7 @@ int rtinit(struct ifaddr *ifa, int cmd, int flags) { struct sockaddr *dst; - int fib = 0; + int fib = RT_DEFAULT_FIB; if (flags & RTF_HOST) { dst = ifa->ifa_dstaddr; Modified: projects/multi-fibv6/head/sys/net/route.h ============================================================================== --- projects/multi-fibv6/head/sys/net/route.h Fri Feb 3 11:20:11 2012 (r230939) +++ projects/multi-fibv6/head/sys/net/route.h Fri Feb 3 12:25:14 2012 (r230940) @@ -406,8 +406,10 @@ void rtredirect(struct sockaddr *, stru int rtrequest(int, struct sockaddr *, struct sockaddr *, struct sockaddr *, int, struct rtentry **); +#ifndef BURN_BRIDGES /* defaults to "all" FIBs */ int rtinit_fib(struct ifaddr *, int, int); +#endif /* XXX MRT NEW VERSIONS THAT USE FIBs * For now the protocol indepedent versions are the same as the AF_INET ones From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 13:08:45 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 24AD21065673; Fri, 3 Feb 2012 13:08:45 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0C0C28FC0A; Fri, 3 Feb 2012 13:08:45 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13D8jBK088526; Fri, 3 Feb 2012 13:08:45 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13D8igQ088505; Fri, 3 Feb 2012 13:08:44 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031308.q13D8igQ088505@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 13:08:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230942 - in projects/multi-fibv6/head/sys: fs/nfsclient net netinet netinet6 netipsec nfs nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 13:08:45 -0000 Author: bz Date: Fri Feb 3 13:08:44 2012 New Revision: 230942 URL: http://svn.freebsd.org/changeset/base/230942 Log: Add multi-FIB IPv6 support to the core network stack supplementing the original IPv4 implementation from r178888: - Use RT_DEFAULT_FIB in the IPv4 implementation where noticed. - Use rt*fib() KPI with explicit RT_DEFAULT_FIB where applicable in the NFS code. - Use the new in6_rt* KPI in TCP, gif(4), and the IPv6 network stack where applicable. - Split in6_rtqtimo() and in6_mtutimo() as done in IPv4 and equally prevent multiple initializations of callouts in in6_inithead(). - Use wrapper functions where needed to preserve the current KPI to ease MFCs. Use BURN_BRIDGES to indicate expected future cleanup. - Fix (related) comments (both technical or style). - Convert to rtinit() where applicable and only use custom loops where currently not possible otherwise. - Multicast group, most neighbor discovery address actions and faith(4) are locked to the default FIB. Individual IPv6 addresses will only appear in the default FIB, however redirect information and prefixes of connected subnets are automatically propagated to all FIBs by default (mimicking IPv4 behavior as closely as possible). Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/fs/nfsclient/nfs_clport.c projects/multi-fibv6/head/sys/fs/nfsclient/nfs_clvfsops.c projects/multi-fibv6/head/sys/net/if_faith.c projects/multi-fibv6/head/sys/netinet/in.c projects/multi-fibv6/head/sys/netinet/tcp_subr.c projects/multi-fibv6/head/sys/netinet6/icmp6.c projects/multi-fibv6/head/sys/netinet6/in6.c projects/multi-fibv6/head/sys/netinet6/in6_gif.c projects/multi-fibv6/head/sys/netinet6/in6_ifattach.c projects/multi-fibv6/head/sys/netinet6/in6_mcast.c projects/multi-fibv6/head/sys/netinet6/in6_rmx.c projects/multi-fibv6/head/sys/netinet6/in6_src.c projects/multi-fibv6/head/sys/netinet6/ip6_forward.c projects/multi-fibv6/head/sys/netinet6/ip6_input.c projects/multi-fibv6/head/sys/netinet6/ip6_output.c projects/multi-fibv6/head/sys/netinet6/ip6_var.h projects/multi-fibv6/head/sys/netinet6/nd6.c projects/multi-fibv6/head/sys/netinet6/nd6_nbr.c projects/multi-fibv6/head/sys/netinet6/nd6_rtr.c projects/multi-fibv6/head/sys/netipsec/ipsec_output.c projects/multi-fibv6/head/sys/nfs/bootp_subr.c projects/multi-fibv6/head/sys/nfsclient/nfs_vfsops.c Modified: projects/multi-fibv6/head/sys/fs/nfsclient/nfs_clport.c ============================================================================== --- projects/multi-fibv6/head/sys/fs/nfsclient/nfs_clport.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/fs/nfsclient/nfs_clport.c Fri Feb 3 13:08:44 2012 (r230942) @@ -976,7 +976,8 @@ nfscl_getmyip(struct nfsmount *nmp, int sad.sin_len = sizeof (struct sockaddr_in); sad.sin_addr.s_addr = sin->sin_addr.s_addr; CURVNET_SET(CRED_TO_VNET(nmp->nm_sockreq.nr_cred)); - rt = rtalloc1((struct sockaddr *)&sad, 0, 0UL); + rt = rtalloc1_fib((struct sockaddr *)&sad, 0, 0UL, + curthread->td_proc->p_fibnum); if (rt != NULL) { if (rt->rt_ifp != NULL && rt->rt_ifa != NULL && @@ -1001,7 +1002,8 @@ nfscl_getmyip(struct nfsmount *nmp, int sad6.sin6_len = sizeof (struct sockaddr_in6); sad6.sin6_addr = sin6->sin6_addr; CURVNET_SET(CRED_TO_VNET(nmp->nm_sockreq.nr_cred)); - rt = rtalloc1((struct sockaddr *)&sad6, 0, 0UL); + rt = rtalloc1_fib((struct sockaddr *)&sad6, 0, 0UL, + curthread->td_proc->p_fibnum); if (rt != NULL) { if (rt->rt_ifp != NULL && rt->rt_ifa != NULL && Modified: projects/multi-fibv6/head/sys/fs/nfsclient/nfs_clvfsops.c ============================================================================== --- projects/multi-fibv6/head/sys/fs/nfsclient/nfs_clvfsops.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/fs/nfsclient/nfs_clvfsops.c Fri Feb 3 13:08:44 2012 (r230942) @@ -459,10 +459,10 @@ nfs_mountroot(struct mount *mp) sin.sin_len = sizeof(sin); /* XXX MRT use table 0 for this sort of thing */ CURVNET_SET(TD_TO_VNET(td)); - error = rtrequest(RTM_ADD, (struct sockaddr *)&sin, + error = rtrequest_fib(RTM_ADD, (struct sockaddr *)&sin, (struct sockaddr *)&nd->mygateway, (struct sockaddr *)&mask, - RTF_UP | RTF_GATEWAY, NULL); + RTF_UP | RTF_GATEWAY, NULL, RT_DEFAULT_FIB); CURVNET_RESTORE(); if (error) panic("nfs_mountroot: RTM_ADD: %d", error); Modified: projects/multi-fibv6/head/sys/net/if_faith.c ============================================================================== --- projects/multi-fibv6/head/sys/net/if_faith.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/net/if_faith.c Fri Feb 3 13:08:44 2012 (r230942) @@ -338,7 +338,7 @@ faithprefix(in6) sin6.sin6_family = AF_INET6; sin6.sin6_len = sizeof(struct sockaddr_in6); sin6.sin6_addr = *in6; - rt = rtalloc1((struct sockaddr *)&sin6, 0, 0UL); + rt = in6_rtalloc1((struct sockaddr *)&sin6, 0, 0UL, RT_DEFAULT_FIB); if (rt && rt->rt_ifp && rt->rt_ifp->if_type == IFT_FAITH && (rt->rt_ifp->if_flags & IFF_UP) != 0) ret = 1; Modified: projects/multi-fibv6/head/sys/netinet/in.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet/in.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet/in.c Fri Feb 3 13:08:44 2012 (r230942) @@ -879,7 +879,7 @@ in_ifinit(struct ifnet *ifp, struct in_i bzero(&ia_ro, sizeof(ia_ro)); *((struct sockaddr_in *)(&ia_ro.ro_dst)) = ia->ia_addr; - rtalloc_ign_fib(&ia_ro, 0, 0); + rtalloc_ign_fib(&ia_ro, 0, RT_DEFAULT_FIB); if ((ia_ro.ro_rt != NULL) && (ia_ro.ro_rt->rt_ifp != NULL) && (ia_ro.ro_rt->rt_ifp == V_loif)) { RT_LOCK(ia_ro.ro_rt); Modified: projects/multi-fibv6/head/sys/netinet/tcp_subr.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet/tcp_subr.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet/tcp_subr.c Fri Feb 3 13:08:44 2012 (r230942) @@ -1750,7 +1750,7 @@ tcp_maxmtu6(struct in_conninfo *inc, int sro6.ro_dst.sin6_family = AF_INET6; sro6.ro_dst.sin6_len = sizeof(struct sockaddr_in6); sro6.ro_dst.sin6_addr = inc->inc6_faddr; - rtalloc_ign((struct route *)&sro6, 0); + in6_rtalloc_ign(&sro6, 0, inc->inc_fibnum); } if (sro6.ro_rt != NULL) { ifp = sro6.ro_rt->rt_ifp; Modified: projects/multi-fibv6/head/sys/netinet6/icmp6.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/icmp6.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/icmp6.c Fri Feb 3 13:08:44 2012 (r230942) @@ -360,7 +360,7 @@ icmp6_error(struct mbuf *m, int type, in m_adj(m, ICMPV6_PLD_MAXLEN - m->m_pkthdr.len); preplen = sizeof(struct ip6_hdr) + sizeof(struct icmp6_hdr); - M_PREPEND(m, preplen, M_DONTWAIT); + M_PREPEND(m, preplen, M_DONTWAIT); /* FIB is also copied over. */ if (m && m->m_len < preplen) m = m_pullup(m, preplen); if (m == NULL) { @@ -584,7 +584,7 @@ icmp6_input(struct mbuf **mp, int *offp, MGETHDR(n, M_DONTWAIT, n0->m_type); n0len = n0->m_pkthdr.len; /* save for use below */ if (n) - M_MOVE_PKTHDR(n, n0); + M_MOVE_PKTHDR(n, n0); /* FIB copied. */ if (n && maxlen >= MHLEN) { MCLGET(n, M_DONTWAIT); if ((n->m_flags & M_EXT) == 0) { @@ -1502,7 +1502,7 @@ ni6_input(struct mbuf *m, int off) m_freem(m); return (NULL); } - M_MOVE_PKTHDR(n, m); /* just for recvif */ + M_MOVE_PKTHDR(n, m); /* just for recvif and FIB */ if (replylen > MHLEN) { if (replylen > MCLBYTES) { /* @@ -2414,7 +2414,7 @@ icmp6_redirect_input(struct mbuf *m, int sin6.sin6_family = AF_INET6; sin6.sin6_len = sizeof(struct sockaddr_in6); bcopy(&reddst6, &sin6.sin6_addr, sizeof(reddst6)); - rt = rtalloc1((struct sockaddr *)&sin6, 0, 0UL); + rt = in6_rtalloc1((struct sockaddr *)&sin6, 0, 0UL, RT_DEFAULT_FIB); if (rt) { if (rt->rt_gateway == NULL || rt->rt_gateway->sa_family != AF_INET6) { @@ -2501,6 +2501,7 @@ icmp6_redirect_input(struct mbuf *m, int struct sockaddr_in6 sdst; struct sockaddr_in6 sgw; struct sockaddr_in6 ssrc; + u_int fibnum; bzero(&sdst, sizeof(sdst)); bzero(&sgw, sizeof(sgw)); @@ -2511,9 +2512,11 @@ icmp6_redirect_input(struct mbuf *m, int bcopy(&redtgt6, &sgw.sin6_addr, sizeof(struct in6_addr)); bcopy(&reddst6, &sdst.sin6_addr, sizeof(struct in6_addr)); bcopy(&src6, &ssrc.sin6_addr, sizeof(struct in6_addr)); - rtredirect((struct sockaddr *)&sdst, (struct sockaddr *)&sgw, - (struct sockaddr *)NULL, RTF_GATEWAY | RTF_HOST, - (struct sockaddr *)&ssrc); + for (fibnum = 0; fibnum < rt_numfibs; fibnum++) + in6_rtredirect((struct sockaddr *)&sdst, + (struct sockaddr *)&sgw, (struct sockaddr *)NULL, + RTF_GATEWAY | RTF_HOST, (struct sockaddr *)&ssrc, + fibnum); } /* finally update cached route in each socket via pfctlinput */ { @@ -2598,6 +2601,7 @@ icmp6_redirect_output(struct mbuf *m0, s MCLGET(m, M_DONTWAIT); if (!m) goto fail; + M_SETFIB(m, rt->rt_fibnum); m->m_pkthdr.rcvif = NULL; m->m_len = 0; maxlen = M_TRAILINGSPACE(m); Modified: projects/multi-fibv6/head/sys/netinet6/in6.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/in6.c Fri Feb 3 13:08:44 2012 (r230942) @@ -180,6 +180,7 @@ in6_ifaddloop(struct ifaddr *ifa) rt_mask(&rt) = (struct sockaddr *)&mask; rt_key(&rt) = (struct sockaddr *)&addr; rt.rt_flags = RTF_UP | RTF_HOST | RTF_STATIC; + /* Announce arrival of local address to all FIBs. */ rt_newaddrmsg(RTM_ADD, ifa, 0, &rt); } @@ -214,6 +215,7 @@ in6_ifremloop(struct ifaddr *ifa) rt_mask(&rt0) = (struct sockaddr *)&mask; rt_key(&rt0) = (struct sockaddr *)&addr; rt0.rt_flags = RTF_HOST | RTF_STATIC; + /* Announce removal of local address to all FIBs. */ rt_newaddrmsg(RTM_DELETE, ifa, 0, &rt0); } @@ -282,6 +284,11 @@ in6_control(struct socket *so, u_long cm switch (cmd) { case SIOCGETSGCNT_IN6: case SIOCGETMIFCNT_IN6: + /* + * XXX mrt_ioctl has a 3rd, unused, FIB argument in route.c. + * We cannot see how that would be needed, so do not adjust the + * KPI blindly; more likely should clean up the IPv4 variant. + */ return (mrt6_ioctl ? mrt6_ioctl(cmd, data) : EOPNOTSUPP); } @@ -820,6 +827,7 @@ out: return (error); } + /* * Join necessary multicast groups. Factored out from in6_update_ifa(). * This entire work should only be done once, for the default FIB. @@ -890,7 +898,7 @@ in6_update_ifa_join_mc(struct ifnet *ifp * reconsider this stuff. Most applications actually do not need the * routes, since they usually specify the outgoing interface. */ - rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); + rt = in6_rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL, RT_DEFAULT_FIB); if (rt != NULL) { /* XXX: only works in !SCOPEDROUTING case. */ if (memcmp(&mltaddr.sin6_addr, @@ -901,10 +909,10 @@ in6_update_ifa_join_mc(struct ifnet *ifp } } if (rt == NULL) { - error = rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, + error = in6_rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, (struct sockaddr *)&ia->ia_addr, (struct sockaddr *)&mltmask, RTF_UP, - (struct rtentry **)0); + (struct rtentry **)0, RT_DEFAULT_FIB); if (error) goto cleanup; } else @@ -950,7 +958,7 @@ in6_update_ifa_join_mc(struct ifnet *ifp if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != 0) goto cleanup; /* XXX: should not fail */ /* XXX: again, do we really need the route? */ - rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); + rt = in6_rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL, RT_DEFAULT_FIB); if (rt != NULL) { if (memcmp(&mltaddr.sin6_addr, &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr, @@ -960,10 +968,10 @@ in6_update_ifa_join_mc(struct ifnet *ifp } } if (rt == NULL) { - error = rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, + error = in6_rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, (struct sockaddr *)&ia->ia_addr, (struct sockaddr *)&mltmask, RTF_UP, - (struct rtentry **)0); + (struct rtentry **)0, RT_DEFAULT_FIB); if (error) goto cleanup; } else @@ -1254,8 +1262,7 @@ in6_update_ifa(struct ifnet *ifp, struct /* * Perform DAD, if needed. - * XXX It may be of use, if we can administratively - * disable DAD. + * XXX It may be of use, if we can administratively disable DAD. */ if (in6if_do_dad(ifp) && ((ifra->ifra_flags & IN6_IFF_NODAD) == 0) && (ia->ia6_flags & IN6_IFF_TENTATIVE)) @@ -1349,7 +1356,7 @@ in6_purgeaddr_mc(struct ifnet *ifp, stru if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != 0) return (error); - rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); + rt = in6_rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL, RT_DEFAULT_FIB); if (rt != NULL && rt->rt_gateway != NULL && (memcmp(&satosin6(rt->rt_gateway)->sin6_addr, &ia->ia_addr.sin6_addr, @@ -1362,11 +1369,11 @@ in6_purgeaddr_mc(struct ifnet *ifp, stru memcpy(&mltaddr.sin6_addr, &satosin6(rt_key(rt))->sin6_addr, sizeof(mltaddr.sin6_addr)); RTFREE_LOCKED(rt); - error = rtrequest(RTM_DELETE, + error = in6_rtrequest(RTM_DELETE, (struct sockaddr *)&mltaddr, (struct sockaddr *)&ia->ia_addr, (struct sockaddr *)&mltmask, RTF_UP, - (struct rtentry **)0); + (struct rtentry **)0, RT_DEFAULT_FIB); if (error) log(LOG_INFO, "%s: link-local all-nodes " "multicast address deletion error\n", @@ -1398,7 +1405,7 @@ in6_purgeaddr_mc(struct ifnet *ifp, stru if ((error = in6_setscope(&mltaddr.sin6_addr, ifp, NULL)) != 0) return (error); - rt = rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL); + rt = in6_rtalloc1((struct sockaddr *)&mltaddr, 0, 0UL, RT_DEFAULT_FIB); if (rt != NULL && rt->rt_gateway != NULL && (memcmp(&satosin6(rt->rt_gateway)->sin6_addr, &ia->ia_addr.sin6_addr, @@ -1412,11 +1419,11 @@ in6_purgeaddr_mc(struct ifnet *ifp, stru sizeof(mltaddr.sin6_addr)); RTFREE_LOCKED(rt); - error = rtrequest(RTM_DELETE, + error = in6_rtrequest(RTM_DELETE, (struct sockaddr *)&mltaddr, (struct sockaddr *)&ia->ia_addr, (struct sockaddr *)&mltmask, RTF_UP, - (struct rtentry **)0); + (struct rtentry **)0, RT_DEFAULT_FIB); if (error) log(LOG_INFO, "%s: node-local all-nodes" "multicast address deletion error\n", @@ -1489,6 +1496,7 @@ in6_purgeaddr(struct ifaddr *ifa) /* stop DAD processing */ nd6_dad_stop(ifa); + /* Remove local address entry from lltable. */ in6_ifremloop(ifa); /* Leave multicast groups. */ @@ -1499,25 +1507,11 @@ in6_purgeaddr(struct ifaddr *ifa) plen = in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL); /* XXX */ if ((ia->ia_flags & IFA_ROUTE) && plen == 128) { - int error; - struct sockaddr *dstaddr; - - /* - * use the interface address if configuring an - * interface address with a /128 prefix len - */ - if (ia->ia_dstaddr.sin6_family == AF_INET6) - dstaddr = (struct sockaddr *)&ia->ia_dstaddr; - else - dstaddr = (struct sockaddr *)&ia->ia_addr; - - error = rtrequest(RTM_DELETE, - (struct sockaddr *)dstaddr, - (struct sockaddr *)&ia->ia_addr, - (struct sockaddr *)&ia->ia_prefixmask, - ia->ia_flags | RTF_HOST, NULL); + error = rtinit(&(ia->ia_ifa), RTM_DELETE, ia->ia_flags | + (ia->ia_dstaddr.sin6_family == AF_INET6) ? RTF_HOST : 0); if (error != 0) - return; + log(LOG_INFO, "%s: err=%d, destination address delete " + "failed\n", __func__, error); ia->ia_flags &= ~IFA_ROUTE; } @@ -1849,8 +1843,7 @@ in6_lifaddr_ioctl(struct socket *so, u_l } /* - * Initialize an interface's intetnet6 address - * and routing table entry. + * Initialize an interface's IPv6 address and routing table entry. */ static int in6_ifinit(struct ifnet *ifp, struct in6_ifaddr *ia, @@ -1900,13 +1893,8 @@ in6_ifinit(struct ifnet *ifp, struct in6 if (!(ia->ia_flags & IFA_ROUTE) && plen == 128 && ia->ia_dstaddr.sin6_family == AF_INET6) { int rtflags = RTF_UP | RTF_HOST; - - error = rtrequest(RTM_ADD, - (struct sockaddr *)&ia->ia_dstaddr, - (struct sockaddr *)&ia->ia_addr, - (struct sockaddr *)&ia->ia_prefixmask, - ia->ia_flags | rtflags, NULL); - if (error != 0) + error = rtinit(&ia->ia_ifa, RTM_ADD, ia->ia_flags | rtflags); + if (error) return (error); ia->ia_flags |= IFA_ROUTE; /* @@ -1926,7 +1914,7 @@ in6_ifinit(struct ifnet *ifp, struct in6 ia->ia_flags |= IFA_RTSELF; } - /* Add ownaddr as loopback rtentry, if necessary (ex. on p2p link). */ + /* Add local address to lltable, if necessary (ex. on p2p link). */ if (newhost) in6_ifaddloop(&(ia->ia_ifa)); @@ -2529,8 +2517,10 @@ in6_lltable_rtcheck(struct ifnet *ifp, KASSERT(l3addr->sa_family == AF_INET6, ("sin_family %d", l3addr->sa_family)); + /* Our local addresses are always only installed on the default FIB. */ /* XXX rtalloc1 should take a const param */ - rt = rtalloc1(__DECONST(struct sockaddr *, l3addr), 0, 0); + rt = in6_rtalloc1(__DECONST(struct sockaddr *, l3addr), 0, 0, + RT_DEFAULT_FIB); if (rt == NULL || (rt->rt_flags & RTF_GATEWAY) || rt->rt_ifp != ifp) { struct ifaddr *ifa; /* Modified: projects/multi-fibv6/head/sys/netinet6/in6_gif.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6_gif.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/in6_gif.c Fri Feb 3 13:08:44 2012 (r230942) @@ -228,6 +228,8 @@ in6_gif_output(struct ifnet *ifp, ip6->ip6_flow &= ~htonl(0xff << 20); ip6->ip6_flow |= htonl((u_int32_t)otos << 20); + M_SETFIB(m, sc->gif_fibnum); + if (dst->sin6_family != sin6_dst->sin6_family || !IN6_ARE_ADDR_EQUAL(&dst->sin6_addr, &sin6_dst->sin6_addr)) { /* cache route doesn't match */ @@ -245,7 +247,7 @@ in6_gif_output(struct ifnet *ifp, } if (sc->gif_ro6.ro_rt == NULL) { - rtalloc((struct route *)&sc->gif_ro6); + in6_rtalloc(&sc->gif_ro6, sc->gif_fibnum); if (sc->gif_ro6.ro_rt == NULL) { m_freem(m); return ENETUNREACH; @@ -404,7 +406,8 @@ gif_validate6(const struct ip6_hdr *ip6, sin6.sin6_addr = ip6->ip6_src; sin6.sin6_scope_id = 0; /* XXX */ - rt = rtalloc1((struct sockaddr *)&sin6, 0, 0UL); + rt = in6_rtalloc1((struct sockaddr *)&sin6, 0, 0UL, + sc->gif_fibnum); if (!rt || rt->rt_ifp != ifp) { #if 0 char ip6buf[INET6_ADDRSTRLEN]; Modified: projects/multi-fibv6/head/sys/netinet6/in6_ifattach.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6_ifattach.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/in6_ifattach.c Fri Feb 3 13:08:44 2012 (r230942) @@ -790,7 +790,6 @@ in6_ifdetach(struct ifnet *ifp) struct ifaddr *ifa, *next; struct radix_node_head *rnh; struct rtentry *rt; - short rtflags; struct sockaddr_in6 sin6; struct in6_multi_mship *imm; @@ -821,16 +820,9 @@ in6_ifdetach(struct ifnet *ifp) in6_leavegroup(imm); } - /* remove from the routing table */ - if ((ia->ia_flags & IFA_ROUTE) && - (rt = rtalloc1((struct sockaddr *)&ia->ia_addr, 0, 0UL))) { - rtflags = rt->rt_flags; - RTFREE_LOCKED(rt); - rtrequest(RTM_DELETE, (struct sockaddr *)&ia->ia_addr, - (struct sockaddr *)&ia->ia_addr, - (struct sockaddr *)&ia->ia_prefixmask, - rtflags, (struct rtentry **)0); - } + /* Remove link-local from the routing table. */ + if (ia->ia_flags & IFA_ROUTE) + (void)rtinit(&ia->ia_ifa, RTM_DELETE, ia->ia_flags); /* remove from the linked list */ IF_ADDR_WLOCK(ifp); @@ -859,7 +851,10 @@ in6_ifdetach(struct ifnet *ifp) */ nd6_purge(ifp); - /* remove route to link-local allnodes multicast (ff02::1) */ + /* + * Remove route to link-local allnodes multicast (ff02::1). + * These only get automatically installed for the default FIB. + */ bzero(&sin6, sizeof(sin6)); sin6.sin6_len = sizeof(struct sockaddr_in6); sin6.sin6_family = AF_INET6; @@ -868,10 +863,11 @@ in6_ifdetach(struct ifnet *ifp) /* XXX: should not fail */ return; /* XXX grab lock first to avoid LOR */ - rnh = rt_tables_get_rnh(0, AF_INET6); + rnh = rt_tables_get_rnh(RT_DEFAULT_FIB, AF_INET6); if (rnh != NULL) { RADIX_NODE_HEAD_LOCK(rnh); - rt = rtalloc1((struct sockaddr *)&sin6, 0, RTF_RNH_LOCKED); + rt = in6_rtalloc1((struct sockaddr *)&sin6, 0, RTF_RNH_LOCKED, + RT_DEFAULT_FIB); if (rt) { if (rt->rt_ifp == ifp) rtexpunge(rt); Modified: projects/multi-fibv6/head/sys/netinet6/in6_mcast.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6_mcast.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/in6_mcast.c Fri Feb 3 13:08:44 2012 (r230942) @@ -1764,7 +1764,7 @@ ip6_getmoptions(struct inpcb *inp, struc * Returns NULL if no ifp could be found. */ static struct ifnet * -in6p_lookup_mcast_ifp(const struct inpcb *in6p __unused, +in6p_lookup_mcast_ifp(const struct inpcb *in6p, const struct sockaddr_in6 *gsin6) { struct route_in6 ro6; @@ -1780,11 +1780,8 @@ in6p_lookup_mcast_ifp(const struct inpcb ifp = NULL; memset(&ro6, 0, sizeof(struct route_in6)); memcpy(&ro6.ro_dst, gsin6, sizeof(struct sockaddr_in6)); -#ifdef notyet - rtalloc_ign_fib(&ro6, 0, inp ? inp->inp_inc.inc_fibnum : 0); -#else - rtalloc_ign((struct route *)&ro6, 0); -#endif + rtalloc_ign_fib((struct route *)&ro6, 0, + in6p ? in6p->inp_inc.inc_fibnum : RT_DEFAULT_FIB); if (ro6.ro_rt != NULL) { ifp = ro6.ro_rt->rt_ifp; KASSERT(ifp != NULL, ("%s: null ifp", __func__)); Modified: projects/multi-fibv6/head/sys/netinet6/in6_rmx.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6_rmx.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/in6_rmx.c Fri Feb 3 13:08:44 2012 (r230942) @@ -168,7 +168,8 @@ in6_addroute(void *v_arg, void *n_arg, s * net route entry, 3ffe:0501:: -> if0. * This case should not raise an error. */ - rt2 = rtalloc1((struct sockaddr *)sin6, 0, RTF_RNH_LOCKED); + rt2 = in6_rtalloc1((struct sockaddr *)sin6, 0, RTF_RNH_LOCKED, + rt->rt_fibnum); if (rt2) { if (((rt2->rt_flags & (RTF_HOST|RTF_GATEWAY)) == 0) && rt2->rt_gateway @@ -255,10 +256,11 @@ in6_rtqkill(struct radix_node *rn, void if (rt->rt_refcnt > 0) panic("rtqkill route really not free"); - err = rtrequest(RTM_DELETE, + err = in6_rtrequest(RTM_DELETE, (struct sockaddr *)rt_key(rt), rt->rt_gateway, rt_mask(rt), - rt->rt_flags|RTF_RNH_LOCKED, 0); + rt->rt_flags|RTF_RNH_LOCKED, 0, + rt->rt_fibnum); if (err) { log(LOG_WARNING, "in6_rtqkill: error %d", err); } else { @@ -287,19 +289,11 @@ static VNET_DEFINE(struct callout, rtq_t #define V_rtq_timer6 VNET(rtq_timer6) static void -in6_rtqtimo(void *rock) +in6_rtqtimo_one(struct radix_node_head *rnh) { - CURVNET_SET_QUIET((struct vnet *) rock); - struct radix_node_head *rnh; struct rtqk_arg arg; - struct timeval atv; static time_t last_adjusted_timeout = 0; - rnh = rt_tables_get_rnh(0, AF_INET6); - if (rnh == NULL) { - CURVNET_RESTORE(); - return; - } arg.found = arg.killed = 0; arg.rnh = rnh; arg.nextstop = time_uptime + V_rtq_timeout6; @@ -335,9 +329,24 @@ in6_rtqtimo(void *rock) rnh->rnh_walktree(rnh, in6_rtqkill, &arg); RADIX_NODE_HEAD_UNLOCK(rnh); } +} + +static void +in6_rtqtimo(void *rock) +{ + CURVNET_SET_QUIET((struct vnet *) rock); + struct radix_node_head *rnh; + struct timeval atv; + u_int fibnum; + + for (fibnum = 0; fibnum < rt_numfibs; fibnum++) { + rnh = rt_tables_get_rnh(fibnum, AF_INET6); + if (rnh != NULL) + in6_rtqtimo_one(rnh); + } atv.tv_usec = 0; - atv.tv_sec = arg.nextstop - time_uptime; + atv.tv_sec = V_rtq_timeout6; callout_reset(&V_rtq_timer6, tvtohz(&atv), in6_rtqtimo, rock); CURVNET_RESTORE(); } @@ -377,31 +386,33 @@ in6_mtuexpire(struct radix_node *rn, voi #define MTUTIMO_DEFAULT (60*1) static void -in6_mtutimo(void *rock) +in6_mtutimo_one(struct radix_node_head *rnh) { - CURVNET_SET_QUIET((struct vnet *) rock); - struct radix_node_head *rnh; struct mtuex_arg arg; - struct timeval atv; - rnh = rt_tables_get_rnh(0, AF_INET6); - if (rnh == NULL) { - CURVNET_RESTORE(); - return; - } arg.rnh = rnh; arg.nextstop = time_uptime + MTUTIMO_DEFAULT; RADIX_NODE_HEAD_LOCK(rnh); rnh->rnh_walktree(rnh, in6_mtuexpire, &arg); RADIX_NODE_HEAD_UNLOCK(rnh); +} - atv.tv_usec = 0; - atv.tv_sec = arg.nextstop - time_uptime; - if (atv.tv_sec < 0) { - printf("invalid mtu expiration time on routing table\n"); - arg.nextstop = time_uptime + 30; /* last resort */ - atv.tv_sec = 30; +static void +in6_mtutimo(void *rock) +{ + CURVNET_SET_QUIET((struct vnet *) rock); + struct radix_node_head *rnh; + struct timeval atv; + u_int fibnum; + + for (fibnum = 0; fibnum < rt_numfibs; fibnum++) { + rnh = rt_tables_get_rnh(fibnum, AF_INET6); + if (rnh != NULL) + in6_mtutimo_one(rnh); } + + atv.tv_sec = MTUTIMO_DEFAULT; + atv.tv_usec = 0; callout_reset(&V_rtq_mtutimer, tvtohz(&atv), in6_mtutimo, rock); CURVNET_RESTORE(); } @@ -413,6 +424,9 @@ in6_mtutimo(void *rock) * value should be so just use that).. FIX AFTER RELENG_7 is MFC'd * see also comments in in_inithead() vfs_export.c and domain.h */ +static VNET_DEFINE(int, _in6_rt_was_here); +#define V__in6_rt_was_here VNET(_in6_rt_was_here) + int in6_inithead(void **head, int off) { @@ -425,13 +439,17 @@ in6_inithead(void **head, int off) return 1; /* only do the rest for the real thing */ rnh = *head; - KASSERT(rnh == rt_tables_get_rnh(0, AF_INET6), ("rnh?")); rnh->rnh_addaddr = in6_addroute; rnh->rnh_matchaddr = in6_matroute; - callout_init(&V_rtq_timer6, CALLOUT_MPSAFE); - callout_init(&V_rtq_mtutimer, CALLOUT_MPSAFE); - in6_rtqtimo(curvnet); /* kick off timeout first time */ - in6_mtutimo(curvnet); /* kick off timeout first time */ + + if (V__in6_rt_was_here == 0) { + callout_init(&V_rtq_timer6, CALLOUT_MPSAFE); + callout_init(&V_rtq_mtutimer, CALLOUT_MPSAFE); + in6_rtqtimo(curvnet); /* kick off timeout first time */ + in6_mtutimo(curvnet); /* kick off timeout first time */ + V__in6_rt_was_here = 1; + } + return 1; } Modified: projects/multi-fibv6/head/sys/netinet6/in6_src.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/in6_src.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/in6_src.c Fri Feb 3 13:08:44 2012 (r230942) @@ -129,9 +129,9 @@ VNET_DEFINE(int, ip6_prefer_tempaddr) = static int selectroute __P((struct sockaddr_in6 *, struct ip6_pktopts *, struct ip6_moptions *, struct route_in6 *, struct ifnet **, - struct rtentry **, int)); + struct rtentry **, int, int)); static int in6_selectif __P((struct sockaddr_in6 *, struct ip6_pktopts *, - struct ip6_moptions *, struct route_in6 *ro, struct ifnet **)); + struct ip6_moptions *, struct route_in6 *ro, struct ifnet **, int)); static struct in6_addrpolicy *lookup_addrsel_policy(struct sockaddr_in6 *); @@ -217,7 +217,9 @@ in6_selectsrc(struct sockaddr_in6 *dstso struct in6_ifaddr *ia6; /* get the outgoing interface */ - if ((error = in6_selectif(dstsock, opts, mopts, ro, &ifp)) != 0) + if ((error = in6_selectif(dstsock, opts, mopts, ro, &ifp, + (inp != NULL) ? inp->inp_inc.inc_fibnum : RT_DEFAULT_FIB)) + != 0) return (error); /* @@ -281,7 +283,8 @@ in6_selectsrc(struct sockaddr_in6 *dstso * the outgoing interface and the destination address. */ /* get the outgoing interface */ - if ((error = in6_selectif(dstsock, opts, mopts, ro, &ifp)) != 0) + if ((error = in6_selectif(dstsock, opts, mopts, ro, &ifp, + (inp != NULL) ? inp->inp_inc.inc_fibnum : RT_DEFAULT_FIB)) != 0) return (error); #ifdef DIAGNOSTIC @@ -504,7 +507,7 @@ in6_selectsrc(struct sockaddr_in6 *dstso static int selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts, struct ip6_moptions *mopts, struct route_in6 *ro, - struct ifnet **retifp, struct rtentry **retrt, int norouteok) + struct ifnet **retifp, struct rtentry **retrt, int norouteok, int fibnum) { int error = 0; struct ifnet *ifp = NULL; @@ -581,7 +584,7 @@ selectroute(struct sockaddr_in6 *dstsock if (ron->ro_rt == NULL) { - rtalloc((struct route *)ron); /* multi path case? */ + in6_rtalloc(ron, fibnum); /* multi path case? */ if (ron->ro_rt == NULL) { if (ron->ro_rt) { RTFREE(ron->ro_rt); @@ -616,7 +619,7 @@ selectroute(struct sockaddr_in6 *dstsock *satosin6(&ron->ro_dst) = *sin6_next; } if (ron->ro_rt == NULL) { - rtalloc((struct route *)ron); /* multi path case? */ + in6_rtalloc(ron); /* multi path case? */ if (ron->ro_rt == NULL || !(ron->ro_rt->rt_flags & RTF_LLINFO)) { if (ron->ro_rt) { @@ -661,11 +664,11 @@ selectroute(struct sockaddr_in6 *dstsock sa6->sin6_scope_id = 0; #ifdef RADIX_MPATH - rtalloc_mpath((struct route *)ro, - ntohl(sa6->sin6_addr.s6_addr32[3])); + rtalloc_mpath_fib((struct route *)ro, + ntohl(sa6->sin6_addr.s6_addr32[3]), fibnum); #else - ro->ro_rt = rtalloc1(&((struct route *)ro) - ->ro_dst, 0, 0UL); + ro->ro_rt = in6_rtalloc1((struct sockaddr *) + &ro->ro_dst, 0, 0UL, fibnum); if (ro->ro_rt) RT_UNLOCK(ro->ro_rt); #endif @@ -746,7 +749,8 @@ selectroute(struct sockaddr_in6 *dstsock static int in6_selectif(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts, - struct ip6_moptions *mopts, struct route_in6 *ro, struct ifnet **retifp) + struct ip6_moptions *mopts, struct route_in6 *ro, struct ifnet **retifp, + int fibnum) { int error; struct route_in6 sro; @@ -758,7 +762,7 @@ in6_selectif(struct sockaddr_in6 *dstsoc } if ((error = selectroute(dstsock, opts, mopts, ro, retifp, - &rt, 1)) != 0) { + &rt, 1, fibnum)) != 0) { if (ro == &sro && rt && rt == sro.ro_rt) RTFREE(rt); return (error); @@ -795,7 +799,10 @@ in6_selectif(struct sockaddr_in6 *dstsoc } /* - * clone - meaningful only for bsdi and freebsd + * Public wrapper function to selectroute(). + * + * XXX-BZ in6_selectroute() should and will grow the FIB argument. The + * in6_selectroute_fib() function is only there for backward compat on stable. */ int in6_selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts, @@ -804,9 +811,21 @@ in6_selectroute(struct sockaddr_in6 *dst { return (selectroute(dstsock, opts, mopts, ro, retifp, - retrt, 0)); + retrt, 0, RT_DEFAULT_FIB)); } +#ifndef BURN_BRIDGES +int +in6_selectroute_fib(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts, + struct ip6_moptions *mopts, struct route_in6 *ro, + struct ifnet **retifp, struct rtentry **retrt, int fibnum) +{ + + return (selectroute(dstsock, opts, mopts, ro, retifp, + retrt, 0, fibnum)); +} +#endif + /* * Default hop limit selection. The precedence is as follows: * 1. Hoplimit value specified via ioctl. @@ -830,7 +849,8 @@ in6_selecthlim(struct inpcb *in6p, struc ro6.ro_dst.sin6_family = AF_INET6; ro6.ro_dst.sin6_len = sizeof(struct sockaddr_in6); ro6.ro_dst.sin6_addr = in6p->in6p_faddr; - rtalloc((struct route *)&ro6); + in6_rtalloc(&ro6, in6p ? in6p->inp_inc.inc_fibnum : + RT_DEFAULT_FIB); if (ro6.ro_rt) { lifp = ro6.ro_rt->rt_ifp; RTFREE(ro6.ro_rt); Modified: projects/multi-fibv6/head/sys/netinet6/ip6_forward.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/ip6_forward.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/ip6_forward.c Fri Feb 3 13:08:44 2012 (r230942) @@ -362,7 +362,7 @@ again: #ifdef IPFIREWALL_FORWARD again2: #endif - rin6.ro_rt = rtalloc1((struct sockaddr *)dst, 0, 0); + rin6.ro_rt = in6_rtalloc1((struct sockaddr *)dst, 0, 0, M_GETFIB(m)); if (rin6.ro_rt != NULL) RT_UNLOCK(rin6.ro_rt); else { Modified: projects/multi-fibv6/head/sys/netinet6/ip6_input.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/ip6_input.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/ip6_input.c Fri Feb 3 13:08:44 2012 (r230942) @@ -666,7 +666,7 @@ passin: dst->sin6_len = sizeof(struct sockaddr_in6); dst->sin6_family = AF_INET6; dst->sin6_addr = ip6->ip6_dst; - rin6.ro_rt = rtalloc1((struct sockaddr *)dst, 0, 0); + rin6.ro_rt = in6_rtalloc1((struct sockaddr *)dst, 0, 0, M_GETFIB(m)); if (rin6.ro_rt) RT_UNLOCK(rin6.ro_rt); Modified: projects/multi-fibv6/head/sys/netinet6/ip6_output.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/ip6_output.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/ip6_output.c Fri Feb 3 13:08:44 2012 (r230942) @@ -142,7 +142,7 @@ static int ip6_insertfraghdr __P((struct static int ip6_insert_jumboopt(struct ip6_exthdrs *, u_int32_t); static int ip6_splithdr(struct mbuf *, struct ip6_exthdrs *); static int ip6_getpmtu __P((struct route_in6 *, struct route_in6 *, - struct ifnet *, struct in6_addr *, u_long *, int *)); + struct ifnet *, struct in6_addr *, u_long *, int *, int)); static int copypktopts(struct ip6_pktopts *, struct ip6_pktopts *, int); @@ -241,6 +241,9 @@ ip6_output(struct mbuf *m0, struct ip6_p goto bad; } + if (inp != NULL) + M_SETFIB(m, inp->inp_inc.inc_fibnum); + finaldst = ip6->ip6_dst; bzero(&exthdrs, sizeof(exthdrs)); if (opt) { @@ -604,8 +607,8 @@ again: if (flevalid) { rt = ro->ro_rt; ifp = ro->ro_rt->rt_ifp; - } else if ((error = in6_selectroute(&dst_sa, opt, im6o, ro, - &ifp, &rt)) != 0) { + } else if ((error = in6_selectroute_fib(&dst_sa, opt, im6o, ro, + &ifp, &rt, inp ? inp->inp_inc.inc_fibnum : M_GETFIB(m))) != 0) { switch (error) { case EHOSTUNREACH: V_ip6stat.ip6s_noroute++; @@ -773,7 +776,7 @@ again: /* Determine path MTU. */ if ((error = ip6_getpmtu(ro_pmtu, ro, ifp, &finaldst, &mtu, - &alwaysfrag)) != 0) + &alwaysfrag, inp ? inp->inp_inc.inc_fibnum : M_GETFIB(m))) != 0) goto bad; /* @@ -1064,7 +1067,7 @@ passout: goto sendorfree; } m->m_pkthdr.rcvif = NULL; - m->m_flags = m0->m_flags & M_COPYFLAGS; + m->m_flags = m0->m_flags & M_COPYFLAGS; /* incl. FIB */ *mnext = m; mnext = &m->m_nextpkt; m->m_data += max_linkhdr; @@ -1321,7 +1324,7 @@ ip6_insertfraghdr(struct mbuf *m0, struc static int ip6_getpmtu(struct route_in6 *ro_pmtu, struct route_in6 *ro, struct ifnet *ifp, struct in6_addr *dst, u_long *mtup, - int *alwaysfragp) + int *alwaysfragp, int fibnum) { u_int32_t mtu = 0; int alwaysfrag = 0; @@ -1343,7 +1346,7 @@ ip6_getpmtu(struct route_in6 *ro_pmtu, s sa6_dst->sin6_len = sizeof(struct sockaddr_in6); sa6_dst->sin6_addr = *dst; - rtalloc((struct route *)ro_pmtu); + in6_rtalloc(ro_pmtu, fibnum); } } if (ro_pmtu->ro_rt) { @@ -1981,7 +1984,8 @@ do { \ * the outgoing interface. */ error = ip6_getpmtu(&sro, NULL, NULL, - &in6p->in6p_faddr, &pmtu, NULL); + &in6p->in6p_faddr, &pmtu, NULL, + so->so_fibnum); if (sro.ro_rt) RTFREE(sro.ro_rt); if (error) Modified: projects/multi-fibv6/head/sys/netinet6/ip6_var.h ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/ip6_var.h Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/ip6_var.h Fri Feb 3 13:08:44 2012 (r230942) @@ -445,6 +445,9 @@ int in6_selectsrc(struct sockaddr_in6 *, int in6_selectroute __P((struct sockaddr_in6 *, struct ip6_pktopts *, struct ip6_moptions *, struct route_in6 *, struct ifnet **, struct rtentry **)); +int in6_selectroute_fib(struct sockaddr_in6 *, struct ip6_pktopts *, + struct ip6_moptions *, struct route_in6 *, struct ifnet **, + struct rtentry **, int); u_int32_t ip6_randomid __P((void)); u_int32_t ip6_randomflowlabel __P((void)); #endif /* _KERNEL */ Modified: projects/multi-fibv6/head/sys/netinet6/nd6.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/nd6.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/nd6.c Fri Feb 3 13:08:44 2012 (r230942) @@ -900,7 +900,10 @@ nd6_is_new_addr_neighbor(struct sockaddr if (!(pr->ndpr_stateflags & NDPRF_ONLINK)) { struct rtentry *rt; - rt = rtalloc1((struct sockaddr *)&pr->ndpr_prefix, 0, 0); + + /* Always use the default FIB here. */ + rt = in6_rtalloc1((struct sockaddr *)&pr->ndpr_prefix, + 0, 0, RT_DEFAULT_FIB); if (rt == NULL) continue; /* Modified: projects/multi-fibv6/head/sys/netinet6/nd6_nbr.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/nd6_nbr.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/nd6_nbr.c Fri Feb 3 13:08:44 2012 (r230942) @@ -242,13 +242,16 @@ nd6_ns_input(struct mbuf *m, int off, in tsin6.sin6_family = AF_INET6; tsin6.sin6_addr = taddr6; + /* Always use the default FIB. */ #ifdef RADIX_MPATH bzero(&ro, sizeof(ro)); ro.ro_dst = tsin6; - rtalloc_mpath((struct route *)&ro, RTF_ANNOUNCE); + rtalloc_mpath_fib((struct route *)&ro, RTF_ANNOUNCE, + RT_DEFAULT_FIB); rt = ro.ro_rt; #else - rt = rtalloc1((struct sockaddr *)&tsin6, 0, 0); + rt = in6_rtalloc1((struct sockaddr *)&tsin6, 0, 0, + RT_DEFAULT_FIB); #endif need_proxy = (rt && (rt->rt_flags & RTF_ANNOUNCE) != 0 && rt->rt_gateway->sa_family == AF_LINK); Modified: projects/multi-fibv6/head/sys/netinet6/nd6_rtr.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet6/nd6_rtr.c Fri Feb 3 12:39:04 2012 (r230941) +++ projects/multi-fibv6/head/sys/netinet6/nd6_rtr.c Fri Feb 3 13:08:44 2012 (r230942) @@ -463,7 +463,7 @@ nd6_rtmsg(int cmd, struct rtentry *rt) } else ifa = NULL; - rt_missmsg(cmd, &info, rt->rt_flags, 0); + rt_missmsg_fib(cmd, &info, rt->rt_flags, 0, rt->rt_fibnum); if (ifa != NULL) ifa_free(ifa); } @@ -486,9 +486,9 @@ defrouter_addreq(struct nd_defrouter *ne gate.sin6_addr = new->rtaddr; s = splnet(); - error = rtrequest(RTM_ADD, (struct sockaddr *)&def, + error = in6_rtrequest(RTM_ADD, (struct sockaddr *)&def, (struct sockaddr *)&gate, (struct sockaddr *)&mask, - RTF_GATEWAY, &newrt); + RTF_GATEWAY, &newrt, RT_DEFAULT_FIB); if (newrt) { nd6_rtmsg(RTM_ADD, newrt); /* tell user process */ RTFREE(newrt); @@ -532,9 +532,9 @@ defrouter_delreq(struct nd_defrouter *dr def.sin6_family = gate.sin6_family = AF_INET6; gate.sin6_addr = dr->rtaddr; - rtrequest(RTM_DELETE, (struct sockaddr *)&def, + in6_rtrequest(RTM_DELETE, (struct sockaddr *)&def, (struct sockaddr *)&gate, - (struct sockaddr *)&mask, RTF_GATEWAY, &oldrt); + (struct sockaddr *)&mask, RTF_GATEWAY, &oldrt, RT_DEFAULT_FIB); if (oldrt) { nd6_rtmsg(RTM_DELETE, oldrt); RTFREE(oldrt); @@ -1541,18 +1541,91 @@ pfxlist_onlink_check() } static int +nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, struct ifaddr *ifa) +{ + static struct sockaddr_dl null_sdl = {sizeof(null_sdl), AF_LINK}; + struct radix_node_head *rnh; + struct rtentry *rt; + struct sockaddr_in6 mask6; + u_long rtflags; + int error, a_failure, fibnum; + + /* + * in6_ifinit() sets nd6_rtrequest to ifa_rtrequest for all ifaddrs. + * ifa->ifa_rtrequest = nd6_rtrequest; + */ + bzero(&mask6, sizeof(mask6)); + mask6.sin6_len = sizeof(mask6); + mask6.sin6_addr = pr->ndpr_mask; + rtflags = (ifa->ifa_flags & ~IFA_RTSELF) | RTF_UP; + + a_failure = 0; + for (fibnum = 0; fibnum < rt_numfibs; fibnum++) { + + rt = NULL; + error = in6_rtrequest(RTM_ADD, + (struct sockaddr *)&pr->ndpr_prefix, ifa->ifa_addr, + (struct sockaddr *)&mask6, rtflags, &rt, fibnum); + if (error == 0) { + KASSERT(rt != NULL, ("%s: in6_rtrequest return no " + "error(%d) but rt is NULL, pr=%p, ifa=%p", __func__, + error, pr, ifa)); + + rnh = rt_tables_get_rnh(rt->rt_fibnum, AF_INET6); + /* XXX what if rhn == NULL? */ + RADIX_NODE_HEAD_LOCK(rnh); + RT_LOCK(rt); + if (rt_setgate(rt, rt_key(rt), + (struct sockaddr *)&null_sdl) == 0) { + struct sockaddr_dl *dl; + + dl = (struct sockaddr_dl *)rt->rt_gateway; + dl->sdl_type = rt->rt_ifp->if_type; + dl->sdl_index = rt->rt_ifp->if_index; + } + RADIX_NODE_HEAD_UNLOCK(rnh); + nd6_rtmsg(RTM_ADD, rt); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 13:12:42 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BBF15106566C; Fri, 3 Feb 2012 13:12:42 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A6ECD8FC0A; Fri, 3 Feb 2012 13:12:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13DCgfe088694; Fri, 3 Feb 2012 13:12:42 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13DCgYr088692; Fri, 3 Feb 2012 13:12:42 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031312.q13DCgYr088692@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 13:12:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230943 - projects/multi-fibv6/head/sys/netinet/ipfw X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 13:12:42 -0000 Author: bz Date: Fri Feb 3 13:12:42 2012 New Revision: 230943 URL: http://svn.freebsd.org/changeset/base/230943 Log: Make ipfw verify_path6() multi-FIB aware. The "fib" and "setfib" keywords implementations need no adjustments. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/netinet/ipfw/ip_fw2.c Modified: projects/multi-fibv6/head/sys/netinet/ipfw/ip_fw2.c ============================================================================== --- projects/multi-fibv6/head/sys/netinet/ipfw/ip_fw2.c Fri Feb 3 13:08:44 2012 (r230942) +++ projects/multi-fibv6/head/sys/netinet/ipfw/ip_fw2.c Fri Feb 3 13:12:42 2012 (r230943) @@ -496,7 +496,7 @@ search_ip6_addr_net (struct in6_addr * i } static int -verify_path6(struct in6_addr *src, struct ifnet *ifp) +verify_path6(struct in6_addr *src, struct ifnet *ifp, u_int fib) { struct route_in6 ro; struct sockaddr_in6 *dst; @@ -507,9 +507,8 @@ verify_path6(struct in6_addr *src, struc dst->sin6_family = AF_INET6; dst->sin6_len = sizeof(*dst); dst->sin6_addr = *src; - /* XXX MRT 0 for ipv6 at this time */ - rtalloc_ign((struct route *)&ro, 0); + in6_rtalloc_ign(&ro, 0, fib); if (ro.ro_rt == NULL) return 0; @@ -1701,7 +1700,7 @@ do { \ #ifdef INET6 is_ipv6 ? verify_path6(&(args->f_id.src_ip6), - m->m_pkthdr.rcvif) : + m->m_pkthdr.rcvif, args->f_id.fib) : #endif verify_path(src_ip, m->m_pkthdr.rcvif, args->f_id.fib))); @@ -1713,7 +1712,7 @@ do { \ #ifdef INET6 is_ipv6 ? verify_path6(&(args->f_id.src_ip6), - NULL) : + NULL, args->f_id.fib) : #endif verify_path(src_ip, NULL, args->f_id.fib))); break; @@ -1731,7 +1730,8 @@ do { \ #ifdef INET6 is_ipv6 ? verify_path6( &(args->f_id.src_ip6), - m->m_pkthdr.rcvif) : + m->m_pkthdr.rcvif, + args->f_id.fib) : #endif verify_path(src_ip, m->m_pkthdr.rcvif, From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 13:20:49 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5E5B51065670; Fri, 3 Feb 2012 13:20:49 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 47A988FC0C; Fri, 3 Feb 2012 13:20:49 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13DKnlZ088968; Fri, 3 Feb 2012 13:20:49 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13DKnRZ088961; Fri, 3 Feb 2012 13:20:49 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031320.q13DKnRZ088961@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 13:20:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230944 - projects/multi-fibv6/head/sys/contrib/pf/net X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 13:20:49 -0000 Author: bz Date: Fri Feb 3 13:20:48 2012 New Revision: 230944 URL: http://svn.freebsd.org/changeset/base/230944 Log: Extend IPv6 routing lookups in pf(4) to use the new multi-FIB KPI. Try to make the "rtable" handling work but the current version of pf(4) does not fully support it yet as especially callers of PF_MISMATCHAW() are not fully FIB-aware. OpenBSD seems to have fixed this in a later version. Prepare as much as possible. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/contrib/pf/net/pf.c projects/multi-fibv6/head/sys/contrib/pf/net/pf_ioctl.c projects/multi-fibv6/head/sys/contrib/pf/net/pf_lb.c projects/multi-fibv6/head/sys/contrib/pf/net/pf_norm.c projects/multi-fibv6/head/sys/contrib/pf/net/pfvar.h Modified: projects/multi-fibv6/head/sys/contrib/pf/net/pf.c ============================================================================== --- projects/multi-fibv6/head/sys/contrib/pf/net/pf.c Fri Feb 3 13:12:42 2012 (r230943) +++ projects/multi-fibv6/head/sys/contrib/pf/net/pf.c Fri Feb 3 13:20:48 2012 (r230944) @@ -320,7 +320,7 @@ u_int8_t pf_get_wscale(struct mbuf *, u_int16_t pf_get_mss(struct mbuf *, int, u_int16_t, sa_family_t); u_int16_t pf_calc_mss(struct pf_addr *, sa_family_t, - u_int16_t); + int, u_int16_t); void pf_set_rt_ifp(struct pf_state *, struct pf_addr *); int pf_check_proto_cksum(struct mbuf *, int, int, @@ -3137,7 +3137,7 @@ pf_get_mss(struct mbuf *m, int off, u_in } u_int16_t -pf_calc_mss(struct pf_addr *addr, sa_family_t af, u_int16_t offer) +pf_calc_mss(struct pf_addr *addr, sa_family_t af, int rtableid, u_int16_t offer) { #ifdef INET struct sockaddr_in *dst; @@ -3166,11 +3166,7 @@ pf_calc_mss(struct pf_addr *addr, sa_fam dst->sin_len = sizeof(*dst); dst->sin_addr = addr->v4; #ifdef __FreeBSD__ -#ifdef RTF_PRCLONING - rtalloc_ign(&ro, (RTF_CLONING | RTF_PRCLONING)); -#else /* !RTF_PRCLONING */ - in_rtalloc_ign(&ro, 0, 0); -#endif + in_rtalloc_ign(&ro, 0, rtableid); #else /* ! __FreeBSD__ */ rtalloc_noclone(&ro, NO_CLONING); #endif @@ -3186,12 +3182,7 @@ pf_calc_mss(struct pf_addr *addr, sa_fam dst6->sin6_len = sizeof(*dst6); dst6->sin6_addr = addr->v6; #ifdef __FreeBSD__ -#ifdef RTF_PRCLONING - rtalloc_ign((struct route *)&ro6, - (RTF_CLONING | RTF_PRCLONING)); -#else /* !RTF_PRCLONING */ - rtalloc_ign((struct route *)&ro6, 0); -#endif + in6_rtalloc_ign(&ro6, 0, rtableid); #else /* ! __FreeBSD__ */ rtalloc_noclone((struct route *)&ro6, NO_CLONING); #endif @@ -3532,14 +3523,14 @@ pf_test_rule(struct pf_rule **rm, struct else if (r->proto && r->proto != pd->proto) r = r->skip[PF_SKIP_PROTO].ptr; else if (PF_MISMATCHAW(&r->src.addr, saddr, af, - r->src.neg, kif)) + r->src.neg, kif, M_GETFIB(m))) r = r->skip[PF_SKIP_SRC_ADDR].ptr; /* tcp/udp only. port_op always 0 in other cases */ else if (r->src.port_op && !pf_match_port(r->src.port_op, r->src.port[0], r->src.port[1], sport)) r = r->skip[PF_SKIP_SRC_PORT].ptr; else if (PF_MISMATCHAW(&r->dst.addr, daddr, af, - r->dst.neg, NULL)) + r->dst.neg, NULL, M_GETFIB(m))) r = r->skip[PF_SKIP_DST_ADDR].ptr; /* tcp/udp only. port_op always 0 in other cases */ else if (r->dst.port_op && !pf_match_port(r->dst.port_op, @@ -3988,9 +3979,10 @@ pf_create_state(struct pf_rule *r, struc } s->src.seqhi = htonl(arc4random()); /* Find mss option */ + int rtid = M_GETFIB(m); mss = pf_get_mss(m, off, th->th_off, pd->af); - mss = pf_calc_mss(pd->src, pd->af, mss); - mss = pf_calc_mss(pd->dst, pd->af, mss); + mss = pf_calc_mss(pd->src, pd->af, rtid, mss); + mss = pf_calc_mss(pd->dst, pd->af, rtid, mss); s->src.mss = mss; #ifdef __FreeBSD__ pf_send_tcp(NULL, r, pd->af, pd->dst, pd->src, th->th_dport, @@ -4072,10 +4064,10 @@ pf_test_fragment(struct pf_rule **rm, in else if (r->proto && r->proto != pd->proto) r = r->skip[PF_SKIP_PROTO].ptr; else if (PF_MISMATCHAW(&r->src.addr, pd->src, af, - r->src.neg, kif)) + r->src.neg, kif, M_GETFIB(m))) r = r->skip[PF_SKIP_SRC_ADDR].ptr; else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af, - r->dst.neg, NULL)) + r->dst.neg, NULL, M_GETFIB(m))) r = r->skip[PF_SKIP_DST_ADDR].ptr; else if (r->tos && !(r->tos == pd->tos)) r = TAILQ_NEXT(r, entries); @@ -5677,7 +5669,8 @@ pf_pull_hdr(struct mbuf *m, int off, voi } int -pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif) +pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif, + int rtableid) { #ifdef __FreeBSD__ #ifdef RADIX_MPATH @@ -5751,13 +5744,21 @@ pf_routable(struct pf_addr *addr, sa_fam goto out; #ifdef __FreeBSD__ -/* XXX MRT not always INET */ /* stick with table 0 though */ + switch (af) { +#ifdef INET6 + case AF_INET6: + in6_rtalloc_ign(&ro, 0, rtableid); + break; +#endif #ifdef INET - if (af == AF_INET) - in_rtalloc_ign((struct route *)&ro, 0, 0); - else + case AF_INET: + in_rtalloc_ign((struct route *)&ro, 0, rtableid); + break; #endif - rtalloc_ign((struct route *)&ro, 0); + default: + rtalloc_ign((struct route *)&ro, 0); /* No/default FIB. */ + break; + } #else /* ! __FreeBSD__ */ rtalloc_noclone((struct route *)&ro, NO_CLONING); #endif @@ -5803,7 +5804,8 @@ out: } int -pf_rtlabel_match(struct pf_addr *addr, sa_family_t af, struct pf_addr_wrap *aw) +pf_rtlabel_match(struct pf_addr *addr, sa_family_t af, struct pf_addr_wrap *aw, + int rtableid) { struct sockaddr_in *dst; #ifdef INET6 @@ -5835,16 +5837,21 @@ pf_rtlabel_match(struct pf_addr *addr, s } #ifdef __FreeBSD__ -# ifdef RTF_PRCLONING - rtalloc_ign((struct route *)&ro, (RTF_CLONING|RTF_PRCLONING)); -# else /* !RTF_PRCLONING */ + switch (af) { +#ifdef INET6 + case AF_INET6: + in6_rtalloc_ign(&ro, 0, rtableid); + break; +#endif #ifdef INET - if (af == AF_INET) - in_rtalloc_ign((struct route *)&ro, 0, 0); - else + case AF_INET: + in_rtalloc_ign((struct route *)&ro, 0, rtableid); + break; #endif + default: rtalloc_ign((struct route *)&ro, 0); -# endif + break; + } #else /* ! __FreeBSD__ */ rtalloc_noclone((struct route *)&ro, NO_CLONING); #endif @@ -5927,7 +5934,7 @@ pf_route(struct mbuf **m, struct pf_rule if (r->rt == PF_FASTROUTE) { #ifdef __FreeBSD__ - in_rtalloc(ro, 0); + in_rtalloc_ign(ro, 0, M_GETFIB(m0)); #else rtalloc(ro); #endif @@ -6893,7 +6900,7 @@ done: ("pf: dropping packet with ip options\n")); } - if ((s && s->tag) || r->rtableid) + if ((s && s->tag) || r->rtableid >= 0) #ifdef __FreeBSD__ pf_tag_packet(m, s ? s->tag : 0, r->rtableid, pd.pf_mtag); #else @@ -7437,7 +7444,7 @@ done: ("pf: dropping packet with dangerous v6 headers\n")); } - if ((s && s->tag) || r->rtableid) + if ((s && s->tag) || r->rtableid >= 0) #ifdef __FreeBSD__ pf_tag_packet(m, s ? s->tag : 0, r->rtableid, pd.pf_mtag); #else Modified: projects/multi-fibv6/head/sys/contrib/pf/net/pf_ioctl.c ============================================================================== --- projects/multi-fibv6/head/sys/contrib/pf/net/pf_ioctl.c Fri Feb 3 13:12:42 2012 (r230943) +++ projects/multi-fibv6/head/sys/contrib/pf/net/pf_ioctl.c Fri Feb 3 13:20:48 2012 (r230944) @@ -1754,7 +1754,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a } #ifdef __FreeBSD__ /* ROUTING */ - if (rule->rtableid > 0 && rule->rtableid > rt_numfibs) + if (rule->rtableid > 0 && rule->rtableid >= rt_numfibs) #else if (rule->rtableid > 0 && !rtable_exists(rule->rtableid)) #endif @@ -2035,7 +2035,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a if (newrule->rtableid > 0 && #ifdef __FreeBSD__ /* ROUTING */ - newrule->rtableid > rt_numfibs) + newrule->rtableid >= rt_numfibs) #else !rtable_exists(newrule->rtableid)) #endif Modified: projects/multi-fibv6/head/sys/contrib/pf/net/pf_lb.c ============================================================================== --- projects/multi-fibv6/head/sys/contrib/pf/net/pf_lb.c Fri Feb 3 13:12:42 2012 (r230943) +++ projects/multi-fibv6/head/sys/contrib/pf/net/pf_lb.c Fri Feb 3 13:20:48 2012 (r230944) @@ -261,7 +261,7 @@ pf_match_translation(struct pf_pdesc *pd else if (r->proto && r->proto != pd->proto) r = r->skip[PF_SKIP_PROTO].ptr; else if (PF_MISMATCHAW(&src->addr, saddr, pd->af, - src->neg, kif)) + src->neg, kif, M_GETFIB(m))) r = r->skip[src == &r->src ? PF_SKIP_SRC_ADDR : PF_SKIP_DST_ADDR].ptr; else if (src->port_op && !pf_match_port(src->port_op, @@ -269,10 +269,11 @@ pf_match_translation(struct pf_pdesc *pd r = r->skip[src == &r->src ? PF_SKIP_SRC_PORT : PF_SKIP_DST_PORT].ptr; else if (dst != NULL && - PF_MISMATCHAW(&dst->addr, daddr, pd->af, dst->neg, NULL)) + PF_MISMATCHAW(&dst->addr, daddr, pd->af, dst->neg, NULL, + M_GETFIB(m))) r = r->skip[PF_SKIP_DST_ADDR].ptr; else if (xdst != NULL && PF_MISMATCHAW(xdst, daddr, pd->af, - 0, NULL)) + 0, NULL, M_GETFIB(m))) r = TAILQ_NEXT(r, entries); else if (dst != NULL && dst->port_op && !pf_match_port(dst->port_op, dst->port[0], Modified: projects/multi-fibv6/head/sys/contrib/pf/net/pf_norm.c ============================================================================== --- projects/multi-fibv6/head/sys/contrib/pf/net/pf_norm.c Fri Feb 3 13:12:42 2012 (r230943) +++ projects/multi-fibv6/head/sys/contrib/pf/net/pf_norm.c Fri Feb 3 13:20:48 2012 (r230944) @@ -1163,11 +1163,11 @@ pf_normalize_ip(struct mbuf **m0, int di r = r->skip[PF_SKIP_PROTO].ptr; else if (PF_MISMATCHAW(&r->src.addr, (struct pf_addr *)&h->ip_src.s_addr, AF_INET, - r->src.neg, kif)) + r->src.neg, kif, M_GETFIB(m))) r = r->skip[PF_SKIP_SRC_ADDR].ptr; else if (PF_MISMATCHAW(&r->dst.addr, (struct pf_addr *)&h->ip_dst.s_addr, AF_INET, - r->dst.neg, NULL)) + r->dst.neg, NULL, M_GETFIB(m))) r = r->skip[PF_SKIP_DST_ADDR].ptr; #ifdef __FreeBSD__ else if (r->match_tag && !pf_match_tag(m, r, &tag, pd->pf_mtag)) @@ -1428,11 +1428,11 @@ pf_normalize_ip6(struct mbuf **m0, int d #endif else if (PF_MISMATCHAW(&r->src.addr, (struct pf_addr *)&h->ip6_src, AF_INET6, - r->src.neg, kif)) + r->src.neg, kif, M_GETFIB(m))) r = r->skip[PF_SKIP_SRC_ADDR].ptr; else if (PF_MISMATCHAW(&r->dst.addr, (struct pf_addr *)&h->ip6_dst, AF_INET6, - r->dst.neg, NULL)) + r->dst.neg, NULL, M_GETFIB(m))) r = r->skip[PF_SKIP_DST_ADDR].ptr; else break; @@ -1593,13 +1593,13 @@ pf_normalize_tcp(int dir, struct pfi_kif else if (r->proto && r->proto != pd->proto) r = r->skip[PF_SKIP_PROTO].ptr; else if (PF_MISMATCHAW(&r->src.addr, pd->src, af, - r->src.neg, kif)) + r->src.neg, kif, M_GETFIB(m))) r = r->skip[PF_SKIP_SRC_ADDR].ptr; else if (r->src.port_op && !pf_match_port(r->src.port_op, r->src.port[0], r->src.port[1], th->th_sport)) r = r->skip[PF_SKIP_SRC_PORT].ptr; else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af, - r->dst.neg, NULL)) + r->dst.neg, NULL, M_GETFIB(m))) r = r->skip[PF_SKIP_DST_ADDR].ptr; else if (r->dst.port_op && !pf_match_port(r->dst.port_op, r->dst.port[0], r->dst.port[1], th->th_dport)) Modified: projects/multi-fibv6/head/sys/contrib/pf/net/pfvar.h ============================================================================== --- projects/multi-fibv6/head/sys/contrib/pf/net/pfvar.h Fri Feb 3 13:12:42 2012 (r230943) +++ projects/multi-fibv6/head/sys/contrib/pf/net/pfvar.h Fri Feb 3 13:20:48 2012 (r230944) @@ -402,14 +402,18 @@ extern struct mtx pf_task_mtx; #endif /* PF_INET6_ONLY */ #endif /* PF_INET_INET6 */ -#define PF_MISMATCHAW(aw, x, af, neg, ifp) \ +/* + * XXX callers not FIB-aware in our version of pf yet. + * OpenBSD fixed it later it seems, 2010/05/07 13:33:16 claudio. + */ +#define PF_MISMATCHAW(aw, x, af, neg, ifp, rtid) \ ( \ (((aw)->type == PF_ADDR_NOROUTE && \ - pf_routable((x), (af), NULL)) || \ + pf_routable((x), (af), NULL, (rtid))) || \ (((aw)->type == PF_ADDR_URPFFAILED && (ifp) != NULL && \ - pf_routable((x), (af), (ifp))) || \ + pf_routable((x), (af), (ifp), (rtid))) || \ ((aw)->type == PF_ADDR_RTLABEL && \ - !pf_rtlabel_match((x), (af), (aw))) || \ + !pf_rtlabel_match((x), (af), (aw), (rtid))) || \ ((aw)->type == PF_ADDR_TABLE && \ !pfr_match_addr((aw)->p.tbl, (x), (af))) || \ ((aw)->type == PF_ADDR_DYNIFTL && \ @@ -1977,8 +1981,10 @@ int pf_normalize_tcp_stateful(struct mbu u_int32_t pf_state_expires(const struct pf_state *); void pf_purge_expired_fragments(void); -int pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *); -int pf_rtlabel_match(struct pf_addr *, sa_family_t, struct pf_addr_wrap *); +int pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *, + int); +int pf_rtlabel_match(struct pf_addr *, sa_family_t, struct pf_addr_wrap *, + int); #ifdef __FreeBSD__ int pf_socket_lookup(int, struct pf_pdesc *, struct inpcb *); #else From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 13:54:26 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0BE9B106566B; Fri, 3 Feb 2012 13:54:26 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D07788FC12; Fri, 3 Feb 2012 13:54:25 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13DsPC1090063; Fri, 3 Feb 2012 13:54:25 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13DsP0M090061; Fri, 3 Feb 2012 13:54:25 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031354.q13DsP0M090061@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 13:54:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230946 - projects/multi-fibv6/head/contrib/pf/pfctl X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 13:54:26 -0000 Author: bz Date: Fri Feb 3 13:54:25 2012 New Revision: 230946 URL: http://svn.freebsd.org/changeset/base/230946 Log: Fix the upper limit bounds checking for the "rtables" keyword wrapping it in a function to dynamically query the currently supported number of FIBs by the kernel for FreeBSD. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/contrib/pf/pfctl/parse.y Modified: projects/multi-fibv6/head/contrib/pf/pfctl/parse.y ============================================================================== --- projects/multi-fibv6/head/contrib/pf/pfctl/parse.y Fri Feb 3 13:40:51 2012 (r230945) +++ projects/multi-fibv6/head/contrib/pf/pfctl/parse.y Fri Feb 3 13:54:25 2012 (r230946) @@ -33,6 +33,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef __FreeBSD__ +#include +#endif #include #include #include @@ -335,6 +338,7 @@ int expand_skip_interface(struct node_ int check_rulestate(int); int getservice(char *); int rule_label(struct pf_rule *, char *); +int rt_tableid_max(void); void mv_rules(struct pf_ruleset *, struct pf_ruleset *); void decide_address_family(struct node_host *, sa_family_t *); @@ -1174,7 +1178,7 @@ scrub_opt : NODF { scrub_opts.randomid = 1; } | RTABLE NUMBER { - if ($2 < 0 /* || $2 > RT_TABLEID_MAX */) { + if ($2 < 0 || $2 > rt_tableid_max()) { yyerror("invalid rtable id"); YYERROR; } @@ -1322,7 +1326,7 @@ antispoof_opt : label { antispoof_opts.label = $1; } | RTABLE NUMBER { - if ($2 < 0 /* || $2 > RT_TABLEID_MAX */ ) { + if ($2 < 0 || $2 > rt_tableid_max()) { yyerror("invalid rtable id"); YYERROR; } @@ -2361,7 +2365,7 @@ filter_opt : USER uids { filter_opts.prob = 1; } | RTABLE NUMBER { - if ($2 < 0 /* || $2 > RT_TABLEID_MAX */ ) { + if ($2 < 0 || $2 > rt_tableid_max()) { yyerror("invalid rtable id"); YYERROR; } @@ -4190,7 +4194,7 @@ tagged : /* empty */ { $$.neg = 0; $$. rtable : /* empty */ { $$ = -1; } | RTABLE NUMBER { - if ($2 < 0 /* || $2 > RT_TABLEID_MAX */ ) { + if ($2 < 0 || $2 > rt_tableid_max()) { yyerror("invalid rtable id"); YYERROR; } @@ -6051,3 +6055,23 @@ pfctl_load_anchors(int dev, struct pfctl return (0); } + +int +rt_tableid_max(void) +{ +#ifdef __FreeBSD__ + int fibs; + size_t l = sizeof(fibs); + + if (sysctlbyname("net.fibs", &fibs, &l, NULL, 0) == -1) + fibs = 16; /* XXX RT_MAXFIBS, at least limit it some. */ + /* + * As the OpenBSD code only compares > and not >= we need to adjust + * here given we only accept values of 0..n and want to avoid #ifdefs + * in the grammer. + */ + return (fibs - 1); +#else + return (RT_TABLEID_MAX); +#endif +} From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 15:26:56 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 409741065672; Fri, 3 Feb 2012 15:26:56 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 11BD38FC0A; Fri, 3 Feb 2012 15:26:56 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13FQtom092986; Fri, 3 Feb 2012 15:26:55 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13FQt4w092984; Fri, 3 Feb 2012 15:26:55 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031526.q13FQt4w092984@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 15:26:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230947 - projects/multi-fibv6/head/usr.bin/netstat X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 15:26:56 -0000 Author: bz Date: Fri Feb 3 15:26:55 2012 New Revision: 230947 URL: http://svn.freebsd.org/changeset/base/230947 Log: Teach netstat -r (display contents of routing tables) about multi-FIB for IPv6 in addition to IPv4. While here harmonize naming of variables a bit with what we use in kernel. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/usr.bin/netstat/route.c Modified: projects/multi-fibv6/head/usr.bin/netstat/route.c ============================================================================== --- projects/multi-fibv6/head/usr.bin/netstat/route.c Fri Feb 3 13:54:25 2012 (r230946) +++ projects/multi-fibv6/head/usr.bin/netstat/route.c Fri Feb 3 15:26:55 2012 (r230947) @@ -113,7 +113,6 @@ typedef union { static sa_u pt_u; -int fibnum; int do_rtent = 0; struct rtentry rtentry; struct radix_node rnode; @@ -148,8 +147,7 @@ routepr(u_long rtree) { struct radix_node_head **rnhp, *rnh, head; size_t intsize; - int i; - int numfibs; + int fam, fibnum, numfibs; intsize = sizeof(int); if (sysctlbyname("net.my_fibnum", &fibnum, &intsize, NULL, 0) == -1) @@ -181,15 +179,20 @@ routepr(u_long rtree) if (kread((u_long)(rtree), (char *)(rt_tables), (numfibs * (AF_MAX+1) * sizeof(struct radix_node_head *))) != 0) return; - for (i = 0; i <= AF_MAX; i++) { + for (fam = 0; fam <= AF_MAX; fam++) { int tmpfib; - if (i != AF_INET) - tmpfib = 0; - else + + switch (fam) { + case AF_INET6: + case AF_INET: tmpfib = fibnum; + break; + default: + tmpfib = 0; + } rnhp = (struct radix_node_head **)*rt_tables; /* Calculate the in-kernel address. */ - rnhp += tmpfib * (AF_MAX+1) + i; + rnhp += tmpfib * (AF_MAX+1) + fam; /* Read the in kernel rhn pointer. */ if (kget(rnhp, rnh) != 0) continue; @@ -198,16 +201,16 @@ routepr(u_long rtree) /* Read the rnh data. */ if (kget(rnh, head) != 0) continue; - if (i == AF_UNSPEC) { + if (fam == AF_UNSPEC) { if (Aflag && af == 0) { printf("Netmasks:\n"); p_tree(head.rnh_treetop); } - } else if (af == AF_UNSPEC || af == i) { - size_cols(i, head.rnh_treetop); - pr_family(i); + } else if (af == AF_UNSPEC || af == fam) { + size_cols(fam, head.rnh_treetop); + pr_family(fam); do_rtent = 1; - pr_rthdr(i); + pr_rthdr(fam); p_tree(head.rnh_treetop); } } From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 15:31:47 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E8438106566B; Fri, 3 Feb 2012 15:31:47 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D3D268FC14; Fri, 3 Feb 2012 15:31:47 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13FVlrK093178; Fri, 3 Feb 2012 15:31:47 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13FVl4u093176; Fri, 3 Feb 2012 15:31:47 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031531.q13FVl4u093176@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 15:31:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230948 - projects/multi-fibv6/head/etc/rc.d X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 15:31:48 -0000 Author: bz Date: Fri Feb 3 15:31:47 2012 New Revision: 230948 URL: http://svn.freebsd.org/changeset/base/230948 Log: Install the IPv6 reject routes we do for the default FIB to all FIBs. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/etc/rc.d/routing Modified: projects/multi-fibv6/head/etc/rc.d/routing ============================================================================== --- projects/multi-fibv6/head/etc/rc.d/routing Fri Feb 3 15:26:55 2012 (r230947) +++ projects/multi-fibv6/head/etc/rc.d/routing Fri Feb 3 15:31:47 2012 (r230948) @@ -137,12 +137,22 @@ static_inet() static_inet6() { - local _action i + local _action i fibs _action=$1 + # get the number of FIBs supported. + fibs=`sysctl -n net.fibs` + : ${fibs:=1} + # disallow "internal" addresses to appear on the wire - route ${_action} -inet6 ::ffff:0.0.0.0 -prefixlen 96 ::1 -reject - route ${_action} -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject + i=0 + while test ${i} -lt ${fibs}; do + setfib -F ${i} route ${_action} \ + -inet6 ::ffff:0.0.0.0 -prefixlen 96 ::1 -reject + setfib -F ${i} route ${_action} \ + -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject + i=$((i + 1)) + done case ${ipv6_defaultrouter} in [Nn][Oo] | '') @@ -214,8 +224,14 @@ static_inet6() # for the host case, you will allow to omit the identifiers. # Under this configuration, the packets will go to the default # interface. - route ${_action} -inet6 fe80:: -prefixlen 10 ::1 -reject - route ${_action} -inet6 ff02:: -prefixlen 16 ::1 -reject + i=0 + while test ${i} -lt ${fibs}; do + setfib -F ${i} route ${_action} \ + -inet6 fe80:: -prefixlen 10 ::1 -reject + setfib -F ${i} route ${_action} \ + -inet6 ff02:: -prefixlen 16 ::1 -reject + i=$((i + 1)) + done case ${ipv6_default_interface} in '') From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 15:33:56 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 07BC6106564A; Fri, 3 Feb 2012 15:33:56 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E743E8FC14; Fri, 3 Feb 2012 15:33:55 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13FXtQD093294; Fri, 3 Feb 2012 15:33:55 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13FXtUx093292; Fri, 3 Feb 2012 15:33:55 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031533.q13FXtUx093292@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 15:33:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230949 - projects/multi-fibv6/head/share/man/man4 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 15:33:56 -0000 Author: bz Date: Fri Feb 3 15:33:55 2012 New Revision: 230949 URL: http://svn.freebsd.org/changeset/base/230949 Log: Document the fact that faith(4) is only available on the default FIB. Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/share/man/man4/faith.4 Modified: projects/multi-fibv6/head/share/man/man4/faith.4 ============================================================================== --- projects/multi-fibv6/head/share/man/man4/faith.4 Fri Feb 3 15:31:47 2012 (r230948) +++ projects/multi-fibv6/head/share/man/man4/faith.4 Fri Feb 3 15:33:55 2012 (r230949) @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 10, 1999 +.Dd January 23, 2012 .Dt FAITH 4 .Os .Sh NAME @@ -58,7 +58,7 @@ variable in .Xr rc.conf 5 . .Pp Special action will be taken when IPv6 TCP traffic is seen on a router, -and the routing table suggests to route it to the +and the default routing table suggests to route it to the .Nm interface. In this case, the packet will be accepted by the router, From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 15:39:14 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 52A5B106566C; Fri, 3 Feb 2012 15:39:14 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3D18A8FC08; Fri, 3 Feb 2012 15:39:14 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13FdE6r093484; Fri, 3 Feb 2012 15:39:14 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13FdEVX093482; Fri, 3 Feb 2012 15:39:14 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031539.q13FdEVX093482@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 15:39:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230950 - projects/multi-fibv6/head/sys/netinet X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 15:39:14 -0000 Author: bz Date: Fri Feb 3 15:39:13 2012 New Revision: 230950 URL: http://svn.freebsd.org/changeset/base/230950 Log: Document the fact that multi-FIB support for SCTP had been backed out in r179783 as (ab)using the concept of VRFs for this had not worked. At this point SCTP in FreeBSD does not support multi-FIB, neither for IPv4 nor for IPv6. Discussed with: rrs Sponsored by: Cisco Systems, Inc. Modified: projects/multi-fibv6/head/sys/netinet/sctp_os_bsd.h Modified: projects/multi-fibv6/head/sys/netinet/sctp_os_bsd.h ============================================================================== --- projects/multi-fibv6/head/sys/netinet/sctp_os_bsd.h Fri Feb 3 15:33:55 2012 (r230949) +++ projects/multi-fibv6/head/sys/netinet/sctp_os_bsd.h Fri Feb 3 15:39:13 2012 (r230950) @@ -424,6 +424,12 @@ typedef struct callout sctp_os_timer_t; typedef struct route sctp_route_t; typedef struct rtentry sctp_rtentry_t; +/* + * XXX multi-FIB support was backed out in r179783 and it seems clear that the + * VRF support as currently in FreeBSD is not ready to support multi-FIB. + * It might be best to implement multi-FIB support for both v4 and v6 indepedent + * of VRFs and leave those to a real MPLS stack. + */ #define SCTP_RTALLOC(ro, vrf_id) rtalloc_ign((struct route *)ro, 0UL) /* Future zero copy wakeup/send function */ From owner-svn-src-projects@FreeBSD.ORG Sat Feb 4 02:00:34 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8E5DB106566B; Sat, 4 Feb 2012 02:00:34 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7CB6C8FC17; Sat, 4 Feb 2012 02:00:34 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q1420YhC014239; Sat, 4 Feb 2012 02:00:34 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q1420YqV014233; Sat, 4 Feb 2012 02:00:34 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201202040200.q1420YqV014233@svn.freebsd.org> From: Rick Macklem Date: Sat, 4 Feb 2012 02:00:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230973 - in projects/nfsv4.1-client/sys/fs: nfs nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 04 Feb 2012 02:00:34 -0000 Author: rmacklem Date: Sat Feb 4 02:00:33 2012 New Revision: 230973 URL: http://svn.freebsd.org/changeset/base/230973 Log: Add NFSPROC_WRITEDS to be used for a write to an NFSv4.1 Data Server (DS). This is needed, since NFSPROC_WRITE includes a Getattr operation and Getattr is not supported by a DS. Modified: projects/nfsv4.1-client/sys/fs/nfs/nfs_commonkrpc.c projects/nfsv4.1-client/sys/fs/nfs/nfs_commonsubs.c projects/nfsv4.1-client/sys/fs/nfs/nfsport.h projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clcomsubs.c Modified: projects/nfsv4.1-client/sys/fs/nfs/nfs_commonkrpc.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfs_commonkrpc.c Sat Feb 4 00:54:43 2012 (r230972) +++ projects/nfsv4.1-client/sys/fs/nfs/nfs_commonkrpc.c Sat Feb 4 02:00:33 2012 (r230973) @@ -888,6 +888,7 @@ printf("foreslots growing %d\n", retval) nd->nd_procnum != NFSPROC_SETATTR && nd->nd_procnum != NFSPROC_READ && nd->nd_procnum != NFSPROC_WRITE && + nd->nd_procnum != NFSPROC_WRITEDS && nd->nd_procnum != NFSPROC_OPEN && nd->nd_procnum != NFSPROC_CREATE && nd->nd_procnum != NFSPROC_OPENCONFIRM && Modified: projects/nfsv4.1-client/sys/fs/nfs/nfs_commonsubs.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfs_commonsubs.c Sat Feb 4 00:54:43 2012 (r230972) +++ projects/nfsv4.1-client/sys/fs/nfs/nfs_commonsubs.c Sat Feb 4 02:00:33 2012 (r230973) @@ -168,7 +168,7 @@ static struct nfsuserlruhead nfsuserlruh */ int nfs_bigreply[NFSV41_NPROCS] = { 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* local functions */ static int nfsrv_skipace(struct nfsrv_descript *nd, int *acesizep); Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsport.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsport.h Sat Feb 4 00:54:43 2012 (r230972) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsport.h Sat Feb 4 02:00:33 2012 (r230973) @@ -348,11 +348,12 @@ #define NFSPROC_LAYOUTCOMMIT 48 #define NFSPROC_LAYOUTRETURN 49 #define NFSPROC_RECLAIMCOMPL 50 +#define NFSPROC_WRITEDS 51 /* * Must be defined as one higher than the last NFSv4.1 Proc# above. */ -#define NFSV41_NPROCS 51 +#define NFSV41_NPROCS 52 #endif /* NFS_V3NPROCS */ Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sat Feb 4 00:54:43 2012 (r230972) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sat Feb 4 02:00:33 2012 (r230973) @@ -314,11 +314,12 @@ #define NFSPROC_LAYOUTCOMMIT 48 #define NFSPROC_LAYOUTRETURN 49 #define NFSPROC_RECLAIMCOMPL 50 +#define NFSPROC_WRITEDS 51 /* * Must be defined as one higher than the last NFSv4.1 Proc# above. */ -#define NFSV41_NPROCS 51 +#define NFSV41_NPROCS 52 #endif /* NFS_V3NPROCS */ Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clcomsubs.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clcomsubs.c Sat Feb 4 00:54:43 2012 (r230972) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clcomsubs.c Sat Feb 4 02:00:33 2012 (r230973) @@ -109,6 +109,7 @@ static struct { { NFSV4OP_LAYOUTCOMMIT, 1, "LayoutCommit", 12, }, { NFSV4OP_LAYOUTRETURN, 1, "LayoutReturn", 12, }, { NFSV4OP_RECLAIMCOMPL, 1, "ReclaimComplete", 15, }, + { NFSV4OP_WRITE, 1, "WriteDS", 7, }, }; @@ -118,7 +119,7 @@ static struct { static int nfs_bigrequest[NFSV41_NPROCS] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 1 }; /* @@ -174,6 +175,12 @@ nfscl_reqstart(struct nfsrv_descript *nd * Sequence Op. */ opcnt = 1; + else if (procnum == NFSPROC_WRITEDS) + /* + * For the special case of a Write to a DS, + * the opcnt == 3, for Sequence, PutFH, Write. + */ + opcnt = 3; } /* * What should the tag really be? @@ -203,7 +210,8 @@ nfscl_reqstart(struct nfsrv_descript *nd NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED); *tl = txdr_unsigned(NFSV4OP_PUTFH); (void) nfsm_fhtom(nd, nfhp, fhlen, 0); - if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh==2){ + if (nfsv4_opflag[nfsv4_opmap[procnum].op].needscfh + == 2 && procnum != NFSPROC_WRITEDS) { NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED); *tl = txdr_unsigned(NFSV4OP_GETATTR); NFSWCCATTR_ATTRBIT(&attrbits); From owner-svn-src-projects@FreeBSD.ORG Sat Feb 4 03:08:24 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 571A91065674; Sat, 4 Feb 2012 03:08:24 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 453658FC0C; Sat, 4 Feb 2012 03:08:24 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q1438OKw016461; Sat, 4 Feb 2012 03:08:24 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q1438NB5016456; Sat, 4 Feb 2012 03:08:23 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201202040308.q1438NB5016456@svn.freebsd.org> From: Rick Macklem Date: Sat, 4 Feb 2012 03:08:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230974 - in projects/nfsv4.1-client/sys/fs: nfs nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 04 Feb 2012 03:08:24 -0000 Author: rmacklem Date: Sat Feb 4 03:08:23 2012 New Revision: 230974 URL: http://svn.freebsd.org/changeset/base/230974 Log: Replace length with end offset in the nfsclflayout structure and keep the layouts that can be used for writing on a separate list from the ones that are for reading. These changes make it easier to find the correct layout(s) to use for reading or writing from/to the DS. This layout handling code is not yet tested. Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h Sat Feb 4 02:00:33 2012 (r230973) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h Sat Feb 4 03:08:23 2012 (r230974) @@ -219,7 +219,8 @@ struct nfscllayout { TAILQ_ENTRY(nfscllayout) nfsly_list; LIST_ENTRY(nfscllayout) nfsly_hash; nfsv4stateid_t nfsly_stateid; - struct nfsclflayouthead nfsly_flay; + struct nfsclflayouthead nfsly_flayread; + struct nfsclflayouthead nfsly_flayrw; struct nfsclclient *nfsly_clp; uint32_t nfsly_refcnt; uint16_t nfsly_retonclose; @@ -229,13 +230,16 @@ struct nfscllayout { /* * MALLOC'd to the correct length to accommodate the file handle list. - * These hang off of nfsly_flay, sorted in increasing offset order. + * These hang off of nfsly_flayread and nfsly_flayrw, sorted in increasing + * offset order. + * The nfsly_flayread list holds the ones with iomode == NFSLAYOUTIOMODE_READ, + * whereas the nfsly_flayrw holds the ones with iomode == NFSLAYOUTIOMODE_RW. */ struct nfsclflayout { LIST_ENTRY(nfsclflayout) nfsfl_list; uint8_t nfsfl_dev[NFSX_V4DEVICEID]; uint64_t nfsfl_off; - uint64_t nfsfl_len; + uint64_t nfsfl_end; uint64_t nfsfl_patoff; uint32_t nfsfl_iomode; uint32_t nfsfl_util; Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sat Feb 4 02:00:33 2012 (r230973) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sat Feb 4 03:08:23 2012 (r230974) @@ -585,6 +585,10 @@ #define NFSDEVICEIDNOTIFY_CHANGEBIT 0x1 #define NFSDEVICEIDNOTIFY_DELETEBIT 0x2 +/* Flags for File Layout. */ +#define NFSFLAYUTIL_DENSE 0x1 +#define NFSFLAYUTIL_COMMIT_THRU_MDS 0x2 + /* Conversion macros */ #define vtonfsv2_mode(t,m) \ txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \ Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Sat Feb 4 02:00:33 2012 (r230973) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Sat Feb 4 03:08:23 2012 (r230974) @@ -4522,6 +4522,7 @@ nfsrpc_layoutget(struct nfsmount *nmp, u struct nfsclflayout *flp, *prevflp, *tflp; int cnt, error, fhcnt, nfhlen, i, j; uint8_t *cp; + uint64_t retlen; flp = NULL; nfscl_reqstart(nd, NFSPROC_LAYOUTGET, nmp, fhp, fhlen, NULL, NULL); @@ -4585,7 +4586,11 @@ printf("fhcnt=%d\n", fhcnt); M_NFSFLAYOUT, M_WAITOK); flp->nfsfl_fhcnt = 0; flp->nfsfl_off = fxdr_hyper(tl); tl += 2; - flp->nfsfl_len = fxdr_hyper(tl); tl += 2; + retlen = fxdr_hyper(tl); tl += 2; + if (flp->nfsfl_off + retlen < flp->nfsfl_off) + flp->nfsfl_end = UINT64_MAX - flp->nfsfl_off; + else + flp->nfsfl_end = flp->nfsfl_off + retlen; flp->nfsfl_iomode = fxdr_unsigned(int, *tl++); printf("layg iom=%d\n", iomode); if (fxdr_unsigned(int, *tl++) != @@ -4619,18 +4624,24 @@ printf("layg iom=%d\n", iomode); NFSM_DISSECT(cp, uint8_t *, NFSM_RNDUP(fhlen)); NFSBCOPY(cp, nfhp->nfh_fh, nfhlen); } - /* Maintain the list in increasing offset order. */ - tflp = LIST_FIRST(flhp); - prevflp = NULL; - while (tflp != NULL && - tflp->nfsfl_off < flp->nfsfl_off) { - prevflp = tflp; - tflp = LIST_NEXT(tflp, nfsfl_list); + if (flp->nfsfl_iomode == iomode) { + /* Keep the list in increasing offset order. */ + tflp = LIST_FIRST(flhp); + prevflp = NULL; + while (tflp != NULL && + tflp->nfsfl_off < flp->nfsfl_off) { + prevflp = tflp; + tflp = LIST_NEXT(tflp, nfsfl_list); + } + if (prevflp == NULL) + LIST_INSERT_HEAD(flhp, flp, nfsfl_list); + else + LIST_INSERT_AFTER(prevflp, flp, + nfsfl_list); + } else { + printf("nfscl_layoutget(): got wrong iomode\n"); + nfscl_freeflayout(flp); } - if (prevflp == NULL) - LIST_INSERT_HEAD(flhp, flp, nfsfl_list); - else - LIST_INSERT_AFTER(prevflp, flp, nfsfl_list); flp = NULL; } } Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Sat Feb 4 02:00:33 2012 (r230973) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Sat Feb 4 03:08:23 2012 (r230974) @@ -4405,6 +4405,7 @@ nfscl_layout(struct nfsmount *nmp, u_int { struct nfsclclient *clp; struct nfscllayout *lyp, *tlyp; + struct nfsclflayout *flp; *lypp = NULL; tlyp = malloc(sizeof(*tlyp) + fhlen - 1, M_NFSLAYOUT, M_WAITOK); @@ -4424,7 +4425,8 @@ nfscl_layout(struct nfsmount *nmp, u_int lyp->nfsly_stateid.other[0] = stateidp->other[0]; lyp->nfsly_stateid.other[1] = stateidp->other[1]; lyp->nfsly_stateid.other[2] = stateidp->other[2]; - LIST_INIT(&lyp->nfsly_flay); + LIST_INIT(&lyp->nfsly_flayread); + LIST_INIT(&lyp->nfsly_flayrw); lyp->nfsly_clp = clp; lyp->nfsly_retonclose = retonclose; lyp->nfsly_refcnt = 1; /* Return with a reference cnt. */ @@ -4444,7 +4446,13 @@ nfscl_layout(struct nfsmount *nmp, u_int } /* Merge the new list of File Layouts into the list. */ - nfscl_mergeflayouts(&lyp->nfsly_flay, fhlp); + flp = LIST_FIRST(fhlp); + if (flp != NULL) { + if (flp->nfsfl_iomode == NFSLAYOUTIOMODE_READ) + nfscl_mergeflayouts(&lyp->nfsly_flayread, fhlp); + else + nfscl_mergeflayouts(&lyp->nfsly_flayrw, fhlp); + } NFSUNLOCKCLSTATE(); if (tlyp != NULL) free(tlyp, M_NFSLAYOUT); @@ -4599,7 +4607,11 @@ nfscl_freelayout(struct nfscllayout *lay { struct nfsclflayout *flp, *nflp; - LIST_FOREACH_SAFE(flp, &layp->nfsly_flay, nfsfl_list, nflp) { + LIST_FOREACH_SAFE(flp, &layp->nfsly_flayread, nfsfl_list, nflp) { + LIST_REMOVE(flp, nfsfl_list); + nfscl_freeflayout(flp); + } + LIST_FOREACH_SAFE(flp, &layp->nfsly_flayrw, nfsfl_list, nflp) { LIST_REMOVE(flp, nfsfl_list); nfscl_freeflayout(flp); } From owner-svn-src-projects@FreeBSD.ORG Sat Feb 4 23:27:17 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E8B151065674; Sat, 4 Feb 2012 23:27:17 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CDFD48FC0A; Sat, 4 Feb 2012 23:27:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q14NRH8D056566; Sat, 4 Feb 2012 23:27:17 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q14NRHjr056538; Sat, 4 Feb 2012 23:27:17 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201202042327.q14NRHjr056538@svn.freebsd.org> From: Nathan Whitehorn Date: Sat, 4 Feb 2012 23:27:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r231000 - in projects/pseries: amd64/acpica amd64/amd64 amd64/conf amd64/include boot/forth cam cam/ata cam/scsi cddl/compat/opensolaris/sys cddl/contrib/opensolaris/uts/common/fs/zfs c... X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 04 Feb 2012 23:27:18 -0000 Author: nwhitehorn Date: Sat Feb 4 23:27:16 2012 New Revision: 231000 URL: http://svn.freebsd.org/changeset/base/231000 Log: IFC @ 230995. Adapt RTAS PCI driver to new unified OF PCI interface. Added: projects/pseries/amd64/conf/WITHOUT_SOURCELESS - copied unchanged from r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS projects/pseries/amd64/conf/WITHOUT_SOURCELESS_HOST - copied unchanged from r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS_HOST projects/pseries/amd64/conf/WITHOUT_SOURCELESS_UCODE - copied unchanged from r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS_UCODE projects/pseries/dev/isci/ - copied from r230995, head/sys/dev/isci/ projects/pseries/dev/ixgbe/ixgbe_82598.h - copied unchanged from r230995, head/sys/dev/ixgbe/ixgbe_82598.h projects/pseries/dev/ixgbe/ixgbe_82599.h - copied unchanged from r230995, head/sys/dev/ixgbe/ixgbe_82599.h projects/pseries/dev/ixgbe/ixgbe_x540.c - copied unchanged from r230995, head/sys/dev/ixgbe/ixgbe_x540.c projects/pseries/dev/ixgbe/ixgbe_x540.h - copied unchanged from r230995, head/sys/dev/ixgbe/ixgbe_x540.h projects/pseries/dev/mps/mps_config.c - copied unchanged from r230995, head/sys/dev/mps/mps_config.c projects/pseries/dev/mps/mps_mapping.c - copied unchanged from r230995, head/sys/dev/mps/mps_mapping.c projects/pseries/dev/mps/mps_mapping.h - copied unchanged from r230995, head/sys/dev/mps/mps_mapping.h projects/pseries/dev/mps/mps_sas.h - copied unchanged from r230995, head/sys/dev/mps/mps_sas.h projects/pseries/dev/mps/mps_sas_lsi.c - copied unchanged from r230995, head/sys/dev/mps/mps_sas_lsi.c projects/pseries/dev/sound/pci/cs461x_dsp.h - copied unchanged from r230995, head/sys/dev/sound/pci/cs461x_dsp.h projects/pseries/dev/xen/netback/netback_unit_tests.c - copied unchanged from r230995, head/sys/dev/xen/netback/netback_unit_tests.c projects/pseries/i386/conf/WITHOUT_SOURCELESS - copied unchanged from r230995, head/sys/i386/conf/WITHOUT_SOURCELESS projects/pseries/i386/conf/WITHOUT_SOURCELESS_HOST - copied unchanged from r230995, head/sys/i386/conf/WITHOUT_SOURCELESS_HOST projects/pseries/i386/conf/WITHOUT_SOURCELESS_UCODE - copied unchanged from r230995, head/sys/i386/conf/WITHOUT_SOURCELESS_UCODE projects/pseries/modules/isci/ - copied from r230995, head/sys/modules/isci/ projects/pseries/powerpc/ofw/ofw_pci.c - copied unchanged from r230995, head/sys/powerpc/ofw/ofw_pci.c projects/pseries/powerpc/ofw/ofw_pci.h - copied unchanged from r230995, head/sys/powerpc/ofw/ofw_pci.h Deleted: projects/pseries/gnu/dev/ Modified: projects/pseries/amd64/acpica/acpi_switch.S projects/pseries/amd64/acpica/acpi_wakecode.S projects/pseries/amd64/acpica/acpi_wakeup.c projects/pseries/amd64/amd64/fpu.c projects/pseries/amd64/amd64/minidump_machdep.c projects/pseries/amd64/amd64/uma_machdep.c projects/pseries/amd64/conf/GENERIC projects/pseries/amd64/conf/NOTES projects/pseries/amd64/include/cpufunc.h projects/pseries/amd64/include/signal.h projects/pseries/boot/forth/menu.rc projects/pseries/cam/ata/ata_da.c projects/pseries/cam/ata/ata_xpt.c projects/pseries/cam/cam_ccb.h projects/pseries/cam/cam_periph.c projects/pseries/cam/cam_xpt.c projects/pseries/cam/cam_xpt_internal.h projects/pseries/cam/scsi/scsi_all.c projects/pseries/cam/scsi/scsi_all.h projects/pseries/cam/scsi/scsi_da.c projects/pseries/cam/scsi/scsi_xpt.c projects/pseries/cddl/compat/opensolaris/sys/kmem.h projects/pseries/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c projects/pseries/conf/files projects/pseries/conf/files.amd64 projects/pseries/conf/files.i386 projects/pseries/conf/files.powerpc projects/pseries/conf/options projects/pseries/conf/options.amd64 projects/pseries/conf/options.i386 projects/pseries/dev/ata/chipsets/ata-acerlabs.c projects/pseries/dev/ata/chipsets/ata-siliconimage.c projects/pseries/dev/ath/ath_dfs/null/dfs_null.c projects/pseries/dev/ath/ath_hal/ar5210/ar5210_attach.c projects/pseries/dev/ath/ath_hal/ar5211/ar5211_attach.c projects/pseries/dev/ath/ath_hal/ar5212/ar5212.h projects/pseries/dev/ath/ath_hal/ar5212/ar5212_attach.c projects/pseries/dev/ath/ath_hal/ar5212/ar5212_misc.c projects/pseries/dev/ath/ath_hal/ar5416/ar5416_attach.c projects/pseries/dev/ath/ath_hal/ar9002/ar9280_attach.c projects/pseries/dev/ath/if_ath.c projects/pseries/dev/ath/if_athdfs.h projects/pseries/dev/ciss/ciss.c projects/pseries/dev/e1000/README projects/pseries/dev/fe/if_fe.c projects/pseries/dev/firewire/sbp_targ.c projects/pseries/dev/fxp/if_fxp.c projects/pseries/dev/hwpmc/hwpmc_x86.c projects/pseries/dev/ie/if_ie.c projects/pseries/dev/iwn/if_iwn.c projects/pseries/dev/ixgbe/ixgbe.c projects/pseries/dev/ixgbe/ixgbe.h projects/pseries/dev/ixgbe/ixgbe_82598.c projects/pseries/dev/ixgbe/ixgbe_82599.c projects/pseries/dev/ixgbe/ixgbe_api.c projects/pseries/dev/ixgbe/ixgbe_api.h projects/pseries/dev/ixgbe/ixgbe_common.c projects/pseries/dev/ixgbe/ixgbe_common.h projects/pseries/dev/ixgbe/ixgbe_mbx.c projects/pseries/dev/ixgbe/ixgbe_mbx.h projects/pseries/dev/ixgbe/ixgbe_osdep.h projects/pseries/dev/ixgbe/ixgbe_phy.c projects/pseries/dev/ixgbe/ixgbe_phy.h projects/pseries/dev/ixgbe/ixgbe_type.h projects/pseries/dev/ixgbe/ixgbe_vf.c projects/pseries/dev/ixgbe/ixgbe_vf.h projects/pseries/dev/ixgbe/ixv.c projects/pseries/dev/ixgbe/ixv.h projects/pseries/dev/mps/mpi/mpi2.h projects/pseries/dev/mps/mpi/mpi2_cnfg.h projects/pseries/dev/mps/mpi/mpi2_hbd.h projects/pseries/dev/mps/mpi/mpi2_history.txt projects/pseries/dev/mps/mpi/mpi2_init.h projects/pseries/dev/mps/mpi/mpi2_ioc.h projects/pseries/dev/mps/mpi/mpi2_ra.h projects/pseries/dev/mps/mpi/mpi2_raid.h projects/pseries/dev/mps/mpi/mpi2_sas.h projects/pseries/dev/mps/mpi/mpi2_targ.h projects/pseries/dev/mps/mpi/mpi2_tool.h projects/pseries/dev/mps/mpi/mpi2_type.h projects/pseries/dev/mps/mps.c projects/pseries/dev/mps/mps_ioctl.h projects/pseries/dev/mps/mps_pci.c projects/pseries/dev/mps/mps_sas.c projects/pseries/dev/mps/mps_table.c projects/pseries/dev/mps/mps_user.c projects/pseries/dev/mps/mpsvar.h projects/pseries/dev/mvs/mvs.h projects/pseries/dev/mvs/mvs_soc.c projects/pseries/dev/netmap/ixgbe_netmap.h projects/pseries/dev/netmap/netmap.c projects/pseries/dev/netmap/netmap_kern.h projects/pseries/dev/ofw/openfirm.c projects/pseries/dev/pccbb/pccbb.c projects/pseries/dev/pci/pcireg.h projects/pseries/dev/sound/pci/csa.c projects/pseries/dev/sound/pci/csareg.h projects/pseries/dev/sound/pci/hda/hdaa.c projects/pseries/dev/sound/pci/hda/hdaa.h projects/pseries/dev/sound/pci/hda/hdaa_patches.c projects/pseries/dev/sound/pci/hda/hdac.c projects/pseries/dev/sound/pci/hda/hdac.h projects/pseries/dev/sound/pci/hda/hdacc.c projects/pseries/dev/sound/pcm/buffer.c projects/pseries/dev/sound/pcm/buffer.h projects/pseries/dev/sound/pcm/channel.c projects/pseries/dev/usb/usb_transfer.c projects/pseries/dev/wi/if_wi.c projects/pseries/dev/xen/blkback/blkback.c projects/pseries/dev/xen/netback/netback.c projects/pseries/fs/nfsclient/nfs_clbio.c projects/pseries/fs/nfsclient/nfs_clnode.c projects/pseries/fs/nfsclient/nfs_clport.c projects/pseries/fs/nfsclient/nfs_clvfsops.c projects/pseries/fs/nfsclient/nfs_clvnops.c projects/pseries/fs/nfsclient/nfsmount.h projects/pseries/geom/geom_bsd.c projects/pseries/geom/geom_mbr.c projects/pseries/geom/geom_pc98.c projects/pseries/geom/mountver/g_mountver.c projects/pseries/geom/part/g_part.c projects/pseries/i386/conf/GENERIC projects/pseries/i386/conf/NOTES projects/pseries/i386/i386/initcpu.c projects/pseries/i386/include/signal.h projects/pseries/i386/include/xen/xenpmap.h projects/pseries/i386/include/xen/xenvar.h projects/pseries/kern/imgact_elf.c projects/pseries/kern/kern_kthread.c projects/pseries/kern/kern_proc.c projects/pseries/kern/kern_shutdown.c projects/pseries/kern/subr_log.c projects/pseries/kern/subr_scanf.c projects/pseries/kern/subr_syscall.c projects/pseries/kern/uipc_mbuf.c projects/pseries/kern/uipc_socket.c projects/pseries/kern/vfs_aio.c projects/pseries/kern/vfs_cache.c projects/pseries/kern/vfs_subr.c projects/pseries/kern/vfs_vnops.c projects/pseries/modules/Makefile projects/pseries/modules/drm/Makefile projects/pseries/modules/ixgbe/Makefile projects/pseries/modules/mps/Makefile projects/pseries/modules/sound/driver/Makefile projects/pseries/modules/sound/driver/emu10k1/Makefile projects/pseries/modules/sound/driver/emu10kx/Makefile projects/pseries/modules/sound/driver/maestro3/Makefile projects/pseries/modules/usb/Makefile projects/pseries/net/flowtable.c projects/pseries/net/if_llatbl.c projects/pseries/net80211/ieee80211_dfs.c projects/pseries/net80211/ieee80211_dfs.h projects/pseries/net80211/ieee80211_hwmp.c projects/pseries/net80211/ieee80211_mesh.c projects/pseries/netinet/ip_carp.c projects/pseries/netinet/ipfw/dn_sched_qfq.c projects/pseries/netinet6/in6.h projects/pseries/netinet6/nd6.c projects/pseries/nfsclient/nfs_bio.c projects/pseries/nfsclient/nfs_vfsops.c projects/pseries/nfsclient/nfs_vnops.c projects/pseries/nfsclient/nfsmount.h projects/pseries/nlm/nlm_prot_impl.c projects/pseries/powerpc/aim/mmu_oea64.c projects/pseries/powerpc/booke/machdep.c projects/pseries/powerpc/powermac/cpcht.c projects/pseries/powerpc/powermac/grackle.c projects/pseries/powerpc/powermac/gracklevar.h projects/pseries/powerpc/powermac/uninorthpci.c projects/pseries/powerpc/powermac/uninorthvar.h projects/pseries/powerpc/ps3/ps3_syscons.c projects/pseries/powerpc/pseries/rtas_pci.c projects/pseries/sparc64/include/clock.h projects/pseries/sparc64/include/cpu.h projects/pseries/sparc64/include/ofw_machdep.h projects/pseries/sparc64/include/vmparam.h projects/pseries/sparc64/pci/schizo.c projects/pseries/sparc64/pci/schizovar.h projects/pseries/sparc64/sparc64/cache.c projects/pseries/sparc64/sparc64/clock.c projects/pseries/sparc64/sparc64/machdep.c projects/pseries/sparc64/sparc64/ofw_machdep.c projects/pseries/sparc64/sparc64/pmap.c projects/pseries/sparc64/sparc64/support.S projects/pseries/sys/elf_common.h projects/pseries/sys/malloc.h projects/pseries/sys/mdioctl.h projects/pseries/sys/param.h projects/pseries/sys/proc.h projects/pseries/sys/signal.h projects/pseries/sys/systm.h projects/pseries/sys/types.h projects/pseries/sys/ucontext.h projects/pseries/vm/swap_pager.c projects/pseries/vm/uma.h projects/pseries/vm/uma_core.c projects/pseries/vm/vm_contig.c projects/pseries/vm/vm_kern.c projects/pseries/vm/vm_page.c projects/pseries/vm/vm_page.h projects/pseries/xen/interface/io/netif.h Directory Properties: projects/pseries/ (props changed) projects/pseries/boot/ (props changed) projects/pseries/cddl/contrib/opensolaris/ (props changed) projects/pseries/conf/ (props changed) Modified: projects/pseries/amd64/acpica/acpi_switch.S ============================================================================== --- projects/pseries/amd64/acpica/acpi_switch.S Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/acpica/acpi_switch.S Sat Feb 4 23:27:16 2012 (r231000) @@ -1,7 +1,7 @@ /*- * Copyright (c) 2001 Takanori Watanabe * Copyright (c) 2001 Mitsuru IWASAKI - * Copyright (c) 2008-2010 Jung-uk Kim + * Copyright (c) 2008-2012 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -95,7 +95,6 @@ ENTRY(acpi_restorecpu) /* Restore CR0 except for FPU mode. */ movq PCB_CR0(%rdi), %rax - movq %rax, %rcx andq $~(CR0_EM | CR0_TS), %rax movq %rax, %cr0 @@ -121,15 +120,6 @@ ENTRY(acpi_restorecpu) #undef SDT_SYSTSS #undef SDT_SYSBSY - /* Restore other callee saved registers. */ - movq PCB_R15(%rdi), %r15 - movq PCB_R14(%rdi), %r14 - movq PCB_R13(%rdi), %r13 - movq PCB_R12(%rdi), %r12 - movq PCB_RBP(%rdi), %rbp - movq PCB_RSP(%rdi), %rsp - movq PCB_RBX(%rdi), %rbx - /* Restore debug registers. */ movq PCB_DR0(%rdi), %rax movq %rax, %dr0 @@ -146,21 +136,34 @@ ENTRY(acpi_restorecpu) /* Restore FPU state. */ fninit - movq WAKEUP_CTX(fpusave),%rdi - cmpl $0,use_xsave - jne 1f - fxrstor (%rdi) + movq WAKEUP_CTX(fpusave), %rbx + movq WAKEUP_CTX(xsmask), %rax + testq %rax, %rax + jz 1f + movq %rax, %rdx + shrq $32, %rdx + movl $XCR0, %ecx +/* xsetbv */ + .byte 0x0f, 0x01, 0xd1 +/* xrstor (%rbx) */ + .byte 0x0f, 0xae, 0x2b jmp 2f -1: movl xsave_mask,%eax - movl xsave_mask+4,%edx -/* xrstor (%rdi) */ - .byte 0x0f,0xae,0x2f +1: + fxrstor (%rbx) 2: /* Reload CR0. */ - movq %rcx, %cr0 + movq PCB_CR0(%rdi), %rax + movq %rax, %cr0 - movq WAKEUP_CTX(pcb),%rdi + /* Restore other callee saved registers. */ + movq PCB_R15(%rdi), %r15 + movq PCB_R14(%rdi), %r14 + movq PCB_R13(%rdi), %r13 + movq PCB_R12(%rdi), %r12 + movq PCB_RBP(%rdi), %rbp + movq PCB_RSP(%rdi), %rsp + movq PCB_RBX(%rdi), %rbx /* Restore return address. */ movq PCB_RIP(%rdi), %rax Modified: projects/pseries/amd64/acpica/acpi_wakecode.S ============================================================================== --- projects/pseries/amd64/acpica/acpi_wakecode.S Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/acpica/acpi_wakecode.S Sat Feb 4 23:27:16 2012 (r231000) @@ -2,7 +2,7 @@ * Copyright (c) 2001 Takanori Watanabe * Copyright (c) 2001 Mitsuru IWASAKI * Copyright (c) 2003 Peter Wemm - * Copyright (c) 2008-2010 Jung-uk Kim + * Copyright (c) 2008-2012 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -267,11 +267,11 @@ wakeup_ctx: .quad 0 wakeup_pcb: .quad 0 +wakeup_fpusave: + .quad 0 wakeup_gdt: .word 0 .quad 0 -wakeup_fpusave: - .quad 0 ALIGN_DATA wakeup_efer: @@ -284,6 +284,8 @@ wakeup_cstar: .quad 0 wakeup_sfmask: .quad 0 +wakeup_xsmask: + .quad 0 wakeup_cpu: .long 0 dummy: Modified: projects/pseries/amd64/acpica/acpi_wakeup.c ============================================================================== --- projects/pseries/amd64/acpica/acpi_wakeup.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/acpica/acpi_wakeup.c Sat Feb 4 23:27:16 2012 (r231000) @@ -2,7 +2,7 @@ * Copyright (c) 2001 Takanori Watanabe * Copyright (c) 2001 Mitsuru IWASAKI * Copyright (c) 2003 Peter Wemm - * Copyright (c) 2008-2010 Jung-uk Kim + * Copyright (c) 2008-2012 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -74,7 +74,7 @@ static struct pcb **susppcbs; static void **suspfpusave; #endif -int acpi_restorecpu(vm_offset_t, struct pcb *); +int acpi_restorecpu(uint64_t, vm_offset_t); static void *acpi_alloc_wakeup_handler(void); static void acpi_stop_beep(void *); @@ -386,6 +386,7 @@ acpi_install_wakeup_handler(struct acpi_ WAKECODE_FIXUP(wakeup_lstar, uint64_t, rdmsr(MSR_LSTAR)); WAKECODE_FIXUP(wakeup_cstar, uint64_t, rdmsr(MSR_CSTAR)); WAKECODE_FIXUP(wakeup_sfmask, uint64_t, rdmsr(MSR_SF_MASK)); + WAKECODE_FIXUP(wakeup_xsmask, uint64_t, xsave_mask); /* Build temporary page tables below realmode code. */ pt4 = wakeaddr; Modified: projects/pseries/amd64/amd64/fpu.c ============================================================================== --- projects/pseries/amd64/amd64/fpu.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/amd64/fpu.c Sat Feb 4 23:27:16 2012 (r231000) @@ -78,6 +78,41 @@ __FBSDID("$FreeBSD$"); : : "n" (CR0_TS) : "ax") #define stop_emulating() __asm __volatile("clts") +static __inline void +xrstor(char *addr, uint64_t mask) +{ + uint32_t low, hi; + + low = mask; + hi = mask >> 32; + /* xrstor (%rdi) */ + __asm __volatile(".byte 0x0f,0xae,0x2f" : : + "a" (low), "d" (hi), "D" (addr)); +} + +static __inline void +xsave(char *addr, uint64_t mask) +{ + uint32_t low, hi; + + low = mask; + hi = mask >> 32; + /* xsave (%rdi) */ + __asm __volatile(".byte 0x0f,0xae,0x27" : : + "a" (low), "d" (hi), "D" (addr) : "memory"); +} + +static __inline void +xsetbv(uint32_t reg, uint64_t val) +{ + uint32_t low, hi; + + low = val; + hi = val >> 32; + __asm __volatile(".byte 0x0f,0x01,0xd1" : : + "c" (reg), "a" (low), "d" (hi)); +} + #else /* !(__GNUCLIKE_ASM && !lint) */ void fldcw(u_short cw); @@ -90,6 +125,9 @@ void fxrstor(caddr_t addr); void ldmxcsr(u_int csr); void start_emulating(void); void stop_emulating(void); +void xrstor(char *addr, uint64_t mask); +void xsave(char *addr, uint64_t mask); +void xsetbv(uint32_t reg, uint64_t val); #endif /* __GNUCLIKE_ASM && !lint */ Modified: projects/pseries/amd64/amd64/minidump_machdep.c ============================================================================== --- projects/pseries/amd64/amd64/minidump_machdep.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/amd64/minidump_machdep.c Sat Feb 4 23:27:16 2012 (r231000) @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #endif #include +#include #include #include #include @@ -75,8 +76,11 @@ CTASSERT(sizeof(*vm_page_dump) == 8); static int is_dumpable(vm_paddr_t pa) { + vm_page_t m; int i; + if ((m = vm_phys_paddr_to_vm_page(pa)) != NULL) + return ((m->flags & PG_NODUMP) == 0); for (i = 0; dump_avail[i] != 0 || dump_avail[i + 1] != 0; i += 2) { if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) return (1); Modified: projects/pseries/amd64/amd64/uma_machdep.c ============================================================================== --- projects/pseries/amd64/amd64/uma_machdep.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/amd64/uma_machdep.c Sat Feb 4 23:27:16 2012 (r231000) @@ -65,7 +65,8 @@ uma_small_alloc(uma_zone_t zone, int byt break; } pa = m->phys_addr; - dump_add_page(pa); + if ((wait & M_NODUMP) == 0) + dump_add_page(pa); va = (void *)PHYS_TO_DMAP(pa); if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) pagezero(va); Modified: projects/pseries/amd64/conf/GENERIC ============================================================================== --- projects/pseries/amd64/conf/GENERIC Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/conf/GENERIC Sat Feb 4 23:27:16 2012 (r231000) @@ -123,6 +123,7 @@ device adv # Advansys SCSI adapters device adw # Advansys wide SCSI adapters device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60. device bt # Buslogic/Mylex MultiMaster SCSI adapters +device isci # Intel C600 SAS controller # ATA/SCSI peripherals device scbus # SCSI bus (required for ATA/SCSI) Modified: projects/pseries/amd64/conf/NOTES ============================================================================== --- projects/pseries/amd64/conf/NOTES Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/conf/NOTES Sat Feb 4 23:27:16 2012 (r231000) @@ -409,6 +409,11 @@ device hptiop device ips # +# Intel C600 (Patsburg) integrated SAS controller +device isci +options ISCI_LOGGING # enable debugging in isci HAL + +# # SafeNet crypto driver: can be moved to the MI NOTES as soon as # it's tested on a big-endian machine # Copied: projects/pseries/amd64/conf/WITHOUT_SOURCELESS (from r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/pseries/amd64/conf/WITHOUT_SOURCELESS Sat Feb 4 23:27:16 2012 (r231000, copy of r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS) @@ -0,0 +1,7 @@ +# +# WITHOUT_SOURCELESS -- Disable drivers that include sourceless code. +# +# $FreeBSD$ + +include WITHOUT_SOURCELESS_HOST +include WITHOUT_SOURCELESS_UCODE Copied: projects/pseries/amd64/conf/WITHOUT_SOURCELESS_HOST (from r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS_HOST) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/pseries/amd64/conf/WITHOUT_SOURCELESS_HOST Sat Feb 4 23:27:16 2012 (r231000, copy of r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS_HOST) @@ -0,0 +1,10 @@ +# +# WITHOUT_SOURCELESS_UCODE -- Disable drivers that include sourceless +# native code for host CPU. +# +# $FreeBSD$ + +nodevice hpt27xx +nodevice hptmv +nodevice hptrr +nodevice nve Copied: projects/pseries/amd64/conf/WITHOUT_SOURCELESS_UCODE (from r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS_UCODE) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/pseries/amd64/conf/WITHOUT_SOURCELESS_UCODE Sat Feb 4 23:27:16 2012 (r231000, copy of r230995, head/sys/amd64/conf/WITHOUT_SOURCELESS_UCODE) @@ -0,0 +1,41 @@ +# +# WITHOUT_SOURCELESS_UCODE -- Disable drivers that include sourceless +# microcode. +# +# $FreeBSD$ + +nodevice adw +nodevice bce +nodevice fatm +nodevice fxp +nodevice ispfw +nodevice mwlfw +nodevice ralfw +nodevice runfw +nodevice sf +nodevice sn +nodevice ti +nodevice txp +nodevice ce +nodevice cp +nodevice ctau +nodevice ipwfw +nodevice iwifw +nodevice iwnfw +nodevice wpifw + +# drm +nodevice mga +nodevice r128 +nodevice radeon + +# sound +nodevice csa +nodevice ds1 +nodevice maestro3 + +# usb +nodevice rum +nodevice uath +nodevice zyd +nodevice kue Modified: projects/pseries/amd64/include/cpufunc.h ============================================================================== --- projects/pseries/amd64/include/cpufunc.h Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/include/cpufunc.h Sat Feb 4 23:27:16 2012 (r231000) @@ -669,41 +669,6 @@ intr_restore(register_t rflags) write_rflags(rflags); } -static __inline void -xsetbv(uint32_t reg, uint64_t val) -{ - uint32_t low, hi; - - low = val; - hi = val >> 32; - __asm __volatile(".byte 0x0f,0x01,0xd1" : : - "c" (reg), "a" (low), "d" (hi)); -} - -static __inline void -xsave(char *addr, uint64_t mask) -{ - uint32_t low, hi; - - low = mask; - hi = mask >> 32; - /* xsave (%rdi) */ - __asm __volatile(".byte 0x0f,0xae,0x27" : : - "a" (low), "d" (hi), "D" (addr) : "memory"); -} - -static __inline void -xrstor(char *addr, uint64_t mask) -{ - uint32_t low, hi; - - low = mask; - hi = mask >> 32; - /* xrstor (%rdi) */ - __asm __volatile(".byte 0x0f,0xae,0x2f" : : - "a" (low), "d" (hi), "D" (addr)); -} - #else /* !(__GNUCLIKE_ASM && __CC_SUPPORTS___INLINE) */ int breakpoint(void); @@ -768,9 +733,6 @@ u_int rgs(void); void wbinvd(void); void write_rflags(u_int rf); void wrmsr(u_int msr, uint64_t newval); -void xsetbv(uint32_t reg, uint64_t val); -void xsave(char *addr, uint64_t mask); -void xrstor(char *addr, uint64_t mask); #endif /* __GNUCLIKE_ASM && __CC_SUPPORTS___INLINE */ Modified: projects/pseries/amd64/include/signal.h ============================================================================== --- projects/pseries/amd64/include/signal.h Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/amd64/include/signal.h Sat Feb 4 23:27:16 2012 (r231000) @@ -99,7 +99,10 @@ struct sigcontext { long sc_fsbase; long sc_gsbase; - long sc_spare[6]; + long sc_xfpustate; + long sc_xfpustate_len; + + long sc_spare[4]; }; #endif /* __BSD_VISIBLE */ Modified: projects/pseries/boot/forth/menu.rc ============================================================================== --- projects/pseries/boot/forth/menu.rc Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/boot/forth/menu.rc Sat Feb 4 23:27:16 2012 (r231000) @@ -18,9 +18,9 @@ menu-init \ initialize the menu area \ Initialize main menu constructs (see `menu.4th') \ NOTE: To use the `ansi' variants, add `loader_color=1' to loader.conf(5) -set menu_caption[1]="Boot [ENTER]" +set menu_caption[1]="Boot [Enter]" set menu_command[1]="boot" -set ansi_caption[1]="Boot [ENTER]" +set ansi_caption[1]="Boot [Enter]" set menu_keycode[1]="98" set menu_caption[2]="[Esc]ape to loader prompt" @@ -38,34 +38,34 @@ set menu_reboot \ set menu_options=4 -set menu_caption[4]="[A]CPI Support: Disabled" -set toggled_text[4]="[A]CPI Support: Enabled" +set menu_caption[4]="[A]CPI Support off" +set toggled_text[4]="[A]CPI Support On" set menu_command[4]="toggle_acpi" set menu_keycode[4]="97" set menu_acpi=4 -set ansi_caption[4]="ACPI Support: Disabled" -set toggled_ansi[4]="ACPI Support: Enabled" +set ansi_caption[4]="ACPI Support Off" +set toggled_ansi[4]="ACPI Support On" -set menu_caption[5]="Boot Safe [M]ode: NO" -set toggled_text[5]="Boot Safe [M]ode: YES" +set menu_caption[5]="Safe [M]ode... off" +set toggled_text[5]="Safe [M]ode... On" set menu_command[5]="toggle_safemode" set menu_keycode[5]="109" -set ansi_caption[5]="Boot Safe Mode: NO" -set toggled_ansi[5]="Boot Safe Mode: YES" +set ansi_caption[5]="Safe Mode... Off" +set toggled_ansi[5]="Safe Mode... On" -set menu_caption[6]="Boot [S]ingle User: NO" -set toggled_text[6]="Boot [S]ingle User: YES" +set menu_caption[6]="[S]ingle User. off" +set toggled_text[6]="[S]ingle User. On" set menu_command[6]="toggle_singleuser" set menu_keycode[6]="115" -set ansi_caption[6]="Boot Single User: NO" -set toggled_ansi[6]="Boot Single User: YES" +set ansi_caption[6]="Single User. Off" +set toggled_ansi[6]="Single User. On" -set menu_caption[7]="Boot [V]erbose: NO" -set toggled_text[7]="Boot [V]erbose: YES" +set menu_caption[7]="[V]erbose..... off" +set toggled_text[7]="[V]erbose..... On" set menu_command[7]="toggle_verbose" set menu_keycode[7]="118" -set ansi_caption[7]="Boot Verbose: NO" -set toggled_ansi[7]="Boot Verbose: YES" +set ansi_caption[7]="Verbose..... Off" +set toggled_ansi[7]="Verbose..... On" \ Enable automatic booting (add ``autoboot_delay=N'' to loader.conf(5) to \ customize the timeout; default is 10-seconds) Modified: projects/pseries/cam/ata/ata_da.c ============================================================================== --- projects/pseries/cam/ata/ata_da.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/ata/ata_da.c Sat Feb 4 23:27:16 2012 (r231000) @@ -1098,7 +1098,7 @@ adaregister(struct cam_periph *periph, v */ callout_init_mtx(&softc->sendordered_c, periph->sim->mtx, 0); callout_reset(&softc->sendordered_c, - (ADA_DEFAULT_TIMEOUT * hz) / ADA_ORDEREDTAG_INTERVAL, + (ada_default_timeout * hz) / ADA_ORDEREDTAG_INTERVAL, adasendorderedtag, softc); if (ADA_RA >= 0 && @@ -1653,7 +1653,7 @@ adasendorderedtag(void *arg) } /* Queue us up again */ callout_reset(&softc->sendordered_c, - (ADA_DEFAULT_TIMEOUT * hz) / ADA_ORDEREDTAG_INTERVAL, + (ada_default_timeout * hz) / ADA_ORDEREDTAG_INTERVAL, adasendorderedtag, softc); } Modified: projects/pseries/cam/ata/ata_xpt.c ============================================================================== --- projects/pseries/cam/ata/ata_xpt.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/ata/ata_xpt.c Sat Feb 4 23:27:16 2012 (r231000) @@ -186,6 +186,12 @@ static void ata_dev_async(u_int32_t asy static void ata_action(union ccb *start_ccb); static void ata_announce_periph(struct cam_periph *periph); +static int ata_dma = 1; +static int atapi_dma = 1; + +TUNABLE_INT("hw.ata.ata_dma", &ata_dma); +TUNABLE_INT("hw.ata.atapi_dma", &atapi_dma); + static struct xpt_xport ata_xport = { .alloc_device = ata_alloc_device, .action = ata_action, @@ -356,6 +362,13 @@ probestart(struct cam_periph *periph, un if (cts.xport_specific.sata.valid & CTS_SATA_VALID_MODE) mode = cts.xport_specific.sata.mode; } + if (periph->path->device->protocol == PROTO_ATA) { + if (ata_dma == 0 && (mode == 0 || mode > ATA_PIO_MAX)) + mode = ATA_PIO_MAX; + } else { + if (atapi_dma == 0 && (mode == 0 || mode > ATA_PIO_MAX)) + mode = ATA_PIO_MAX; + } negotiate: /* Honor device capabilities. */ wantmode = mode = ata_max_mode(ident_buf, mode); Modified: projects/pseries/cam/cam_ccb.h ============================================================================== --- projects/pseries/cam/cam_ccb.h Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/cam_ccb.h Sat Feb 4 23:27:16 2012 (r231000) @@ -1118,6 +1118,7 @@ struct ccb_dev_advinfo { #define CDAI_TYPE_SCSI_DEVID 1 #define CDAI_TYPE_SERIAL_NUM 2 #define CDAI_TYPE_PHYS_PATH 3 +#define CDAI_TYPE_RCAPLONG 4 off_t bufsiz; /* IN: Size of external buffer */ #define CAM_SCSI_DEVID_MAXLEN 65536 /* length in buffer is an uint16_t */ off_t provsiz; /* OUT: Size required/used */ Modified: projects/pseries/cam/cam_periph.c ============================================================================== --- projects/pseries/cam/cam_periph.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/cam_periph.c Sat Feb 4 23:27:16 2012 (r231000) @@ -1864,13 +1864,26 @@ cam_periph_error(union ccb *ccb, cam_fla case CAM_DEV_NOT_THERE: { struct cam_path *newpath; + lun_id_t lun_id; error = ENXIO; + + /* + * For a selection timeout, we consider all of the LUNs on + * the target to be gone. If the status is CAM_DEV_NOT_THERE, + * then we only get rid of the device(s) specified by the + * path in the original CCB. + */ + if (status == CAM_DEV_NOT_THERE) + lun_id = xpt_path_lun_id(ccb->ccb_h.path); + else + lun_id = CAM_LUN_WILDCARD; + /* Should we do more if we can't create the path?? */ if (xpt_create_path(&newpath, periph, xpt_path_path_id(ccb->ccb_h.path), xpt_path_target_id(ccb->ccb_h.path), - CAM_LUN_WILDCARD) != CAM_REQ_CMP) + lun_id) != CAM_REQ_CMP) break; /* Modified: projects/pseries/cam/cam_xpt.c ============================================================================== --- projects/pseries/cam/cam_xpt.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/cam_xpt.c Sat Feb 4 23:27:16 2012 (r231000) @@ -4588,6 +4588,17 @@ xpt_release_device(struct cam_ed *device cam_devq_resize(devq, devq->alloc_queue.array_size - 1); camq_fini(&device->drvq); cam_ccbq_fini(&device->ccbq); + /* + * Free allocated memory. free(9) does nothing if the + * supplied pointer is NULL, so it is safe to call without + * checking. + */ + free(device->supported_vpds, M_CAMXPT); + free(device->device_id, M_CAMXPT); + free(device->physpath, M_CAMXPT); + free(device->rcap_buf, M_CAMXPT); + free(device->serial_num, M_CAMXPT); + xpt_release_target(device->target); free(device, M_CAMXPT); } else Modified: projects/pseries/cam/cam_xpt_internal.h ============================================================================== --- projects/pseries/cam/cam_xpt_internal.h Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/cam_xpt_internal.h Sat Feb 4 23:27:16 2012 (r231000) @@ -99,6 +99,8 @@ struct cam_ed { uint8_t *device_id; uint8_t physpath_len; uint8_t *physpath; /* physical path string form */ + uint32_t rcap_len; + uint8_t *rcap_buf; struct ata_params ident_data; u_int8_t inq_flags; /* * Current settings for inquiry flags. Modified: projects/pseries/cam/scsi/scsi_all.c ============================================================================== --- projects/pseries/cam/scsi/scsi_all.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/scsi/scsi_all.c Sat Feb 4 23:27:16 2012 (r231000) @@ -5325,8 +5325,8 @@ void scsi_read_capacity_16(struct ccb_scsiio *csio, uint32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), uint8_t tag_action, uint64_t lba, int reladr, int pmi, - struct scsi_read_capacity_data_long *rcap_buf, - uint8_t sense_len, uint32_t timeout) + uint8_t *rcap_buf, int rcap_buf_len, uint8_t sense_len, + uint32_t timeout) { struct scsi_read_capacity_16 *scsi_cmd; @@ -5337,7 +5337,7 @@ scsi_read_capacity_16(struct ccb_scsiio /*flags*/CAM_DIR_IN, tag_action, /*data_ptr*/(u_int8_t *)rcap_buf, - /*dxfer_len*/sizeof(*rcap_buf), + /*dxfer_len*/rcap_buf_len, sense_len, sizeof(*scsi_cmd), timeout); @@ -5346,7 +5346,7 @@ scsi_read_capacity_16(struct ccb_scsiio scsi_cmd->opcode = SERVICE_ACTION_IN; scsi_cmd->service_action = SRC16_SERVICE_ACTION; scsi_u64to8b(lba, scsi_cmd->addr); - scsi_ulto4b(sizeof(*rcap_buf), scsi_cmd->alloc_len); + scsi_ulto4b(rcap_buf_len, scsi_cmd->alloc_len); if (pmi) reladr |= SRC16_PMI; if (reladr) Modified: projects/pseries/cam/scsi/scsi_all.h ============================================================================== --- projects/pseries/cam/scsi/scsi_all.h Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/scsi/scsi_all.h Sat Feb 4 23:27:16 2012 (r231000) @@ -1437,15 +1437,26 @@ struct scsi_read_capacity_data_long uint8_t length[4]; #define SRC16_PROT_EN 0x01 #define SRC16_P_TYPE 0x0e +#define SRC16_PTYPE_1 0x00 +#define SRC16_PTYPE_2 0x02 +#define SRC16_PTYPE_3 0x04 uint8_t prot; #define SRC16_LBPPBE 0x0f #define SRC16_PI_EXPONENT 0xf0 #define SRC16_PI_EXPONENT_SHIFT 4 uint8_t prot_lbppbe; -#define SRC16_LALBA 0x3fff -#define SRC16_LBPRZ 0x4000 -#define SRC16_LBPME 0x8000 +#define SRC16_LALBA 0x3f +#define SRC16_LBPRZ 0x40 +#define SRC16_LBPME 0x80 +/* + * Alternate versions of these macros that are intended for use on a 16-bit + * version of the lalba_lbp field instead of the array of 2 8 bit numbers. + */ +#define SRC16_LALBA_A 0x3fff +#define SRC16_LBPRZ_A 0x4000 +#define SRC16_LBPME_A 0x8000 uint8_t lalba_lbp[2]; + uint8_t reserved[16]; }; struct scsi_report_luns @@ -2293,9 +2304,8 @@ void scsi_read_capacity_16(struct ccb_s void (*cbfcnp)(struct cam_periph *, union ccb *), uint8_t tag_action, uint64_t lba, int reladr, int pmi, - struct scsi_read_capacity_data_long - *rcap_buf, uint8_t sense_len, - uint32_t timeout); + uint8_t *rcap_buf, int rcap_buf_len, + uint8_t sense_len, uint32_t timeout); void scsi_report_luns(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, Modified: projects/pseries/cam/scsi/scsi_da.c ============================================================================== --- projects/pseries/cam/scsi/scsi_da.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/scsi/scsi_da.c Sat Feb 4 23:27:16 2012 (r231000) @@ -160,6 +160,7 @@ struct da_softc { struct callout sendordered_c; uint64_t wwpn; uint8_t unmap_buf[UNMAP_MAX_RANGES * 16 + 8]; + struct scsi_read_capacity_data_long rcaplong; }; struct da_quirk_entry { @@ -830,7 +831,9 @@ static int daerror(union ccb *ccb, u_i static void daprevent(struct cam_periph *periph, int action); static int dagetcapacity(struct cam_periph *periph); static void dasetgeom(struct cam_periph *periph, uint32_t block_len, - uint64_t maxsector, u_int lbppbe, u_int lalba); + uint64_t maxsector, + struct scsi_read_capacity_data_long *rcaplong, + size_t rcap_size); static timeout_t dasendorderedtag; static void dashutdown(void *arg, int howto); @@ -1146,7 +1149,7 @@ dadump(void *arg, void *virtual, vm_offs /*data_ptr*/(u_int8_t *) virtual, /*dxfer_len*/length, /*sense_len*/SSD_FULL_SIZE, - DA_DEFAULT_TIMEOUT * 1000); + da_default_timeout * 1000); xpt_polled_action((union ccb *)&csio); cam_periph_unlock(periph); @@ -1594,7 +1597,7 @@ daregister(struct cam_periph *periph, vo */ callout_init_mtx(&softc->sendordered_c, periph->sim->mtx, 0); callout_reset(&softc->sendordered_c, - (DA_DEFAULT_TIMEOUT * hz) / DA_ORDEREDTAG_INTERVAL, + (da_default_timeout * hz) / DA_ORDEREDTAG_INTERVAL, dasendorderedtag, softc); mtx_unlock(periph->sim->mtx); @@ -1948,7 +1951,8 @@ out: /*lba*/ 0, /*reladr*/ 0, /*pmi*/ 0, - rcaplong, + /*rcap_buf*/ (uint8_t *)rcaplong, + /*rcap_buf_len*/ sizeof(*rcaplong), /*sense_len*/ SSD_FULL_SIZE, /*timeout*/ 60000); start_ccb->ccb_h.ccb_bp = NULL; @@ -2227,10 +2231,15 @@ dadone(struct cam_periph *periph, union announce_buf[0] = '\0'; cam_periph_invalidate(periph); } else { + /* + * We pass rcaplong into dasetgeom(), + * because it will only use it if it is + * non-NULL. + */ dasetgeom(periph, block_size, maxsector, - lbppbe, lalba & SRC16_LALBA); - if ((lalba & SRC16_LBPME) && - softc->delete_method == DA_DELETE_NONE) + rcaplong, sizeof(*rcaplong)); + if ((lalba & SRC16_LBPME_A) + && softc->delete_method == DA_DELETE_NONE) softc->delete_method = DA_DELETE_UNMAP; dp = &softc->params; snprintf(announce_buf, sizeof(announce_buf), @@ -2504,6 +2513,7 @@ dagetcapacity(struct cam_periph *periph) lalba = 0; error = 0; rc16failed = 0; + rcaplong = NULL; sense_flags = SF_RETRY_UA; if (softc->flags & DA_FLAG_PACK_REMOVABLE) sense_flags |= SF_NO_PRINT; @@ -2521,39 +2531,47 @@ dagetcapacity(struct cam_periph *periph) /* Try READ CAPACITY(16) first if we think it should work. */ if (softc->flags & DA_FLAG_CAN_RC16) { scsi_read_capacity_16(&ccb->csio, - /*retries*/ 4, - /*cbfcnp*/ dadone, - /*tag_action*/ MSG_SIMPLE_Q_TAG, - /*lba*/ 0, - /*reladr*/ 0, - /*pmi*/ 0, - rcaplong, - /*sense_len*/ SSD_FULL_SIZE, - /*timeout*/ 60000); + /*retries*/ 4, + /*cbfcnp*/ dadone, + /*tag_action*/ MSG_SIMPLE_Q_TAG, + /*lba*/ 0, + /*reladr*/ 0, + /*pmi*/ 0, + /*rcap_buf*/ (uint8_t *)rcaplong, + /*rcap_buf_len*/ sizeof(*rcaplong), + /*sense_len*/ SSD_FULL_SIZE, + /*timeout*/ 60000); ccb->ccb_h.ccb_bp = NULL; error = cam_periph_runccb(ccb, daerror, - /*cam_flags*/CAM_RETRY_SELTO, - sense_flags, - softc->disk->d_devstat); + /*cam_flags*/CAM_RETRY_SELTO, + sense_flags, softc->disk->d_devstat); if (error == 0) goto rc16ok; /* If we got ILLEGAL REQUEST, do not prefer RC16 any more. */ - if ((ccb->ccb_h.status & CAM_STATUS_MASK) == - CAM_REQ_INVALID) { + if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INVALID) { softc->flags &= ~DA_FLAG_CAN_RC16; } else if (((ccb->ccb_h.status & CAM_STATUS_MASK) == - CAM_SCSI_STATUS_ERROR) && - (ccb->csio.scsi_status == SCSI_STATUS_CHECK_COND) && - (ccb->ccb_h.status & CAM_AUTOSNS_VALID) && - ((ccb->ccb_h.flags & CAM_SENSE_PHYS) == 0) && - ((ccb->ccb_h.flags & CAM_SENSE_PTR) == 0)) { + CAM_SCSI_STATUS_ERROR) + && (ccb->csio.scsi_status == SCSI_STATUS_CHECK_COND) + && (ccb->ccb_h.status & CAM_AUTOSNS_VALID) + && ((ccb->ccb_h.flags & CAM_SENSE_PHYS) == 0) + && ((ccb->ccb_h.flags & CAM_SENSE_PTR) == 0)) { int sense_key, error_code, asc, ascq; - scsi_extract_sense(&ccb->csio.sense_data, - &error_code, &sense_key, &asc, &ascq); - if (sense_key == SSD_KEY_ILLEGAL_REQUEST) + scsi_extract_sense_len(&ccb->csio.sense_data, + ccb->csio.sense_len - + ccb->csio.sense_resid, + &error_code, &sense_key, + &asc, &ascq, /*show_errors*/1); + /* + * If we don't have enough sense to get the sense + * key, or if it's illegal request, turn off + * READ CAPACITY (16). + */ + if ((sense_key == -1) + || (sense_key == SSD_KEY_ILLEGAL_REQUEST)) softc->flags &= ~DA_FLAG_CAN_RC16; } rc16failed = 1; @@ -2590,7 +2608,8 @@ dagetcapacity(struct cam_periph *periph) /*lba*/ 0, /*reladr*/ 0, /*pmi*/ 0, - rcaplong, + /*rcap_buf*/ (uint8_t *)rcaplong, + /*rcap_buf_len*/ sizeof(*rcaplong), /*sense_len*/ SSD_FULL_SIZE, /*timeout*/ 60000); ccb->ccb_h.ccb_bp = NULL; @@ -2617,9 +2636,9 @@ done: error = EINVAL; } else { dasetgeom(periph, block_len, maxsector, - lbppbe, lalba & SRC16_LALBA); - if ((lalba & SRC16_LBPME) && - softc->delete_method == DA_DELETE_NONE) + rcaplong, sizeof(*rcaplong)); + if ((lalba & SRC16_LBPME) + && softc->delete_method == DA_DELETE_NONE) softc->delete_method = DA_DELETE_UNMAP; } } @@ -2633,17 +2652,27 @@ done: static void dasetgeom(struct cam_periph *periph, uint32_t block_len, uint64_t maxsector, - u_int lbppbe, u_int lalba) + struct scsi_read_capacity_data_long *rcaplong, size_t rcap_len) { struct ccb_calc_geometry ccg; struct da_softc *softc; struct disk_params *dp; + u_int lbppbe, lalba; softc = (struct da_softc *)periph->softc; dp = &softc->params; dp->secsize = block_len; dp->sectors = maxsector + 1; + if (rcaplong != NULL) { + lbppbe = rcaplong->prot_lbppbe & SRC16_LBPPBE; + lalba = scsi_2btoul(rcaplong->lalba_lbp); + lalba &= SRC16_LALBA_A; + } else { + lbppbe = 0; + lalba = 0; + } + if (lbppbe > 0) { dp->stripesize = block_len << lbppbe; dp->stripeoffset = (dp->stripesize - block_len * lalba) % @@ -2688,6 +2717,38 @@ dasetgeom(struct cam_periph *periph, uin dp->secs_per_track = ccg.secs_per_track; dp->cylinders = ccg.cylinders; } + + /* + * If the user supplied a read capacity buffer, and if it is + * different than the previous buffer, update the data in the EDT. + * If it's the same, we don't bother. This avoids sending an + * update every time someone opens this device. + */ + if ((rcaplong != NULL) + && (bcmp(rcaplong, &softc->rcaplong, + min(sizeof(softc->rcaplong), rcap_len)) != 0)) { + struct ccb_dev_advinfo cdai; + + xpt_setup_ccb(&cdai.ccb_h, periph->path, CAM_PRIORITY_NORMAL); + cdai.ccb_h.func_code = XPT_DEV_ADVINFO; + cdai.buftype = CDAI_TYPE_RCAPLONG; + cdai.flags |= CDAI_FLAG_STORE; + cdai.bufsiz = rcap_len; + cdai.buf = (uint8_t *)rcaplong; + xpt_action((union ccb *)&cdai); + if ((cdai.ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(cdai.ccb_h.path, 0, 0, 0, FALSE); + if (cdai.ccb_h.status != CAM_REQ_CMP) { + xpt_print(periph->path, "%s: failed to set read " + "capacity advinfo\n", __func__); + /* Use cam_error_print() to decode the status */ + cam_error_print((union ccb *)&cdai, CAM_ESF_CAM_STATUS, + CAM_EPF_ALL); + } else { + bcopy(rcaplong, &softc->rcaplong, + min(sizeof(softc->rcaplong), rcap_len)); + } + } } static void @@ -2707,7 +2768,7 @@ dasendorderedtag(void *arg) } /* Queue us up again */ callout_reset(&softc->sendordered_c, - (DA_DEFAULT_TIMEOUT * hz) / DA_ORDEREDTAG_INTERVAL, + (da_default_timeout * hz) / DA_ORDEREDTAG_INTERVAL, dasendorderedtag, softc); } Modified: projects/pseries/cam/scsi/scsi_xpt.c ============================================================================== --- projects/pseries/cam/scsi/scsi_xpt.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cam/scsi/scsi_xpt.c Sat Feb 4 23:27:16 2012 (r231000) @@ -2468,8 +2468,10 @@ scsi_dev_advinfo(union ccb *start_ccb) break; case CDAI_TYPE_PHYS_PATH: if (cdai->flags & CDAI_FLAG_STORE) { - if (device->physpath != NULL) + if (device->physpath != NULL) { free(device->physpath, M_CAMXPT); + device->physpath = NULL; + } device->physpath_len = cdai->bufsiz; /* Clear existing buffer if zero length */ if (cdai->bufsiz == 0) @@ -2490,6 +2492,36 @@ scsi_dev_advinfo(union ccb *start_ccb) memcpy(cdai->buf, device->physpath, amt); } break; + case CDAI_TYPE_RCAPLONG: + if (cdai->flags & CDAI_FLAG_STORE) { + if (device->rcap_buf != NULL) { + free(device->rcap_buf, M_CAMXPT); + device->rcap_buf = NULL; + } + + device->rcap_len = cdai->bufsiz; + /* Clear existing buffer if zero length */ + if (cdai->bufsiz == 0) + break; + + device->rcap_buf = malloc(cdai->bufsiz, M_CAMXPT, + M_NOWAIT); + if (device->rcap_buf == NULL) { + start_ccb->ccb_h.status = CAM_REQ_ABORTED; + return; + } + + memcpy(device->rcap_buf, cdai->buf, cdai->bufsiz); + } else { + cdai->provsiz = device->rcap_len; + if (device->rcap_len == 0) + break; + amt = device->rcap_len; + if (cdai->provsiz > cdai->bufsiz) + amt = cdai->bufsiz; + memcpy(cdai->buf, device->rcap_buf, amt); + } + break; default: return; } Modified: projects/pseries/cddl/compat/opensolaris/sys/kmem.h ============================================================================== --- projects/pseries/cddl/compat/opensolaris/sys/kmem.h Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cddl/compat/opensolaris/sys/kmem.h Sat Feb 4 23:27:16 2012 (r231000) @@ -45,7 +45,9 @@ MALLOC_DECLARE(M_SOLARIS); #define KM_SLEEP M_WAITOK #define KM_PUSHPAGE M_WAITOK #define KM_NOSLEEP M_NOWAIT -#define KMC_NODEBUG 0 +#define KM_ZERO M_ZERO +#define KM_NODEBUG M_NODUMP +#define KMC_NODEBUG UMA_ZONE_NODUMP #define KMC_NOTOUCH 0 typedef struct kmem_cache { Modified: projects/pseries/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c ============================================================================== --- projects/pseries/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Sat Feb 4 23:25:18 2012 (r230999) +++ projects/pseries/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Sat Feb 4 23:27:16 2012 (r231000) @@ -42,6 +42,10 @@ static int zio_use_uma = 0; TUNABLE_INT("vfs.zfs.zio.use_uma", &zio_use_uma); SYSCTL_INT(_vfs_zfs_zio, OID_AUTO, use_uma, CTLFLAG_RDTUN, &zio_use_uma, 0, "Use uma(9) for ZIO allocations"); +static int zio_exclude_metadata = 0; +TUNABLE_INT("vfs.zfs.zio.exclude_metadata", &zio_exclude_metadata); +SYSCTL_INT(_vfs_zfs_zio, OID_AUTO, exclude_metadata, CTLFLAG_RDTUN, &zio_exclude_metadata, 0, + "Exclude metadata buffers from dumps as well"); /* * ========================================================================== @@ -148,7 +152,7 @@ zio_init(void) (void) sprintf(name, "zio_data_buf_%lu", (ulong_t)size); zio_data_buf_cache[c] = kmem_cache_create(name, size, align, NULL, NULL, NULL, NULL, NULL, - cflags | KMC_NOTOUCH); + cflags | KMC_NOTOUCH | KMC_NODEBUG); } } @@ -217,13 +221,14 @@ void * zio_buf_alloc(size_t size) { size_t c = (size - 1) >> SPA_MINBLOCKSHIFT; + int flags = zio_exclude_metadata ? KM_NODEBUG : 0; ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT); if (zio_use_uma) return (kmem_cache_alloc(zio_buf_cache[c], KM_PUSHPAGE)); else - return (kmem_alloc(size, KM_SLEEP)); + return (kmem_alloc(size, KM_SLEEP|flags)); } /* @@ -242,7 +247,7 @@ zio_data_buf_alloc(size_t size) if (zio_use_uma) return (kmem_cache_alloc(zio_data_buf_cache[c], KM_PUSHPAGE)); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***