svn commit: r366675 - stable/12/sys/kern
Alexander Motin
mav at FreeBSD.org
Tue Oct 13 17:50:02 UTC 2020
Author: mav
Date: Tue Oct 13 17:50:01 2020
New Revision: 366675
URL: https://svnweb.freebsd.org/changeset/base/366675
Log:
MFC r355083 (by rlibby): sysctl: wire old buf before output with sysctl lock
Several sysctl sysctls output to a user buffer while holding a
non-sleepable lock that protects the sysctl topology. They need to wire
the output buffer, or else they may try to sleep on a page fault.
Modified:
stable/12/sys/kern/kern_sysctl.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/kern/kern_sysctl.c
==============================================================================
--- stable/12/sys/kern/kern_sysctl.c Tue Oct 13 17:30:34 2020 (r366674)
+++ stable/12/sys/kern/kern_sysctl.c Tue Oct 13 17:50:01 2020 (r366675)
@@ -1022,12 +1022,16 @@ sysctl_sysctl_name(SYSCTL_HANDLER_ARGS)
{
int *name = (int *) arg1;
u_int namelen = arg2;
- int error = 0;
+ int error;
struct sysctl_oid *oid;
struct sysctl_oid_list *lsp = &sysctl__children, *lsp2;
struct rm_priotracker tracker;
char buf[10];
+ error = sysctl_wire_old_buffer(req, 0);
+ if (error)
+ return (error);
+
SYSCTL_RLOCK(&tracker);
while (namelen) {
if (!lsp) {
@@ -1264,6 +1268,10 @@ sysctl_sysctl_oidfmt(SYSCTL_HANDLER_ARGS)
struct rm_priotracker tracker;
int error;
+ error = sysctl_wire_old_buffer(req, 0);
+ if (error)
+ return (error);
+
SYSCTL_RLOCK(&tracker);
error = sysctl_find_oid(arg1, arg2, &oid, NULL, req);
if (error)
@@ -1293,6 +1301,10 @@ sysctl_sysctl_oiddescr(SYSCTL_HANDLER_ARGS)
struct rm_priotracker tracker;
int error;
+ error = sysctl_wire_old_buffer(req, 0);
+ if (error)
+ return (error);
+
SYSCTL_RLOCK(&tracker);
error = sysctl_find_oid(arg1, arg2, &oid, NULL, req);
if (error)
@@ -1317,6 +1329,10 @@ sysctl_sysctl_oidlabel(SYSCTL_HANDLER_ARGS)
struct sysctl_oid *oid;
struct rm_priotracker tracker;
int error;
+
+ error = sysctl_wire_old_buffer(req, 0);
+ if (error)
+ return (error);
SYSCTL_RLOCK(&tracker);
error = sysctl_find_oid(arg1, arg2, &oid, NULL, req);
More information about the svn-src-stable-12
mailing list