This commit is contained in:
Attilio Rao 2011-05-13 20:58:48 +00:00
commit b2aa562e7b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/projects/largeSMP/; revision=221858
21 changed files with 158 additions and 39 deletions

View File

@ -134,7 +134,7 @@ will run with effective gid set to the gid of the file owner.
See
.Xr chmod 2
and
.Xr sticky 8 .
.Xr sticky 7 .
.It Li 0400
Allow read by owner.
.It Li 0200
@ -325,10 +325,10 @@ option is non-standard and its use in scripts is not recommended.
.Xr umask 2 ,
.Xr fts 3 ,
.Xr setmode 3 ,
.Xr sticky 7 ,
.Xr symlink 7 ,
.Xr chown 8 ,
.Xr mount 8 ,
.Xr sticky 8
.Xr mount 8
.Sh STANDARDS
The
.Nm

View File

@ -459,7 +459,7 @@ but not execute or search permission.
(See
.Xr chmod 1
or
.Xr sticky 8 . )
.Xr sticky 7 . )
.It Sy t
The sticky bit is set (mode
.Li 1000 ) ,
@ -467,7 +467,7 @@ and is searchable or executable.
(See
.Xr chmod 1
or
.Xr sticky 8 . )
.Xr sticky 7 . )
.El
.El
.Pp
@ -683,9 +683,9 @@ specification.
.Xr strmode 3 ,
.Xr termcap 5 ,
.Xr maclabel 7 ,
.Xr sticky 7 ,
.Xr symlink 7 ,
.Xr getfmac 8 ,
.Xr sticky 8
.Xr getfmac 8
.Sh STANDARDS
With the exception of options
.Fl I , g , n

View File

@ -161,7 +161,7 @@ The sticky bit may be
set by any user on a directory which the user owns or has appropriate
permissions.
For more details of the properties of the sticky bit, see
.Xr sticky 8 .
.Xr sticky 7 .
.Pp
If mode ISUID (set UID) is set on a directory,
and the MNT_SUIDDIR option was used in the mount of the file system,
@ -289,7 +289,7 @@ nor a file descriptor associated with a directory.
.Xr chown 2 ,
.Xr open 2 ,
.Xr stat 2 ,
.Xr sticky 8
.Xr sticky 7
.Sh STANDARDS
The
.Fn chmod

View File

@ -401,8 +401,8 @@ nor a file descriptor associated with a directory.
.Xr fhstat 2 ,
.Xr statfs 2 ,
.Xr utimes 2 ,
.Xr symlink 7 ,
.Xr sticky 8
.Xr sticky 7 ,
.Xr symlink 7
.Sh STANDARDS
The
.Fn stat

View File

@ -53,6 +53,7 @@ MLINKS+= queue.3 LIST_EMPTY.3 \
queue.3 LIST_INSERT_HEAD.3 \
queue.3 LIST_NEXT.3 \
queue.3 LIST_REMOVE.3 \
queue.3 LIST_SWAP.3 \
queue.3 SLIST_EMPTY.3 \
queue.3 SLIST_ENTRY.3 \
queue.3 SLIST_FIRST.3 \
@ -67,6 +68,7 @@ MLINKS+= queue.3 LIST_EMPTY.3 \
queue.3 SLIST_REMOVE.3 \
queue.3 SLIST_REMOVE_AFTER.3 \
queue.3 SLIST_REMOVE_HEAD.3 \
queue.3 SLIST_SWAP.3 \
queue.3 STAILQ_CONCAT.3 \
queue.3 STAILQ_EMPTY.3 \
queue.3 STAILQ_ENTRY.3 \
@ -84,6 +86,7 @@ MLINKS+= queue.3 LIST_EMPTY.3 \
queue.3 STAILQ_REMOVE.3 \
queue.3 STAILQ_REMOVE_AFTER.3 \
queue.3 STAILQ_REMOVE_HEAD.3 \
queue.3 STAILQ_SWAP.3 \
queue.3 TAILQ_CONCAT.3 \
queue.3 TAILQ_EMPTY.3 \
queue.3 TAILQ_ENTRY.3 \
@ -102,7 +105,8 @@ MLINKS+= queue.3 LIST_EMPTY.3 \
queue.3 TAILQ_LAST.3 \
queue.3 TAILQ_NEXT.3 \
queue.3 TAILQ_PREV.3 \
queue.3 TAILQ_REMOVE.3
queue.3 TAILQ_REMOVE.3 \
queue.3 TAILQ_SWAP.3
MLINKS+= stdarg.3 va_arg.3 \
stdarg.3 va_copy.3 \
stdarg.3 va_end.3 \

