summaryrefslogtreecommitdiffstats
path: root/scripts/config
diff options
context:
space:
mode:
authorZeng Chi <zengchi@kylinos.cn>2026-09-21 18:24:42 +0800
committerSean Christopherson <seanjc@google.com>2026-09-22 08:36:16 -0700
commit119e9db233ad0f4cbd4cfb9f9385a7bca378b37d (patch)
tree660d50d4139cb750fbde1ae3432452c20726c99d /scripts/config
downloadlinux-stable-119e9db233ad0f4cbd4cfb9f9385a7bca378b37d.tar.gz
linux-stable-119e9db233ad0f4cbd4cfb9f9385a7bca378b37d.zip
KVM: Don't pre-reserve xarray entries when storing empty/NULL attributesgrafted
Skip the xarray reservation loop when clearing all memory attributes, as storing NULL only erases the entry and never needs to allocate, so no reservation (and no cleanup of a failed one) is required in that case. Suggested-by: Sean Christopherson <seanjc@google.com> Cc: David Ballesteros <davimaba.v@proton.me> Signed-off-by: Zeng Chi <zengchi@kylinos.cn> Link: https://patch.msgid.link/20260921102442.1232375-1-zeng_chi911@163.com [sean: split to separate patch] Signed-off-by: Sean Christopherson <seanjc@google.com>
Diffstat (limited to 'scripts/config')
-rwxr-xr-xscripts/config240
1 files changed, 240 insertions, 0 deletions
diff --git a/scripts/config b/scripts/config
new file mode 100755
index 000000000..32428ea90
--- /dev/null
+++ b/scripts/config
@@ -0,0 +1,240 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: GPL-2.0
+# Manipulate options in a .config file from the command line
+
+myname=${0##*/}
+
+# If no prefix forced, use the default CONFIG_
+CONFIG_="${CONFIG_-CONFIG_}"
+
+# We use an uncommon delimiter for sed substitutions
+SED_DELIM=$(echo -en "\001")
+
+usage() {
+ cat >&2 <<EOL
+Manipulate options in a .config file from the command line.
+Usage:
+$myname options command ...
+commands:
+ --enable|-e option Enable option
+ --disable|-d option Disable option
+ --module|-m option Turn option into a module
+ --set-str option string
+ Set option to "string"
+ --set-val option value
+ Set option to value
+ --undefine|-u option Undefine option
+ --state|-s option Print state of option (n,y,m,undef)
+
+ --enable-after|-E beforeopt option
+ Enable option directly after other option
+ --disable-after|-D beforeopt option
+ Disable option directly after other option
+ --module-after|-M beforeopt option
+ Turn option into module directly after other option
+ --refresh Refresh the config using old settings
+
+ commands can be repeated multiple times
+
+options:
+ --file config-file .config file to change (default .config)
+ --keep-case|-k Keep next symbols' case (don't upper-case it)
+
+$myname doesn't check the validity of the .config file. This is done at next
+make time.
+
+By default, $myname will upper-case the given symbol. Use --keep-case to keep
+the case of all following symbols unchanged.
+
+$myname uses 'CONFIG_' as the default symbol prefix. Set the environment
+variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ...
+EOL
+ exit 1
+}
+
+checkarg() {
+ ARG="$1"
+ if [ "$ARG" = "" ] ; then
+ usage
+ fi
+ case "$ARG" in
+ ${CONFIG_}*)
+ ARG="${ARG/${CONFIG_}/}"
+ ;;
+ esac
+ if [ "$MUNGE_CASE" = "yes" ] ; then
+ ARG="`echo $ARG | tr a-z A-Z`"
+ fi
+}
+
+txt_append() {
+ local anchor="$1"
+ local insert="$2"
+ local infile="$3"
+
+ # sed append cmd: 'a\' + newline + text + newline
+ cmd="$(printf "a\\%b$insert" "\n")"
+
+ # We don't really need a backup file, but in-place editing with backup
+ # skipped is not portable due to different implementations parsing
+ # arguments in incompatible manners.
+ # Create a backup file anyway to ensure portability. The file will be
+ # deleted on exit.
+ sed -E -i.swp -e "/$anchor/$cmd" "$infile"
+ SED_EDITED=1
+}
+
+txt_subst() {
+ local before="$1"
+ local after="$2"
+ local infile="$3"
+
+ sed -E -i.swp -e "s$SED_DELIM$before$SED_DELIM$after$SED_DELIM" "$infile"
+ SED_EDITED=1
+}
+
+txt_delete() {
+ local text="$1"
+ local infile="$2"
+
+ sed -E -i.swp -e "/$text/d" "$infile"
+ SED_EDITED=1
+}
+
+set_var() {
+ local name=$1 new=$2 before=$3
+
+ name_re="^($name=.*|# $name is not set)"
+ before_re="^($before=|# $before is not set)"
+ if test -n "$before" && grep -Eq "$before_re" "$FN"; then
+ txt_append "$before_re" "$new" "$FN"
+ elif grep -Eq "$name_re" "$FN"; then
+ txt_subst "$name_re" "$new" "$FN"
+ else
+ echo "$new" >>"$FN"
+ fi
+}
+
+undef_var() {
+ local name=$1
+
+ txt_delete "^($name=|# $name is not set)" "$FN"
+}
+
+SED_EDITED=0
+on_exit() {
+ if [ "$SED_EDITED" -ge 1 ]; then
+ rm -f "$FN.swp"
+ fi
+}
+trap on_exit EXIT
+
+FN=.config
+CMDS=()
+while [[ $# -gt 0 ]]; do
+ if [ "$1" = "--file" ]; then
+ if [ "$2" = "" ]; then
+ usage
+ fi
+ FN="$2"
+ shift 2
+ else
+ CMDS+=("$1")
+ shift
+ fi
+done
+
+set -- "${CMDS[@]}"
+if [ "$1" = "" ] ; then
+ usage
+fi
+
+MUNGE_CASE=yes
+while [ "$1" != "" ] ; do
+ CMD="$1"
+ shift
+ case "$CMD" in
+ --keep-case|-k)
+ MUNGE_CASE=no
+ continue
+ ;;
+ --refresh)
+ ;;
+ --*-after|-E|-D|-M)
+ checkarg "$1"
+ A=$ARG
+ checkarg "$2"
+ B=$ARG
+ shift 2
+ ;;
+ -*)
+ checkarg "$1"
+ shift
+ ;;
+ esac
+ case "$CMD" in
+ --enable|-e)
+ set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
+ ;;
+
+ --disable|-d)
+ set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
+ ;;
+
+ --module|-m)
+ set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
+ ;;
+
+ --set-str)
+ # sed swallows one level of escaping, so we need double-escaping
+ set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
+ shift
+ ;;
+
+ --set-val)
+ set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
+ shift
+ ;;
+ --undefine|-u)
+ undef_var "${CONFIG_}$ARG"
+ ;;
+
+ --state|-s)
+ if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
+ echo n
+ else
+ V="$(grep "^${CONFIG_}$ARG=" $FN)"
+ if [ $? != 0 ] ; then
+ echo undef
+ else
+ V="${V/#${CONFIG_}$ARG=/}"
+ V="${V/#\"/}"
+ V="${V/%\"/}"
+ V="${V//\\\"/\"}"
+ echo "${V}"
+ fi
+ fi
+ ;;
+
+ --enable-after|-E)
+ set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
+ ;;
+
+ --disable-after|-D)
+ set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
+ ;;
+
+ --module-after|-M)
+ set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
+ ;;
+
+ --refresh)
+ yes "" | make oldconfig KCONFIG_CONFIG=$FN
+ ;;
+
+ *)
+ echo "bad command: $CMD" >&2
+ usage
+ ;;
+ esac
+done