diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2023-02-23 17:55:40 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2023-02-23 17:55:40 -0800 | 
| commit | d2980d8d826554fa6981d621e569a453787472f8 (patch) | |
| tree | d75ddea276ae8bf42ecf528f9862714a8bccf8f4 /scripts | |
| parent | 3822a7c40997dc86b1458766a3f146d62393f084 (diff) | |
| parent | 817013880a6883f7ab08030d1f8cfef5f07ba467 (diff) | |
Merge tag 'mm-nonmm-stable-2023-02-20-15-29' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
Pull non-MM updates from Andrew Morton:
 "There is no particular theme here - mainly quick hits all over the
  tree.
  Most notable is a set of zlib changes from Mikhail Zaslonko which
  enhances and fixes zlib's use of S390 hardware support: 'lib/zlib: Set
  of s390 DFLTCC related patches for kernel zlib'"
* tag 'mm-nonmm-stable-2023-02-20-15-29' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (55 commits)
  Update CREDITS file entry for Jesper Juhl
  sparc: allow PM configs for sparc32 COMPILE_TEST
  hung_task: print message when hung_task_warnings gets down to zero.
  arch/Kconfig: fix indentation
  scripts/tags.sh: fix the Kconfig tags generation when using latest ctags
  nilfs2: prevent WARNING in nilfs_dat_commit_end()
  lib/zlib: remove redundation assignement of avail_in dfltcc_gdht()
  lib/Kconfig.debug: do not enable DEBUG_PREEMPT by default
  lib/zlib: DFLTCC always switch to software inflate for Z_PACKET_FLUSH option
  lib/zlib: DFLTCC support inflate with small window
  lib/zlib: Split deflate and inflate states for DFLTCC
  lib/zlib: DFLTCC not writing header bits when avail_out == 0
  lib/zlib: fix DFLTCC ignoring flush modes when avail_in == 0
  lib/zlib: fix DFLTCC not flushing EOBS when creating raw streams
  lib/zlib: implement switching between DFLTCC and software
  lib/zlib: adjust offset calculation for dfltcc_state
  nilfs2: replace WARN_ONs for invalid DAT metadata block requests
  scripts/spelling.txt: add "exsits" pattern and fix typo instances
  fs: gracefully handle ->get_block not mapping bh in __mpage_writepage
  cramfs: Kconfig: fix spelling & punctuation
  ...
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/bloat-o-meter | 3 | ||||
| -rwxr-xr-x | scripts/checkpatch.pl | 38 | ||||
| -rw-r--r-- | scripts/gdb/linux/mm.py | 222 | ||||
| -rw-r--r-- | scripts/gdb/vmlinux-gdb.py | 1 | ||||
| -rw-r--r-- | scripts/spelling.txt | 17 | ||||
| -rwxr-xr-x | scripts/tags.sh | 10 | 
6 files changed, 279 insertions, 12 deletions
diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter index f9553f60a14a..36303afa9dfc 100755 --- a/scripts/bloat-o-meter +++ b/scripts/bloat-o-meter @@ -80,8 +80,7 @@ def calc(oldfile, newfile, format):          if d<0: shrink, down = shrink+1, down-d          delta.append((d, name)) -    delta.sort() -    delta.reverse() +    delta.sort(reverse=True)      return grow, shrink, add, remove, up, down, delta, old, new, otot, ntot  def print_result(symboltype, symbolformat): diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 78cc595b98ce..bd44d12965c9 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -823,7 +823,9 @@ our %deprecated_apis = (  	"get_state_synchronize_sched"		=> "get_state_synchronize_rcu",  	"cond_synchronize_sched"		=> "cond_synchronize_rcu",  	"kmap"					=> "kmap_local_page", +	"kunmap"				=> "kunmap_local",  	"kmap_atomic"				=> "kmap_local_page", +	"kunmap_atomic"				=> "kunmap_local",  );  #Create a search pattern for all these strings to speed up a loop below @@ -3142,21 +3144,33 @@ sub process {  			if ($sign_off =~ /^co-developed-by:$/i) {  				if ($email eq $author) {  					WARN("BAD_SIGN_OFF", -					      "Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . "$here\n" . $rawline); +					      "Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . $herecurr);  				}  				if (!defined $lines[$linenr]) {  					WARN("BAD_SIGN_OFF", -					     "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline); -				} elsif ($rawlines[$linenr] !~ /^\s*signed-off-by:\s*(.*)/i) { +					     "Co-developed-by: must be immediately followed by Signed-off-by:\n" . $herecurr); +				} elsif ($rawlines[$linenr] !~ /^signed-off-by:\s*(.*)/i) {  					WARN("BAD_SIGN_OFF", -					     "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]); +					     "Co-developed-by: must be immediately followed by Signed-off-by:\n" . $herecurr . $rawlines[$linenr] . "\n");  				} elsif ($1 ne $email) {  					WARN("BAD_SIGN_OFF", -					     "Co-developed-by and Signed-off-by: name/email do not match \n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]); +					     "Co-developed-by and Signed-off-by: name/email do not match\n" . $herecurr . $rawlines[$linenr] . "\n"); +				} +			} + +# check if Reported-by: is followed by a Link: +			if ($sign_off =~ /^reported(?:|-and-tested)-by:$/i) { +				if (!defined $lines[$linenr]) { +					WARN("BAD_REPORTED_BY_LINK", +					     "Reported-by: should be immediately followed by Link: to the report\n" . $herecurr . $rawlines[$linenr] . "\n"); +				} elsif ($rawlines[$linenr] !~ m{^link:\s*https?://}i) { +					WARN("BAD_REPORTED_BY_LINK", +					     "Reported-by: should be immediately followed by Link: with a URL to the report\n" . $herecurr . $rawlines[$linenr] . "\n");  				}  			}  		} +  # Check Fixes: styles is correct  		if (!$in_header_lines &&  		    $line =~ /^\s*fixes:?\s*(?:commit\s*)?[0-9a-f]{5,}\b/i) { @@ -3250,6 +3264,18 @@ sub process {  			$commit_log_possible_stack_dump = 0;  		} +# Check for odd tags before a URI/URL +		if ($in_commit_log && +		    $line =~ /^\s*(\w+):\s*http/ && $1 ne 'Link') { +			if ($1 =~ /^v(?:ersion)?\d+/i) { +				WARN("COMMIT_LOG_VERSIONING", +				     "Patch version information should be after the --- line\n" . $herecurr); +			} else { +				WARN("COMMIT_LOG_USE_LINK", +				     "Unknown link reference '$1:', use 'Link:' instead\n" . $herecurr); +			} +		} +  # Check for lines starting with a #  		if ($in_commit_log && $line =~ /^#/) {  			if (WARN("COMMIT_COMMENT_SYMBOL", @@ -3725,7 +3751,7 @@ sub process {  		}  # check for embedded filenames -		if ($rawline =~ /^\+.*\Q$realfile\E/) { +		if ($rawline =~ /^\+.*\b\Q$realfile\E\b/) {  			WARN("EMBEDDED_FILENAME",  			     "It's generally not useful to have the filename in the file\n" . $herecurr);  		} diff --git a/scripts/gdb/linux/mm.py b/scripts/gdb/linux/mm.py new file mode 100644 index 000000000000..30d837f3dfae --- /dev/null +++ b/scripts/gdb/linux/mm.py @@ -0,0 +1,222 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# gdb helper commands and functions for Linux kernel debugging +# +#  routines to introspect page table +# +# Authors: +#  Dmitrii Bundin <dmitrii.bundin.a@gmail.com> +# + +import gdb + +from linux import utils + +PHYSICAL_ADDRESS_MASK = gdb.parse_and_eval('0xfffffffffffff') + + +def page_mask(level=1): +    # 4KB +    if level == 1: +        return gdb.parse_and_eval('(u64) ~0xfff') +    # 2MB +    elif level == 2: +        return gdb.parse_and_eval('(u64) ~0x1fffff') +    # 1GB +    elif level == 3: +        return gdb.parse_and_eval('(u64) ~0x3fffffff') +    else: +        raise Exception(f'Unknown page level: {level}') + + +#page_offset_base in case CONFIG_DYNAMIC_MEMORY_LAYOUT is disabled +POB_NO_DYNAMIC_MEM_LAYOUT = '0xffff888000000000' +def _page_offset_base(): +    pob_symbol = gdb.lookup_global_symbol('page_offset_base') +    pob = pob_symbol.name if pob_symbol else POB_NO_DYNAMIC_MEM_LAYOUT +    return gdb.parse_and_eval(pob) + + +def is_bit_defined_tupled(data, offset): +    return offset, bool(data >> offset & 1) + +def content_tupled(data, bit_start, bit_end): +    return (bit_start, bit_end), data >> bit_start & ((1 << (1 + bit_end - bit_start)) - 1) + +def entry_va(level, phys_addr, translating_va): +        def start_bit(level): +            if level == 5: +                return 48 +            elif level == 4: +                return 39 +            elif level == 3: +                return 30 +            elif level == 2: +                return 21 +            elif level == 1: +                return 12 +            else: +                raise Exception(f'Unknown level {level}') + +        entry_offset =  ((translating_va >> start_bit(level)) & 511) * 8 +        entry_va = _page_offset_base() + phys_addr + entry_offset +        return entry_va + +class Cr3(): +    def __init__(self, cr3, page_levels): +        self.cr3 = cr3 +        self.page_levels = page_levels +        self.page_level_write_through = is_bit_defined_tupled(cr3, 3) +        self.page_level_cache_disabled = is_bit_defined_tupled(cr3, 4) +        self.next_entry_physical_address = cr3 & PHYSICAL_ADDRESS_MASK & page_mask() + +    def next_entry(self, va): +        next_level = self.page_levels +        return PageHierarchyEntry(entry_va(next_level, self.next_entry_physical_address, va), next_level) + +    def mk_string(self): +            return f"""\ +cr3: +    {'cr3 binary data': <30} {hex(self.cr3)} +    {'next entry physical address': <30} {hex(self.next_entry_physical_address)} +    --- +    {'bit' : <4} {self.page_level_write_through[0]: <10} {'page level write through': <30} {self.page_level_write_through[1]} +    {'bit' : <4} {self.page_level_cache_disabled[0]: <10} {'page level cache disabled': <30} {self.page_level_cache_disabled[1]} +""" + + +class PageHierarchyEntry(): +    def __init__(self, address, level): +        data = int.from_bytes( +            memoryview(gdb.selected_inferior().read_memory(address, 8)), +            "little" +        ) +        if level == 1: +            self.is_page = True +            self.entry_present = is_bit_defined_tupled(data, 0) +            self.read_write = is_bit_defined_tupled(data, 1) +            self.user_access_allowed = is_bit_defined_tupled(data, 2) +            self.page_level_write_through = is_bit_defined_tupled(data, 3) +            self.page_level_cache_disabled = is_bit_defined_tupled(data, 4) +            self.entry_was_accessed = is_bit_defined_tupled(data, 5) +            self.dirty = is_bit_defined_tupled(data, 6) +            self.pat = is_bit_defined_tupled(data, 7) +            self.global_translation = is_bit_defined_tupled(data, 8) +            self.page_physical_address = data & PHYSICAL_ADDRESS_MASK & page_mask(level) +            self.next_entry_physical_address = None +            self.hlat_restart_with_ordinary = is_bit_defined_tupled(data, 11) +            self.protection_key = content_tupled(data, 59, 62) +            self.executed_disable = is_bit_defined_tupled(data, 63) +        else: +            page_size = is_bit_defined_tupled(data, 7) +            page_size_bit = page_size[1] +            self.is_page = page_size_bit +            self.entry_present = is_bit_defined_tupled(data, 0) +            self.read_write = is_bit_defined_tupled(data, 1) +            self.user_access_allowed = is_bit_defined_tupled(data, 2) +            self.page_level_write_through = is_bit_defined_tupled(data, 3) +            self.page_level_cache_disabled = is_bit_defined_tupled(data, 4) +            self.entry_was_accessed = is_bit_defined_tupled(data, 5) +            self.page_size = page_size +            self.dirty = is_bit_defined_tupled( +                data, 6) if page_size_bit else None +            self.global_translation = is_bit_defined_tupled( +                data, 8) if page_size_bit else None +            self.pat = is_bit_defined_tupled( +                data, 12) if page_size_bit else None +            self.page_physical_address = data & PHYSICAL_ADDRESS_MASK & page_mask(level) if page_size_bit else None +            self.next_entry_physical_address = None if page_size_bit else data & PHYSICAL_ADDRESS_MASK & page_mask() +            self.hlat_restart_with_ordinary = is_bit_defined_tupled(data, 11) +            self.protection_key = content_tupled(data, 59, 62) if page_size_bit else None +            self.executed_disable = is_bit_defined_tupled(data, 63) +        self.address = address +        self.page_entry_binary_data = data +        self.page_hierarchy_level = level + +    def next_entry(self, va): +        if self.is_page or not self.entry_present[1]: +            return None + +        next_level = self.page_hierarchy_level - 1 +        return PageHierarchyEntry(entry_va(next_level, self.next_entry_physical_address, va), next_level) + + +    def mk_string(self): +        if not self.entry_present[1]: +            return f"""\ +level {self.page_hierarchy_level}: +    {'entry address': <30} {hex(self.address)} +    {'page entry binary data': <30} {hex(self.page_entry_binary_data)} +    --- +    PAGE ENTRY IS NOT PRESENT! +""" +        elif self.is_page: +            def page_size_line(ps_bit, ps, level): +                return "" if level == 1 else f"{'bit': <3} {ps_bit: <5} {'page size': <30} {ps}" + +            return f"""\ +level {self.page_hierarchy_level}: +    {'entry address': <30} {hex(self.address)} +    {'page entry binary data': <30} {hex(self.page_entry_binary_data)} +    {'page size': <30} {'1GB' if self.page_hierarchy_level == 3 else '2MB' if self.page_hierarchy_level == 2 else '4KB' if self.page_hierarchy_level == 1 else 'Unknown page size for level:' + self.page_hierarchy_level} +    {'page physical address': <30} {hex(self.page_physical_address)} +    --- +    {'bit': <4} {self.entry_present[0]: <10} {'entry present': <30} {self.entry_present[1]} +    {'bit': <4} {self.read_write[0]: <10} {'read/write access allowed': <30} {self.read_write[1]} +    {'bit': <4} {self.user_access_allowed[0]: <10} {'user access allowed': <30} {self.user_access_allowed[1]} +    {'bit': <4} {self.page_level_write_through[0]: <10} {'page level write through': <30} {self.page_level_write_through[1]} +    {'bit': <4} {self.page_level_cache_disabled[0]: <10} {'page level cache disabled': <30} {self.page_level_cache_disabled[1]} +    {'bit': <4} {self.entry_was_accessed[0]: <10} {'entry has been accessed': <30} {self.entry_was_accessed[1]} +    {"" if self.page_hierarchy_level == 1 else f"{'bit': <4} {self.page_size[0]: <10} {'page size': <30} {self.page_size[1]}"} +    {'bit': <4} {self.dirty[0]: <10} {'page dirty': <30} {self.dirty[1]} +    {'bit': <4} {self.global_translation[0]: <10} {'global translation': <30} {self.global_translation[1]} +    {'bit': <4} {self.hlat_restart_with_ordinary[0]: <10} {'restart to ordinary': <30} {self.hlat_restart_with_ordinary[1]} +    {'bit': <4} {self.pat[0]: <10} {'pat': <30} {self.pat[1]} +    {'bits': <4} {str(self.protection_key[0]): <10} {'protection key': <30} {self.protection_key[1]} +    {'bit': <4} {self.executed_disable[0]: <10} {'execute disable': <30} {self.executed_disable[1]} +""" +        else: +            return f"""\ +level {self.page_hierarchy_level}: +    {'entry address': <30} {hex(self.address)} +    {'page entry binary data': <30} {hex(self.page_entry_binary_data)} +    {'next entry physical address': <30} {hex(self.next_entry_physical_address)} +    --- +    {'bit': <4} {self.entry_present[0]: <10} {'entry present': <30} {self.entry_present[1]} +    {'bit': <4} {self.read_write[0]: <10} {'read/write access allowed': <30} {self.read_write[1]} +    {'bit': <4} {self.user_access_allowed[0]: <10} {'user access allowed': <30} {self.user_access_allowed[1]} +    {'bit': <4} {self.page_level_write_through[0]: <10} {'page level write through': <30} {self.page_level_write_through[1]} +    {'bit': <4} {self.page_level_cache_disabled[0]: <10} {'page level cache disabled': <30} {self.page_level_cache_disabled[1]} +    {'bit': <4} {self.entry_was_accessed[0]: <10} {'entry has been accessed': <30} {self.entry_was_accessed[1]} +    {'bit': <4} {self.page_size[0]: <10} {'page size': <30} {self.page_size[1]} +    {'bit': <4} {self.hlat_restart_with_ordinary[0]: <10} {'restart to ordinary': <30} {self.hlat_restart_with_ordinary[1]} +    {'bit': <4} {self.executed_disable[0]: <10} {'execute disable': <30} {self.executed_disable[1]} +""" + + +class TranslateVM(gdb.Command): +    """Prints the entire paging structure used to translate a given virtual address. + +Having an address space of the currently executed process translates the virtual address +and prints detailed information of all paging structure levels used for the transaltion. +Currently supported arch: x86""" + +    def __init__(self): +        super(TranslateVM, self).__init__('translate-vm', gdb.COMMAND_USER) + +    def invoke(self, arg, from_tty): +        if utils.is_target_arch("x86"): +            vm_address = gdb.parse_and_eval(f'{arg}') +            cr3_data = gdb.parse_and_eval('$cr3') +            cr4 = gdb.parse_and_eval('$cr4') +            page_levels = 5 if cr4 & (1 << 12) else 4 +            page_entry = Cr3(cr3_data, page_levels) +            while page_entry: +                gdb.write(page_entry.mk_string()) +                page_entry = page_entry.next_entry(vm_address) +        else: +            gdb.GdbError("Virtual address translation is not" +                         "supported for this arch") + + +TranslateVM() diff --git a/scripts/gdb/vmlinux-gdb.py b/scripts/gdb/vmlinux-gdb.py index 3e8d3669f0ce..3a5b44cd6bfe 100644 --- a/scripts/gdb/vmlinux-gdb.py +++ b/scripts/gdb/vmlinux-gdb.py @@ -37,3 +37,4 @@ else:      import linux.clk      import linux.genpd      import linux.device +    import linux.mm diff --git a/scripts/spelling.txt b/scripts/spelling.txt index ded8bcfc0247..f8bd6178d17b 100644 --- a/scripts/spelling.txt +++ b/scripts/spelling.txt @@ -65,6 +65,7 @@ acumulative||accumulative  acumulator||accumulator  acutally||actually  adapater||adapter +adderted||asserted  addional||additional  additionaly||additionally  additonal||additional @@ -122,6 +123,7 @@ alue||value  ambigious||ambiguous  ambigous||ambiguous  amoung||among +amount of times||number of times  amout||amount  amplifer||amplifier  amplifyer||amplifier @@ -287,6 +289,7 @@ capapbilities||capabilities  caputure||capture  carefuly||carefully  cariage||carriage +casued||caused  catagory||category  cehck||check  challange||challenge @@ -370,6 +373,7 @@ conbination||combination  conditionaly||conditionally  conditon||condition  condtion||condition +condtional||conditional  conected||connected  conector||connector  configration||configuration @@ -423,6 +427,7 @@ cound||could  couter||counter  coutner||counter  cryptocraphic||cryptographic +cummulative||cumulative  cunter||counter  curently||currently  cylic||cyclic @@ -625,8 +630,10 @@ exeuction||execution  existance||existence  existant||existent  exixt||exist +exsits||exists  exlcude||exclude  exlcusive||exclusive +exlusive||exclusive  exmaple||example  expecially||especially  experies||expires @@ -664,11 +671,13 @@ feauture||feature  feautures||features  fetaure||feature  fetaures||features +fetcing||fetching  fileystem||filesystem  fimrware||firmware  fimware||firmware  firmare||firmware  firmaware||firmware +firtly||firstly  firware||firmware  firwmare||firmware  finanize||finalize @@ -838,6 +847,7 @@ integrety||integrity  integrey||integrity  intendet||intended  intented||intended +interal||internal  interanl||internal  interchangable||interchangeable  interferring||interfering @@ -1023,6 +1033,7 @@ negotation||negotiation  nerver||never  nescessary||necessary  nessessary||necessary +none existent||non-existent  noticable||noticeable  notication||notification  notications||notifications @@ -1044,6 +1055,7 @@ occured||occurred  occurence||occurrence  occure||occurred  occuring||occurring +ocurrence||occurrence  offser||offset  offet||offset  offlaod||offload @@ -1055,6 +1067,7 @@ omitt||omit  ommiting||omitting  ommitted||omitted  onself||oneself +onthe||on the  ony||only  openning||opening  operatione||operation @@ -1121,6 +1134,7 @@ perfomring||performing  periperal||peripheral  peripherial||peripheral  permissons||permissions +permited||permitted  peroid||period  persistance||persistence  persistant||persistent @@ -1334,6 +1348,7 @@ sacrifying||sacrificing  safly||safely  safty||safety  satify||satisfy +satisifed||satisfied  savable||saveable  scaleing||scaling  scaned||scanned @@ -1558,6 +1573,7 @@ tunning||tuning  ture||true  tyep||type  udpate||update +updtes||updates  uesd||used  unknwon||unknown  uknown||unknown @@ -1614,6 +1630,7 @@ unuseful||useless  unvalid||invalid  upate||update  upsupported||unsupported +upto||up to  useable||usable  usefule||useful  usefull||useful diff --git a/scripts/tags.sh b/scripts/tags.sh index e137cf15aae9..84775f08260f 100755 --- a/scripts/tags.sh +++ b/scripts/tags.sh @@ -264,10 +264,12 @@ exuberant()  	--$CTAGS_EXTRA=+fq --c-kinds=+px --fields=+iaS --langmap=c:+.h \  	"${regex[@]}" -	setup_regex exuberant kconfig -	all_kconfigs | xargs $1 -a                              \ -	--langdef=kconfig --language-force=kconfig "${regex[@]}" - +	KCONFIG_ARGS=() +	if ! $1 --list-languages | grep -iq kconfig; then +		setup_regex exuberant kconfig +		KCONFIG_ARGS=(--langdef=kconfig --language-force=kconfig "${regex[@]}") +	fi +	all_kconfigs | xargs $1 -a "${KCONFIG_ARGS[@]}"  }  emacs()  | 
