diff options
author | Brian Bennett <brian.bennett@mnx.io> | 2022-06-10 20:05:16 +0000 |
---|---|---|
committer | Brian Bennett <brian.bennett@mnx.io> | 2022-06-10 20:05:16 +0000 |
commit | b66333d8fa2df710a3b017d364b027432453db40 (patch) | |
tree | 5fa8769c75982a81a79e5a4aef312b41039aef83 | |
parent | f5ec4d77349a1b62430af816d1f0b653b801aab8 (diff) | |
parent | 8130f8e19e97c2d371c7b8894112a375409fe34a (diff) | |
download | illumos-joyent-b66333d8fa2df710a3b017d364b027432453db40.tar.gz |
[illumos-gate merge]
commit 8130f8e19e97c2d371c7b8894112a375409fe34a
14731 clean malloc/free shims from bhyve
commit d4f59ae5164748e530cad42bd54b9b909d0c1ee8
14703 clean KTR from bhyve
commit 61b20185b3a9f12c5f69672abe47b79dfb002cab
14142 kernel SMB spams log when it hits max_connections
commit 2514b110a74b7a0ce021feff362fe3c4c2352b43
14724 failed delete of IP address made it undeletable
commit 7a15b0ec33c685e4e6b096454b077a52604acf9b
14713 tools ld should be 64bit
41 files changed, 257 insertions, 675 deletions
diff --git a/exception_lists/packaging b/exception_lists/packaging index 9b923ed9d4..dc81d8238c 100644 --- a/exception_lists/packaging +++ b/exception_lists/packaging @@ -924,22 +924,24 @@ usr/lib/libjedec.so # # the tools copy of the link-editor is not delivered # -opt/onbld/bin/i386/ld i386 -opt/onbld/bin/sparc/ld sparc +opt/onbld/bin/amd64 i386 +opt/onbld/bin/sparcv9 sparc +# The directory exclusions above cover bin/.../ld, should we ever not exclude +# those directories, ld must be added here opt/onbld/bin/i386/sgsmsg i386 opt/onbld/bin/sparc/sgsmsg sparc -opt/onbld/lib/i386/libelf.so i386 -opt/onbld/lib/i386/libelf.so.1 i386 -opt/onbld/lib/i386/libld.so i386 -opt/onbld/lib/i386/libld.so.4 i386 -opt/onbld/lib/i386/liblddbg.so i386 -opt/onbld/lib/i386/liblddbg.so.4 i386 -opt/onbld/lib/sparc/libelf.so sparc -opt/onbld/lib/sparc/libelf.so.1 sparc -opt/onbld/lib/sparc/libld.so sparc -opt/onbld/lib/sparc/libld.so.4 sparc -opt/onbld/lib/sparc/liblddbg.so sparc -opt/onbld/lib/sparc/liblddbg.so.4 sparc +opt/onbld/lib/i386/64/libelf.so i386 +opt/onbld/lib/i386/64/libelf.so.1 i386 +opt/onbld/lib/i386/64/libld.so i386 +opt/onbld/lib/i386/64/libld.so.4 i386 +opt/onbld/lib/i386/64/liblddbg.so i386 +opt/onbld/lib/i386/64/liblddbg.so.4 i386 +opt/onbld/lib/sparc/64/libelf.so sparc +opt/onbld/lib/sparc/64/libelf.so.1 sparc +opt/onbld/lib/sparc/64/libld.so sparc +opt/onbld/lib/sparc/64/libld.so.4 sparc +opt/onbld/lib/sparc/64/liblddbg.so sparc +opt/onbld/lib/sparc/64/liblddbg.so.4 sparc opt/onbld/man/man1onbld/sgsmsg.1onbld # diff --git a/usr/src/Makefile.master b/usr/src/Makefile.master index 9a926c7fbf..47672f66ad 100644 --- a/usr/src/Makefile.master +++ b/usr/src/Makefile.master @@ -939,7 +939,7 @@ CW= $(ONBLD_TOOLS)/bin/$(MACH)/cw BUILD_CC= $(CW) $(CW_LINKER) $(CW_CC_COMPILERS) -- BUILD_CCC= $(CW) -C $(CW_LINKER) $(CW_CCC_COMPILERS) -- BUILD_CPP= /usr/lib/cpp -BUILD_LD= $(ONBLD_TOOLS)/bin/$(MACH)/ld +BUILD_LD= $(ONBLD_TOOLS)/bin/$(MACH64)/ld $(MACH)_CC= $(BUILD_CC) $(MACH)_CCC= $(BUILD_CCC) diff --git a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c index 2bae04288e..9660e67d06 100644 --- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c +++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c @@ -19,6 +19,7 @@ * CDDL HEADER END * * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2022 Oxide Computer Company */ #include "defs.h" @@ -2418,7 +2419,7 @@ ndpd_delete_addrs(const char *ifname) } if (IN6_IS_ADDR_UNSPECIFIED(&pi->pi_token)) { logmsg(LOG_ERR, "token does not exist for %s", ifname); - return (EINVAL); + return (ENOENT); } if (ifsock < 0) { diff --git a/usr/src/compat/bhyve/sys/ktr.h b/usr/src/compat/bhyve/sys/ktr.h deleted file mode 100644 index 96c499ef18..0000000000 --- a/usr/src/compat/bhyve/sys/ktr.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * This file and its contents are supplied under the terms of the - * Common Development and Distribution License ("CDDL"), version 1.0. - * You may only use this file in accordance with the terms of version - * 1.0 of the CDDL. - * - * A full copy of the text of the CDDL should have accompanied this - * source. A copy of the CDDL is also available via the Internet at - * http://www.illumos.org/license/CDDL. - */ - -/* - * Copyright 2013 Pluribus Networks Inc. - */ - -#ifndef _COMPAT_FREEBSD_SYS_KTR_H_ -#define _COMPAT_FREEBSD_SYS_KTR_H_ - -#define CTR0(m, format) -#define CTR1(m, format, p1) -#define CTR2(m, format, p1, p2) -#define CTR3(m, format, p1, p2, p3) -#define CTR4(m, format, p1, p2, p3, p4) -#define CTR5(m, format, p1, p2, p3, p4, p5) -#define CTR6(m, d, p1, p2, p3, p4, p5, p6) - -#endif /* _COMPAT_FREEBSD_SYS_KTR_H_ */ diff --git a/usr/src/compat/bhyve/sys/malloc.h b/usr/src/compat/bhyve/sys/malloc.h deleted file mode 100644 index 341d57b807..0000000000 --- a/usr/src/compat/bhyve/sys/malloc.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file and its contents are supplied under the terms of the - * Common Development and Distribution License ("CDDL"), version 1.0. - * You may only use this file in accordance with the terms of version - * 1.0 of the CDDL. - * - * A full copy of the text of the CDDL should have accompanied this - * source. A copy of the CDDL is also available via the Internet at - * http://www.illumos.org/license/CDDL. - */ - -/* - * Copyright 2013 Pluribus Networks Inc. - */ - -#ifndef _COMPAT_FREEBSD_SYS_MALLOC_H_ -#define _COMPAT_FREEBSD_SYS_MALLOC_H_ - -/* - * flags to malloc. - */ -#define M_NOWAIT 0x0001 /* do not block */ -#define M_WAITOK 0x0002 /* ok to block */ -#define M_ZERO 0x0100 /* bzero the allocation */ - -struct malloc_type { - const char *ks_shortdesc; /* Printable type name. */ -}; - -#ifdef _KERNEL -#define MALLOC_DEFINE(type, shortdesc, longdesc) \ - struct malloc_type type[1] = { \ - { shortdesc } \ - } - -#define MALLOC_DECLARE(type) \ - extern struct malloc_type type[1] - -void free(void *addr, struct malloc_type *type); -void *malloc(unsigned long size, struct malloc_type *type, int flags); -void *old_malloc(unsigned long size, struct malloc_type *type , int flags); -void *contigmalloc(unsigned long, struct malloc_type *, int, vm_paddr_t, - vm_paddr_t, unsigned long, vm_paddr_t); -void contigfree(void *, unsigned long, struct malloc_type *); - - -#endif /* _KERNEL */ - -#endif /* _COMPAT_FREEBSD_SYS_MALLOC_H_ */ diff --git a/usr/src/lib/libipadm/common/ipadm_ndpd.c b/usr/src/lib/libipadm/common/ipadm_ndpd.c index 29ea8ccf51..95e6df2d0a 100644 --- a/usr/src/lib/libipadm/common/ipadm_ndpd.c +++ b/usr/src/lib/libipadm/common/ipadm_ndpd.c @@ -21,6 +21,7 @@ /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016, Chris Fraire <cfraire@me.com>. + * Copyright 2022 Oxide Computer Company */ /* @@ -129,8 +130,12 @@ i_ipadm_delete_ipv6addrs(ipadm_handle_t iph, ipadm_addrobj_t ipaddr) */ status = i_ipadm_send_ndpd_cmd(ipaddr->ipadm_ifname, ipaddr, IPADM_DELETE_ADDRS); - if (status == IPADM_NDPD_NOT_RUNNING) + + /* if the entry is not found, or ndpd is not running, just carry on */ + if (status == IPADM_NDPD_NOT_RUNNING || status == IPADM_ENXIO || + status == IPADM_NOTFOUND) status = IPADM_SUCCESS; + if (status == IPADM_SUCCESS) status = i_ipadm_delete_addr(iph, ipaddr); diff --git a/usr/src/tools/Makefile b/usr/src/tools/Makefile index 63f9b38709..5524ad71bd 100644 --- a/usr/src/tools/Makefile +++ b/usr/src/tools/Makefile @@ -109,6 +109,7 @@ ROOTDIRS= \ $(ROOTONBLD) \ $(ROOTONBLD)/bin \ $(ROOTONBLD)/bin/$(MACH) \ + $(ROOTONBLD)/bin/$(MACH64) \ $(ROOTONBLD)/lib \ $(ROOTONBLD)/lib/$(MACH) \ $(ROOTONBLD)/lib/$(MACH)/64 \ diff --git a/usr/src/tools/Makefile.targ b/usr/src/tools/Makefile.targ index b496f5d5fd..62ea62bfb0 100644 --- a/usr/src/tools/Makefile.targ +++ b/usr/src/tools/Makefile.targ @@ -19,8 +19,6 @@ # CDDL HEADER END # # -#ident "%Z%%M% %I% %E% SMI" -# # Copyright 2008 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # @@ -28,9 +26,3 @@ clobber: clean -$(RM) $(PROG) $(CLOBBERFILES) - -lint_PROG: - $(LINT.c) $(PROG).c - -lint_SRCS: - $(LINT.c) $(SRCS) diff --git a/usr/src/tools/Makefile.tools b/usr/src/tools/Makefile.tools index 315a10b6c6..6bc8e66c14 100644 --- a/usr/src/tools/Makefile.tools +++ b/usr/src/tools/Makefile.tools @@ -34,6 +34,7 @@ ROOTOPT= $(TOOLS_PROTO)/opt ROOTONBLD= $(ROOTOPT)/onbld ROOTONBLDBIN= $(ROOTONBLD)/bin ROOTONBLDBINMACH= $(ROOTONBLD)/bin/$(MACH) +ROOTONBLDBINMACH64= $(ROOTONBLD)/bin/$(MACH64) ROOTONBLDETC= $(ROOTONBLD)/etc ROOTONBLDLIB= $(ROOTONBLD)/lib ROOTONBLDLIBMACH= $(ROOTONBLD)/lib/$(MACH) @@ -78,6 +79,7 @@ CW_LINKER= ROOTONBLDPROG= $(PROG:%=$(ROOTONBLDBIN)/%) ROOTONBLDSCRIPTS= $(SCRIPTS:%=$(ROOTONBLDBIN)/%) ROOTONBLDMACHPROG= $(PROG:%=$(ROOTONBLDBINMACH)/%) +ROOTONBLDMACH64PROG= $(PROG:%=$(ROOTONBLDBINMACH64)/%) ROOTONBLDSHFILES= $(SHFILES:%=$(ROOTONBLDBIN)/%) ROOTONBLDMAKEFILES= $(MAKEFILES:%=$(ROOTONBLDBIN)/%) ROOTONBLDMACHSHFILES= $(SHFILES:%=$(ROOTONBLDBINMACH)/%) @@ -106,6 +108,9 @@ $(ROOTONBLDBIN)/%: % $(ROOTONBLDBINMACH)/%: % $(INS.file) +$(ROOTONBLDBINMACH64)/%: % + $(INS.file) + $(ROOTONBLDETC)/%: % $(INS.file) diff --git a/usr/src/tools/sgs/ld/Makefile b/usr/src/tools/sgs/ld/Makefile index 05ce16f7a6..f8c54774da 100644 --- a/usr/src/tools/sgs/ld/Makefile +++ b/usr/src/tools/sgs/ld/Makefile @@ -25,16 +25,17 @@ include ../Makefile.com include ../../Makefile.tools include $(SGSHOME)/ld/Makefile.com +include $(SRC)/Makefile.master.64 -LDLIBS = -lumem -L../libconv -L$(ROOTONBLDLIBMACH) -lld -lelf -lconv +LDLIBS = -lumem -L../libconv -L$(ROOTONBLDLIBMACH64) -lld -lelf -lconv NATIVE_LIBS += libc.so libumem.so CPPFLAGS = $(NATIVE_CPPFLAGS) CFLAGS = $(NATIVE_CFLAGS) MAPFILES = $(SRCDIR)/common/mapfile-intf -RPATH = '-R$$ORIGIN/../../lib/$(MACH)' +RPATH = '-R$$ORIGIN/../../lib/$(MACH)/64' CW_LINKER = -install: $(ROOTONBLDMACHPROG) +install: $(ROOTONBLDMACH64PROG) .KEEP_STATE: diff --git a/usr/src/tools/sgs/libconv/Makefile b/usr/src/tools/sgs/libconv/Makefile index a4423c8304..626221f74e 100644 --- a/usr/src/tools/sgs/libconv/Makefile +++ b/usr/src/tools/sgs/libconv/Makefile @@ -27,6 +27,7 @@ include ../Makefile.com include $(SGSHOME)/libconv/Makefile.com +include $(SRC)/Makefile.master.64 CPPFLAGS = $(NATIVE_CPPFLAGS) -I$(SRC)/lib/libc/inc -I$(ELFCAP) \ -I$(SRC)/common/sgsrtcid \ diff --git a/usr/src/tools/sgs/libelf/Makefile b/usr/src/tools/sgs/libelf/Makefile index 7fc734dc99..bb397296f6 100644 --- a/usr/src/tools/sgs/libelf/Makefile +++ b/usr/src/tools/sgs/libelf/Makefile @@ -26,6 +26,7 @@ include ../Makefile.com include ../../Makefile.tools include $(SGSHOME)/libelf/Makefile.com +include $(SRC)/Makefile.master.64 CONVLIBDIR = -L../libconv CPPFLAGS = $(NATIVE_CPPFLAGS) @@ -40,14 +41,14 @@ MAPFILES= .KEEP_STATE: -install: all $(ROOTONBLDLIBMACH)/$(DYNLIB) $(ROOTONBLDLIBMACH)/$(LIBLINKS) +install: all $(ROOTONBLDLIBMACH64)/$(DYNLIB) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) -$(ROOTONBLDLIBMACH)/$(DYNLIB): $(PICS) $(ROOTONBLDLIBMACH) +$(ROOTONBLDLIBMACH64)/$(DYNLIB): $(PICS) $(ROOTONBLDLIBMACH64) $(BUILD.SO) $(POST_PROCESS_SO) -$(ROOTONBLDLIBMACH)/$(LIBLINKS): $(ROOTONBLDLIBMACH)/$(DYNLIB) - @$(RM) $(ROOTONBLDLIBMACH)/$(LIBLINKS) - $(SYMLINK) $(DYNLIB) $(ROOTONBLDLIBMACH)/$(LIBLINKS) +$(ROOTONBLDLIBMACH64)/$(LIBLINKS): $(ROOTONBLDLIBMACH64)/$(DYNLIB) + @$(RM) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) + $(SYMLINK) $(DYNLIB) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) include $(SGSHOME)/libelf/Makefile.targ diff --git a/usr/src/tools/sgs/libld/Makefile b/usr/src/tools/sgs/libld/Makefile index 956a85c482..72c3adf4f1 100644 --- a/usr/src/tools/sgs/libld/Makefile +++ b/usr/src/tools/sgs/libld/Makefile @@ -28,6 +28,7 @@ include ../Makefile.com include ../../Makefile.tools include $(SGSHOME)/libld/Makefile.com +include $(SRC)/Makefile.master.64 .KEEP_STATE: @@ -43,7 +44,7 @@ CW_LINKER = CPPFLAGS = $(NATIVE_CPPFLAGS) -DUSE_LIBLD_MALLOC -I$(SRC)/lib/libc/inc \ -I$(SRC)/uts/common/krtld -I$(SRC)/uts/sparc \ -I$(SRC)/uts/common -LDLIBS += -L../libconv -lconv -L$(ROOTONBLDLIBMACH) -llddbg -lelf -lc +LDLIBS += -L../libconv -lconv -L$(ROOTONBLDLIBMACH64) -llddbg -lelf -lc NATIVE_LIBS += libc.so DYNFLAGS += $(VERSREF) '-R$$ORIGIN' @@ -51,14 +52,14 @@ CFLAGS = $(NATIVE_CFLAGS) all: $(DYNLIB) $(LIBLINKS) -install: all $(ROOTONBLDLIBMACH)/$(DYNLIB) $(ROOTONBLDLIBMACH)/$(LIBLINKS) +install: all $(ROOTONBLDLIBMACH64)/$(DYNLIB) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) -$(ROOTONBLDLIBMACH)/$(DYNLIB): $(PICS) $(ROOTONBLDLIBMACH) +$(ROOTONBLDLIBMACH64)/$(DYNLIB): $(PICS) $(ROOTONBLDLIBMACH64) $(BUILD.SO) $(POST_PROCESS_SO) -$(ROOTONBLDLIBMACH)/$(LIBLINKS): $(ROOTONBLDLIBMACH)/$(DYNLIB) - @$(RM) $(ROOTONBLDLIBMACH)/$(LIBLINKS) - $(SYMLINK) $(DYNLIB) $(ROOTONBLDLIBMACH)/$(LIBLINKS) +$(ROOTONBLDLIBMACH64)/$(LIBLINKS): $(ROOTONBLDLIBMACH64)/$(DYNLIB) + @$(RM) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) + $(SYMLINK) $(DYNLIB) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) include $(SGSHOME)/libld/Makefile.targ diff --git a/usr/src/tools/sgs/liblddbg/Makefile b/usr/src/tools/sgs/liblddbg/Makefile index 968af30d3e..5a7818e852 100644 --- a/usr/src/tools/sgs/liblddbg/Makefile +++ b/usr/src/tools/sgs/liblddbg/Makefile @@ -27,6 +27,7 @@ include ../Makefile.com include ../../Makefile.tools include $(SGSHOME)/liblddbg/Makefile.com +include $(SRC)/Makefile.master.64 .KEEP_STATE: @@ -42,14 +43,14 @@ MAPFILES = all: $(DYNLIB) $(LIBLINKS) -install: all $(ROOTONBLDLIBMACH)/$(DYNLIB) $(ROOTONBLDLIBMACH)/$(LIBLINKS) +install: all $(ROOTONBLDLIBMACH64)/$(DYNLIB) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) -$(ROOTONBLDLIBMACH)/$(DYNLIB): $(PICS) $(ROOTONBLDLIBMACH) +$(ROOTONBLDLIBMACH64)/$(DYNLIB): $(PICS) $(ROOTONBLDLIBMACH64) $(BUILD.SO) $(POST_PROCESS_SO) -$(ROOTONBLDLIBMACH)/$(LIBLINKS): $(ROOTONBLDLIBMACH)/$(DYNLIB) - @$(RM) $(ROOTONBLDLIBMACH)/$(LIBLINKS) - $(SYMLINK) $(DYNLIB) $(ROOTONBLDLIBMACH)/$(LIBLINKS) +$(ROOTONBLDLIBMACH64)/$(LIBLINKS): $(ROOTONBLDLIBMACH64)/$(DYNLIB) + @$(RM) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) + $(SYMLINK) $(DYNLIB) $(ROOTONBLDLIBMACH64)/$(LIBLINKS) include $(SGSHOME)/liblddbg/Makefile.targ diff --git a/usr/src/uts/common/fs/smbsrv/smb_server.c b/usr/src/uts/common/fs/smbsrv/smb_server.c index 3b69a5699b..5988f121eb 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_server.c +++ b/usr/src/uts/common/fs/smbsrv/smb_server.c @@ -22,7 +22,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017 by Delphix. All rights reserved. * Copyright 2019 Nexenta by DDN, Inc. All rights reserved. - * Copyright 2020 RackTop Systems, Inc. + * Copyright 2022 RackTop Systems, Inc. */ /* @@ -2478,15 +2478,17 @@ smb_spool_add_doc(smb_tree_t *tree, smb_kspooldoc_t *sp) static void smb_server_create_session(smb_listener_daemon_t *ld, ksocket_t s_so) { + smb_server_t *sv = ld->ld_sv; smb_session_t *session; - taskqid_t tqid; smb_llist_t *sl; - smb_server_t *sv = ld->ld_sv; + taskqid_t tqid; + clock_t now; session = smb_session_create(s_so, ld->ld_port, sv, ld->ld_family); if (session == NULL) { + /* This should be rare (create sleeps) */ smb_soshutdown(s_so); smb_sodestroy(s_so); cmn_err(CE_WARN, "SMB Session: alloc failed"); @@ -2495,6 +2497,17 @@ smb_server_create_session(smb_listener_daemon_t *ld, ksocket_t s_so) sl = &sv->sv_session_list; smb_llist_enter(sl, RW_WRITER); + if (smb_llist_get_count(sl) >= sv->sv_cfg.skc_maxconnections) { + /* + * New session not in sv_session_list, so we can just + * delete it directly. + */ + smb_llist_exit(sl); + DTRACE_PROBE1(maxconn, smb_session_t *, session); + smb_soshutdown(session->sock); + smb_session_delete(session); + goto logmaxconn; + } smb_llist_insert_tail(sl, session); smb_llist_exit(sl); @@ -2505,13 +2518,33 @@ smb_server_create_session(smb_listener_daemon_t *ld, ksocket_t s_so) tqid = taskq_dispatch(sv->sv_receiver_pool, smb_server_receiver, session, TQ_NOQUEUE | TQ_SLEEP); if (tqid == TASKQID_INVALID) { + /* + * We never entered smb_server_receiver() + * so need to do it's return cleanup + */ + DTRACE_PROBE1(maxconn, smb_session_t *, session); smb_session_disconnect(session); + smb_session_logoff(session); smb_server_destroy_session(session); - cmn_err(CE_WARN, "SMB Session: taskq_dispatch failed"); - return; + goto logmaxconn; } - /* handy for debugging */ + + /* Success */ session->s_receiver_tqid = tqid; + return; + +logmaxconn: + /* + * If we hit max_connections, log something so an admin + * can find out why new connections are failing, but + * log this no more than once a minute. + */ + now = ddi_get_lbolt(); + if (now > ld->ld_quiet) { + ld->ld_quiet = now + SEC_TO_TICK(60); + cmn_err(CE_WARN, "SMB can't create session: " + "Would exceed max_connections."); + } } static void diff --git a/usr/src/uts/common/inet/ip.h b/usr/src/uts/common/inet/ip.h index 7687fdd29e..ebf2574363 100644 --- a/usr/src/uts/common/inet/ip.h +++ b/usr/src/uts/common/inet/ip.h @@ -25,6 +25,7 @@ * Copyright 2017 Nexenta Systems, Inc. * Copyright 2017 OmniTI Computer Consulting, Inc. All rights reserved. * Copyright 2019, Joyent, Inc. + * Copyright 2022 Oxide Computer Company */ #ifndef _INET_IP_H @@ -2015,7 +2016,7 @@ enum { IF_CMD = 1, LIF_CMD, ARP_CMD, XARP_CMD, MSFILT_CMD, MISC_CMD }; #define IPI_DONTCARE 0 /* For ioctl encoded values that don't matter */ /* Flag values in ipi_flags */ -#define IPI_PRIV 0x1 /* Root only command */ +#define IPI_PRIV 0x1 /* Command requires PRIV_SYS_IP_CONFIG */ #define IPI_MODOK 0x2 /* Permitted on mod instance of IP */ #define IPI_WR 0x4 /* Need to grab writer access */ #define IPI_GET_CMD 0x8 /* branch to mi_copyout on success */ diff --git a/usr/src/uts/common/smbsrv/smb_ktypes.h b/usr/src/uts/common/smbsrv/smb_ktypes.h index 1b596dbb9f..9d63d4c4b4 100644 --- a/usr/src/uts/common/smbsrv/smb_ktypes.h +++ b/usr/src/uts/common/smbsrv/smb_ktypes.h @@ -20,8 +20,8 @@ */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright 2020 RackTop Systems, Inc. * Copyright 2020 Tintri by DDN, Inc. All rights reserved. + * Copyright 2022 RackTop Systems, Inc. */ /* @@ -2063,6 +2063,7 @@ typedef struct { int ld_family; struct sockaddr_in ld_sin; struct sockaddr_in6 ld_sin6; + clock_t ld_quiet; } smb_listener_daemon_t; #define SMB_SSETUP_CMD "authentication" diff --git a/usr/src/uts/intel/io/vmm/amd/svm.c b/usr/src/uts/intel/io/vmm/amd/svm.c index 993e759fc6..b699d57991 100644 --- a/usr/src/uts/intel/io/vmm/amd/svm.c +++ b/usr/src/uts/intel/io/vmm/amd/svm.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/pcpu.h> #include <sys/proc.h> #include <sys/sysctl.h> @@ -67,7 +67,6 @@ __FBSDID("$FreeBSD$"); #include "vmm_lapic.h" #include "vmm_stat.h" -#include "vmm_ktr.h" #include "vmm_ioport.h" #include "vatpic.h" #include "vlapic.h" @@ -113,9 +112,6 @@ static uint32_t vmcb_clean = VMCB_CACHE_DEFAULT; SYSCTL_INT(_hw_vmm_svm, OID_AUTO, vmcb_clean, CTLFLAG_RDTUN, &vmcb_clean, 0, NULL); -static MALLOC_DEFINE(M_SVM, "svm", "svm"); -static MALLOC_DEFINE(M_SVM_VLAPIC, "svm-vlapic", "svm-vlapic"); - /* SVM features advertised by CPUID.8000000AH:EDX */ static uint32_t svm_feature = ~0U; /* AMD SVM features. */ @@ -275,8 +271,6 @@ svm_set_intercept(struct svm_softc *sc, int vcpu, int idx, uint32_t bitmask, if (ctrl->intercept[idx] != oldval) { svm_set_dirty(sc, vcpu, VMCB_CACHE_I); - VCPU_CTR3(sc->vm, vcpu, "intercept[%d] modified " - "from %x to %x", idx, oldval, ctrl->intercept[idx]); } } @@ -430,16 +424,13 @@ svm_vminit(struct vm *vm) int i; uint16_t maxcpus; - svm_sc = malloc(sizeof (*svm_sc), M_SVM, M_WAITOK | M_ZERO); - if (((uintptr_t)svm_sc & PAGE_MASK) != 0) - panic("malloc of svm_softc not aligned on page boundary"); + svm_sc = kmem_zalloc(sizeof (*svm_sc), KM_SLEEP); + VERIFY3U(((uintptr_t)svm_sc & PAGE_MASK), ==, 0); - svm_sc->msr_bitmap = contigmalloc(SVM_MSR_BITMAP_SIZE, M_SVM, - M_WAITOK, 0, ~(vm_paddr_t)0, PAGE_SIZE, 0); + svm_sc->msr_bitmap = vmm_contig_alloc(SVM_MSR_BITMAP_SIZE); if (svm_sc->msr_bitmap == NULL) panic("contigmalloc of SVM MSR bitmap failed"); - svm_sc->iopm_bitmap = contigmalloc(SVM_IO_BITMAP_SIZE, M_SVM, - M_WAITOK, 0, ~(vm_paddr_t)0, PAGE_SIZE, 0); + svm_sc->iopm_bitmap = vmm_contig_alloc(SVM_IO_BITMAP_SIZE); if (svm_sc->iopm_bitmap == NULL) panic("contigmalloc of SVM IO bitmap failed"); @@ -945,8 +936,6 @@ svm_save_exitintinfo(struct svm_softc *svm_sc, int vcpu) * If a #VMEXIT happened during event delivery then record the event * that was being delivered. */ - VCPU_CTR2(svm_sc->vm, vcpu, "SVM:Pending INTINFO(0x%lx), vector=%d.\n", - intinfo, VMCB_EXITINTINFO_VECTOR(intinfo)); vmm_stat_incr(svm_sc->vm, vcpu, VCPU_EXITINTINFO, 1); /* * Relies on match between VMCB exitintinfo format and bhyve-generic @@ -992,7 +981,6 @@ svm_enable_intr_window_exiting(struct svm_softc *sc, int vcpu) VERIFY((ctrl->eventinj & VMCB_EVENTINJ_VALID) != 0 || (state->rflags & PSL_I) == 0 || ctrl->intr_shadow); - VCPU_CTR0(sc->vm, vcpu, "Enable intr window exiting"); ctrl->v_irq |= V_IRQ; ctrl->v_intr_prio |= V_IGN_TPR; ctrl->v_intr_vector = 0; @@ -1013,7 +1001,6 @@ svm_disable_intr_window_exiting(struct svm_softc *sc, int vcpu) return; } - VCPU_CTR0(sc->vm, vcpu, "Disable intr window exiting"); ctrl->v_irq &= ~V_IRQ; ctrl->v_intr_vector = 0; svm_set_dirty(sc, vcpu, VMCB_CACHE_TPR); @@ -1038,7 +1025,6 @@ svm_clear_nmi_blocking(struct svm_softc *sc, int vcpu) struct vmcb_ctrl *ctrl; KASSERT(svm_nmi_blocked(sc, vcpu), ("vNMI already unblocked")); - VCPU_CTR0(sc->vm, vcpu, "vNMI blocking cleared"); /* * When the IRET intercept is cleared the vcpu will attempt to execute * the "iret" when it runs next. However, it is possible to inject @@ -1498,23 +1484,15 @@ svm_vmexit(struct svm_softc *svm_sc, int vcpu, struct vm_exit *vmexit) case VMCB_EXIT_NPF: /* EXITINFO2 contains the faulting guest physical address */ if (info1 & VMCB_NPF_INFO1_RSV) { - VCPU_CTR2(svm_sc->vm, vcpu, "nested page fault with " - "reserved bits set: info1(%lx) info2(%lx)", - info1, info2); + /* nested fault with reserved bits set */ } else if (vm_mem_allocated(svm_sc->vm, vcpu, info2)) { vmexit->exitcode = VM_EXITCODE_PAGING; vmexit->u.paging.gpa = info2; vmexit->u.paging.fault_type = npf_fault_type(info1); vmm_stat_incr(svm_sc->vm, vcpu, VMEXIT_NESTED_FAULT, 1); - VCPU_CTR3(svm_sc->vm, vcpu, "nested page fault " - "on gpa %lx/%lx at rip %lx", - info2, info1, state->rip); } else if (svm_npf_emul_fault(info1)) { svm_handle_mmio_emul(svm_sc, vcpu, vmexit, info2); vmm_stat_incr(svm_sc->vm, vcpu, VMEXIT_MMIO_EMUL, 1); - VCPU_CTR3(svm_sc->vm, vcpu, "mmio_emul fault " - "for gpa %lx/%lx at rip %lx", - info2, info1, state->rip); } break; case VMCB_EXIT_MONITOR: @@ -2015,11 +1993,9 @@ svm_vmrun(void *arg, int vcpu, uint64_t rip) ctrl->vmcb_clean = vmcb_clean & ~vcpustate->dirty; vcpustate->dirty = 0; - VCPU_CTR1(vm, vcpu, "vmcb clean %x", ctrl->vmcb_clean); /* Launch Virtual Machine. */ vcpu_ustate_change(vm, vcpu, VU_RUN); - VCPU_CTR1(vm, vcpu, "Resume execution at %lx", state->rip); svm_dr_enter_guest(gctx); svm_launch(vmcb_pa, gctx, get_pcpu()); svm_dr_leave_guest(gctx); @@ -2053,9 +2029,9 @@ svm_vmcleanup(void *arg) { struct svm_softc *sc = arg; - contigfree(sc->iopm_bitmap, SVM_IO_BITMAP_SIZE, M_SVM); - contigfree(sc->msr_bitmap, SVM_MSR_BITMAP_SIZE, M_SVM); - free(sc, M_SVM); + vmm_contig_free(sc->iopm_bitmap, SVM_IO_BITMAP_SIZE); + vmm_contig_free(sc->msr_bitmap, SVM_MSR_BITMAP_SIZE); + kmem_free(sc, sizeof (*sc)); } static uint64_t * @@ -2418,8 +2394,7 @@ svm_vlapic_init(void *arg, int vcpuid) struct vlapic *vlapic; svm_sc = arg; - vlapic = malloc(sizeof (struct vlapic), M_SVM_VLAPIC, - M_WAITOK | M_ZERO); + vlapic = kmem_zalloc(sizeof (struct vlapic), KM_SLEEP); vlapic->vm = svm_sc->vm; vlapic->vcpuid = vcpuid; vlapic->apic_page = (struct LAPIC *)&svm_sc->apic_page[vcpuid]; @@ -2433,7 +2408,7 @@ static void svm_vlapic_cleanup(void *arg, struct vlapic *vlapic) { vlapic_cleanup(vlapic); - free(vlapic, M_SVM_VLAPIC); + kmem_free(vlapic, sizeof (struct vlapic)); } static void diff --git a/usr/src/uts/intel/io/vmm/intel/vmx.c b/usr/src/uts/intel/io/vmm/intel/vmx.c index 58d1c8361e..360cec1056 100644 --- a/usr/src/uts/intel/io/vmm/intel/vmx.c +++ b/usr/src/uts/intel/io/vmm/intel/vmx.c @@ -49,7 +49,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/pcpu.h> #include <sys/proc.h> #include <sys/sysctl.h> @@ -77,7 +77,6 @@ __FBSDID("$FreeBSD$"); #include "vmm_lapic.h" #include "vmm_host.h" #include "vmm_ioport.h" -#include "vmm_ktr.h" #include "vmm_stat.h" #include "vatpic.h" #include "vlapic.h" @@ -163,9 +162,6 @@ __FBSDID("$FreeBSD$"); #define HANDLED 1 #define UNHANDLED 0 -static MALLOC_DEFINE(M_VMX, "vmx", "vmx"); -static MALLOC_DEFINE(M_VLAPIC, "vlapic", "vlapic"); - SYSCTL_DECL(_hw_vmm); SYSCTL_NODE(_hw_vmm, OID_AUTO, vmx, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, NULL); @@ -695,13 +691,10 @@ vmx_vminit(struct vm *vm) uint32_t proc_ctls, proc2_ctls, pin_ctls; uint64_t apic_access_pa = UINT64_MAX; - vmx = malloc(sizeof (struct vmx), M_VMX, M_WAITOK | M_ZERO); - if ((uintptr_t)vmx & PAGE_MASK) { - panic("malloc of struct vmx not aligned on %d byte boundary", - PAGE_SIZE); - } - vmx->vm = vm; + vmx = kmem_zalloc(sizeof (struct vmx), KM_SLEEP); + VERIFY3U((uintptr_t)vmx & PAGE_MASK, ==, 0); + vmx->vm = vm; vmx->eptp = vmspace_table_root(vm_get_vmspace(vm)); /* @@ -1053,23 +1046,22 @@ CTASSERT((PROCBASED_CTLS_ONE_SETTING & PROCBASED_INT_WINDOW_EXITING) != 0); static __inline void vmx_set_int_window_exiting(struct vmx *vmx, int vcpu) { - if ((vmx->cap[vcpu].proc_ctls & PROCBASED_INT_WINDOW_EXITING) == 0) { + /* Enable interrupt window exiting */ vmx->cap[vcpu].proc_ctls |= PROCBASED_INT_WINDOW_EXITING; vmcs_write(VMCS_PRI_PROC_BASED_CTLS, vmx->cap[vcpu].proc_ctls); - VCPU_CTR0(vmx->vm, vcpu, "Enabling interrupt window exiting"); } } static __inline void vmx_clear_int_window_exiting(struct vmx *vmx, int vcpu) { - KASSERT((vmx->cap[vcpu].proc_ctls & PROCBASED_INT_WINDOW_EXITING) != 0, ("intr_window_exiting not set: %x", vmx->cap[vcpu].proc_ctls)); + + /* Disable interrupt window exiting */ vmx->cap[vcpu].proc_ctls &= ~PROCBASED_INT_WINDOW_EXITING; vmcs_write(VMCS_PRI_PROC_BASED_CTLS, vmx->cap[vcpu].proc_ctls); - VCPU_CTR0(vmx->vm, vcpu, "Disabling interrupt window exiting"); } static __inline bool @@ -1341,10 +1333,6 @@ vmx_inject_vlapic(struct vmx *vmx, int vcpu, struct vlapic *vlapic) */ if (status_new > status_old) { vmcs_write(VMCS_GUEST_INTR_STATUS, status_new); - VCPU_CTR2(vlapic->vm, vlapic->vcpuid, - "vmx_inject_interrupts: guest_intr_status " - "changed from 0x%04x to 0x%04x", - status_old, status_new); } /* @@ -1433,7 +1421,6 @@ vmx_restore_nmi_blocking(struct vmx *vmx, int vcpuid) { uint32_t gi; - VCPU_CTR0(vmx->vm, vcpuid, "Restore Virtual-NMI blocking"); gi = vmcs_read(VMCS_GUEST_INTERRUPTIBILITY); gi |= VMCS_INTERRUPTIBILITY_NMI_BLOCKING; vmcs_write(VMCS_GUEST_INTERRUPTIBILITY, gi); @@ -1444,7 +1431,6 @@ vmx_clear_nmi_blocking(struct vmx *vmx, int vcpuid) { uint32_t gi; - VCPU_CTR0(vmx->vm, vcpuid, "Clear Virtual-NMI blocking"); gi = vmcs_read(VMCS_GUEST_INTERRUPTIBILITY); gi &= ~VMCS_INTERRUPTIBILITY_NMI_BLOCKING; vmcs_write(VMCS_GUEST_INTERRUPTIBILITY, gi); @@ -2182,7 +2168,6 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) * as most VM-exit fields are not populated as usual. */ if (reason == EXIT_REASON_MCE_DURING_ENTRY) { - VCPU_CTR0(vmx->vm, vcpu, "Handling MCE during VM-entry"); vmm_call_trap(T_MCE); return (1); } @@ -2276,10 +2261,6 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) } vmexit->exitcode = VM_EXITCODE_TASK_SWITCH; SDT_PROBE4(vmm, vmx, exit, taskswitch, vmx, vcpu, vmexit, ts); - VCPU_CTR4(vmx->vm, vcpu, "task switch reason %d, tss 0x%04x, " - "%s errcode 0x%016lx", ts->reason, ts->tsssel, - ts->ext ? "external" : "internal", - ((uint64_t)ts->errcode << 32) | ts->errcode_valid); break; case EXIT_REASON_CR_ACCESS: vmm_stat_incr(vmx->vm, vcpu, VMEXIT_CR_ACCESS, 1); @@ -2407,7 +2388,6 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) * the machine check back into the guest. */ if (intr_vec == IDT_MC) { - VCPU_CTR0(vmx->vm, vcpu, "Vectoring to MCE handler"); vmm_call_trap(T_MCE); return (1); } @@ -2444,8 +2424,6 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) errcode_valid = 1; errcode = vmcs_read(VMCS_EXIT_INTR_ERRCODE); } - VCPU_CTR2(vmx->vm, vcpu, "Reflecting exception %d/%x into " - "the guest", intr_vec, errcode); SDT_PROBE5(vmm, vmx, exit, exception, vmx, vcpu, vmexit, intr_vec, errcode); error = vm_inject_exception(vmx->vm, vcpu, intr_vec, @@ -2924,9 +2902,6 @@ vmx_run(void *arg, int vcpu, uint64_t rip) vmexit->exitcode); } - VCPU_CTR1(vm, vcpu, "returning from vmx_run: exitcode %d", - vmexit->exitcode); - vmcs_clear(vmcs_pa); vmx_msr_guest_exit(vmx, vcpu); @@ -2956,7 +2931,7 @@ vmx_vmcleanup(void *arg) for (i = 0; i < maxcpus; i++) vpid_free(vmx->state[i].vpid); - free(vmx, M_VMX); + kmem_free(vmx, sizeof (*vmx)); } static uint64_t * @@ -3020,7 +2995,7 @@ vmx_getreg(void *arg, int vcpu, int reg, uint64_t *retval) running = vcpu_is_running(vmx->vm, vcpu, &hostcpu); if (running && hostcpu != curcpu) - panic("vmx_getreg: %s%d is running", vm_name(vmx->vm), vcpu); + panic("vmx_getreg: %d is running", vcpu); /* VMCS access not required for ctx reads */ if ((regp = vmxctx_regptr(&vmx->ctx[vcpu], reg)) != NULL) { @@ -3076,7 +3051,7 @@ vmx_setreg(void *arg, int vcpu, int reg, uint64_t val) running = vcpu_is_running(vmx->vm, vcpu, &hostcpu); if (running && hostcpu != curcpu) - panic("vmx_setreg: %s%d is running", vm_name(vmx->vm), vcpu); + panic("vmx_setreg: %d is running", vcpu); /* VMCS access not required for ctx writes */ if ((regp = vmxctx_regptr(&vmx->ctx[vcpu], reg)) != NULL) { @@ -3182,7 +3157,7 @@ vmx_getdesc(void *arg, int vcpu, int seg, struct seg_desc *desc) running = vcpu_is_running(vmx->vm, vcpu, &hostcpu); if (running && hostcpu != curcpu) - panic("vmx_getdesc: %s%d is running", vm_name(vmx->vm), vcpu); + panic("vmx_getdesc: %d is running", vcpu); if (!running) { vmcs_load(vmx->vmcs_pa[vcpu]); @@ -3212,7 +3187,7 @@ vmx_setdesc(void *arg, int vcpu, int seg, const struct seg_desc *desc) running = vcpu_is_running(vmx->vm, vcpu, &hostcpu); if (running && hostcpu != curcpu) - panic("vmx_setdesc: %s%d is running", vm_name(vmx->vm), vcpu); + panic("vmx_setdesc: %d is running", vcpu); if (!running) { vmcs_load(vmx->vmcs_pa[vcpu]); @@ -3647,22 +3622,19 @@ vmx_tpr_shadow_exit(struct vlapic *vlapic) static struct vlapic * vmx_vlapic_init(void *arg, int vcpuid) { - struct vmx *vmx; - struct vlapic *vlapic; + struct vmx *vmx = arg; struct vlapic_vtx *vlapic_vtx; + struct vlapic *vlapic; - vmx = arg; + vlapic_vtx = kmem_zalloc(sizeof (struct vlapic_vtx), KM_SLEEP); + vlapic_vtx->pir_desc = &vmx->pir_desc[vcpuid]; + vlapic_vtx->vmx = vmx; - vlapic = malloc(sizeof (struct vlapic_vtx), M_VLAPIC, - M_WAITOK | M_ZERO); + vlapic = &vlapic_vtx->vlapic; vlapic->vm = vmx->vm; vlapic->vcpuid = vcpuid; vlapic->apic_page = (struct LAPIC *)&vmx->apic_page[vcpuid]; - vlapic_vtx = (struct vlapic_vtx *)vlapic; - vlapic_vtx->pir_desc = &vmx->pir_desc[vcpuid]; - vlapic_vtx->vmx = vmx; - if (vmx_cap_en(vmx, VMX_CAP_TPR_SHADOW)) { vlapic->ops.enable_x2apic_mode = vmx_enable_x2apic_mode_ts; } @@ -3685,9 +3657,8 @@ vmx_vlapic_init(void *arg, int vcpuid) static void vmx_vlapic_cleanup(void *arg, struct vlapic *vlapic) { - vlapic_cleanup(vlapic); - free(vlapic, M_VLAPIC); + kmem_free(vlapic, sizeof (struct vlapic_vtx)); } static void diff --git a/usr/src/uts/intel/io/vmm/intel/vtd.c b/usr/src/uts/intel/io/vmm/intel/vtd.c index d32143aa07..6f5e6626c8 100644 --- a/usr/src/uts/intel/io/vmm/intel/vtd.c +++ b/usr/src/uts/intel/io/vmm/intel/vtd.c @@ -34,7 +34,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/kernel.h> #include <sys/systm.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <dev/pci/pcireg.h> @@ -131,8 +131,6 @@ static dev_info_t *vtddips[DRHD_MAX_UNITS]; static uint64_t root_table[PAGE_SIZE / sizeof (uint64_t)] __aligned(4096); static uint64_t ctx_tables[256][PAGE_SIZE / sizeof (uint64_t)] __aligned(4096); -static MALLOC_DEFINE(M_VTD, "vtd", "vtd"); - static int vtd_max_domains(struct vtdmap *vtdmap) { @@ -666,7 +664,7 @@ vtd_update_mapping(void *arg, vm_paddr_t gpa, vm_paddr_t hpa, uint64_t len, * to it from the current page table. */ if (ptp[ptpindex] == 0) { - void *nlp = malloc(PAGE_SIZE, M_VTD, M_WAITOK | M_ZERO); + void *nlp = vmm_ptp_alloc(); ptp[ptpindex] = vtophys(nlp)| VTD_PTE_RD | VTD_PTE_WR; } @@ -779,12 +777,12 @@ vtd_create_domain(vm_paddr_t maxaddr) tmp, agaw); } - dom = malloc(sizeof (struct domain), M_VTD, M_ZERO | M_WAITOK); + dom = kmem_zalloc(sizeof (struct domain), KM_SLEEP); dom->pt_levels = pt_levels; dom->addrwidth = addrwidth; dom->id = domain_id(); dom->maxaddr = maxaddr; - dom->ptp = malloc(PAGE_SIZE, M_VTD, M_ZERO | M_WAITOK); + dom->ptp = vmm_ptp_alloc(); if ((uintptr_t)dom->ptp & PAGE_MASK) panic("vtd_create_domain: ptp (%p) not page aligned", dom->ptp); @@ -846,8 +844,7 @@ vtd_free_ptp(uint64_t *ptp, int level) } } - bzero(ptp, PAGE_SIZE); - free(ptp, M_VTD); + vmm_ptp_free(ptp); } static void @@ -859,7 +856,7 @@ vtd_destroy_domain(void *arg) SLIST_REMOVE(&domhead, dom, domain, next); vtd_free_ptp(dom->ptp, dom->pt_levels); - free(dom, M_VTD); + kmem_free(dom, sizeof (*dom)); } const struct iommu_ops iommu_ops_intel = { diff --git a/usr/src/uts/intel/io/vmm/io/iommu.h b/usr/src/uts/intel/io/vmm/io/iommu.h index a5e9448b4e..0d1c4b1ee2 100644 --- a/usr/src/uts/intel/io/vmm/io/iommu.h +++ b/usr/src/uts/intel/io/vmm/io/iommu.h @@ -73,4 +73,9 @@ void iommu_remove_mapping(void *dom, vm_paddr_t gpa, size_t len); void iommu_add_device(void *dom, uint16_t rid); void iommu_remove_device(void *dom, uint16_t rid); void iommu_invalidate_tlb(void *domain); + +/* Glue functions used by iommu provider(s) */ +void *vmm_ptp_alloc(void); +void vmm_ptp_free(void *); + #endif diff --git a/usr/src/uts/intel/io/vmm/io/ppt.c b/usr/src/uts/intel/io/vmm/io/ppt.c index 75a29fa17a..3492603d38 100644 --- a/usr/src/uts/intel/io/vmm/io/ppt.c +++ b/usr/src/uts/intel/io/vmm/io/ppt.c @@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/module.h> #include <sys/bus.h> #include <sys/pciio.h> @@ -63,7 +63,6 @@ __FBSDID("$FreeBSD$"); #include <sys/sysmacros.h> #include "vmm_lapic.h" -#include "vmm_ktr.h" #include "iommu.h" #include "ppt.h" diff --git a/usr/src/uts/intel/io/vmm/io/vatpic.c b/usr/src/uts/intel/io/vmm/io/vatpic.c index 43e332d70d..2b4dc81b12 100644 --- a/usr/src/uts/intel/io/vmm/io/vatpic.c +++ b/usr/src/uts/intel/io/vmm/io/vatpic.c @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #include <sys/types.h> #include <sys/queue.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/mutex.h> #include <sys/systm.h> @@ -54,13 +54,10 @@ __FBSDID("$FreeBSD$"); #include <machine/vmm.h> -#include "vmm_ktr.h" #include "vmm_lapic.h" #include "vioapic.h" #include "vatpic.h" -static MALLOC_DEFINE(M_VATPIC, "atpic", "bhyve virtual atpic (8259)"); - #define VATPIC_LOCK(vatpic) mutex_enter(&((vatpic)->lock)) #define VATPIC_UNLOCK(vatpic) mutex_exit(&((vatpic)->lock)) #define VATPIC_LOCKED(vatpic) MUTEX_HELD(&((vatpic)->lock)) @@ -115,21 +112,6 @@ struct vatpic { struct atpic_stats stats; }; -#define VATPIC_CTR0(vatpic, fmt) \ - VM_CTR0((vatpic)->vm, fmt) - -#define VATPIC_CTR1(vatpic, fmt, a1) \ - VM_CTR1((vatpic)->vm, fmt, a1) - -#define VATPIC_CTR2(vatpic, fmt, a1, a2) \ - VM_CTR2((vatpic)->vm, fmt, a1, a2) - -#define VATPIC_CTR3(vatpic, fmt, a1, a2, a3) \ - VM_CTR3((vatpic)->vm, fmt, a1, a2, a3) - -#define VATPIC_CTR4(vatpic, fmt, a1, a2, a3, a4) \ - VM_CTR4((vatpic)->vm, fmt, a1, a2, a3, a4) - /* * Loop over all the pins in priority order from highest to lowest. */ @@ -235,10 +217,6 @@ vatpic_notify_intr(struct vatpic *vatpic) atpic = &vatpic->atpic[1]; if (!atpic->intr_raised && (pin = vatpic_get_highest_irrpin(atpic)) != -1) { - VATPIC_CTR4(vatpic, "atpic slave notify pin = %d " - "(imr 0x%x irr 0x%x isr 0x%x)", pin, - atpic->reg_imr, atpic->reg_irr, atpic->reg_isr); - /* * Cascade the request from the slave to the master. */ @@ -247,9 +225,7 @@ vatpic_notify_intr(struct vatpic *vatpic) (void) vatpic_set_pinstate(vatpic, 2, false); } } else { - VATPIC_CTR3(vatpic, "atpic slave no eligible interrupts " - "(imr 0x%x irr 0x%x isr 0x%x)", - atpic->reg_imr, atpic->reg_irr, atpic->reg_isr); + /* No eligible interrupts on slave chip */ } /* @@ -258,10 +234,6 @@ vatpic_notify_intr(struct vatpic *vatpic) atpic = &vatpic->atpic[0]; if (!atpic->intr_raised && (pin = vatpic_get_highest_irrpin(atpic)) != -1) { - VATPIC_CTR4(vatpic, "atpic master notify pin = %d " - "(imr 0x%x irr 0x%x isr 0x%x)", pin, - atpic->reg_imr, atpic->reg_irr, atpic->reg_isr); - /* * From Section 3.6.2, "Interrupt Modes", in the * MPtable Specification, Version 1.4 @@ -292,9 +264,7 @@ vatpic_notify_intr(struct vatpic *vatpic) (void) vioapic_pulse_irq(vatpic->vm, 0); vatpic->stats.as_interrupts++; } else { - VATPIC_CTR3(vatpic, "atpic master no eligible interrupts " - "(imr 0x%x irr 0x%x isr 0x%x)", - atpic->reg_imr, atpic->reg_irr, atpic->reg_isr); + /* No eligible interrupts on master chip */ } } @@ -312,12 +282,12 @@ vatpic_icw1(struct vatpic *vatpic, struct atpic *atpic, uint8_t val) atpic->special_mask_mode = false; if ((val & ICW1_SNGL) != 0) { - VATPIC_CTR0(vatpic, "vatpic cascade mode required"); + /* Cascade mode reqired */ return (-1); } if ((val & ICW1_IC4) == 0) { - VATPIC_CTR0(vatpic, "vatpic icw4 required"); + /* ICW4 reqired */ return (-1); } @@ -347,7 +317,7 @@ static int vatpic_icw4(struct vatpic *vatpic, struct atpic *atpic, uint8_t val) { if ((val & ICW4_8086) == 0) { - VATPIC_CTR0(vatpic, "vatpic microprocessor mode required"); + /* Microprocessor mode required */ return (-1); } @@ -809,7 +779,7 @@ vatpic_init(struct vm *vm) { struct vatpic *vatpic; - vatpic = malloc(sizeof (struct vatpic), M_VATPIC, M_WAITOK | M_ZERO); + vatpic = kmem_zalloc(sizeof (struct vatpic), KM_SLEEP); vatpic->vm = vm; mutex_init(&vatpic->lock, NULL, MUTEX_ADAPTIVE, NULL); @@ -821,5 +791,5 @@ void vatpic_cleanup(struct vatpic *vatpic) { mutex_destroy(&vatpic->lock); - free(vatpic, M_VATPIC); + kmem_free(vatpic, sizeof (*vatpic)); } diff --git a/usr/src/uts/intel/io/vmm/io/vatpit.c b/usr/src/uts/intel/io/vmm/io/vatpit.c index 3d66932a3a..9bf6c01ff4 100644 --- a/usr/src/uts/intel/io/vmm/io/vatpit.c +++ b/usr/src/uts/intel/io/vmm/io/vatpit.c @@ -34,19 +34,16 @@ __FBSDID("$FreeBSD$"); #include <sys/types.h> #include <sys/queue.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/mutex.h> #include <sys/systm.h> #include <machine/vmm.h> -#include "vmm_ktr.h" #include "vatpic.h" #include "vioapic.h" #include "vatpit.h" -static MALLOC_DEFINE(M_VATPIT, "atpit", "bhyve virtual atpit (8254)"); - #define VATPIT_LOCK(vatpit) mutex_enter(&((vatpit)->lock)) #define VATPIT_UNLOCK(vatpit) mutex_exit(&((vatpit)->lock)) @@ -147,8 +144,6 @@ vatpit_callout_handler(void *a) c = &vatpit->channel[arg->channel_num]; callout = &c->callout; - VM_CTR1(vatpit->vm, "atpit t%d fired", arg->channel_num); - VATPIT_LOCK(vatpit); if (callout_pending(callout)) /* callout was reset */ @@ -348,7 +343,7 @@ vatpit_handler(void *arg, bool in, uint16_t port, uint8_t bytes, uint32_t *eax) if (port == TIMER_MODE) { if (in) { - VM_CTR0(vatpit->vm, "vatpit attempt to read mode"); + /* Mode is write-only */ return (-1); } @@ -450,7 +445,7 @@ vatpit_init(struct vm *vm) struct vatpit_callout_arg *arg; int i; - vatpit = malloc(sizeof (struct vatpit), M_VATPIT, M_WAITOK | M_ZERO); + vatpit = kmem_zalloc(sizeof (struct vatpit), KM_SLEEP); vatpit->vm = vm; mutex_init(&vatpit->lock, NULL, MUTEX_ADAPTIVE, NULL); @@ -474,7 +469,7 @@ vatpit_cleanup(struct vatpit *vatpit) callout_drain(&vatpit->channel[i].callout); mutex_destroy(&vatpit->lock); - free(vatpit, M_VATPIT); + kmem_free(vatpit, sizeof (*vatpit)); } void diff --git a/usr/src/uts/intel/io/vmm/io/vhpet.c b/usr/src/uts/intel/io/vmm/io/vhpet.c index 423280a32e..cab4f54458 100644 --- a/usr/src/uts/intel/io/vmm/io/vhpet.c +++ b/usr/src/uts/intel/io/vmm/io/vhpet.c @@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/mutex.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/systm.h> #include <dev/acpica/acpi_hpet.h> @@ -52,9 +52,6 @@ __FBSDID("$FreeBSD$"); #include "vioapic.h" #include "vhpet.h" -#include "vmm_ktr.h" - -static MALLOC_DEFINE(M_VHPET, "vhpet", "bhyve virtual hpet"); #define HPET_FREQ 16777216 /* 16.7 (2^24) Mhz */ #define FS_PER_S 1000000000000000ul @@ -224,7 +221,6 @@ vhpet_timer_interrupt(struct vhpet *vhpet, int n) * If a level triggered interrupt is already asserted then just return. */ if ((vhpet->isr & (1 << n)) != 0) { - VM_CTR1(vhpet->vm, "hpet t%d intr is already asserted", n); return; } @@ -236,7 +232,7 @@ vhpet_timer_interrupt(struct vhpet *vhpet, int n) pin = vhpet_timer_ioapic_pin(vhpet, n); if (pin == 0) { - VM_CTR1(vhpet->vm, "hpet t%d intr is not routed to ioapic", n); + /* Interrupt is not routed to IOAPIC */ return; } @@ -289,8 +285,6 @@ vhpet_handler(void *a) n = arg->timer_num; callout = &vhpet->timer[n].callout; - VM_CTR1(vhpet->vm, "hpet t%d fired", n); - VHPET_LOCK(vhpet); if (callout_pending(callout)) /* callout was reset */ @@ -314,8 +308,6 @@ done: static void vhpet_stop_timer(struct vhpet *vhpet, int n, hrtime_t now) { - - VM_CTR1(vhpet->vm, "hpet t%d stopped", n); callout_stop(&vhpet->timer[n].callout); /* @@ -326,8 +318,6 @@ vhpet_stop_timer(struct vhpet *vhpet, int n, hrtime_t now) * the next interrupt has to wait for the counter to wrap around. */ if (vhpet->timer[n].callout_expire < now) { - VM_CTR1(vhpet->vm, "hpet t%d interrupt triggered after " - "stopping timer", n); vhpet_timer_interrupt(vhpet, n); } } @@ -415,7 +405,6 @@ vhpet_timer_update_config(struct vhpet *vhpet, int n, uint64_t data, return; vhpet->timer[n].cap_config = newval; - VM_CTR2(vhpet->vm, "hpet t%d cap_config set to 0x%016x", n, newval); /* * Validate the interrupt routing in the HPET_TCNF_INT_ROUTE field. @@ -425,8 +414,7 @@ vhpet_timer_update_config(struct vhpet *vhpet, int n, uint64_t data, allowed_irqs = vhpet->timer[n].cap_config >> 32; new_pin = vhpet_timer_ioapic_pin(vhpet, n); if (new_pin != 0 && (allowed_irqs & (1 << new_pin)) == 0) { - VM_CTR3(vhpet->vm, "hpet t%d configured invalid irq %d, " - "allowed_irqs 0x%08x", n, new_pin, allowed_irqs); + /* Invalid IRQ configured */ new_pin = 0; vhpet->timer[n].cap_config &= ~HPET_TCNF_INT_ROUTE; } @@ -458,8 +446,6 @@ vhpet_timer_update_config(struct vhpet *vhpet, int n, uint64_t data, clear_isr = false; if (clear_isr) { - VM_CTR1(vhpet->vm, "hpet t%d isr cleared due to " - "configuration change", n); (void) vioapic_deassert_irq(vhpet->vm, old_pin); vhpet->isr &= ~(1 << n); } @@ -496,15 +482,12 @@ vhpet_mmio_write(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t val, } break; default: - VM_CTR2(vhpet->vm, "hpet invalid mmio write: " - "offset 0x%08x, size %d", offset, size); + /* Invalid MMIO write */ goto done; } /* Access to the HPET should be naturally aligned to its width */ if (offset & (size - 1)) { - VM_CTR2(vhpet->vm, "hpet invalid mmio write: " - "offset 0x%08x, size %d", offset, size); goto done; } @@ -528,10 +511,8 @@ vhpet_mmio_write(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t val, if ((oldval ^ vhpet->config) & HPET_CNF_ENABLE) { if (vhpet_counter_enabled(vhpet)) { vhpet_start_counting(vhpet); - VM_CTR0(vhpet->vm, "hpet enabled"); } else { vhpet_stop_counting(vhpet, counter, now); - VM_CTR0(vhpet->vm, "hpet disabled"); } } goto done; @@ -541,7 +522,6 @@ vhpet_mmio_write(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t val, isr_clear_mask = vhpet->isr & data; for (i = 0; i < VHPET_NUM_TIMERS; i++) { if ((isr_clear_mask & (1 << i)) != 0) { - VM_CTR1(vhpet->vm, "hpet t%d isr cleared", i); vhpet_timer_clear_isr(vhpet, i); } } @@ -630,16 +610,12 @@ vhpet_mmio_read(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t *rval, /* Accesses to the HPET should be 4 or 8 bytes wide */ if (size != 4 && size != 8) { - VM_CTR2(vhpet->vm, "hpet invalid mmio read: " - "offset 0x%08x, size %d", offset, size); data = 0; goto done; } /* Access to the HPET should be naturally aligned to its width */ if (offset & (size - 1)) { - VM_CTR2(vhpet->vm, "hpet invalid mmio read: " - "offset 0x%08x, size %d", offset, size); data = 0; goto done; } @@ -705,7 +681,7 @@ vhpet_init(struct vm *vm) uint64_t allowed_irqs; struct vhpet_callout_arg *arg; - vhpet = malloc(sizeof (struct vhpet), M_VHPET, M_WAITOK | M_ZERO); + vhpet = kmem_zalloc(sizeof (struct vhpet), KM_SLEEP); vhpet->vm = vm; mutex_init(&vhpet->lock, NULL, MUTEX_ADAPTIVE, NULL); @@ -745,7 +721,7 @@ vhpet_cleanup(struct vhpet *vhpet) callout_drain(&vhpet->timer[i].callout); mutex_destroy(&vhpet->lock); - free(vhpet, M_VHPET); + kmem_free(vhpet, sizeof (*vhpet)); } int diff --git a/usr/src/uts/intel/io/vmm/io/vioapic.c b/usr/src/uts/intel/io/vmm/io/vioapic.c index 90dedb9ac1..8222fd33e3 100644 --- a/usr/src/uts/intel/io/vmm/io/vioapic.c +++ b/usr/src/uts/intel/io/vmm/io/vioapic.c @@ -51,13 +51,12 @@ __FBSDID("$FreeBSD$"); #include <sys/mutex.h> #include <sys/systm.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/cpuset.h> #include <x86/apicreg.h> #include <machine/vmm.h> -#include "vmm_ktr.h" #include "vmm_lapic.h" #include "vlapic.h" #include "vioapic.h" @@ -96,19 +95,6 @@ struct vioapic { #define VIOAPIC_UNLOCK(vioapic) mutex_exit(&((vioapic)->lock)) #define VIOAPIC_LOCKED(vioapic) MUTEX_HELD(&((vioapic)->lock)) -static MALLOC_DEFINE(M_VIOAPIC, "vioapic", "bhyve virtual ioapic"); - -#define VIOAPIC_CTR1(vioapic, fmt, a1) \ - VM_CTR1((vioapic)->vm, fmt, a1) - -#define VIOAPIC_CTR2(vioapic, fmt, a1, a2) \ - VM_CTR2((vioapic)->vm, fmt, a1, a2) - -#define VIOAPIC_CTR3(vioapic, fmt, a1, a2, a3) \ - VM_CTR3((vioapic)->vm, fmt, a1, a2, a3) - -#define VIOAPIC_CTR4(vioapic, fmt, a1, a2, a3, a4) \ - VM_CTR4((vioapic)->vm, fmt, a1, a2, a3, a4) static void vioapic_send_intr(struct vioapic *vioapic, int pin) @@ -124,7 +110,7 @@ vioapic_send_intr(struct vioapic *vioapic, int pin) high = vioapic->rtbl[pin].reg >> 32; if ((low & IOART_INTMASK) == IOART_INTMSET) { - VIOAPIC_CTR1(vioapic, "ioapic pin%d: masked", pin); + /* Pin is masked */ return; } @@ -133,8 +119,7 @@ vioapic_send_intr(struct vioapic *vioapic, int pin) level = low & IOART_TRGRLVL ? true : false; if (level) { if ((low & IOART_REM_IRR) != 0) { - VIOAPIC_CTR1(vioapic, "ioapic pin%d: irr pending", - pin); + /* IRR already pending */ return; } vioapic->rtbl[pin].reg |= IOART_REM_IRR; @@ -331,9 +316,6 @@ vioapic_write(struct vioapic *vioapic, int vcpuid, uint32_t addr, uint32_t data) (vioapic->rtbl[pin].reg & IOART_REM_IRR) != 0) vioapic->rtbl[pin].reg &= ~IOART_REM_IRR; - VIOAPIC_CTR2(vioapic, "ioapic pin%d: redir table entry %#lx", - pin, vioapic->rtbl[pin].reg); - /* * Generate an interrupt if the following conditions are met: * - pin trigger mode is level @@ -341,8 +323,6 @@ vioapic_write(struct vioapic *vioapic, int vcpuid, uint32_t addr, uint32_t data) */ if ((vioapic->rtbl[pin].reg & IOART_TRGRMOD) == IOART_TRGRLVL && (vioapic->rtbl[pin].acnt > 0)) { - VIOAPIC_CTR2(vioapic, "ioapic pin%d: asserted at rtbl " - "write, acnt %d", pin, vioapic->rtbl[pin].acnt); vioapic_send_intr(vioapic, pin); } } @@ -420,7 +400,6 @@ vioapic_process_eoi(struct vm *vm, int vcpuid, int vector) ("vioapic_process_eoi: invalid vector %d", vector)); vioapic = vm_ioapic(vm); - VIOAPIC_CTR1(vioapic, "ioapic processing eoi for vector %d", vector); /* * XXX keep track of the pins associated with this vector instead @@ -434,8 +413,7 @@ vioapic_process_eoi(struct vm *vm, int vcpuid, int vector) continue; vioapic->rtbl[pin].reg &= ~IOART_REM_IRR; if (vioapic->rtbl[pin].acnt > 0) { - VIOAPIC_CTR2(vioapic, "ioapic pin%d: asserted at eoi, " - "acnt %d", pin, vioapic->rtbl[pin].acnt); + /* Pin asserted at EOI */ vioapic_send_intr(vioapic, pin); } } @@ -448,7 +426,7 @@ vioapic_init(struct vm *vm) int i; struct vioapic *vioapic; - vioapic = malloc(sizeof (struct vioapic), M_VIOAPIC, M_WAITOK | M_ZERO); + vioapic = kmem_zalloc(sizeof (struct vioapic), KM_SLEEP); vioapic->vm = vm; mutex_init(&vioapic->lock, NULL, MUTEX_ADAPTIVE, NULL); @@ -464,7 +442,7 @@ void vioapic_cleanup(struct vioapic *vioapic) { mutex_destroy(&vioapic->lock); - free(vioapic, M_VIOAPIC); + kmem_free(vioapic, sizeof (*vioapic)); } int diff --git a/usr/src/uts/intel/io/vmm/io/vlapic.c b/usr/src/uts/intel/io/vmm/io/vlapic.c index ef7a876c0c..50964a9c4c 100644 --- a/usr/src/uts/intel/io/vmm/io/vlapic.c +++ b/usr/src/uts/intel/io/vmm/io/vlapic.c @@ -48,7 +48,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/mutex.h> #include <sys/systm.h> #include <sys/cpuset.h> @@ -62,7 +62,6 @@ __FBSDID("$FreeBSD$"); #include <sys/vmm_kernel.h> #include "vmm_lapic.h" -#include "vmm_ktr.h" #include "vmm_stat.h" #include "vlapic.h" @@ -163,8 +162,7 @@ vlapic_dfr_write_handler(struct vlapic *vlapic) lapic = vlapic->apic_page; if (vlapic_x2mode(vlapic)) { - VM_CTR1(vlapic->vm, "ignoring write to DFR in x2apic mode: %#x", - lapic->dfr); + /* Ignore write to DFR in x2APIC mode */ lapic->dfr = 0; return; } @@ -182,12 +180,10 @@ vlapic_ldr_write_handler(struct vlapic *vlapic) /* LDR is read-only in x2apic mode */ if (vlapic_x2mode(vlapic)) { - VLAPIC_CTR1(vlapic, "ignoring write to LDR in x2apic mode: %#x", - lapic->ldr); + /* Ignore write to LDR in x2APIC mode */ lapic->ldr = x2apic_ldr(vlapic); } else { lapic->ldr &= ~APIC_LDR_RESERVED; - VLAPIC_CTR1(vlapic, "vlapic LDR set to %#x", lapic->ldr); } } @@ -263,8 +259,6 @@ vlapic_get_ccr(struct vlapic *vlapic) } KASSERT(ccr <= lapic->icr_timer, ("vlapic_get_ccr: invalid ccr %x, " "icr_timer is %x", ccr, lapic->icr_timer)); - VLAPIC_CTR2(vlapic, "vlapic ccr_timer = %#x, icr_timer = %#x", - ccr, lapic->icr_timer); VLAPIC_TIMER_UNLOCK(vlapic); return (ccr); } @@ -279,8 +273,6 @@ vlapic_dcr_write_handler(struct vlapic *vlapic) VLAPIC_TIMER_LOCK(vlapic); divisor = vlapic_timer_divisor(lapic->dcr_timer); - VLAPIC_CTR2(vlapic, "vlapic dcr_timer=%#x, divisor=%d", - lapic->dcr_timer, divisor); /* * Update the timer frequency and the timer period. @@ -574,7 +566,6 @@ vlapic_update_ppr(struct vlapic *vlapic) } vlapic->apic_page->ppr = ppr; - VLAPIC_CTR1(vlapic, "vlapic_update_ppr 0x%02x", ppr); } /* @@ -598,7 +589,6 @@ vlapic_raise_ppr(struct vlapic *vlapic, int vec) #endif /* __ISRVEC_DEBUG */ lapic->ppr = ppr; - VLAPIC_CTR1(vlapic, "vlapic_update_ppr 0x%02x", ppr); } void @@ -627,9 +617,6 @@ vlapic_process_eoi(struct vlapic *vlapic) vector = i * 32 + bitpos; isrptr[idx] &= ~(1 << bitpos); - VCPU_CTR1(vlapic->vm, vlapic->vcpuid, "EOI vector %d", - vector); - VLAPIC_CTR_ISR(vlapic, "vlapic_process_eoi"); #ifdef __ISRVEC_DEBUG vlapic_isrstk_eoi(vlapic, vector); #endif @@ -641,7 +628,6 @@ vlapic_process_eoi(struct vlapic *vlapic) return; } } - VCPU_CTR0(vlapic->vm, vlapic->vcpuid, "Gratuitous EOI"); vmm_stat_incr(vlapic->vm, vlapic->vcpuid, VLAPIC_GRATUITOUS_EOI, 1); } @@ -690,7 +676,6 @@ vlapic_fire_timer(struct vlapic *vlapic) ASSERT(VLAPIC_TIMER_LOCKED(vlapic)); if (vlapic_fire_lvt(vlapic, APIC_LVT_TIMER)) { - VLAPIC_CTR0(vlapic, "vlapic timer fired"); vmm_stat_incr(vlapic->vm, vlapic->vcpuid, VLAPIC_INTR_TIMER, 1); } } @@ -908,8 +893,6 @@ vlapic_calcdest(struct vm *vm, cpuset_t *dmask, uint32_t dest, bool phys, * Guest has configured a bad logical * model for this vcpu - skip it. */ - VLAPIC_CTR1(vlapic, "vlapic has bad logical " - "model %x - cannot deliver interrupt", dfr); continue; } @@ -931,8 +914,6 @@ vlapic_set_tpr(struct vlapic *vlapic, uint8_t val) struct LAPIC *lapic = vlapic->apic_page; if (lapic->tpr != val) { - VCPU_CTR2(vlapic->vm, vlapic->vcpuid, "vlapic TPR changed " - "from %#x to %#x", lapic->tpr, val); lapic->tpr = val; vlapic_update_ppr(vlapic); } @@ -1067,7 +1048,6 @@ vlapic_self_ipi_handler(struct vlapic *vlapic, uint32_t val) (void) lapic_intr_edge(vlapic->vm, vlapic->vcpuid, vec); vmm_stat_incr(vlapic->vm, vlapic->vcpuid, VLAPIC_IPI_SEND, 1); vmm_stat_incr(vlapic->vm, vlapic->vcpuid, VLAPIC_IPI_RECV, 1); - VLAPIC_CTR1(vlapic, "vlapic self-ipi %d", vec); } int @@ -1090,7 +1070,6 @@ vlapic_pending_intr(struct vlapic *vlapic, int *vecptr) if (bitpos != 0) { vector = i * 32 + (bitpos - 1); if (PRIO(vector) > PRIO(lapic->ppr)) { - VLAPIC_CTR1(vlapic, "pending intr %d", vector); if (vecptr != NULL) *vecptr = vector; return (1); @@ -1121,11 +1100,9 @@ vlapic_intr_accepted(struct vlapic *vlapic, int vector) irrptr = &lapic->irr0; atomic_clear_int(&irrptr[idx], 1 << (vector % 32)); - VLAPIC_CTR_IRR(vlapic, "vlapic_intr_accepted"); isrptr = &lapic->isr0; isrptr[idx] |= 1 << (vector % 32); - VLAPIC_CTR_ISR(vlapic, "vlapic_intr_accepted"); /* * The only way a fresh vector could be accepted into ISR is if it was @@ -1158,7 +1135,6 @@ vlapic_svr_write_handler(struct vlapic *vlapic) * The apic is now disabled so stop the apic timer * and mask all the LVT entries. */ - VLAPIC_CTR0(vlapic, "vlapic is software-disabled"); VLAPIC_TIMER_LOCK(vlapic); callout_stop(&vlapic->callout); VLAPIC_TIMER_UNLOCK(vlapic); @@ -1168,7 +1144,6 @@ vlapic_svr_write_handler(struct vlapic *vlapic) * The apic is now enabled so restart the apic timer * if it is configured in periodic mode. */ - VLAPIC_CTR0(vlapic, "vlapic is software-enabled"); if (vlapic_periodic_timer(vlapic)) vlapic_icrtmr_write_handler(vlapic); } @@ -1704,7 +1679,7 @@ vlapic_deliver_intr(struct vm *vm, bool level, uint32_t dest, bool phys, if (delmode != IOART_DELFIXED && delmode != IOART_DELLOPRI && delmode != IOART_DELEXINT) { - VM_CTR1(vm, "vlapic intr invalid delmode %#x", delmode); + /* Invalid delivery mode */ return; } lowprio = (delmode == IOART_DELLOPRI); diff --git a/usr/src/uts/intel/io/vmm/io/vlapic_priv.h b/usr/src/uts/intel/io/vmm/io/vlapic_priv.h index 7b12b60f51..abe1271fcc 100644 --- a/usr/src/uts/intel/io/vmm/io/vlapic_priv.h +++ b/usr/src/uts/intel/io/vmm/io/vlapic_priv.h @@ -97,46 +97,6 @@ #define APIC_OFFSET_TIMER_DCR 0x3E0 /* Timer's Divide Configuration */ #define APIC_OFFSET_SELF_IPI 0x3F0 /* Self IPI register */ -#define VLAPIC_CTR0(vlapic, format) \ - VCPU_CTR0((vlapic)->vm, (vlapic)->vcpuid, format) - -#define VLAPIC_CTR1(vlapic, format, p1) \ - VCPU_CTR1((vlapic)->vm, (vlapic)->vcpuid, format, p1) - -#define VLAPIC_CTR2(vlapic, format, p1, p2) \ - VCPU_CTR2((vlapic)->vm, (vlapic)->vcpuid, format, p1, p2) - -#define VLAPIC_CTR3(vlapic, format, p1, p2, p3) \ - VCPU_CTR3((vlapic)->vm, (vlapic)->vcpuid, format, p1, p2, p3) - -#define VLAPIC_CTR_IRR(vlapic, msg) \ -do { \ - uint32_t *irrptr = &(vlapic)->apic_page->irr0; \ - irrptr[0] = irrptr[0]; /* silence compiler */ \ - VLAPIC_CTR1((vlapic), msg " irr0 0x%08x", irrptr[0 << 2]); \ - VLAPIC_CTR1((vlapic), msg " irr1 0x%08x", irrptr[1 << 2]); \ - VLAPIC_CTR1((vlapic), msg " irr2 0x%08x", irrptr[2 << 2]); \ - VLAPIC_CTR1((vlapic), msg " irr3 0x%08x", irrptr[3 << 2]); \ - VLAPIC_CTR1((vlapic), msg " irr4 0x%08x", irrptr[4 << 2]); \ - VLAPIC_CTR1((vlapic), msg " irr5 0x%08x", irrptr[5 << 2]); \ - VLAPIC_CTR1((vlapic), msg " irr6 0x%08x", irrptr[6 << 2]); \ - VLAPIC_CTR1((vlapic), msg " irr7 0x%08x", irrptr[7 << 2]); \ -} while (0) - -#define VLAPIC_CTR_ISR(vlapic, msg) \ -do { \ - uint32_t *isrptr = &(vlapic)->apic_page->isr0; \ - isrptr[0] = isrptr[0]; /* silence compiler */ \ - VLAPIC_CTR1((vlapic), msg " isr0 0x%08x", isrptr[0 << 2]); \ - VLAPIC_CTR1((vlapic), msg " isr1 0x%08x", isrptr[1 << 2]); \ - VLAPIC_CTR1((vlapic), msg " isr2 0x%08x", isrptr[2 << 2]); \ - VLAPIC_CTR1((vlapic), msg " isr3 0x%08x", isrptr[3 << 2]); \ - VLAPIC_CTR1((vlapic), msg " isr4 0x%08x", isrptr[4 << 2]); \ - VLAPIC_CTR1((vlapic), msg " isr5 0x%08x", isrptr[5 << 2]); \ - VLAPIC_CTR1((vlapic), msg " isr6 0x%08x", isrptr[6 << 2]); \ - VLAPIC_CTR1((vlapic), msg " isr7 0x%08x", isrptr[7 << 2]); \ -} while (0) - /* * 16 priority levels with at most one vector injected per level. */ diff --git a/usr/src/uts/intel/io/vmm/io/vpmtmr.c b/usr/src/uts/intel/io/vmm/io/vpmtmr.c index 9a7d7d4253..930aa2d237 100644 --- a/usr/src/uts/intel/io/vmm/io/vpmtmr.c +++ b/usr/src/uts/intel/io/vmm/io/vpmtmr.c @@ -44,7 +44,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/queue.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/systm.h> #include <machine/vmm.h> @@ -67,14 +67,12 @@ struct vpmtmr { hrtime_t base_time; }; -static MALLOC_DEFINE(M_VPMTMR, "vpmtmr", "bhyve virtual acpi timer"); - struct vpmtmr * vpmtmr_init(struct vm *vm) { struct vpmtmr *vpmtmr; - vpmtmr = malloc(sizeof (struct vpmtmr), M_VPMTMR, M_WAITOK | M_ZERO); + vpmtmr = kmem_zalloc(sizeof (struct vpmtmr), KM_SLEEP); vpmtmr->vm = vm; vpmtmr->base_time = gethrtime(); @@ -111,7 +109,7 @@ vpmtmr_cleanup(struct vpmtmr *vpmtmr) err = vpmtmr_detach_ioport(vpmtmr); VERIFY3P(err, ==, 0); - free(vpmtmr, M_VPMTMR); + kmem_free(vpmtmr, sizeof (*vpmtmr)); } int diff --git a/usr/src/uts/intel/io/vmm/io/vrtc.c b/usr/src/uts/intel/io/vmm/io/vrtc.c index e01fabfa68..4c74cd7922 100644 --- a/usr/src/uts/intel/io/vmm/io/vrtc.c +++ b/usr/src/uts/intel/io/vmm/io/vrtc.c @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$"); #include <sys/systm.h> #include <sys/queue.h> #include <sys/kernel.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/mutex.h> #include <sys/clock.h> #include <sys/sysctl.h> @@ -46,7 +46,6 @@ __FBSDID("$FreeBSD$"); #include <isa/rtc.h> -#include "vmm_ktr.h" #include "vatpic.h" #include "vioapic.h" #include "vrtc.h" @@ -106,8 +105,6 @@ struct vrtc { static void vrtc_callout_handler(void *arg); static void vrtc_set_reg_c(struct vrtc *vrtc, uint8_t newval); -static MALLOC_DEFINE(M_VRTC, "vrtc", "bhyve virtual rtc"); - SYSCTL_DECL(_hw_vmm); SYSCTL_NODE(_hw_vmm, OID_AUTO, vrtc, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, NULL); @@ -403,8 +400,6 @@ vrtc_time_update(struct vrtc *vrtc, time_t newtime, hrtime_t newbase) alarm_hour = rtc->alarm_hour; oldtime = vrtc->base_rtctime; - VM_CTR2(vrtc->vm, "Updating RTC secs from %lx to %lx", - oldtime, newtime); vrtc->base_uptime = newbase; @@ -425,7 +420,6 @@ vrtc_time_update(struct vrtc *vrtc, time_t newtime, hrtime_t newbase) * Return an error if RTC updates are halted by the guest. */ if (rtc_halted(vrtc)) { - VM_CTR0(vrtc->vm, "RTC update halted by guest"); return (EBUSY); } @@ -514,12 +508,10 @@ vrtc_callout_reset(struct vrtc *vrtc, hrtime_t freqhrt) if (freqhrt == 0) { if (callout_active(&vrtc->callout)) { - VM_CTR0(vrtc->vm, "RTC callout stopped"); callout_stop(&vrtc->callout); } return; } - VM_CTR1(vrtc->vm, "RTC callout frequency %d hz", NANOSEC / freqhrt); callout_reset_hrtime(&vrtc->callout, freqhrt, vrtc_callout_handler, vrtc, 0); } @@ -531,7 +523,6 @@ vrtc_callout_handler(void *arg) time_t rtctime; int error; - VM_CTR0(vrtc->vm, "vrtc callout fired"); VRTC_LOCK(vrtc); if (callout_pending(&vrtc->callout)) /* callout was reset */ @@ -580,7 +571,6 @@ vrtc_set_reg_c(struct vrtc *vrtc, uint8_t newval) { struct rtcdev *rtc; int oldirqf, newirqf; - uint8_t oldval, changed; ASSERT(VRTC_LOCKED(vrtc)); @@ -596,20 +586,14 @@ vrtc_set_reg_c(struct vrtc *vrtc, uint8_t newval) newirqf = 0; } - oldval = rtc->reg_c; rtc->reg_c = newirqf | newval; - changed = oldval ^ rtc->reg_c; - if (changed) { - VM_CTR2(vrtc->vm, "RTC reg_c changed from %x to %x", - oldval, rtc->reg_c); - } if (!oldirqf && newirqf) { - VM_CTR1(vrtc->vm, "RTC irq %d asserted", RTC_IRQ); + /* IRQ asserted */ (void) vatpic_pulse_irq(vrtc->vm, RTC_IRQ); (void) vioapic_pulse_irq(vrtc->vm, RTC_IRQ); } else if (oldirqf && !newirqf) { - VM_CTR1(vrtc->vm, "RTC irq %d deasserted", RTC_IRQ); + /* IRQ de-asserted */ } } @@ -630,10 +614,6 @@ vrtc_set_reg_b(struct vrtc *vrtc, uint8_t newval) rtc->reg_b = newval; changed = oldval ^ newval; - if (changed) { - VM_CTR2(vrtc->vm, "RTC reg_b changed from %x to %x", - oldval, newval); - } if (changed & RTCSB_HALT) { hrtime_t basetime; @@ -695,7 +675,7 @@ static void vrtc_set_reg_a(struct vrtc *vrtc, uint8_t newval) { hrtime_t oldfreq, newfreq; - uint8_t oldval, changed; + uint8_t oldval; ASSERT(VRTC_LOCKED(vrtc)); @@ -704,8 +684,7 @@ vrtc_set_reg_a(struct vrtc *vrtc, uint8_t newval) oldfreq = vrtc_freq(vrtc); if (divider_enabled(oldval) && !divider_enabled(newval)) { - VM_CTR2(vrtc->vm, "RTC divider held in reset at %lx/%lx", - vrtc->base_rtctime, vrtc->base_uptime); + /* RTC divider held in reset */ } else if (!divider_enabled(oldval) && divider_enabled(newval)) { /* * If the dividers are coming out of reset then update @@ -714,18 +693,11 @@ vrtc_set_reg_a(struct vrtc *vrtc, uint8_t newval) * while the dividers were disabled. */ vrtc->base_uptime = gethrtime(); - VM_CTR2(vrtc->vm, "RTC divider out of reset at %lx/%lx", - vrtc->base_rtctime, vrtc->base_uptime); } else { /* NOTHING */ } vrtc->rtcdev.reg_a = newval; - changed = oldval ^ newval; - if (changed) { - VM_CTR2(vrtc->vm, "RTC reg_a changed from %x to %x", - oldval, newval); - } /* * Side effect of changes to rate select and divider enable bits. @@ -748,13 +720,6 @@ vrtc_set_time(struct vm *vm, time_t secs) error = vrtc_time_update(vrtc, secs, gethrtime()); VRTC_UNLOCK(vrtc); - if (error) { - VM_CTR2(vrtc->vm, "Error %d setting RTC time to %lx", error, - secs); - } else { - VM_CTR1(vrtc->vm, "RTC time set to %lx", secs); - } - return (error); } @@ -785,15 +750,13 @@ vrtc_nvram_write(struct vm *vm, int offset, uint8_t value) */ if (offset < offsetof(struct rtcdev, nvram[0]) || offset == RTC_CENTURY || offset >= sizeof (struct rtcdev)) { - VM_CTR1(vrtc->vm, "RTC nvram write to invalid offset %d", - offset); + /* NVRAM write to invalid offset */ return (EINVAL); } VRTC_LOCK(vrtc); ptr = (uint8_t *)(&vrtc->rtcdev); ptr[offset] = value; - VM_CTR2(vrtc->vm, "RTC nvram write %x to offset %x", value, offset); VRTC_UNLOCK(vrtc); return (0); @@ -897,25 +860,19 @@ vrtc_data_handler(void *arg, bool in, uint16_t port, uint8_t bytes, } else { *val = *((uint8_t *)rtc + offset); } - VM_CTR2(vm, "Read value %x from RTC offset %x", - *val, offset); } else { switch (offset) { case 10: - VM_CTR1(vm, "RTC reg_a set to %x", *val); vrtc_set_reg_a(vrtc, *val); break; case 11: - VM_CTR1(vm, "RTC reg_b set to %x", *val); error = vrtc_set_reg_b(vrtc, *val); break; case 12: - VM_CTR1(vm, "RTC reg_c set to %x (ignored)", - *val); + /* Ignored write to reg_c */ break; case 13: - VM_CTR1(vm, "RTC reg_d set to %x (ignored)", - *val); + /* Ignored write to reg_d */ break; case 0: /* @@ -924,7 +881,6 @@ vrtc_data_handler(void *arg, bool in, uint16_t port, uint8_t bytes, *val &= 0x7f; /* FALLTHRU */ default: - VM_CTR2(vm, "RTC offset %x set to %x", offset, *val); *((uint8_t *)rtc + offset) = *val; break; } @@ -969,7 +925,7 @@ vrtc_init(struct vm *vm) time_t curtime; int error; - vrtc = malloc(sizeof (struct vrtc), M_VRTC, M_WAITOK | M_ZERO); + vrtc = kmem_zalloc(sizeof (struct vrtc), KM_SLEEP); vrtc->vm = vm; mutex_init(&vrtc->lock, NULL, MUTEX_ADAPTIVE, NULL); callout_init(&vrtc->callout, 1); @@ -1004,7 +960,7 @@ vrtc_cleanup(struct vrtc *vrtc) { callout_drain(&vrtc->callout); mutex_destroy(&vrtc->lock); - free(vrtc, M_VRTC); + kmem_free(vrtc, sizeof (*vrtc)); } void diff --git a/usr/src/uts/intel/io/vmm/sys/vmm_kernel.h b/usr/src/uts/intel/io/vmm/sys/vmm_kernel.h index ed6fe1c814..29e90e3a1e 100644 --- a/usr/src/uts/intel/io/vmm/sys/vmm_kernel.h +++ b/usr/src/uts/intel/io/vmm/sys/vmm_kernel.h @@ -111,10 +111,9 @@ struct vmm_ops { extern struct vmm_ops vmm_ops_intel; extern struct vmm_ops vmm_ops_amd; -int vm_create(const char *name, uint64_t flags, struct vm **retvm); +int vm_create(uint64_t flags, struct vm **retvm); void vm_destroy(struct vm *vm); int vm_reinit(struct vm *vm, uint64_t); -const char *vm_name(struct vm *vm); uint16_t vm_get_maxcpus(struct vm *vm); void vm_get_topology(struct vm *vm, uint16_t *sockets, uint16_t *cores, uint16_t *threads, uint16_t *maxcpus); @@ -378,6 +377,9 @@ typedef enum vm_msr_result { void vmm_sol_glue_init(void); void vmm_sol_glue_cleanup(void); +void *vmm_contig_alloc(size_t); +void vmm_contig_free(void *, size_t); + int vmm_mod_load(void); int vmm_mod_unload(void); diff --git a/usr/src/uts/intel/io/vmm/vmm.c b/usr/src/uts/intel/io/vmm/vmm.c index db87dfbbf4..800ae4d8ee 100644 --- a/usr/src/uts/intel/io/vmm/vmm.c +++ b/usr/src/uts/intel/io/vmm/vmm.c @@ -51,7 +51,7 @@ __FBSDID("$FreeBSD$"); #include <sys/kernel.h> #include <sys/module.h> #include <sys/sysctl.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/pcpu.h> #include <sys/mutex.h> #include <sys/proc.h> @@ -74,7 +74,6 @@ __FBSDID("$FreeBSD$"); #include <sys/vmm_gpt.h> #include "vmm_ioport.h" -#include "vmm_ktr.h" #include "vmm_host.h" #include "vmm_util.h" #include "vatpic.h" @@ -206,7 +205,6 @@ struct vm { struct mem_map mem_maps[VM_MAX_MEMMAPS]; /* (i) guest address space */ struct mem_seg mem_segs[VM_MAX_MEMSEGS]; /* (o) guest memory regions */ struct vmspace *vmspace; /* (o) guest's address space */ - char name[VM_MAX_NAMELEN]; /* (o) virtual machine name */ struct vcpu vcpu[VM_MAXCPU]; /* (i) guest vcpus */ /* The following describe the vm cpu topology */ uint16_t sockets; /* (o) num of sockets */ @@ -274,8 +272,6 @@ static vmm_pte_ops_t *pte_ops = NULL; SDT_PROVIDER_DEFINE(vmm); -static MALLOC_DEFINE(M_VM, "vm", "vm"); - SYSCTL_NODE(_hw, OID_AUTO, vmm, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, NULL); @@ -522,7 +518,7 @@ uint_t threads_per_core = 1; bool gpt_track_dirty = false; int -vm_create(const char *name, uint64_t flags, struct vm **retvm) +vm_create(uint64_t flags, struct vm **retvm) { struct vm *vm; struct vmspace *vmspace; @@ -534,15 +530,11 @@ vm_create(const char *name, uint64_t flags, struct vm **retvm) if (!vmm_initialized) return (ENXIO); - /* Name validation has already occurred */ - VERIFY3U(strnlen(name, VM_MAX_NAMELEN), <, VM_MAX_NAMELEN); - vmspace = vmspace_alloc(VM_MAXUSER_ADDRESS, pte_ops, gpt_track_dirty); if (vmspace == NULL) return (ENOMEM); - vm = malloc(sizeof (struct vm), M_VM, M_WAITOK | M_ZERO); - (void) strlcpy(vm->name, name, sizeof (vm->name)); + vm = kmem_zalloc(sizeof (struct vm), KM_SLEEP); vm->vmspace = vmspace; vm->mem_transient = (flags & VCF_RESERVOIR_MEM) == 0; @@ -663,7 +655,7 @@ void vm_destroy(struct vm *vm) { vm_cleanup(vm, true); - free(vm, M_VM); + kmem_free(vm, sizeof (*vm)); } int @@ -705,12 +697,6 @@ vm_reinit(struct vm *vm, uint64_t flags) return (0); } -const char * -vm_name(struct vm *vm) -{ - return (vm->name); -} - int vm_map_mmio(struct vm *vm, vm_paddr_t gpa, size_t len, vm_paddr_t hpa) { @@ -1127,7 +1113,6 @@ vm_set_register(struct vm *vm, int vcpuid, int reg, uint64_t val) return (error); /* Set 'nextrip' to match the value of %rip */ - VCPU_CTR1(vm, vcpuid, "Setting nextrip to %lx", val); vcpu = &vm->vcpu[vcpuid]; vcpu->nextrip = val; return (0); @@ -1340,8 +1325,6 @@ vcpu_set_state_locked(struct vm *vm, int vcpuid, enum vcpu_state newstate, while (vcpu->state != VCPU_IDLE) { vcpu->reqidle = 1; vcpu_notify_event_locked(vcpu, VCPU_NOTIFY_EXIT); - VCPU_CTR1(vm, vcpuid, "vcpu state change from %s to " - "idle requested", vcpu_state2str(vcpu->state)); cv_wait(&vcpu->state_cv, &vcpu->lock); } } else { @@ -1380,9 +1363,6 @@ vcpu_set_state_locked(struct vm *vm, int vcpuid, enum vcpu_state newstate, if (error) return (EBUSY); - VCPU_CTR2(vm, vcpuid, "vcpu state changed from %s to %s", - vcpu_state2str(vcpu->state), vcpu_state2str(newstate)); - vcpu->state = newstate; if (newstate == VCPU_RUNNING) vcpu->hostcpu = curcpu; @@ -1511,9 +1491,6 @@ vm_handle_paging(struct vm *vm, int vcpuid) rv = vmc_fault(vmc, vme->u.paging.gpa, ftype); - VCPU_CTR3(vm, vcpuid, "vm_handle_paging rv = %d, gpa = %lx, " - "ftype = %d", rv, vme->u.paging.gpa, ftype); - if (rv != 0) return (EFAULT); return (0); @@ -1576,9 +1553,6 @@ vm_handle_mmio_emul(struct vm *vm, int vcpuid) inst_addr = vme->rip + vme->u.mmio_emul.cs_base; cs_d = vme->u.mmio_emul.cs_d; - VCPU_CTR1(vm, vcpuid, "inst_emul fault accessing gpa %lx", - vme->u.mmio_emul.gpa); - /* Fetch the faulting instruction */ if (vie_needs_fetch(vie)) { error = vie_fetch_instruction(vie, vm, vcpuid, inst_addr, @@ -1597,8 +1571,6 @@ vm_handle_mmio_emul(struct vm *vm, int vcpuid) } if (vie_decode_instruction(vie, vm, vcpuid, cs_d) != 0) { - VCPU_CTR1(vm, vcpuid, "Error decoding instruction at %lx", - inst_addr); /* Dump (unrecognized) instruction bytes in userspace */ vie_fallback_exitinfo(vie, vme); return (-1); @@ -1765,7 +1737,6 @@ vm_handle_suspend(struct vm *vm, int vcpuid) int rc; if (CPU_CMP(&vm->suspended_cpus, &vm->active_cpus) == 0) { - VCPU_CTR0(vm, vcpuid, "All vcpus suspended"); break; } @@ -2435,8 +2406,6 @@ exit: vmm_savectx(&vcpu->vtc); kpreempt_enable(); - VCPU_CTR2(vm, vcpuid, "retu %d/%d", error, vme->exitcode); - vcpu_ustate_change(vm, vcpuid, VU_EMU_USER); return (error); } @@ -2464,8 +2433,6 @@ vm_restart_instruction(void *arg, int vcpuid) * instruction to be restarted. */ vcpu->exitinfo.inst_length = 0; - VCPU_CTR1(vm, vcpuid, "restarting instruction at %lx by " - "setting inst_length to zero", vcpu->exitinfo.rip); } else if (state == VCPU_FROZEN) { /* * When a vcpu is "frozen" it is outside the critical section @@ -2475,8 +2442,6 @@ vm_restart_instruction(void *arg, int vcpuid) */ error = vm_get_register(vm, vcpuid, VM_REG_GUEST_RIP, &rip); KASSERT(!error, ("%s: error %d getting rip", __func__, error)); - VCPU_CTR2(vm, vcpuid, "restarting instruction by updating " - "nextrip from %lx to %lx", vcpu->nextrip, rip); vcpu->nextrip = rip; } else { panic("%s: invalid state %d", __func__, state); @@ -3125,7 +3090,6 @@ vm_activate_cpu(struct vm *vm, int vcpuid) return (EBUSY); } - VCPU_CTR0(vm, vcpuid, "activated"); CPU_SET_ATOMIC(vcpuid, &vm->active_cpus); /* diff --git a/usr/src/uts/intel/io/vmm/vmm_gpt.c b/usr/src/uts/intel/io/vmm/vmm_gpt.c index 586b994d56..a542dba055 100644 --- a/usr/src/uts/intel/io/vmm/vmm_gpt.c +++ b/usr/src/uts/intel/io/vmm/vmm_gpt.c @@ -15,7 +15,6 @@ */ #include <sys/types.h> -#include <sys/malloc.h> #include <sys/atomic.h> #include <sys/kmem.h> #include <sys/sysmacros.h> diff --git a/usr/src/uts/intel/io/vmm/vmm_instruction_emul.c b/usr/src/uts/intel/io/vmm/vmm_instruction_emul.c index a71fa63cc4..6f2380d170 100644 --- a/usr/src/uts/intel/io/vmm/vmm_instruction_emul.c +++ b/usr/src/uts/intel/io/vmm/vmm_instruction_emul.c @@ -62,7 +62,6 @@ __FBSDID("$FreeBSD$"); #include <x86/specialreg.h> #include "vmm_ioport.h" -#include "vmm_ktr.h" enum vie_status { VIES_INIT = (1U << 0), diff --git a/usr/src/uts/intel/io/vmm/vmm_ktr.h b/usr/src/uts/intel/io/vmm/vmm_ktr.h deleted file mode 100644 index 2e706ffc57..0000000000 --- a/usr/src/uts/intel/io/vmm/vmm_ktr.h +++ /dev/null @@ -1,72 +0,0 @@ -/*- - * SPDX-License-Identifier: BSD-2-Clause-FreeBSD - * - * Copyright (c) 2011 NetApp, Inc. - * 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 NETAPP, INC ``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 NETAPP, INC 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$ - */ - -#ifndef _VMM_KTR_H_ -#define _VMM_KTR_H_ - -#include <sys/ktr.h> -#include <sys/pcpu.h> - -#ifndef KTR_VMM -#define KTR_VMM KTR_GEN -#endif - -#define VCPU_CTR0(vm, vcpuid, format) \ - CTR2(KTR_VMM, "vm %s[%d]: " format, vm_name((vm)), (vcpuid)) - -#define VCPU_CTR1(vm, vcpuid, format, p1) \ - CTR3(KTR_VMM, "vm %s[%d]: " format, vm_name((vm)), (vcpuid), (p1)) - -#define VCPU_CTR2(vm, vcpuid, format, p1, p2) \ - CTR4(KTR_VMM, "vm %s[%d]: " format, vm_name((vm)), (vcpuid), (p1), (p2)) - -#define VCPU_CTR3(vm, vcpuid, format, p1, p2, p3) \ - CTR5(KTR_VMM, "vm %s[%d]: " format, vm_name((vm)), (vcpuid), \ - (p1), (p2), (p3)) - -#define VCPU_CTR4(vm, vcpuid, format, p1, p2, p3, p4) \ - CTR6(KTR_VMM, "vm %s[%d]: " format, vm_name((vm)), (vcpuid), \ - (p1), (p2), (p3), (p4)) - -#define VM_CTR0(vm, format) \ - CTR1(KTR_VMM, "vm %s: " format, vm_name((vm))) - -#define VM_CTR1(vm, format, p1) \ - CTR2(KTR_VMM, "vm %s: " format, vm_name((vm)), (p1)) - -#define VM_CTR2(vm, format, p1, p2) \ - CTR3(KTR_VMM, "vm %s: " format, vm_name((vm)), (p1), (p2)) - -#define VM_CTR3(vm, format, p1, p2, p3) \ - CTR4(KTR_VMM, "vm %s: " format, vm_name((vm)), (p1), (p2), (p3)) - -#define VM_CTR4(vm, format, p1, p2, p3, p4) \ - CTR5(KTR_VMM, "vm %s: " format, vm_name((vm)), (p1), (p2), (p3), (p4)) -#endif diff --git a/usr/src/uts/intel/io/vmm/vmm_lapic.c b/usr/src/uts/intel/io/vmm/vmm_lapic.c index 8ef1c851d0..bf97e18d2c 100644 --- a/usr/src/uts/intel/io/vmm/vmm_lapic.c +++ b/usr/src/uts/intel/io/vmm/vmm_lapic.c @@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$"); #include <x86/apicreg.h> #include <machine/vmm.h> -#include "vmm_ktr.h" #include "vmm_lapic.h" #include "vlapic.h" @@ -120,10 +119,8 @@ lapic_intr_msi(struct vm *vm, uint64_t addr, uint64_t msg) uint32_t dest; bool phys; - VM_CTR2(vm, "lapic MSI addr: %#lx msg: %#lx", addr, msg); - if ((addr & MSI_X86_ADDR_MASK) != MSI_X86_ADDR_BASE) { - VM_CTR1(vm, "lapic MSI invalid addr %#lx", addr); + /* Invalid MSI address */ return (-1); } @@ -143,9 +140,6 @@ lapic_intr_msi(struct vm *vm, uint64_t addr, uint64_t msg) delmode = msg & APIC_DELMODE_MASK; vec = msg & 0xff; - VM_CTR3(vm, "lapic MSI %s dest %#x, vec %d", - phys ? "physical" : "logical", dest, vec); - vlapic_deliver_intr(vm, LAPIC_TRIG_EDGE, dest, phys, delmode, vec); return (0); } diff --git a/usr/src/uts/intel/io/vmm/vmm_sol_dev.c b/usr/src/uts/intel/io/vmm/vmm_sol_dev.c index c8fd8b9aa4..bf57cba26f 100644 --- a/usr/src/uts/intel/io/vmm/vmm_sol_dev.c +++ b/usr/src/uts/intel/io/vmm/vmm_sol_dev.c @@ -1665,7 +1665,7 @@ vmmdev_do_vm_create(const struct vm_create_req *req, cred_t *cr) goto fail; } - error = vm_create(req->name, req->flags, &sc->vmm_vm); + error = vm_create(req->flags, &sc->vmm_vm); if (error == 0) { /* Complete VM intialization and report success. */ (void) strlcpy(sc->vmm_name, name, sizeof (sc->vmm_name)); diff --git a/usr/src/uts/intel/io/vmm/vmm_sol_glue.c b/usr/src/uts/intel/io/vmm/vmm_sol_glue.c index 81c3ea0ea9..6e3173581f 100644 --- a/usr/src/uts/intel/io/vmm/vmm_sol_glue.c +++ b/usr/src/uts/intel/io/vmm/vmm_sol_glue.c @@ -44,7 +44,7 @@ #include <sys/archsystm.h> #include <sys/cpuset.h> #include <sys/fp.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <sys/queue.h> #include <sys/spl.h> #include <sys/systm.h> @@ -146,138 +146,117 @@ cpusetobj_ffs(const cpuset_t *set) return (small + 1); } -struct kmem_item { - void *addr; - size_t size; +struct vmm_ptp_item { + void *vpi_vaddr; }; -static kmutex_t kmem_items_lock; +static kmutex_t vmm_ptp_lock; -static mod_hash_t *vmm_alloc_hash; -uint_t vmm_alloc_hash_nchains = 16381; -uint_t vmm_alloc_hash_size = PAGESIZE; +static mod_hash_t *vmm_ptp_hash; +uint_t vmm_ptp_hash_nchains = 16381; +uint_t vmm_ptp_hash_size = PAGESIZE; static void -vmm_alloc_hash_valdtor(mod_hash_val_t val) +vmm_ptp_hash_valdtor(mod_hash_val_t val) { - struct kmem_item *i = (struct kmem_item *)val; + struct vmm_ptp_item *i = (struct vmm_ptp_item *)val; - kmem_free(i->addr, i->size); - kmem_free(i, sizeof (struct kmem_item)); + kmem_free(i->vpi_vaddr, PAGE_SIZE); + kmem_free(i, sizeof (*i)); } static void -vmm_alloc_init(void) +vmm_ptp_init(void) { - vmm_alloc_hash = mod_hash_create_ptrhash("vmm_alloc_hash", - vmm_alloc_hash_nchains, vmm_alloc_hash_valdtor, - vmm_alloc_hash_size); + vmm_ptp_hash = mod_hash_create_ptrhash("vmm_ptp_hash", + vmm_ptp_hash_nchains, vmm_ptp_hash_valdtor, vmm_ptp_hash_size); - VERIFY(vmm_alloc_hash != NULL); + VERIFY(vmm_ptp_hash != NULL); } static uint_t -vmm_alloc_check(mod_hash_key_t key, mod_hash_val_t *val, void *unused) +vmm_ptp_check(mod_hash_key_t key, mod_hash_val_t *val, void *unused) { - struct kmem_item *i = (struct kmem_item *)val; + struct vmm_ptp_item *i = (struct vmm_ptp_item *)val; - cmn_err(CE_PANIC, "!vmm_alloc_check: hash not empty: %p, %lu", i->addr, - i->size); + cmn_err(CE_PANIC, "!vmm_ptp_check: hash not empty: %p", i->vpi_vaddr); return (MH_WALK_TERMINATE); } static void -vmm_alloc_cleanup(void) +vmm_ptp_cleanup(void) { - mod_hash_walk(vmm_alloc_hash, vmm_alloc_check, NULL); - mod_hash_destroy_ptrhash(vmm_alloc_hash); + mod_hash_walk(vmm_ptp_hash, vmm_ptp_check, NULL); + mod_hash_destroy_ptrhash(vmm_ptp_hash); } +/* + * The logic in VT-d uses both kernel-virtual and direct-mapped addresses when + * freeing PTP pages. Until the consuming code is improved to better track the + * pages it allocates, we keep the kernel-virtual addresses to those pages in a + * hash table for when they are freed. + */ void * -malloc(unsigned long size, struct malloc_type *mtp, int flags) +vmm_ptp_alloc(void) { - void *p; - struct kmem_item *i; - int kmem_flag = KM_SLEEP; + void *p; + struct vmm_ptp_item *i; - if (flags & M_NOWAIT) - kmem_flag = KM_NOSLEEP; - - if (flags & M_ZERO) { - p = kmem_zalloc(size, kmem_flag); - } else { - p = kmem_alloc(size, kmem_flag); - } + p = kmem_zalloc(PAGE_SIZE, KM_SLEEP); + i = kmem_alloc(sizeof (struct vmm_ptp_item), KM_SLEEP); + i->vpi_vaddr = p; - if (p == NULL) - return (NULL); - - i = kmem_zalloc(sizeof (struct kmem_item), kmem_flag); - - if (i == NULL) { - kmem_free(p, size); - return (NULL); - } - - mutex_enter(&kmem_items_lock); - i->addr = p; - i->size = size; - - VERIFY(mod_hash_insert(vmm_alloc_hash, + mutex_enter(&vmm_ptp_lock); + VERIFY(mod_hash_insert(vmm_ptp_hash, (mod_hash_key_t)PHYS_TO_DMAP(vtophys(p)), (mod_hash_val_t)i) == 0); - - mutex_exit(&kmem_items_lock); + mutex_exit(&vmm_ptp_lock); return (p); } void -free(void *addr, struct malloc_type *mtp) +vmm_ptp_free(void *addr) { - mutex_enter(&kmem_items_lock); - VERIFY(mod_hash_destroy(vmm_alloc_hash, + mutex_enter(&vmm_ptp_lock); + VERIFY(mod_hash_destroy(vmm_ptp_hash, (mod_hash_key_t)PHYS_TO_DMAP(vtophys(addr))) == 0); - mutex_exit(&kmem_items_lock); + mutex_exit(&vmm_ptp_lock); } +/* Reach into i86pc/os/ddi_impl.c for these */ extern void *contig_alloc(size_t, ddi_dma_attr_t *, uintptr_t, int); extern void contig_free(void *, size_t); void * -contigmalloc(unsigned long size, struct malloc_type *type, int flags, - vm_paddr_t low, vm_paddr_t high, unsigned long alignment, - vm_paddr_t boundary) +vmm_contig_alloc(size_t size) { ddi_dma_attr_t attr = { /* Using fastboot_dma_attr as a guide... */ - DMA_ATTR_V0, - low, /* dma_attr_addr_lo */ - high, /* dma_attr_addr_hi */ - 0x00000000FFFFFFFFULL, /* dma_attr_count_max */ - alignment, /* dma_attr_align */ - 1, /* dma_attr_burstsize */ - 1, /* dma_attr_minxfer */ - 0x00000000FFFFFFFFULL, /* dma_attr_maxxfer */ - 0x00000000FFFFFFFFULL, /* dma_attr_seg: any */ - 1, /* dma_attr_sgllen */ - alignment, /* dma_attr_granular */ - 0, /* dma_attr_flags */ + .dma_attr_version = DMA_ATTR_V0, + .dma_attr_addr_lo = 0, + .dma_attr_addr_hi = ~0UL, + .dma_attr_count_max = 0x00000000FFFFFFFFULL, + .dma_attr_align = PAGE_SIZE, + .dma_attr_burstsizes = 1, + .dma_attr_minxfer = 1, + .dma_attr_maxxfer = 0x00000000FFFFFFFFULL, + .dma_attr_seg = 0x00000000FFFFFFFFULL, /* any */ + .dma_attr_sgllen = 1, + .dma_attr_granular = PAGE_SIZE, + .dma_attr_flags = 0, }; - int cansleep = (flags & M_WAITOK); - void *result; + void *res; - ASSERT(alignment == PAGESIZE); - - result = contig_alloc((size_t)size, &attr, alignment, cansleep); - - if (result != NULL && (flags & M_ZERO) != 0) { - bzero(result, size); + res = contig_alloc(size, &attr, PAGE_SIZE, 1); + if (res != NULL) { + bzero(res, size); } - return (result); + + return (res); } void -contigfree(void *addr, unsigned long size, struct malloc_type *type) +vmm_contig_free(void *addr, size_t size) { contig_free(addr, size); } @@ -429,14 +408,14 @@ vmm_cpuid_init(void) void vmm_sol_glue_init(void) { - vmm_alloc_init(); + vmm_ptp_init(); vmm_cpuid_init(); } void vmm_sol_glue_cleanup(void) { - vmm_alloc_cleanup(); + vmm_ptp_cleanup(); } diff --git a/usr/src/uts/intel/io/vmm/vmm_stat.c b/usr/src/uts/intel/io/vmm/vmm_stat.c index 1d8644f48d..1a8128d330 100644 --- a/usr/src/uts/intel/io/vmm/vmm_stat.c +++ b/usr/src/uts/intel/io/vmm/vmm_stat.c @@ -34,7 +34,7 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/kernel.h> #include <sys/systm.h> -#include <sys/malloc.h> +#include <sys/kmem.h> #include <machine/vmm.h> #include "vmm_util.h" @@ -51,8 +51,6 @@ __FBSDID("$FreeBSD$"); static int vst_num_elems, vst_num_types; static struct vmm_stat_type *vsttab[MAX_VMM_STAT_ELEMS]; -static MALLOC_DEFINE(M_VMM_STAT, "vmm stat", "vmm stat"); - #define vst_size ((size_t)vst_num_elems * sizeof (uint64_t)) void @@ -122,21 +120,19 @@ vmm_stat_copy(struct vm *vm, int vcpu, int index, int count, int *num_stats, void * vmm_stat_alloc(void) { - - return (malloc(vst_size, M_VMM_STAT, M_WAITOK)); + return (kmem_alloc(vst_size, KM_SLEEP)); } void vmm_stat_init(void *vp) { - bzero(vp, vst_size); } void vmm_stat_free(void *vp) { - free(vp, M_VMM_STAT); + kmem_free(vp, vst_size); } int diff --git a/usr/src/uts/intel/io/vmm/vmm_vm.c b/usr/src/uts/intel/io/vmm/vmm_vm.c index 6e75e6bf87..42d963a53c 100644 --- a/usr/src/uts/intel/io/vmm/vmm_vm.c +++ b/usr/src/uts/intel/io/vmm/vmm_vm.c @@ -26,7 +26,6 @@ #include <sys/sysmacros.h> #include <sys/machsystm.h> #include <sys/vmsystm.h> -#include <sys/malloc.h> #include <sys/x86_archext.h> #include <vm/as.h> #include <vm/hat_i86.h> diff --git a/usr/src/uts/intel/io/vmm/x86.c b/usr/src/uts/intel/io/vmm/x86.c index 187c89afd0..de48ba1d48 100644 --- a/usr/src/uts/intel/io/vmm/x86.c +++ b/usr/src/uts/intel/io/vmm/x86.c @@ -60,7 +60,6 @@ __FBSDID("$FreeBSD$"); #include <machine/vmm.h> #include "vmm_host.h" -#include "vmm_ktr.h" #include "vmm_util.h" #include "x86.h" @@ -110,8 +109,6 @@ x86_emulate_cpuid(struct vm *vm, int vcpu_id, uint64_t *rax, uint64_t *rbx, func = (uint32_t)*rax; param = (uint32_t)*rcx; - VCPU_CTR2(vm, vcpu_id, "cpuid %#x,%#x", func, param); - /* * Requests for invalid CPUID levels should map to the highest * available level instead. |