View File

@ -32,7 +32,7 @@
.\" @(#)queue.3 8.2 (Berkeley) 1/24/94
.\" $FreeBSD$
.\"
.Dd March 24, 2006
.Dd May 13, 2011
.Dt QUEUE 3
.Os
.Sh NAME
@ -50,6 +50,7 @@
.Nm SLIST_REMOVE_AFTER ,
.Nm SLIST_REMOVE_HEAD ,
.Nm SLIST_REMOVE ,
.Nm SLIST_SWAP ,
.Nm STAILQ_CONCAT ,
.Nm STAILQ_EMPTY ,
.Nm STAILQ_ENTRY ,
@ -67,6 +68,7 @@
.Nm STAILQ_REMOVE_AFTER ,
.Nm STAILQ_REMOVE_HEAD ,
.Nm STAILQ_REMOVE ,
.Nm STAILQ_SWAP ,
.Nm LIST_EMPTY ,
.Nm LIST_ENTRY ,
.Nm LIST_FIRST ,
@ -80,6 +82,7 @@
.Nm LIST_INSERT_HEAD ,
.Nm LIST_NEXT ,
.Nm LIST_REMOVE ,
.Nm LIST_SWAP ,
.Nm TAILQ_CONCAT ,
.Nm TAILQ_EMPTY ,
.Nm TAILQ_ENTRY ,
@ -98,7 +101,8 @@
.Nm TAILQ_LAST ,
.Nm TAILQ_NEXT ,
.Nm TAILQ_PREV ,
.Nm TAILQ_REMOVE
.Nm TAILQ_REMOVE ,
.Nm TAILQ_SWAP
.Nd implementations of singly-linked lists, singly-linked tail queues,
lists and tail queues
.Sh SYNOPSIS
@ -118,6 +122,7 @@ lists and tail queues
.Fn SLIST_REMOVE_AFTER "TYPE *elm" "SLIST_ENTRY NAME"
.Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME"
.Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME"
.Fn SLIST_SWAP "SLIST_HEAD *head1" "SLIST_HEAD *head2" "SLIST_ENTRY NAME"
.\"
.Fn STAILQ_CONCAT "STAILQ_HEAD *head1" "STAILQ_HEAD *head2"
.Fn STAILQ_EMPTY "STAILQ_HEAD *head"
@ -136,6 +141,7 @@ lists and tail queues
.Fn STAILQ_REMOVE_AFTER "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
.Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
.Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY NAME"
.Fn STAILQ_SWAP "STAILQ_HEAD *head1" "STAILQ_HEAD *head2" "STAILQ_ENTRY NAME"
.\"
.Fn LIST_EMPTY "LIST_HEAD *head"
.Fn LIST_ENTRY "TYPE"
@ -150,6 +156,7 @@ lists and tail queues
.Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME"
.Fn LIST_NEXT "TYPE *elm" "LIST_ENTRY NAME"
.Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME"
.Fn LIST_SWAP "LIST_HEAD *head1" "LIST_HEAD *head2" "TYPE" "LIST_ENTRY NAME"
.\"
.Fn TAILQ_CONCAT "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TAILQ_ENTRY NAME"
.Fn TAILQ_EMPTY "TAILQ_HEAD *head"
@ -170,6 +177,7 @@ lists and tail queues
.Fn TAILQ_NEXT "TYPE *elm" "TAILQ_ENTRY NAME"
.Fn TAILQ_PREV "TYPE *elm" "HEADNAME" "TAILQ_ENTRY NAME"
.Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
.Fn TAILQ_SWAP "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TYPE" "TAILQ_ENTRY NAME"
.\"
.Sh DESCRIPTION
These macros define and operate on four types of data structures:
@ -184,6 +192,8 @@ Insertion of a new entry after any element in the list.
O(1) removal of an entry from the head of the list.
.It
Forward traversal through the list.
.It
Swawpping the contents of two lists.
.El
.Pp
Singly-linked lists are the simplest of the four data structures
@ -402,6 +412,13 @@ The macro
removes the element
.Fa elm
from the list.
.Pp
The macro
.Nm SLIST_SWAP
swaps the contents of
.Fa head1
and
.Fa head2 .
.Sh SINGLY-LINKED LIST EXAMPLE
.Bd -literal
SLIST_HEAD(slisthead, entry) head =
@ -584,6 +601,13 @@ The macro
removes the element
.Fa elm
from the tail queue.
.Pp
The macro
.Nm STAILQ_SWAP
swaps the contents of
.Fa head1
and
.Fa head2 .
.Sh SINGLY-LINKED TAIL QUEUE EXAMPLE
.Bd -literal
STAILQ_HEAD(stailhead, entry) head =
@ -743,6 +767,13 @@ The macro
removes the element
.Fa elm
from the list.
.Pp
The macro
.Nm LIST_SWAP
swaps the contents of
.Fa head1
and
.Fa head2 .
.Sh LIST EXAMPLE
.Bd -literal
LIST_HEAD(listhead, entry) head =
@ -942,6 +973,13 @@ The macro
removes the element
.Fa elm
from the tail queue.
.Pp
The macro
.Nm TAILQ_SWAP
swaps the contents of
.Fa head1
and
.Fa head2 .
.Sh TAIL QUEUE EXAMPLE
.Bd -literal
TAILQ_HEAD(tailhead, entry) head =

