Print this page
13902 Fix for 13717 may break 8-disk raidz2
13915 installctx() blocking allocate causes problems
Portions contributed by: Jerry Jelinek <gjelinek@gmail.com>
Change-Id: I934d69946cec42630fc541fa8c7385b862b69ca2

@@ -18,11 +18,11 @@
  *
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2018 Joyent, Inc.
+ * Copyright 2021 Joyent, Inc.
  */
 
 /*      Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T   */
 /*        All Rights Reserved   */

@@ -91,10 +91,13 @@
          * The SI86V86 subsystem call of the SYSI86 system call
          * supports only one subcode -- V86SC_IOPL.
          */
         case SI86V86:
                 if (arg1 == V86SC_IOPL) {
+#if defined(__xpv)
+                        struct ctxop *ctx;
+#endif
                         struct regs *rp = lwptoregs(ttolwp(curthread));
                         greg_t oldpl = rp->r_ps & PS_IOPL;
                         greg_t newpl = arg2 & PS_IOPL;
 
                         /*

@@ -103,14 +106,15 @@
                          */
                         if (newpl > oldpl && (error =
                             secpolicy_sys_config(CRED(), B_FALSE)) != 0)
                                 return (set_errno(error));
 #if defined(__xpv)
+                        ctx = installctx_preallocate();
                         kpreempt_disable();
                         installctx(curthread, NULL, xen_disable_user_iopl,
                             xen_enable_user_iopl, NULL, NULL,
-                            xen_disable_user_iopl, NULL);
+                            xen_disable_user_iopl, NULL, ctx);
                         xen_enable_user_iopl();
                         kpreempt_enable();
 #else
                         rp->r_ps ^= oldpl ^ newpl;
 #endif