Merge ^/head r363989 through r364034.
This commit is contained in:
commit
e53daa1d64
@ -2179,9 +2179,6 @@ _yacc= usr.bin/yacc
|
|||||||
_gensnmptree= usr.sbin/bsnmpd/gensnmptree
|
_gensnmptree= usr.sbin/bsnmpd/gensnmptree
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
.if ${MK_LOCALES} != "no"
|
|
||||||
_localedef= usr.bin/localedef
|
|
||||||
.endif
|
|
||||||
|
|
||||||
# We need to build tblgen when we're building clang or lld, either as
|
# We need to build tblgen when we're building clang or lld, either as
|
||||||
# bootstrap tools, or as the part of the normal build.
|
# bootstrap tools, or as the part of the normal build.
|
||||||
@ -2296,13 +2293,12 @@ ${_bt}-links: .PHONY
|
|||||||
|
|
||||||
.for _tool in ${_bootstrap_tools_links}
|
.for _tool in ${_bootstrap_tools_links}
|
||||||
${_bt}-link-${_tool}: .PHONY .MAKE
|
${_bt}-link-${_tool}: .PHONY .MAKE
|
||||||
@if [ ! -e "${WORLDTMP}/legacy/bin/${_tool}" ]; then \
|
@rm -f "${WORLDTMP}/legacy/bin/${_tool}"; \
|
||||||
source_path=`which ${_tool}`; \
|
source_path=`which ${_tool}`; \
|
||||||
if [ ! -e "$${source_path}" ] ; then \
|
if [ ! -e "$${source_path}" ] ; then \
|
||||||
echo "Cannot find host tool '${_tool}'"; false; \
|
echo "Cannot find host tool '${_tool}'"; false; \
|
||||||
fi; \
|
fi; \
|
||||||
ln -sfnv "$${source_path}" "${WORLDTMP}/legacy/bin/${_tool}"; \
|
cp -f "$${source_path}" "${WORLDTMP}/legacy/bin/${_tool}"
|
||||||
fi
|
|
||||||
${_bt}-links: ${_bt}-link-${_tool}
|
${_bt}-links: ${_bt}-link-${_tool}
|
||||||
.endfor
|
.endfor
|
||||||
|
|
||||||
|
6
UPDATING
6
UPDATING
@ -32,6 +32,12 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 13.x IS SLOW:
|
|||||||
information about prerequisites and upgrading, if you are not already
|
information about prerequisites and upgrading, if you are not already
|
||||||
using clang 3.5.0 or higher.
|
using clang 3.5.0 or higher.
|
||||||
|
|
||||||
|
20200807:
|
||||||
|
Makefile.inc has been updated to work around the issue documented in
|
||||||
|
20200729. It was a case where the optimization of using symbolic links
|
||||||
|
to point to binaries created a situation where we'd run new binaries
|
||||||
|
with old libraries starting midway through the installworld process.
|
||||||
|
|
||||||
20200729:
|
20200729:
|
||||||
r363679 has redefined some undefined behavior in regcomp(3); notably,
|
r363679 has redefined some undefined behavior in regcomp(3); notably,
|
||||||
extraneous escapes of most ordinary characters will no longer be
|
extraneous escapes of most ordinary characters will no longer be
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#pragma ident "%Z%%M% %I% %E% SMI"
|
#pragma ident "%Z%%M% %I% %E% SMI"
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/endian.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/zmod.h>
|
#include <sys/zmod.h>
|
||||||
|
@ -665,6 +665,7 @@ wq_init(workqueue_t *wq, int nfiles)
|
|||||||
|
|
||||||
for (i = 0; i < nslots; i++) {
|
for (i = 0; i < nslots; i++) {
|
||||||
pthread_mutex_init(&wq->wq_wip[i].wip_lock, NULL);
|
pthread_mutex_init(&wq->wq_wip[i].wip_lock, NULL);
|
||||||
|
pthread_cond_init(&wq->wq_wip[i].wip_cv, NULL);
|
||||||
wq->wq_wip[i].wip_batchid = wq->wq_next_batchid++;
|
wq->wq_wip[i].wip_batchid = wq->wq_next_batchid++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
#include <sys/ccompile.h>
|
#include <sys/ccompile.h>
|
||||||
|
#include <sys/endian.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -65,6 +66,15 @@ extern "C" {
|
|||||||
#define MIN(a, b) ((a) > (b) ? (b) : (a))
|
#define MIN(a, b) ((a) > (b) ? (b) : (a))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Sanity check for cross-build bootstrap tools */
|
||||||
|
#if !defined(BYTE_ORDER)
|
||||||
|
#error "Missing BYTE_ORDER defines"
|
||||||
|
#elif !defined(_LITTLE_ENDIAN)
|
||||||
|
#error "Missing _LITTLE_ENDIAN defines"
|
||||||
|
#elif !defined(_BIG_ENDIAN)
|
||||||
|
#error "Missing _BIG_ENDIAN defines"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
.\" @(#)telnet.1 8.6 (Berkeley) 6/1/94
|
.\" @(#)telnet.1 8.6 (Berkeley) 6/1/94
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd September 18, 2006
|
.Dd August 7, 2020
|
||||||
.Dt TELNET 1
|
.Dt TELNET 1
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -47,6 +47,7 @@ protocol
|
|||||||
.Op Fl l Ar user
|
.Op Fl l Ar user
|
||||||
.Op Fl n Ar tracefile
|
.Op Fl n Ar tracefile
|
||||||
.Op Fl s Ar src_addr
|
.Op Fl s Ar src_addr
|
||||||
|
.Op Fl P Ar policy
|
||||||
.Oo
|
.Oo
|
||||||
.Ar host
|
.Ar host
|
||||||
.Op Ar port
|
.Op Ar port
|
||||||
@ -189,6 +190,13 @@ for recording trace information.
|
|||||||
See the
|
See the
|
||||||
.Ic set tracefile
|
.Ic set tracefile
|
||||||
command below.
|
command below.
|
||||||
|
.It Fl P Ar policy
|
||||||
|
Use IPsec policy specification string
|
||||||
|
.Ar policy ,
|
||||||
|
for the connections.
|
||||||
|
See
|
||||||
|
.Xr ipsec_set_policy 3
|
||||||
|
for details.
|
||||||
.It Fl r
|
.It Fl r
|
||||||
Specifies a user interface similar to
|
Specifies a user interface similar to
|
||||||
.Xr rlogin 1 .
|
.Xr rlogin 1 .
|
||||||
|
@ -73,10 +73,10 @@ struct regdomain {
|
|||||||
netband_head bands_11b; /* 11b operation */
|
netband_head bands_11b; /* 11b operation */
|
||||||
netband_head bands_11g; /* 11g operation */
|
netband_head bands_11g; /* 11g operation */
|
||||||
netband_head bands_11a; /* 11a operation */
|
netband_head bands_11a; /* 11a operation */
|
||||||
netband_head bands_11ng;/* 11ng operation */
|
netband_head bands_11ng; /* 11ng operation */
|
||||||
netband_head bands_11na;/* 11na operation */
|
netband_head bands_11na; /* 11na operation */
|
||||||
netband_head bands_11ac;/* 11ac 5GHz operation */
|
netband_head bands_11ac; /* 11ac 5GHz operation */
|
||||||
netband_head bands_11acg;/* 11ac 2GHz operation */
|
netband_head bands_11acg; /* 11ac 2GHz operation */
|
||||||
|
|
||||||
LIST_ENTRY(regdomain) next;
|
LIST_ENTRY(regdomain) next;
|
||||||
};
|
};
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
.\" SUCH DAMAGE.
|
.\" SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.Dd July 21, 2004
|
.Dd August 7, 2020
|
||||||
.Dt MBSRTOWCS 3
|
.Dt MBSRTOWCS 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -98,15 +98,29 @@ except that conversion stops after reading at most
|
|||||||
bytes from the buffer pointed to by
|
bytes from the buffer pointed to by
|
||||||
.Fa src .
|
.Fa src .
|
||||||
.Sh RETURN VALUES
|
.Sh RETURN VALUES
|
||||||
The
|
If successful, and
|
||||||
|
.Fa dst
|
||||||
|
is not NULL, the
|
||||||
.Fn mbsrtowcs
|
.Fn mbsrtowcs
|
||||||
and
|
and
|
||||||
.Fn mbsnrtowcs
|
.Fn mbsnrtowcs
|
||||||
functions return the number of wide characters stored in
|
functions return the number of wide characters stored in
|
||||||
the array pointed to by
|
the array pointed to by
|
||||||
|
.Fa dst .
|
||||||
|
.Pp
|
||||||
|
If
|
||||||
.Fa dst
|
.Fa dst
|
||||||
if successful, otherwise it returns
|
was NULL then the functions
|
||||||
.Po Vt size_t Pc Ns \-1 .
|
.Fn mbsrtowcs
|
||||||
|
and
|
||||||
|
.Fn mbsnrtowcs
|
||||||
|
return the number of wide characters that would have been stored where
|
||||||
|
.Fa dst
|
||||||
|
points to an infinitely large array.
|
||||||
|
.Pp
|
||||||
|
If either one of the functions is not successful then
|
||||||
|
.Po Vt size_t Pc Ns \-1
|
||||||
|
is returned.
|
||||||
.Sh ERRORS
|
.Sh ERRORS
|
||||||
The
|
The
|
||||||
.Fn mbsrtowcs
|
.Fn mbsrtowcs
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
.\" @(#)setlocale.3 8.1 (Berkeley) 6/9/93
|
.\" @(#)setlocale.3 8.1 (Berkeley) 6/9/93
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd September 9, 2019
|
.Dd August 7, 2020
|
||||||
.Dt SETLOCALE 3
|
.Dt SETLOCALE 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -98,6 +98,10 @@ as well as values returned by
|
|||||||
Set a locale for formatting dates and times using the
|
Set a locale for formatting dates and times using the
|
||||||
.Fn strftime
|
.Fn strftime
|
||||||
function.
|
function.
|
||||||
|
.It Dv LANG
|
||||||
|
Sets the generic locale category for native language, local customs
|
||||||
|
and coded character set in the absence of more specific locale
|
||||||
|
variables.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
Only three locales are defined by default,
|
Only three locales are defined by default,
|
||||||
@ -153,6 +157,25 @@ if the given combination of
|
|||||||
and
|
and
|
||||||
.Fa locale
|
.Fa locale
|
||||||
makes no sense.
|
makes no sense.
|
||||||
|
.Sh EXAMPLES
|
||||||
|
The following code illustrates how a program can initialize the
|
||||||
|
international environment for one language, while selectively
|
||||||
|
modifying the program's locale such that regular expressions and
|
||||||
|
string operations can be applied to text recorded in a different
|
||||||
|
language:
|
||||||
|
.Bd -literal
|
||||||
|
setlocale(LC_ALL, "de");
|
||||||
|
setlocale(LC_COLLATE, "fr");
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
When a process is started, its current locale is set to the C or POSIX
|
||||||
|
locale.
|
||||||
|
An internationalized program that depends on locale data not defined in
|
||||||
|
the C or POSIX locale must invoke the setlocale subroutine in the
|
||||||
|
following manner before using any of the locale-specific information:
|
||||||
|
.Bd -literal
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
.Ed
|
||||||
.Sh FILES
|
.Sh FILES
|
||||||
.Bl -tag -width /usr/share/locale/locale/category -compact
|
.Bl -tag -width /usr/share/locale/locale/category -compact
|
||||||
.It Pa $PATH_LOCALE/ Ns Em locale/category
|
.It Pa $PATH_LOCALE/ Ns Em locale/category
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
.\" @(#)tmpnam.3 8.2 (Berkeley) 11/17/93
|
.\" @(#)tmpnam.3 8.2 (Berkeley) 11/17/93
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd March 18, 2007
|
.Dd August 7, 2020
|
||||||
.Dt TMPFILE 3
|
.Dt TMPFILE 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -156,6 +156,8 @@ on error.
|
|||||||
.Bl -tag -width Ds
|
.Bl -tag -width Ds
|
||||||
.It Ev TMPDIR
|
.It Ev TMPDIR
|
||||||
.Pf [ Fn tempnam
|
.Pf [ Fn tempnam
|
||||||
|
and
|
||||||
|
.Fn tmpfile
|
||||||
only]
|
only]
|
||||||
If set,
|
If set,
|
||||||
the directory in which the temporary file is stored.
|
the directory in which the temporary file is stored.
|
||||||
|
@ -97,6 +97,8 @@ main() {
|
|||||||
|
|
||||||
outname="${outname%%_*}"
|
outname="${outname%%_*}"
|
||||||
|
|
||||||
|
pkgdeps="$(echo ${pkgdeps} | tr '_' '-')"
|
||||||
|
|
||||||
desc="$(make -C ${srctree}/release/packages -f Makefile.package -V ${outname}_DESC)"
|
desc="$(make -C ${srctree}/release/packages -f Makefile.package -V ${outname}_DESC)"
|
||||||
comment="$(make -C ${srctree}/release/packages -f Makefile.package -V ${outname}_COMMENT)"
|
comment="$(make -C ${srctree}/release/packages -f Makefile.package -V ${outname}_COMMENT)"
|
||||||
|
|
||||||
|
@ -4779,6 +4779,23 @@ getid(int s, int ix, void *data, size_t len, int *plen, int mesh)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
getdevicename(int s, void *data, size_t len, int *plen)
|
||||||
|
{
|
||||||
|
struct ieee80211req ireq;
|
||||||
|
|
||||||
|
(void) memset(&ireq, 0, sizeof(ireq));
|
||||||
|
(void) strlcpy(ireq.i_name, name, sizeof(ireq.i_name));
|
||||||
|
ireq.i_type = IEEE80211_IOC_IC_NAME;
|
||||||
|
ireq.i_val = -1;
|
||||||
|
ireq.i_data = data;
|
||||||
|
ireq.i_len = len;
|
||||||
|
if (ioctl(s, SIOCG80211, &ireq) < 0)
|
||||||
|
return (-1);
|
||||||
|
*plen = ireq.i_len;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ieee80211_status(int s)
|
ieee80211_status(int s)
|
||||||
{
|
{
|
||||||
@ -5503,6 +5520,12 @@ ieee80211_status(int s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LINE_BREAK();
|
LINE_BREAK();
|
||||||
|
|
||||||
|
if (getdevicename(s, data, sizeof(data), &len) < 0)
|
||||||
|
return;
|
||||||
|
LINE_CHECK("parent interface: %s", data);
|
||||||
|
|
||||||
|
LINE_BREAK();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# $FreeBSD$
|
# $FreeBSD$
|
||||||
|
|
||||||
PACKAGE=iscsi_legacy
|
PACKAGE=iscsilegacy
|
||||||
SRCS= iscontrol.c pdu.c fsm.c config.c login.c auth_subr.c misc.c
|
SRCS= iscontrol.c pdu.c fsm.c config.c login.c auth_subr.c misc.c
|
||||||
PROG= iscontrol
|
PROG= iscontrol
|
||||||
LIBADD= cam md
|
LIBADD= cam md
|
||||||
|
@ -697,9 +697,9 @@ prmount(struct statfs *sfp)
|
|||||||
(uintmax_t)sfp->f_syncreads,
|
(uintmax_t)sfp->f_syncreads,
|
||||||
(uintmax_t)sfp->f_asyncreads);
|
(uintmax_t)sfp->f_asyncreads);
|
||||||
if (sfp->f_fsid.val[0] != 0 || sfp->f_fsid.val[1] != 0) {
|
if (sfp->f_fsid.val[0] != 0 || sfp->f_fsid.val[1] != 0) {
|
||||||
printf(", fsid ");
|
(void)printf(", fsid ");
|
||||||
for (i = 0; i < sizeof(sfp->f_fsid); i++)
|
for (i = 0; i < sizeof(sfp->f_fsid); i++)
|
||||||
printf("%02x", ((u_char *)&sfp->f_fsid)[i]);
|
(void)printf("%02x", ((u_char *)&sfp->f_fsid)[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(void)printf(")\n");
|
(void)printf(")\n");
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd July 10, 2009
|
.Dd August 7, 2020
|
||||||
.Dt NET80211 4
|
.Dt NET80211 4
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -393,6 +393,16 @@ Valid values are:
|
|||||||
and
|
and
|
||||||
.Dv IEEE80211_HWMP_ROOTMODE_RANN
|
.Dv IEEE80211_HWMP_ROOTMODE_RANN
|
||||||
(send broadcast Root Announcement (RANN) frames).
|
(send broadcast Root Announcement (RANN) frames).
|
||||||
|
.It Dv IEEE80211_IOC_IC_NAME
|
||||||
|
Return the underlying hardware
|
||||||
|
.Xr device 9
|
||||||
|
name in the buffer pointed to by
|
||||||
|
.Va i_data
|
||||||
|
and the name length including terminating NUL character in
|
||||||
|
.Va i_len .
|
||||||
|
If the buffer length is too small to hold the full name
|
||||||
|
.Er EINVAL
|
||||||
|
will be returned.
|
||||||
.It Dv IEEE80211_IOC_INACTIVITY
|
.It Dv IEEE80211_IOC_INACTIVITY
|
||||||
Return whether or not the system handles inactivity processing in
|
Return whether or not the system handles inactivity processing in
|
||||||
.Va i_val .
|
.Va i_val .
|
||||||
|
@ -98,6 +98,7 @@ obj->var2 = 2;
|
|||||||
seqc_write_end(&obj->seqc);
|
seqc_write_end(&obj->seqc);
|
||||||
unlock_exclusive(&obj->lock);
|
unlock_exclusive(&obj->lock);
|
||||||
.Ed
|
.Ed
|
||||||
|
.Pp
|
||||||
The following example for a reader reads the
|
The following example for a reader reads the
|
||||||
.Va var1
|
.Va var1
|
||||||
and
|
and
|
||||||
|
@ -237,6 +237,6 @@ ${_ILINKS}: .NOMETA
|
|||||||
esac ; \
|
esac ; \
|
||||||
path=`(cd $$path && /bin/pwd)` ; \
|
path=`(cd $$path && /bin/pwd)` ; \
|
||||||
${ECHO} ${.TARGET} "->" $$path ; \
|
${ECHO} ${.TARGET} "->" $$path ; \
|
||||||
ln -fhs $$path ${.TARGET}
|
ln -fns $$path ${.TARGET}
|
||||||
.endif # !NO_OBJ
|
.endif # !NO_OBJ
|
||||||
.endif # __BOOT_DEFS_MK__
|
.endif # __BOOT_DEFS_MK__
|
||||||
|
@ -48,9 +48,7 @@ void assfail3(const char *, uintmax_t, const char *, uintmax_t, const char *,
|
|||||||
#ifndef HAVE_ASSFAIL
|
#ifndef HAVE_ASSFAIL
|
||||||
extern int aok;
|
extern int aok;
|
||||||
|
|
||||||
__inline int __assfail(const char *expr, const char *file, int line);
|
static __inline int
|
||||||
|
|
||||||
__inline int
|
|
||||||
__assfail(const char *expr, const char *file, int line)
|
__assfail(const char *expr, const char *file, int line)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -32,11 +32,19 @@
|
|||||||
|
|
||||||
#include_next <sys/stat.h>
|
#include_next <sys/stat.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When bootstrapping on Linux a stat64/fstat64 functions exists in both
|
||||||
|
* glibc and musl libc. To avoid compilation errors, use those functions instead
|
||||||
|
* of redefining them to stat/fstat.
|
||||||
|
* Similarly, macOS provides (deprecated) stat64 functions that we can use
|
||||||
|
* for now.
|
||||||
|
*/
|
||||||
|
#if !defined(__linux__) && !defined(__APPLE__)
|
||||||
#define stat64 stat
|
#define stat64 stat
|
||||||
|
|
||||||
#define MAXOFFSET_T OFF_MAX
|
#define MAXOFFSET_T OFF_MAX
|
||||||
|
|
||||||
#ifndef _KERNEL
|
#if !defined(_KERNEL)
|
||||||
#include <sys/disk.h>
|
#include <sys/disk.h>
|
||||||
|
|
||||||
static __inline int
|
static __inline int
|
||||||
@ -51,6 +59,7 @@ fstat64(int fd, struct stat *sb)
|
|||||||
}
|
}
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* !defined(_KERNEL) */
|
||||||
|
#endif /* !defined(__linux__) && !defined(__APPLE__) */
|
||||||
|
|
||||||
#endif /* !_COMPAT_OPENSOLARIS_SYS_STAT_H_ */
|
#endif /* !_COMPAT_OPENSOLARIS_SYS_STAT_H_ */
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#ifndef _OPENSOLARIS_SYS_TIME_H_
|
#ifndef _OPENSOLARIS_SYS_TIME_H_
|
||||||
#define _OPENSOLARIS_SYS_TIME_H_
|
#define _OPENSOLARIS_SYS_TIME_H_
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
#include_next <sys/time.h>
|
#include_next <sys/time.h>
|
||||||
|
|
||||||
#define SEC 1
|
#define SEC 1
|
||||||
|
@ -175,13 +175,6 @@ static int __dbuf_hold_impl(struct dbuf_hold_impl_data *dh);
|
|||||||
static boolean_t dbuf_undirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
|
static boolean_t dbuf_undirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
|
||||||
static void dbuf_write(dbuf_dirty_record_t *dr, arc_buf_t *data, dmu_tx_t *tx);
|
static void dbuf_write(dbuf_dirty_record_t *dr, arc_buf_t *data, dmu_tx_t *tx);
|
||||||
|
|
||||||
#ifndef __lint
|
|
||||||
extern inline void dmu_buf_init_user(dmu_buf_user_t *dbu,
|
|
||||||
dmu_buf_evict_func_t *evict_func_sync,
|
|
||||||
dmu_buf_evict_func_t *evict_func_async,
|
|
||||||
dmu_buf_t **clear_on_evict_dbufp);
|
|
||||||
#endif /* ! __lint */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global data structures and functions for the dbuf cache.
|
* Global data structures and functions for the dbuf cache.
|
||||||
*/
|
*/
|
||||||
|
@ -610,7 +610,7 @@ typedef struct dmu_buf_user {
|
|||||||
* To allow enforcement of this, dbu must already be zeroed on entry.
|
* To allow enforcement of this, dbu must already be zeroed on entry.
|
||||||
*/
|
*/
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
inline void
|
static inline void
|
||||||
dmu_buf_init_user(dmu_buf_user_t *dbu, dmu_buf_evict_func_t *evict_func_sync,
|
dmu_buf_init_user(dmu_buf_user_t *dbu, dmu_buf_evict_func_t *evict_func_sync,
|
||||||
dmu_buf_evict_func_t *evict_func_async, dmu_buf_t **clear_on_evict_dbufp)
|
dmu_buf_evict_func_t *evict_func_async, dmu_buf_t **clear_on_evict_dbufp)
|
||||||
{
|
{
|
||||||
|
@ -46,8 +46,12 @@ extern "C" {
|
|||||||
/*
|
/*
|
||||||
* Disk blocks (sectors) and bytes.
|
* Disk blocks (sectors) and bytes.
|
||||||
*/
|
*/
|
||||||
|
#ifndef dtob
|
||||||
#define dtob(DD) ((DD) << DEV_BSHIFT)
|
#define dtob(DD) ((DD) << DEV_BSHIFT)
|
||||||
|
#endif
|
||||||
|
#ifndef btod
|
||||||
#define btod(BB) (((BB) + DEV_BSIZE - 1) >> DEV_BSHIFT)
|
#define btod(BB) (((BB) + DEV_BSIZE - 1) >> DEV_BSHIFT)
|
||||||
|
#endif
|
||||||
#define btodt(BB) ((BB) >> DEV_BSHIFT)
|
#define btodt(BB) ((BB) >> DEV_BSHIFT)
|
||||||
#define lbtod(BB) (((offset_t)(BB) + DEV_BSIZE - 1) >> DEV_BSHIFT)
|
#define lbtod(BB) (((offset_t)(BB) + DEV_BSIZE - 1) >> DEV_BSHIFT)
|
||||||
|
|
||||||
@ -220,9 +224,12 @@ extern unsigned char bcd_to_byte[256];
|
|||||||
/*
|
/*
|
||||||
* Macros for counting and rounding.
|
* Macros for counting and rounding.
|
||||||
*/
|
*/
|
||||||
|
#ifndef howmany
|
||||||
#define howmany(x, y) (((x)+((y)-1))/(y))
|
#define howmany(x, y) (((x)+((y)-1))/(y))
|
||||||
|
#endif
|
||||||
|
#ifndef roundup
|
||||||
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
|
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* Macro to determine if value is a power of 2
|
* Macro to determine if value is a power of 2
|
||||||
*/
|
*/
|
||||||
|
@ -78,6 +78,7 @@ radix_tree_exception(void *arg)
|
|||||||
void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
|
void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
|
||||||
void *radix_tree_delete(struct radix_tree_root *, unsigned long);
|
void *radix_tree_delete(struct radix_tree_root *, unsigned long);
|
||||||
int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
|
int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
|
||||||
|
int radix_tree_store(struct radix_tree_root *, unsigned long, void **);
|
||||||
bool radix_tree_iter_find(struct radix_tree_root *, struct radix_tree_iter *, void ***);
|
bool radix_tree_iter_find(struct radix_tree_root *, struct radix_tree_iter *, void ***);
|
||||||
void radix_tree_iter_delete(struct radix_tree_root *, struct radix_tree_iter *, void **);
|
void radix_tree_iter_delete(struct radix_tree_root *, struct radix_tree_iter *, void **);
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* Copyright (c) 2010 Isilon Systems, Inc.
|
* Copyright (c) 2010 Isilon Systems, Inc.
|
||||||
* Copyright (c) 2010 iX Systems, Inc.
|
* Copyright (c) 2010 iX Systems, Inc.
|
||||||
* Copyright (c) 2010 Panasas, Inc.
|
* Copyright (c) 2010 Panasas, Inc.
|
||||||
* Copyright (c) 2013-2018 Mellanox Technologies, Ltd.
|
* Copyright (c) 2013-2020 Mellanox Technologies, Ltd.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -55,6 +55,17 @@ radix_pos(long id, int height)
|
|||||||
return (id >> (RADIX_TREE_MAP_SHIFT * height)) & RADIX_TREE_MAP_MASK;
|
return (id >> (RADIX_TREE_MAP_SHIFT * height)) & RADIX_TREE_MAP_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
radix_tree_clean_root_node(struct radix_tree_root *root)
|
||||||
|
{
|
||||||
|
/* Check if the root node should be freed */
|
||||||
|
if (root->rnode->count == 0) {
|
||||||
|
free(root->rnode, M_RADIX);
|
||||||
|
root->rnode = NULL;
|
||||||
|
root->height = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
|
radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
|
||||||
{
|
{
|
||||||
@ -197,8 +208,10 @@ radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
|
|||||||
while (radix_max(root) < index) {
|
while (radix_max(root) < index) {
|
||||||
|
|
||||||
/* check if the radix tree is getting too big */
|
/* check if the radix tree is getting too big */
|
||||||
if (root->height == RADIX_TREE_MAX_HEIGHT)
|
if (root->height == RADIX_TREE_MAX_HEIGHT) {
|
||||||
|
radix_tree_clean_root_node(root);
|
||||||
return (-E2BIG);
|
return (-E2BIG);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the root radix level is not empty, we need to
|
* If the root radix level is not empty, we need to
|
||||||
@ -206,8 +219,16 @@ radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
|
|||||||
*/
|
*/
|
||||||
if (node->count != 0) {
|
if (node->count != 0) {
|
||||||
node = malloc(sizeof(*node), M_RADIX, root->gfp_mask | M_ZERO);
|
node = malloc(sizeof(*node), M_RADIX, root->gfp_mask | M_ZERO);
|
||||||
if (node == NULL)
|
if (node == NULL) {
|
||||||
|
/*
|
||||||
|
* Freeing the already allocated radix
|
||||||
|
* levels, if any, will be handled by
|
||||||
|
* the radix_tree_delete() function.
|
||||||
|
* This code path can only happen when
|
||||||
|
* the tree is not empty.
|
||||||
|
*/
|
||||||
return (-ENOMEM);
|
return (-ENOMEM);
|
||||||
|
}
|
||||||
node->slots[0] = root->rnode;
|
node->slots[0] = root->rnode;
|
||||||
node->count++;
|
node->count++;
|
||||||
root->rnode = node;
|
root->rnode = node;
|
||||||
@ -231,14 +252,9 @@ radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
|
|||||||
temp[idx] = malloc(sizeof(*node), M_RADIX,
|
temp[idx] = malloc(sizeof(*node), M_RADIX,
|
||||||
root->gfp_mask | M_ZERO);
|
root->gfp_mask | M_ZERO);
|
||||||
if (temp[idx] == NULL) {
|
if (temp[idx] == NULL) {
|
||||||
while(idx--)
|
while (idx--)
|
||||||
free(temp[idx], M_RADIX);
|
free(temp[idx], M_RADIX);
|
||||||
/* Check if we should free the root node as well. */
|
radix_tree_clean_root_node(root);
|
||||||
if (root->rnode->count == 0) {
|
|
||||||
free(root->rnode, M_RADIX);
|
|
||||||
root->rnode = NULL;
|
|
||||||
root->height = 0;
|
|
||||||
}
|
|
||||||
return (-ENOMEM);
|
return (-ENOMEM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -262,3 +278,110 @@ radix_tree_insert(struct radix_tree_root *root, unsigned long index, void *item)
|
|||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
radix_tree_store(struct radix_tree_root *root, unsigned long index, void **ppitem)
|
||||||
|
{
|
||||||
|
struct radix_tree_node *node;
|
||||||
|
struct radix_tree_node *temp[RADIX_TREE_MAX_HEIGHT - 1];
|
||||||
|
void *pitem;
|
||||||
|
int height;
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Inserting a NULL item means delete it. The old pointer is
|
||||||
|
* stored at the location pointed to by "ppitem".
|
||||||
|
*/
|
||||||
|
if (*ppitem == NULL) {
|
||||||
|
*ppitem = radix_tree_delete(root, index);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get root node, if any */
|
||||||
|
node = root->rnode;
|
||||||
|
|
||||||
|
/* allocate root node, if any */
|
||||||
|
if (node == NULL) {
|
||||||
|
node = malloc(sizeof(*node), M_RADIX, root->gfp_mask | M_ZERO);
|
||||||
|
if (node == NULL)
|
||||||
|
return (-ENOMEM);
|
||||||
|
root->rnode = node;
|
||||||
|
root->height++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* expand radix tree as needed */
|
||||||
|
while (radix_max(root) < index) {
|
||||||
|
|
||||||
|
/* check if the radix tree is getting too big */
|
||||||
|
if (root->height == RADIX_TREE_MAX_HEIGHT) {
|
||||||
|
radix_tree_clean_root_node(root);
|
||||||
|
return (-E2BIG);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the root radix level is not empty, we need to
|
||||||
|
* allocate a new radix level:
|
||||||
|
*/
|
||||||
|
if (node->count != 0) {
|
||||||
|
node = malloc(sizeof(*node), M_RADIX, root->gfp_mask | M_ZERO);
|
||||||
|
if (node == NULL) {
|
||||||
|
/*
|
||||||
|
* Freeing the already allocated radix
|
||||||
|
* levels, if any, will be handled by
|
||||||
|
* the radix_tree_delete() function.
|
||||||
|
* This code path can only happen when
|
||||||
|
* the tree is not empty.
|
||||||
|
*/
|
||||||
|
return (-ENOMEM);
|
||||||
|
}
|
||||||
|
node->slots[0] = root->rnode;
|
||||||
|
node->count++;
|
||||||
|
root->rnode = node;
|
||||||
|
}
|
||||||
|
root->height++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get radix tree height index */
|
||||||
|
height = root->height - 1;
|
||||||
|
|
||||||
|
/* walk down the tree until the first missing node, if any */
|
||||||
|
for ( ; height != 0; height--) {
|
||||||
|
idx = radix_pos(index, height);
|
||||||
|
if (node->slots[idx] == NULL)
|
||||||
|
break;
|
||||||
|
node = node->slots[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* allocate the missing radix levels, if any */
|
||||||
|
for (idx = 0; idx != height; idx++) {
|
||||||
|
temp[idx] = malloc(sizeof(*node), M_RADIX,
|
||||||
|
root->gfp_mask | M_ZERO);
|
||||||
|
if (temp[idx] == NULL) {
|
||||||
|
while (idx--)
|
||||||
|
free(temp[idx], M_RADIX);
|
||||||
|
radix_tree_clean_root_node(root);
|
||||||
|
return (-ENOMEM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup new radix levels, if any */
|
||||||
|
for ( ; height != 0; height--) {
|
||||||
|
idx = radix_pos(index, height);
|
||||||
|
node->slots[idx] = temp[height - 1];
|
||||||
|
node->count++;
|
||||||
|
node = node->slots[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Insert and adjust count if the item does not already exist.
|
||||||
|
*/
|
||||||
|
idx = radix_pos(index, 0);
|
||||||
|
/* swap */
|
||||||
|
pitem = node->slots[idx];
|
||||||
|
node->slots[idx] = *ppitem;
|
||||||
|
*ppitem = pitem;
|
||||||
|
|
||||||
|
if (pitem == NULL)
|
||||||
|
node->count++;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include "opt_acpi.h"
|
#include "opt_acpi.h"
|
||||||
|
#include "opt_pci.h"
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
@ -207,8 +208,10 @@ static int
|
|||||||
apei_pcie_handler(ACPI_HEST_GENERIC_DATA *ged)
|
apei_pcie_handler(ACPI_HEST_GENERIC_DATA *ged)
|
||||||
{
|
{
|
||||||
struct apei_pcie_error *p = (struct apei_pcie_error *)(ged + 1);
|
struct apei_pcie_error *p = (struct apei_pcie_error *)(ged + 1);
|
||||||
|
int h = 0, off;
|
||||||
|
#ifdef DEV_PCI
|
||||||
device_t dev;
|
device_t dev;
|
||||||
int h = 0, off, sev;
|
int sev;
|
||||||
|
|
||||||
if ((p->ValidationBits & 0x8) == 0x8) {
|
if ((p->ValidationBits & 0x8) == 0x8) {
|
||||||
mtx_lock(&Giant);
|
mtx_lock(&Giant);
|
||||||
@ -235,6 +238,7 @@ apei_pcie_handler(ACPI_HEST_GENERIC_DATA *ged)
|
|||||||
}
|
}
|
||||||
if (h)
|
if (h)
|
||||||
return (h);
|
return (h);
|
||||||
|
#endif
|
||||||
|
|
||||||
printf("APEI %s PCIe Error:\n", apei_severity(ged->ErrorSeverity));
|
printf("APEI %s PCIe Error:\n", apei_severity(ged->ErrorSeverity));
|
||||||
if (p->ValidationBits & 0x01)
|
if (p->ValidationBits & 0x01)
|
||||||
|
@ -1334,6 +1334,11 @@ em_if_init(if_ctx_t ctx)
|
|||||||
ctrl |= E1000_CTRL_VME;
|
ctrl |= E1000_CTRL_VME;
|
||||||
E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl);
|
E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
u32 ctrl;
|
||||||
|
ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL);
|
||||||
|
ctrl &= ~E1000_CTRL_VME;
|
||||||
|
E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't lose promiscuous settings */
|
/* Don't lose promiscuous settings */
|
||||||
|
@ -58,8 +58,6 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include <ck_epoch.h>
|
#include <ck_epoch.h>
|
||||||
|
|
||||||
static MALLOC_DEFINE(M_EPOCH, "epoch", "epoch based reclamation");
|
|
||||||
|
|
||||||
#ifdef __amd64__
|
#ifdef __amd64__
|
||||||
#define EPOCH_ALIGN CACHE_LINE_SIZE*2
|
#define EPOCH_ALIGN CACHE_LINE_SIZE*2
|
||||||
#else
|
#else
|
||||||
@ -79,7 +77,7 @@ typedef struct epoch_record {
|
|||||||
struct epoch {
|
struct epoch {
|
||||||
struct ck_epoch e_epoch __aligned(EPOCH_ALIGN);
|
struct ck_epoch e_epoch __aligned(EPOCH_ALIGN);
|
||||||
epoch_record_t e_pcpu_record;
|
epoch_record_t e_pcpu_record;
|
||||||
int e_idx;
|
int e_in_use;
|
||||||
int e_flags;
|
int e_flags;
|
||||||
struct sx e_drain_sx;
|
struct sx e_drain_sx;
|
||||||
struct mtx e_drain_mtx;
|
struct mtx e_drain_mtx;
|
||||||
@ -128,19 +126,23 @@ TAILQ_HEAD (threadlist, thread);
|
|||||||
CK_STACK_CONTAINER(struct ck_epoch_entry, stack_entry,
|
CK_STACK_CONTAINER(struct ck_epoch_entry, stack_entry,
|
||||||
ck_epoch_entry_container)
|
ck_epoch_entry_container)
|
||||||
|
|
||||||
epoch_t allepochs[MAX_EPOCHS];
|
static struct epoch epoch_array[MAX_EPOCHS];
|
||||||
|
|
||||||
DPCPU_DEFINE(struct grouptask, epoch_cb_task);
|
DPCPU_DEFINE(struct grouptask, epoch_cb_task);
|
||||||
DPCPU_DEFINE(int, epoch_cb_count);
|
DPCPU_DEFINE(int, epoch_cb_count);
|
||||||
|
|
||||||
static __read_mostly int inited;
|
static __read_mostly int inited;
|
||||||
static __read_mostly int epoch_count;
|
|
||||||
__read_mostly epoch_t global_epoch;
|
__read_mostly epoch_t global_epoch;
|
||||||
__read_mostly epoch_t global_epoch_preempt;
|
__read_mostly epoch_t global_epoch_preempt;
|
||||||
|
|
||||||
static void epoch_call_task(void *context __unused);
|
static void epoch_call_task(void *context __unused);
|
||||||
static uma_zone_t pcpu_zone_record;
|
static uma_zone_t pcpu_zone_record;
|
||||||
|
|
||||||
|
static struct sx epoch_sx;
|
||||||
|
|
||||||
|
#define EPOCH_LOCK() sx_xlock(&epoch_sx)
|
||||||
|
#define EPOCH_UNLOCK() sx_xunlock(&epoch_sx)
|
||||||
|
|
||||||
#ifdef EPOCH_TRACE
|
#ifdef EPOCH_TRACE
|
||||||
struct stackentry {
|
struct stackentry {
|
||||||
RB_ENTRY(stackentry) se_node;
|
RB_ENTRY(stackentry) se_node;
|
||||||
@ -281,6 +283,7 @@ epoch_init(void *arg __unused)
|
|||||||
#ifdef EPOCH_TRACE
|
#ifdef EPOCH_TRACE
|
||||||
SLIST_INIT(&thread0.td_epochs);
|
SLIST_INIT(&thread0.td_epochs);
|
||||||
#endif
|
#endif
|
||||||
|
sx_init(&epoch_sx, "epoch-sx");
|
||||||
inited = 1;
|
inited = 1;
|
||||||
global_epoch = epoch_alloc("Global", 0);
|
global_epoch = epoch_alloc("Global", 0);
|
||||||
global_epoch_preempt = epoch_alloc("Global preemptible", EPOCH_PREEMPT);
|
global_epoch_preempt = epoch_alloc("Global preemptible", EPOCH_PREEMPT);
|
||||||
@ -326,19 +329,48 @@ epoch_t
|
|||||||
epoch_alloc(const char *name, int flags)
|
epoch_alloc(const char *name, int flags)
|
||||||
{
|
{
|
||||||
epoch_t epoch;
|
epoch_t epoch;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
MPASS(name != NULL);
|
||||||
|
|
||||||
if (__predict_false(!inited))
|
if (__predict_false(!inited))
|
||||||
panic("%s called too early in boot", __func__);
|
panic("%s called too early in boot", __func__);
|
||||||
epoch = malloc(sizeof(struct epoch), M_EPOCH, M_ZERO | M_WAITOK);
|
|
||||||
|
EPOCH_LOCK();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find a free index in the epoch array. If no free index is
|
||||||
|
* found, try to use the index after the last one.
|
||||||
|
*/
|
||||||
|
for (i = 0;; i++) {
|
||||||
|
/*
|
||||||
|
* If too many epochs are currently allocated,
|
||||||
|
* return NULL.
|
||||||
|
*/
|
||||||
|
if (i == MAX_EPOCHS) {
|
||||||
|
epoch = NULL;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (epoch_array[i].e_in_use == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
epoch = epoch_array + i;
|
||||||
ck_epoch_init(&epoch->e_epoch);
|
ck_epoch_init(&epoch->e_epoch);
|
||||||
epoch_ctor(epoch);
|
epoch_ctor(epoch);
|
||||||
MPASS(epoch_count < MAX_EPOCHS - 2);
|
|
||||||
epoch->e_flags = flags;
|
epoch->e_flags = flags;
|
||||||
epoch->e_idx = epoch_count;
|
|
||||||
epoch->e_name = name;
|
epoch->e_name = name;
|
||||||
sx_init(&epoch->e_drain_sx, "epoch-drain-sx");
|
sx_init(&epoch->e_drain_sx, "epoch-drain-sx");
|
||||||
mtx_init(&epoch->e_drain_mtx, "epoch-drain-mtx", NULL, MTX_DEF);
|
mtx_init(&epoch->e_drain_mtx, "epoch-drain-mtx", NULL, MTX_DEF);
|
||||||
allepochs[epoch_count++] = epoch;
|
|
||||||
|
/*
|
||||||
|
* Set e_in_use last, because when this field is set the
|
||||||
|
* epoch_call_task() function will start scanning this epoch
|
||||||
|
* structure.
|
||||||
|
*/
|
||||||
|
atomic_store_rel_int(&epoch->e_in_use, 1);
|
||||||
|
done:
|
||||||
|
EPOCH_UNLOCK();
|
||||||
return (epoch);
|
return (epoch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,13 +378,24 @@ void
|
|||||||
epoch_free(epoch_t epoch)
|
epoch_free(epoch_t epoch)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
EPOCH_LOCK();
|
||||||
|
|
||||||
|
MPASS(epoch->e_in_use != 0);
|
||||||
|
|
||||||
epoch_drain_callbacks(epoch);
|
epoch_drain_callbacks(epoch);
|
||||||
allepochs[epoch->e_idx] = NULL;
|
|
||||||
|
atomic_store_rel_int(&epoch->e_in_use, 0);
|
||||||
|
/*
|
||||||
|
* Make sure the epoch_call_task() function see e_in_use equal
|
||||||
|
* to zero, by calling epoch_wait() on the global_epoch:
|
||||||
|
*/
|
||||||
epoch_wait(global_epoch);
|
epoch_wait(global_epoch);
|
||||||
uma_zfree_pcpu(pcpu_zone_record, epoch->e_pcpu_record);
|
uma_zfree_pcpu(pcpu_zone_record, epoch->e_pcpu_record);
|
||||||
mtx_destroy(&epoch->e_drain_mtx);
|
mtx_destroy(&epoch->e_drain_mtx);
|
||||||
sx_destroy(&epoch->e_drain_sx);
|
sx_destroy(&epoch->e_drain_sx);
|
||||||
free(epoch, M_EPOCH);
|
memset(epoch, 0, sizeof(*epoch));
|
||||||
|
|
||||||
|
EPOCH_UNLOCK();
|
||||||
}
|
}
|
||||||
|
|
||||||
static epoch_record_t
|
static epoch_record_t
|
||||||
@ -705,8 +748,10 @@ epoch_call_task(void *arg __unused)
|
|||||||
ck_stack_init(&cb_stack);
|
ck_stack_init(&cb_stack);
|
||||||
critical_enter();
|
critical_enter();
|
||||||
epoch_enter(global_epoch);
|
epoch_enter(global_epoch);
|
||||||
for (total = i = 0; i < epoch_count; i++) {
|
for (total = i = 0; i != MAX_EPOCHS; i++) {
|
||||||
if (__predict_false((epoch = allepochs[i]) == NULL))
|
epoch = epoch_array + i;
|
||||||
|
if (__predict_false(
|
||||||
|
atomic_load_acq_int(&epoch->e_in_use) == 0))
|
||||||
continue;
|
continue;
|
||||||
er = epoch_currecord(epoch);
|
er = epoch_currecord(epoch);
|
||||||
record = &er->er_record;
|
record = &er->er_record;
|
||||||
|
@ -1076,28 +1076,24 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
|
|||||||
struct netmap_adapter *na = kring->na;
|
struct netmap_adapter *na = kring->na;
|
||||||
struct netmap_ring *ring = kring->ring;
|
struct netmap_ring *ring = kring->ring;
|
||||||
if_t ifp = na->ifp;
|
if_t ifp = na->ifp;
|
||||||
iflib_fl_t fl;
|
|
||||||
uint32_t nm_i; /* index into the netmap ring */
|
uint32_t nm_i; /* index into the netmap ring */
|
||||||
uint32_t nic_i; /* index into the NIC ring */
|
uint32_t nic_i; /* index into the NIC ring */
|
||||||
u_int i, n;
|
u_int n;
|
||||||
u_int const lim = kring->nkr_num_slots - 1;
|
u_int const lim = kring->nkr_num_slots - 1;
|
||||||
u_int const head = kring->rhead;
|
|
||||||
int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR;
|
int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR;
|
||||||
struct if_rxd_info ri;
|
|
||||||
|
|
||||||
if_ctx_t ctx = ifp->if_softc;
|
if_ctx_t ctx = ifp->if_softc;
|
||||||
iflib_rxq_t rxq = &ctx->ifc_rxqs[kring->ring_id];
|
iflib_rxq_t rxq = &ctx->ifc_rxqs[kring->ring_id];
|
||||||
if (head > lim)
|
iflib_fl_t fl = &rxq->ifr_fl[0];
|
||||||
return netmap_ring_reinit(kring);
|
struct if_rxd_info ri;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX netmap_fl_refill() only ever (re)fills free list 0 so far.
|
* netmap only uses free list 0, to avoid out of order consumption
|
||||||
|
* of receive buffers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0, fl = rxq->ifr_fl; i < rxq->ifr_nfl; i++, fl++) {
|
bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_ifdi->idi_map,
|
||||||
bus_dmamap_sync(fl->ifl_ifdi->idi_tag, fl->ifl_ifdi->idi_map,
|
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
|
||||||
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First part: import newly received packets.
|
* First part: import newly received packets.
|
||||||
@ -1119,38 +1115,35 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
|
|||||||
int crclen = iflib_crcstrip ? 0 : 4;
|
int crclen = iflib_crcstrip ? 0 : 4;
|
||||||
int error, avail;
|
int error, avail;
|
||||||
|
|
||||||
for (i = 0; i < rxq->ifr_nfl; i++) {
|
nic_i = fl->ifl_cidx;
|
||||||
fl = &rxq->ifr_fl[i];
|
nm_i = netmap_idx_n2k(kring, nic_i);
|
||||||
nic_i = fl->ifl_cidx;
|
avail = ctx->isc_rxd_available(ctx->ifc_softc,
|
||||||
nm_i = netmap_idx_n2k(kring, nic_i);
|
rxq->ifr_id, nic_i, USHRT_MAX);
|
||||||
avail = ctx->isc_rxd_available(ctx->ifc_softc,
|
for (n = 0; avail > 0 && nm_i != hwtail_lim; n++, avail--) {
|
||||||
rxq->ifr_id, nic_i, USHRT_MAX);
|
rxd_info_zero(&ri);
|
||||||
for (n = 0; avail > 0 && nm_i != hwtail_lim; n++, avail--) {
|
ri.iri_frags = rxq->ifr_frags;
|
||||||
rxd_info_zero(&ri);
|
ri.iri_qsidx = kring->ring_id;
|
||||||
ri.iri_frags = rxq->ifr_frags;
|
ri.iri_ifp = ctx->ifc_ifp;
|
||||||
ri.iri_qsidx = kring->ring_id;
|
ri.iri_cidx = nic_i;
|
||||||
ri.iri_ifp = ctx->ifc_ifp;
|
|
||||||
ri.iri_cidx = nic_i;
|
|
||||||
|
|
||||||
error = ctx->isc_rxd_pkt_get(ctx->ifc_softc, &ri);
|
error = ctx->isc_rxd_pkt_get(ctx->ifc_softc, &ri);
|
||||||
ring->slot[nm_i].len = error ? 0 : ri.iri_len - crclen;
|
ring->slot[nm_i].len = error ? 0 : ri.iri_len - crclen;
|
||||||
ring->slot[nm_i].flags = 0;
|
ring->slot[nm_i].flags = 0;
|
||||||
bus_dmamap_sync(fl->ifl_buf_tag,
|
bus_dmamap_sync(fl->ifl_buf_tag,
|
||||||
fl->ifl_sds.ifsd_map[nic_i], BUS_DMASYNC_POSTREAD);
|
fl->ifl_sds.ifsd_map[nic_i], BUS_DMASYNC_POSTREAD);
|
||||||
nm_i = nm_next(nm_i, lim);
|
nm_i = nm_next(nm_i, lim);
|
||||||
nic_i = nm_next(nic_i, lim);
|
nic_i = nm_next(nic_i, lim);
|
||||||
}
|
|
||||||
if (n) { /* update the state variables */
|
|
||||||
if (netmap_no_pendintr && !force_update) {
|
|
||||||
/* diagnostics */
|
|
||||||
iflib_rx_miss ++;
|
|
||||||
iflib_rx_miss_bufs += n;
|
|
||||||
}
|
|
||||||
fl->ifl_cidx = nic_i;
|
|
||||||
kring->nr_hwtail = nm_i;
|
|
||||||
}
|
|
||||||
kring->nr_kflags &= ~NKR_PENDINTR;
|
|
||||||
}
|
}
|
||||||
|
if (n) { /* update the state variables */
|
||||||
|
if (netmap_no_pendintr && !force_update) {
|
||||||
|
/* diagnostics */
|
||||||
|
iflib_rx_miss ++;
|
||||||
|
iflib_rx_miss_bufs += n;
|
||||||
|
}
|
||||||
|
fl->ifl_cidx = nic_i;
|
||||||
|
kring->nr_hwtail = nm_i;
|
||||||
|
}
|
||||||
|
kring->nr_kflags &= ~NKR_PENDINTR;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Second part: skip past packets that userspace has released.
|
* Second part: skip past packets that userspace has released.
|
||||||
@ -1160,7 +1153,6 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
|
|||||||
* nic_i is the index in the NIC ring, and
|
* nic_i is the index in the NIC ring, and
|
||||||
* nm_i == (nic_i + kring->nkr_hwofs) % ring_size
|
* nm_i == (nic_i + kring->nkr_hwofs) % ring_size
|
||||||
*/
|
*/
|
||||||
/* XXX not sure how this will work with multiple free lists */
|
|
||||||
nm_i = kring->nr_hwcur;
|
nm_i = kring->nr_hwcur;
|
||||||
|
|
||||||
return (netmap_fl_refill(rxq, kring, nm_i, false));
|
return (netmap_fl_refill(rxq, kring, nm_i, false));
|
||||||
|
@ -785,6 +785,13 @@ ieee80211_ioctl_get80211(struct ieee80211vap *vap, u_long cmd,
|
|||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
switch (ireq->i_type) {
|
switch (ireq->i_type) {
|
||||||
|
case IEEE80211_IOC_IC_NAME:
|
||||||
|
len = strlen(ic->ic_name) + 1;
|
||||||
|
if (len > ireq->i_len)
|
||||||
|
return (EINVAL);
|
||||||
|
ireq->i_len = len;
|
||||||
|
error = copyout(ic->ic_name, ireq->i_data, ireq->i_len);
|
||||||
|
break;
|
||||||
case IEEE80211_IOC_SSID:
|
case IEEE80211_IOC_SSID:
|
||||||
switch (vap->iv_state) {
|
switch (vap->iv_state) {
|
||||||
case IEEE80211_S_INIT:
|
case IEEE80211_S_INIT:
|
||||||
|
@ -743,6 +743,9 @@ struct ieee80211req {
|
|||||||
#define IEEE80211_IOC_QUIET_OFFSET 207 /* Quiet Offset */
|
#define IEEE80211_IOC_QUIET_OFFSET 207 /* Quiet Offset */
|
||||||
#define IEEE80211_IOC_QUIET_DUR 208 /* Quiet Duration */
|
#define IEEE80211_IOC_QUIET_DUR 208 /* Quiet Duration */
|
||||||
#define IEEE80211_IOC_QUIET_COUNT 209 /* Quiet Count */
|
#define IEEE80211_IOC_QUIET_COUNT 209 /* Quiet Count */
|
||||||
|
|
||||||
|
#define IEEE80211_IOC_IC_NAME 210 /* HW device name. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parameters for controlling a scan requested with
|
* Parameters for controlling a scan requested with
|
||||||
* IEEE80211_IOC_SCAN_REQ.
|
* IEEE80211_IOC_SCAN_REQ.
|
||||||
|
@ -163,7 +163,7 @@ VNET_PCPUSTAT_SYSUNINIT(udpstat);
|
|||||||
#ifdef INET
|
#ifdef INET
|
||||||
static void udp_detach(struct socket *so);
|
static void udp_detach(struct socket *so);
|
||||||
static int udp_output(struct inpcb *, struct mbuf *, struct sockaddr *,
|
static int udp_output(struct inpcb *, struct mbuf *, struct sockaddr *,
|
||||||
struct mbuf *, struct thread *);
|
struct mbuf *, struct thread *, int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1083,9 +1083,65 @@ udp_ctloutput(struct socket *so, struct sockopt *sopt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef INET
|
#ifdef INET
|
||||||
|
#ifdef INET6
|
||||||
|
/* The logic here is derived from ip6_setpktopt(). See comments there. */
|
||||||
|
static int
|
||||||
|
udp_v4mapped_pktinfo(struct cmsghdr *cm, struct sockaddr_in * src,
|
||||||
|
struct inpcb *inp, int flags)
|
||||||
|
{
|
||||||
|
struct ifnet *ifp;
|
||||||
|
struct in6_pktinfo *pktinfo;
|
||||||
|
struct in_addr ia;
|
||||||
|
|
||||||
|
if ((flags & PRUS_IPV6) == 0)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
if (cm->cmsg_level != IPPROTO_IPV6)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
if (cm->cmsg_type != IPV6_2292PKTINFO &&
|
||||||
|
cm->cmsg_type != IPV6_PKTINFO)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
if (cm->cmsg_len !=
|
||||||
|
CMSG_LEN(sizeof(struct in6_pktinfo)))
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
|
pktinfo = (struct in6_pktinfo *)CMSG_DATA(cm);
|
||||||
|
if (!IN6_IS_ADDR_V4MAPPED(&pktinfo->ipi6_addr) &&
|
||||||
|
!IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr))
|
||||||
|
return (EINVAL);
|
||||||
|
|
||||||
|
/* Validate the interface index if specified. */
|
||||||
|
if (pktinfo->ipi6_ifindex > V_if_index)
|
||||||
|
return (ENXIO);
|
||||||
|
|
||||||
|
ifp = NULL;
|
||||||
|
if (pktinfo->ipi6_ifindex) {
|
||||||
|
ifp = ifnet_byindex(pktinfo->ipi6_ifindex);
|
||||||
|
if (ifp == NULL)
|
||||||
|
return (ENXIO);
|
||||||
|
}
|
||||||
|
if (ifp != NULL && !IN6_IS_ADDR_UNSPECIFIED(&pktinfo->ipi6_addr)) {
|
||||||
|
|
||||||
|
ia.s_addr = pktinfo->ipi6_addr.s6_addr32[3];
|
||||||
|
if (in_ifhasaddr(ifp, ia) == 0)
|
||||||
|
return (EADDRNOTAVAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
bzero(src, sizeof(*src));
|
||||||
|
src->sin_family = AF_INET;
|
||||||
|
src->sin_len = sizeof(*src);
|
||||||
|
src->sin_port = inp->inp_lport;
|
||||||
|
src->sin_addr.s_addr = pktinfo->ipi6_addr.s6_addr32[3];
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
|
udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
|
||||||
struct mbuf *control, struct thread *td)
|
struct mbuf *control, struct thread *td, int flags)
|
||||||
{
|
{
|
||||||
struct udpiphdr *ui;
|
struct udpiphdr *ui;
|
||||||
int len = m->m_pkthdr.len;
|
int len = m->m_pkthdr.len;
|
||||||
@ -1149,6 +1205,11 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
|
|||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef INET6
|
||||||
|
error = udp_v4mapped_pktinfo(cm, &src, inp, flags);
|
||||||
|
if (error != 0)
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
if (cm->cmsg_level != IPPROTO_IP)
|
if (cm->cmsg_level != IPPROTO_IP)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1696,7 +1757,7 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
|
|||||||
|
|
||||||
inp = sotoinpcb(so);
|
inp = sotoinpcb(so);
|
||||||
KASSERT(inp != NULL, ("udp_send: inp == NULL"));
|
KASSERT(inp != NULL, ("udp_send: inp == NULL"));
|
||||||
return (udp_output(inp, m, addr, control, td));
|
return (udp_output(inp, m, addr, control, td, flags));
|
||||||
}
|
}
|
||||||
#endif /* INET */
|
#endif /* INET */
|
||||||
|
|
||||||
|
@ -784,7 +784,7 @@ udp6_output(struct socket *so, int flags_arg, struct mbuf *m,
|
|||||||
in6_sin6_2_sin_in_sock((struct sockaddr *)sin6);
|
in6_sin6_2_sin_in_sock((struct sockaddr *)sin6);
|
||||||
pru = inetsw[ip_protox[nxt]].pr_usrreqs;
|
pru = inetsw[ip_protox[nxt]].pr_usrreqs;
|
||||||
/* addr will just be freed in sendit(). */
|
/* addr will just be freed in sendit(). */
|
||||||
return ((*pru->pru_send)(so, flags_arg, m,
|
return ((*pru->pru_send)(so, flags_arg | PRUS_IPV6, m,
|
||||||
(struct sockaddr *)sin6, control, td));
|
(struct sockaddr *)sin6, control, td));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
@ -210,6 +210,7 @@ struct pr_usrreqs {
|
|||||||
#define PRUS_EOF 0x2
|
#define PRUS_EOF 0x2
|
||||||
#define PRUS_MORETOCOME 0x4
|
#define PRUS_MORETOCOME 0x4
|
||||||
#define PRUS_NOTREADY 0x8
|
#define PRUS_NOTREADY 0x8
|
||||||
|
#define PRUS_IPV6 0x10
|
||||||
int (*pru_ready)(struct socket *so, struct mbuf *m, int count);
|
int (*pru_ready)(struct socket *so, struct mbuf *m, int count);
|
||||||
int (*pru_sense)(struct socket *so, struct stat *sb);
|
int (*pru_sense)(struct socket *so, struct stat *sb);
|
||||||
int (*pru_shutdown)(struct socket *so);
|
int (*pru_shutdown)(struct socket *so);
|
||||||
|
@ -119,26 +119,25 @@ _host_abs_tools_to_symlink= ${_make_abs}:make ${_make_abs}:bmake
|
|||||||
host-symlinks:
|
host-symlinks:
|
||||||
@echo "Linking host tools into ${DESTDIR}/bin"
|
@echo "Linking host tools into ${DESTDIR}/bin"
|
||||||
.for _tool in ${_host_tools_to_symlink}
|
.for _tool in ${_host_tools_to_symlink}
|
||||||
@if [ ! -e "${DESTDIR}/bin/${_tool}" ]; then \
|
@source_path=`which ${_tool}`; \
|
||||||
source_path=`which ${_tool}`; \
|
if [ ! -e "$${source_path}" ] ; then \
|
||||||
if [ ! -e "$${source_path}" ] ; then \
|
echo "Cannot find host tool '${_tool}'"; false; \
|
||||||
echo "Cannot find host tool '${_tool}'"; false; \
|
fi; \
|
||||||
fi; \
|
rm -f "${DESTDIR}/bin/${_tool}"; \
|
||||||
ln -sfnv "$${source_path}" "${DESTDIR}/bin/${_tool}"; \
|
cp -f "$${source_path}" "${DESTDIR}/bin/${_tool}"
|
||||||
fi
|
|
||||||
.endfor
|
.endfor
|
||||||
.for _tool in ${_host_abs_tools_to_symlink}
|
.for _tool in ${_host_abs_tools_to_symlink}
|
||||||
@source_path="${_tool:S/:/ /:[1]}"; \
|
@source_path="${_tool:S/:/ /:[1]}"; \
|
||||||
target_path="${DESTDIR}/bin/${_tool:S/:/ /:[2]}"; \
|
target_path="${DESTDIR}/bin/${_tool:S/:/ /:[2]}"; \
|
||||||
if [ ! -e "$${target_path}" ] ; then \
|
if [ ! -e "$${source_path}" ] ; then \
|
||||||
if [ ! -e "$${source_path}" ] ; then \
|
echo "Host tool '${src_path}' is missing"; false; \
|
||||||
echo "Host tool '${src_path}' is missing"; false; \
|
fi; \
|
||||||
fi; \
|
rm -f "$${target_path}"; \
|
||||||
ln -sfnv "$${source_path}" "$${target_path}"; \
|
cp -f "$${source_path}" "$${target_path}"
|
||||||
fi
|
|
||||||
.endfor
|
.endfor
|
||||||
.if exists(/usr/libexec/flua)
|
.if exists(/usr/libexec/flua)
|
||||||
ln -sf /usr/libexec/flua ${DESTDIR}/usr/libexec/flua
|
rm -f ${DESTDIR}/usr/libexec/flua
|
||||||
|
cp -f /usr/libexec/flua ${DESTDIR}/usr/libexec/flua
|
||||||
.endif
|
.endif
|
||||||
|
|
||||||
# Create all the directories that are needed during the legacy, bootstrap-tools
|
# Create all the directories that are needed during the legacy, bootstrap-tools
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
.include <src.opts.mk>
|
.include <src.opts.mk>
|
||||||
|
|
||||||
.if ${MK_BSD_GREP} == "yes"
|
.if ${MK_BSD_GREP} == "yes" || defined(BOOTSTRAPPING)
|
||||||
PROG= grep
|
PROG= grep
|
||||||
MAN1= grep.1 zgrep.1
|
MAN1= grep.1 zgrep.1
|
||||||
.else
|
.else
|
||||||
@ -50,7 +50,7 @@ MLINKS= zgrep.1 zfgrep.1 \
|
|||||||
|
|
||||||
CFLAGS.gcc+= --param max-inline-insns-single=500
|
CFLAGS.gcc+= --param max-inline-insns-single=500
|
||||||
|
|
||||||
.if ${MK_BSD_GREP} == "yes"
|
.if ${MK_BSD_GREP} == "yes" || defined(BOOTSTRAPPING)
|
||||||
LINKS+= ${BINDIR}/grep ${BINDIR}/egrep \
|
LINKS+= ${BINDIR}/grep ${BINDIR}/egrep \
|
||||||
${BINDIR}/grep ${BINDIR}/fgrep \
|
${BINDIR}/grep ${BINDIR}/fgrep \
|
||||||
${BINDIR}/grep ${BINDIR}/rgrep \
|
${BINDIR}/grep ${BINDIR}/rgrep \
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" @(#)grep.1 8.3 (Berkeley) 4/18/94
|
.\" @(#)grep.1 8.3 (Berkeley) 4/18/94
|
||||||
.\"
|
.\"
|
||||||
.Dd August 21, 2018
|
.Dd August 7, 2020
|
||||||
.Dt GREP 1
|
.Dt GREP 1
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -209,7 +209,7 @@ Note that
|
|||||||
and
|
and
|
||||||
.Fl Fl include
|
.Fl Fl include
|
||||||
patterns are processed in the order given.
|
patterns are processed in the order given.
|
||||||
If a name patches multiple patterns, the latest matching rule wins.
|
If a name matches multiple patterns, the latest matching rule wins.
|
||||||
If no
|
If no
|
||||||
.Fl Fl include
|
.Fl Fl include
|
||||||
pattern is specified, all files are searched that are
|
pattern is specified, all files are searched that are
|
||||||
@ -228,7 +228,7 @@ Note that
|
|||||||
and
|
and
|
||||||
.Fl Fl include-dir
|
.Fl Fl include-dir
|
||||||
patterns are processed in the order given.
|
patterns are processed in the order given.
|
||||||
If a name patches multiple patterns, the latest matching rule wins.
|
If a name matches multiple patterns, the latest matching rule wins.
|
||||||
If no
|
If no
|
||||||
.Fl Fl include-dir
|
.Fl Fl include-dir
|
||||||
pattern is specified, all directories are searched that are
|
pattern is specified, all directories are searched that are
|
||||||
@ -284,7 +284,7 @@ Note that
|
|||||||
and
|
and
|
||||||
.Fl Fl exclude
|
.Fl Fl exclude
|
||||||
patterns are processed in the order given.
|
patterns are processed in the order given.
|
||||||
If a name patches multiple patterns, the latest matching rule wins.
|
If a name matches multiple patterns, the latest matching rule wins.
|
||||||
Patterns are matched to the full path specified,
|
Patterns are matched to the full path specified,
|
||||||
not only to the filename component.
|
not only to the filename component.
|
||||||
.It Fl Fl include-dir Ar pattern
|
.It Fl Fl include-dir Ar pattern
|
||||||
@ -298,7 +298,7 @@ Note that
|
|||||||
and
|
and
|
||||||
.Fl Fl exclude-dir
|
.Fl Fl exclude-dir
|
||||||
patterns are processed in the order given.
|
patterns are processed in the order given.
|
||||||
If a name patches multiple patterns, the latest matching rule wins.
|
If a name matches multiple patterns, the latest matching rule wins.
|
||||||
.It Fl L , Fl Fl files-without-match
|
.It Fl L , Fl Fl files-without-match
|
||||||
Only the names of files not containing selected lines are written to
|
Only the names of files not containing selected lines are written to
|
||||||
standard output.
|
standard output.
|
||||||
|
@ -53,7 +53,6 @@
|
|||||||
__FBSDID("$FreeBSD$");
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/clock.h>
|
|
||||||
#include <sys/errno.h>
|
#include <sys/errno.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
@ -9,5 +9,8 @@ MAN= pwd_mkdb.8
|
|||||||
SRCS= pw_scan.c pwd_mkdb.c
|
SRCS= pw_scan.c pwd_mkdb.c
|
||||||
|
|
||||||
CFLAGS+= -I${SRCTOP}/lib/libc/gen # for pw_scan.h
|
CFLAGS+= -I${SRCTOP}/lib/libc/gen # for pw_scan.h
|
||||||
|
.if defined(BOOTSTRAPPING)
|
||||||
|
CFLAGS+=-I${.CURDIR}
|
||||||
|
.endif
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
.include <bsd.prog.mk>
|
||||||
|
66
usr.sbin/pwd_mkdb/pwd.h
Normal file
66
usr.sbin/pwd_mkdb/pwd.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/*-
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*
|
||||||
|
* Copyright 2018-2020 Alex Richardson <arichardson@FreeBSD.org>
|
||||||
|
*
|
||||||
|
* This software was developed by SRI International and the University of
|
||||||
|
* Cambridge Computer Laboratory (Department of Computer Science and
|
||||||
|
* Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
|
||||||
|
* DARPA SSITH research programme.
|
||||||
|
*
|
||||||
|
* This software was developed by SRI International and the University of
|
||||||
|
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||||
|
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When building pwd_mkdb we need to use target systems definition of
|
||||||
|
* struct passwd. This protects against future changes to struct passwd and
|
||||||
|
* is essential to allow cross-building from Linux/macOS hosts since the
|
||||||
|
* structure is not compatible there.
|
||||||
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
/*
|
||||||
|
* Note: pwd_mkdb always stores uint32_t for all integer fields (including
|
||||||
|
* time_t!) so these definitions do not need to match sys/sys/_types.h
|
||||||
|
*/
|
||||||
|
typedef uint32_t _bootstrap_gid_t;
|
||||||
|
typedef uint32_t _bootstrap_uid_t;
|
||||||
|
typedef uint64_t _bootstrap_time_t;
|
||||||
|
#define _GID_T_DECLARED
|
||||||
|
#define _TIME_T_DECLARED
|
||||||
|
#define _UID_T_DECLARED
|
||||||
|
#define _SIZE_T_DECLARED
|
||||||
|
|
||||||
|
#define gid_t _bootstrap_gid_t
|
||||||
|
#define uid_t _bootstrap_uid_t
|
||||||
|
#define time_t _bootstrap_time_t
|
||||||
|
#define passwd _bootstrap_passwd
|
||||||
|
#include "../../include/pwd.h"
|
||||||
|
#undef gid_t
|
||||||
|
#undef uid_t
|
||||||
|
#undef time_t
|
@ -7,7 +7,7 @@ MAN= tzsetup.8
|
|||||||
|
|
||||||
CFLAGS+= -I.
|
CFLAGS+= -I.
|
||||||
|
|
||||||
.if ${MK_DIALOG} != no
|
.if ${MK_DIALOG} != no && !defined(BOOTSTRAPPING)
|
||||||
WARNS?= 3
|
WARNS?= 3
|
||||||
CFLAGS+= -I${SRCTOP}/contrib/dialog -DHAVE_DIALOG
|
CFLAGS+= -I${SRCTOP}/contrib/dialog -DHAVE_DIALOG
|
||||||
LIBADD= dialog ncursesw
|
LIBADD= dialog ncursesw
|
||||||
|
Loading…
Reference in New Issue
Block a user