View File

@ -212,4 +212,6 @@
#define VM_INITIAL_PAGEIN 16
#endif
#define ZERO_REGION_SIZE (2 * 1024 * 1024) /* 2MB */
#endif /* _MACHINE_VMPARAM_H_ */

View File

@ -3646,7 +3646,7 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
pte = *ptep;
pg = PHYS_TO_VM_PAGE(l2pte_pa(pte));
if (pg)
pmap_modify_pv(pg, pmap, va, PVF_WIRED, wired);
pmap_modify_pv(pg, pmap, va, PVF_WIRED, wired ? PVF_WIRED : 0);
vm_page_unlock_queues();
PMAP_UNLOCK(pmap);
}

View File

@ -150,4 +150,7 @@
#ifdef ARM_USE_SMALL_ALLOC
#define UMA_MD_SMALL_ALLOC
#endif /* ARM_USE_SMALL_ALLOC */
#define ZERO_REGION_SIZE (64 * 1024) /* 64KB */
#endif /* _MACHINE_VMPARAM_H_ */

View File

@ -89,6 +89,8 @@
#include <vm/swap_pager.h>
#include <vm/uma.h>
#include <machine/vmparam.h>
#define MD_MODVER 1
#define MD_SHUTDOWN 0x10000 /* Tell worker thread to terminate. */
@ -205,9 +207,6 @@ struct md_s {
vm_object_t object;
};
/* Used for BIO_DELETE on MD_VNODE */
static u_char zero[PAGE_SIZE];
static struct indir *
new_indir(u_int shift)
{
@ -560,7 +559,8 @@ mdstart_vnode(struct md_s *sc, struct bio *bp)
* that the two cases end up having very little in common.
*/
if (bp->bio_cmd == BIO_DELETE) {
zerosize = sizeof(zero) - (sizeof(zero) % sc->sectorsize);
zerosize = ZERO_REGION_SIZE -
(ZERO_REGION_SIZE % sc->sectorsize);
auio.uio_iov = &aiov;
auio.uio_iovcnt = 1;
auio.uio_offset = (vm_ooffset_t)bp->bio_offset;
@ -573,7 +573,7 @@ mdstart_vnode(struct md_s *sc, struct bio *bp)
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
error = 0;
while (auio.uio_offset < end) {
aiov.iov_base = zero;
aiov.iov_base = __DECONST(void *, zero_region);
aiov.iov_len = end - auio.uio_offset;
if (aiov.iov_len > zerosize)
aiov.iov_len = zerosize;

View File

@ -39,7 +39,9 @@ __FBSDID("$FreeBSD$");
#include <sys/priv.h>
#include <sys/disk.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <machine/vmparam.h>
/* For use with destroy_dev(9). */
static struct cdev *null_dev;
@ -65,8 +67,6 @@ static struct cdevsw zero_cdevsw = {
.d_flags = D_MMAP_ANON,
};
static void *zbuf;
/* ARGSUSED */
static int
null_write(struct cdev *dev __unused, struct uio *uio, int flags __unused)
@ -95,10 +95,19 @@ null_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t data __unused,
static int
zero_read(struct cdev *dev __unused, struct uio *uio, int flags __unused)
{
void *zbuf;
ssize_t len;
int error = 0;
while (uio->uio_resid > 0 && error == 0)
error = uiomove(zbuf, MIN(uio->uio_resid, PAGE_SIZE), uio);
KASSERT(uio->uio_rw == UIO_READ,
("Can't be in %s for write", __func__));
zbuf = __DECONST(void *, zero_region);
while (uio->uio_resid > 0 && error == 0) {
len = uio->uio_resid;
if (len > ZERO_REGION_SIZE)
len = ZERO_REGION_SIZE;
error = uiomove(zbuf, len, uio);
}
return (error);
}
@ -111,7 +120,6 @@ null_modevent(module_t mod __unused, int type, void *data __unused)
case MOD_LOAD:
if (bootverbose)
printf("null: <null device, zero device>\n");
zbuf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK | M_ZERO);
null_dev = make_dev_credf(MAKEDEV_ETERNAL_KLD, &null_cdevsw, 0,
NULL, UID_ROOT, GID_WHEEL, 0666, "null");
zero_dev = make_dev_credf(MAKEDEV_ETERNAL_KLD, &zero_cdevsw, 0,
@ -121,7 +129,6 @@ null_modevent(module_t mod __unused, int type, void *data __unused)
case MOD_UNLOAD:
destroy_dev(null_dev);
destroy_dev(zero_dev);
free(zbuf, M_TEMP);
break;
case MOD_SHUTDOWN:

View File

@ -198,4 +198,6 @@
#define VM_INITIAL_PAGEIN 16
#endif
#define ZERO_REGION_SIZE (64 * 1024) /* 64KB */
#endif /* _MACHINE_VMPARAM_H_ */

View File

@ -215,4 +215,6 @@
#define VM_INITIAL_PAGEIN 16
#endif
#define ZERO_REGION_SIZE (2 * 1024 * 1024) /* 2MB */
#endif /* !_MACHINE_VMPARAM_H_ */

View File

@ -187,4 +187,6 @@
*/
#define VM_NFREEORDER 9
#define ZERO_REGION_SIZE (64 * 1024) /* 64KB */
#endif /* !_MACHINE_VMPARAM_H_ */

View File

@ -198,4 +198,6 @@ struct pmap_physseg {
#endif
#endif
#define ZERO_REGION_SIZE (64 * 1024) /* 64KB */
#endif /* _MACHINE_VMPARAM_H_ */

View File

@ -240,4 +240,11 @@
extern vm_offset_t vm_max_kernel_address;
/*
* Older sparc64 machines have a virtually indexed L1 data cache of 16KB.
* Consequently, mapping the same physical page multiple times may have
* caching disabled.
*/
#define ZERO_REGION_SIZE PAGE_SIZE
#endif /* !_MACHINE_VMPARAM_H_ */

View File

@ -223,4 +223,6 @@
#define UMA_MD_SMALL_ALLOC
extern vm_offset_t vm_max_kernel_address;
#define ZERO_REGION_SIZE (64 * 1024) /* 64KB */
#endif /* !_MACHINE_VMPARAM_H_ */

View File

@ -99,6 +99,7 @@
* _REMOVE_AFTER + - + -
* _REMOVE_HEAD + - + -
* _REMOVE + + + +
* _SWAP + + + +
*
*/
#ifdef QUEUE_MACRO_DEBUG
@ -307,18 +308,18 @@ struct { \
TRASHIT(*oldnext); \
} while (0)
#define STAILQ_REMOVE_HEAD(head, field) do { \
if ((STAILQ_FIRST((head)) = \
STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
(head)->stqh_last = &STAILQ_FIRST((head)); \
} while (0)
#define STAILQ_REMOVE_AFTER(head, elm, field) do { \
if ((STAILQ_NEXT(elm, field) = \
STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
} while (0)
#define STAILQ_REMOVE_HEAD(head, field) do { \
if ((STAILQ_FIRST((head)) = \
STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
(head)->stqh_last = &STAILQ_FIRST((head)); \
} while (0)
#define STAILQ_SWAP(head1, head2, type) do { \
struct type *swap_first = STAILQ_FIRST(head1); \
struct type **swap_last = (head1)->stqh_last; \

View File

@ -125,6 +125,8 @@ extern char static_hints[]; /* by config for now */
extern char **kenvp;
extern const void *zero_region; /* address space maps to a zeroed page */
/*
* General function declarations.
*/

View File

@ -91,6 +91,9 @@ vm_map_t exec_map=0;
vm_map_t pipe_map;
vm_map_t buffer_map=0;
const void *zero_region;
CTASSERT((ZERO_REGION_SIZE & PAGE_MASK) == 0);
/*
* kmem_alloc_nofault:
*
@ -527,6 +530,32 @@ kmem_free_wakeup(map, addr, size)
vm_map_unlock(map);
}
static void
kmem_init_zero_region(void)
{
vm_offset_t addr, i;
vm_page_t m;
int error;
/*
* Map a single physical page of zeros to a larger virtual range.
* This requires less looping in places that want large amounts of
* zeros, while not using much more physical resources.
*/
addr = kmem_alloc_nofault(kernel_map, ZERO_REGION_SIZE);
m = vm_page_alloc(NULL, OFF_TO_IDX(addr - VM_MIN_KERNEL_ADDRESS),
VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO);
if ((m->flags & PG_ZERO) == 0)
pmap_zero_page(m);
for (i = 0; i < ZERO_REGION_SIZE; i += PAGE_SIZE)
pmap_qenter(addr + i, &m, 1);
error = vm_map_protect(kernel_map, addr, addr + ZERO_REGION_SIZE,
VM_PROT_READ, TRUE);
KASSERT(error == 0, ("error=%d", error));
zero_region = (const void *)addr;
}
/*
* kmem_init:
*
@ -555,6 +584,8 @@ kmem_init(start, end)
start, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT);
/* ... and ending with the completion of the above `insert' */
vm_map_unlock(m);
kmem_init_zero_region();
}
#ifdef DIAGNOSTIC

View File

@ -418,7 +418,7 @@ populate_slice ( ) (
echo "Creating ${dev} with ${dir} (mounting on ${mnt})"
newfs_part $dev $mnt $lbl
cd ${dir}
find . -print | grep -Ev '/(CVS|\.svn)' | cpio -dumpv ${mnt}
find . -print | grep -Ev '/(CVS|\.svn)' | cpio -Ldumpv ${mnt}
df -i ${mnt}
umount ${mnt}
)
@ -567,8 +567,10 @@ create_i386_diskimage ( ) (
dd if=/dev/${MD} of=${IMG} bs=64k
fi
echo "Writing out _.disk.image..."
dd if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k
if ${do_copyout_partition} ; then
echo "Writing out _.disk.image..."
dd if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k
fi
mdconfig -d -u $MD
trap - 1 2 15 EXIT
@ -674,7 +676,7 @@ cust_allow_ssh_root () (
cust_install_files () (
cd ${NANO_TOOLS}/Files
find . -print | grep -Ev '/(CVS|\.svn)' | cpio -dumpv ${NANO_WORLDDIR}
find . -print | grep -Ev '/(CVS|\.svn)' | cpio -Ldumpv ${NANO_WORLDDIR}
)
#######################################################################
@ -682,12 +684,18 @@ cust_install_files () (
cust_pkg () (
# If the package directory doesn't exist, we're done.
if [ ! -d ${NANO_PACKAGE_DIR} ]; then
echo "DONE 0 packages"
return 0
fi
# Copy packages into chroot
mkdir -p ${NANO_WORLDDIR}/Pkg
(
cd ${NANO_PACKAGE_DIR}
find ${NANO_PACKAGE_LIST} -print |
cpio -dumpv ${NANO_WORLDDIR}/Pkg
cpio -Ldumpv ${NANO_WORLDDIR}/Pkg
)
# Count & report how many we have to install
@ -758,8 +766,9 @@ pprint() {
usage () {
(
echo "Usage: $0 [-biknqvw] [-c config_file]"
echo "Usage: $0 [-bfiknqvw] [-c config_file]"
echo " -b suppress builds (both kernel and world)"
echo " -f suppress code slice extraction"
echo " -i suppress disk image build"
echo " -k suppress buildkernel"
echo " -n add -DNO_CLEAN to buildworld, buildkernel, etc"
@ -778,9 +787,10 @@ do_clean=true
do_kernel=true
do_world=true
do_image=true
do_copyout_partition=true
set +e
args=`getopt bc:hiknqvw $*`
args=`getopt bc:fhiknqvw $*`
if [ $? -ne 0 ] ; then
usage
exit 2
@ -806,6 +816,10 @@ do
shift
shift
;;
-f)
do_copyout_partition=false
shift
;;
-h)
usage
;;