From owner-freebsd-hackers@FreeBSD.ORG Sat Jun 11 00:46:35 2011 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A3EAB1065676 for ; Sat, 11 Jun 2011 00:46:35 +0000 (UTC) (envelope-from yanegomi@gmail.com) Received: from mail-vw0-f54.google.com (mail-vw0-f54.google.com [209.85.212.54]) by mx1.freebsd.org (Postfix) with ESMTP id 62CA88FC08 for ; Sat, 11 Jun 2011 00:46:35 +0000 (UTC) Received: by vws18 with SMTP id 18so3726776vws.13 for ; Fri, 10 Jun 2011 17:46:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:date:message-id:subject:from:to :content-type; bh=/F0PXIeFqs9w2G05usbk3aQOuK3d/42TZ1I74g9+2A8=; b=pqF1u2TmND/brnscL/EJ4+KJltNSwc1bQ4ifg+nGFuw5vAftpzAHx9XW0+2zM9vXar 0nXgV3JbFUCEug+D8Alrok6Gyq8ms+TV3ASYc6nmA/zr5XqDaGp2hiKML8dqMDwet7Am 3auR6+l8yWBr9UVuaXUkMofrhKtcbkUhD+/yA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=FvVJ5B9aoIdYxqC/ysDUihZrJJzJj9CrfqzTSib7nhkztlLuWcivMlwojucpaxA6Id 2nwQR7chi6+GV4ee2wcT0atkws1MSmSU76LG0Mw5tWcdVTdY9i1RzjQkez1GnO9omymJ vVYkdT7Ui3XQObTcaeTORzURHiGTBrCrWQhMw= MIME-Version: 1.0 Received: by 10.220.187.76 with SMTP id cv12mr1059682vcb.128.1307753194450; Fri, 10 Jun 2011 17:46:34 -0700 (PDT) Received: by 10.220.189.202 with HTTP; Fri, 10 Jun 2011 17:46:34 -0700 (PDT) Date: Fri, 10 Jun 2011 17:46:34 -0700 Message-ID: From: Garrett Cooper To: freebsd-hackers@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Subject: sysctl_handle_int questions X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jun 2011 00:46:35 -0000 Looking at sysctl_handle_int in a 7.2-ish tree... 1. What is the purpose of arg2? In all cases in /sys minus a few, arg2 appears to be zeroed out: $ grep -Ir 'sysctl_handle_int.*[^0], req)' . 2>/dev/null ./amd64/amd64/pmap.c: error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); ./amd64/amd64/pmap.c: error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); ./dev/acpi_support/acpi_aiboost.c: error = sysctl_handle_int(oidp, &val, 0 , req); ./dev/acpi_support/acpi_aiboost.c: error = sysctl_handle_int(oidp, &val, 0 , req); ./dev/acpi_support/acpi_aiboost.c: error = sysctl_handle_int(oidp, &val, 0 , req); ./dev/cxgb/cxgb_sge.c: err = sysctl_handle_int(oidp, &coalesce_usecs, arg2, req); ./dev/mxge/if_mxge.c: err = sysctl_handle_int(oidp, &intr_coal_delay, arg2, req); ./dev/mxge/if_mxge.c: err = sysctl_handle_int(oidp, &enabled, arg2, req); ./dev/mxge/if_mxge.c: err = sysctl_handle_int(oidp, &lro_cnt, arg2, req); ./dev/mxge/if_mxge.c: err = sysctl_handle_int(oidp, arg1, arg2, req); ./dev/nxge/if_nxge.c: status = sysctl_handle_int(oidp, &request, arg2, req); ./dev/random/randomdev_soft.c: return sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); ./kern/subr_prf.c: error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); ./netinet/in_pcb.c: error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); ./netinet/sctp_sysctl.c: error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); ./netinet/sctp_sysctl.c: error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); 2. Is there a proper way to restore the value in a SYSCTL_PROC handler instead of saving a value to a local, passing in newp via a global value, and restoring if sysctl_handle_int returned a nonzero value, e.g. old_global = global; error = sysctl_handle_int(oidp, &global, old_global, req); if (!error && req->newptr) { /* * Do something fun with global.. maybe capture an error via `error' and * restore appropriately down below, but that's optional.. */ } if (error) global = old_global; I'm asking because I tried passing in a local variable instead of the global in the function, and that got printed out later on via sysctlbyname(3), and well... it didn't work out too well (sysctlbyname(3) was returning a random uninitialized value from the stack). Thanks! -Garrett