mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-09 16:12:21 +00:00
Merge branch 'akpm' (patches from Andrew)
Merge more updates from Andrew Morton: "VM: - z3fold fixes and enhancements by Henry Burns and Vitaly Wool - more accurate reclaimed slab caches calculations by Yafang Shao - fix MAP_UNINITIALIZED UAPI symbol to not depend on config, by Christoph Hellwig - !CONFIG_MMU fixes by Christoph Hellwig - new novmcoredd parameter to omit device dumps from vmcore, by Kairui Song - new test_meminit module for testing heap and pagealloc initialization, by Alexander Potapenko - ioremap improvements for huge mappings, by Anshuman Khandual - generalize kprobe page fault handling, by Anshuman Khandual - device-dax hotplug fixes and improvements, by Pavel Tatashin - enable synchronous DAX fault on powerpc, by Aneesh Kumar K.V - add pte_devmap() support for arm64, by Robin Murphy - unify locked_vm accounting with a helper, by Daniel Jordan - several misc fixes core/lib: - new typeof_member() macro including some users, by Alexey Dobriyan - make BIT() and GENMASK() available in asm, by Masahiro Yamada - changed LIST_POISON2 on x86_64 to 0xdead000000000122 for better code generation, by Alexey Dobriyan - rbtree code size optimizations, by Michel Lespinasse - convert struct pid count to refcount_t, by Joel Fernandes get_maintainer.pl: - add --no-moderated switch to skip moderated ML's, by Joe Perches misc: - ptrace PTRACE_GET_SYSCALL_INFO interface - coda updates - gdb scripts, various" [ Using merge message suggestion from Vlastimil Babka, with some editing - Linus ] * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (100 commits) fs/select.c: use struct_size() in kmalloc() mm: add account_locked_vm utility function arm64: mm: implement pte_devmap support mm: introduce ARCH_HAS_PTE_DEVMAP mm: clean up is_device_*_page() definitions mm/mmap: move common defines to mman-common.h mm: move MAP_SYNC to asm-generic/mman-common.h device-dax: "Hotremove" persistent memory that is used like normal RAM mm/hotplug: make remove_memory() interface usable device-dax: fix memory and resource leak if hotplug fails include/linux/lz4.h: fix spelling and copy-paste errors in documentation ipc/mqueue.c: only perform resource calculation if user valid include/asm-generic/bug.h: fix "cut here" for WARN_ON for __WARN_TAINT architectures scripts/gdb: add helpers to find and list devices scripts/gdb: add lx-genpd-summary command drivers/pps/pps.c: clear offset flags in PPS_SETPARAMS ioctl kernel/pid.c: convert struct pid count to refcount_t drivers/rapidio/devices/rio_mport_cdev.c: NUL terminate some strings select: shift restore_saved_sigmask_unless() into poll_select_copy_remaining() select: change do_poll() to return -ERESTARTNOHAND rather than -EINTR ...
This commit is contained in:
commit
57a8ec387e
151 changed files with 2672 additions and 1223 deletions
|
@ -6639,6 +6639,12 @@ sub process {
|
|||
"unknown module license " . $extracted_string . "\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
|
||||
# check for sysctl duplicate constants
|
||||
if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) {
|
||||
WARN("DUPLICATED_SYSCTL_CONST",
|
||||
"duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
|
||||
# If we have no input at all, then there is nothing to report on
|
||||
|
|
182
scripts/gdb/linux/device.py
Normal file
182
scripts/gdb/linux/device.py
Normal file
|
@ -0,0 +1,182 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Copyright (c) NXP 2019
|
||||
|
||||
import gdb
|
||||
|
||||
from linux.utils import CachedType
|
||||
from linux.utils import container_of
|
||||
from linux.lists import list_for_each_entry
|
||||
|
||||
|
||||
device_private_type = CachedType('struct device_private')
|
||||
device_type = CachedType('struct device')
|
||||
|
||||
subsys_private_type = CachedType('struct subsys_private')
|
||||
kobject_type = CachedType('struct kobject')
|
||||
kset_type = CachedType('struct kset')
|
||||
|
||||
bus_type = CachedType('struct bus_type')
|
||||
class_type = CachedType('struct class')
|
||||
|
||||
|
||||
def dev_name(dev):
|
||||
dev_init_name = dev['init_name']
|
||||
if dev_init_name:
|
||||
return dev_init_name.string()
|
||||
return dev['kobj']['name'].string()
|
||||
|
||||
|
||||
def kset_for_each_object(kset):
|
||||
return list_for_each_entry(kset['list'],
|
||||
kobject_type.get_type().pointer(), "entry")
|
||||
|
||||
|
||||
def for_each_bus():
|
||||
for kobj in kset_for_each_object(gdb.parse_and_eval('bus_kset')):
|
||||
subsys = container_of(kobj, kset_type.get_type().pointer(), 'kobj')
|
||||
subsys_priv = container_of(subsys, subsys_private_type.get_type().pointer(), 'subsys')
|
||||
yield subsys_priv['bus']
|
||||
|
||||
|
||||
def for_each_class():
|
||||
for kobj in kset_for_each_object(gdb.parse_and_eval('class_kset')):
|
||||
subsys = container_of(kobj, kset_type.get_type().pointer(), 'kobj')
|
||||
subsys_priv = container_of(subsys, subsys_private_type.get_type().pointer(), 'subsys')
|
||||
yield subsys_priv['class']
|
||||
|
||||
|
||||
def get_bus_by_name(name):
|
||||
for item in for_each_bus():
|
||||
if item['name'].string() == name:
|
||||
return item
|
||||
raise gdb.GdbError("Can't find bus type {!r}".format(name))
|
||||
|
||||
|
||||
def get_class_by_name(name):
|
||||
for item in for_each_class():
|
||||
if item['name'].string() == name:
|
||||
return item
|
||||
raise gdb.GdbError("Can't find device class {!r}".format(name))
|
||||
|
||||
|
||||
klist_type = CachedType('struct klist')
|
||||
klist_node_type = CachedType('struct klist_node')
|
||||
|
||||
|
||||
def klist_for_each(klist):
|
||||
return list_for_each_entry(klist['k_list'],
|
||||
klist_node_type.get_type().pointer(), 'n_node')
|
||||
|
||||
|
||||
def bus_for_each_device(bus):
|
||||
for kn in klist_for_each(bus['p']['klist_devices']):
|
||||
dp = container_of(kn, device_private_type.get_type().pointer(), 'knode_bus')
|
||||
yield dp['device']
|
||||
|
||||
|
||||
def class_for_each_device(cls):
|
||||
for kn in klist_for_each(cls['p']['klist_devices']):
|
||||
dp = container_of(kn, device_private_type.get_type().pointer(), 'knode_class')
|
||||
yield dp['device']
|
||||
|
||||
|
||||
def device_for_each_child(dev):
|
||||
for kn in klist_for_each(dev['p']['klist_children']):
|
||||
dp = container_of(kn, device_private_type.get_type().pointer(), 'knode_parent')
|
||||
yield dp['device']
|
||||
|
||||
|
||||
def _show_device(dev, level=0, recursive=False):
|
||||
gdb.write('{}dev {}:\t{}\n'.format('\t' * level, dev_name(dev), dev))
|
||||
if recursive:
|
||||
for child in device_for_each_child(dev):
|
||||
_show_device(child, level + 1, recursive)
|
||||
|
||||
|
||||
class LxDeviceListBus(gdb.Command):
|
||||
'''Print devices on a bus (or all buses if not specified)'''
|
||||
|
||||
def __init__(self):
|
||||
super(LxDeviceListBus, self).__init__('lx-device-list-bus', gdb.COMMAND_DATA)
|
||||
|
||||
def invoke(self, arg, from_tty):
|
||||
if not arg:
|
||||
for bus in for_each_bus():
|
||||
gdb.write('bus {}:\t{}\n'.format(bus['name'].string(), bus))
|
||||
for dev in bus_for_each_device(bus):
|
||||
_show_device(dev, level=1)
|
||||
else:
|
||||
bus = get_bus_by_name(arg)
|
||||
if not bus:
|
||||
raise gdb.GdbError("Can't find bus {!r}".format(arg))
|
||||
for dev in bus_for_each_device(bus):
|
||||
_show_device(dev)
|
||||
|
||||
|
||||
class LxDeviceListClass(gdb.Command):
|
||||
'''Print devices in a class (or all classes if not specified)'''
|
||||
|
||||
def __init__(self):
|
||||
super(LxDeviceListClass, self).__init__('lx-device-list-class', gdb.COMMAND_DATA)
|
||||
|
||||
def invoke(self, arg, from_tty):
|
||||
if not arg:
|
||||
for cls in for_each_class():
|
||||
gdb.write("class {}:\t{}\n".format(cls['name'].string(), cls))
|
||||
for dev in class_for_each_device(cls):
|
||||
_show_device(dev, level=1)
|
||||
else:
|
||||
cls = get_class_by_name(arg)
|
||||
for dev in class_for_each_device(cls):
|
||||
_show_device(dev)
|
||||
|
||||
|
||||
class LxDeviceListTree(gdb.Command):
|
||||
'''Print a device and its children recursively'''
|
||||
|
||||
def __init__(self):
|
||||
super(LxDeviceListTree, self).__init__('lx-device-list-tree', gdb.COMMAND_DATA)
|
||||
|
||||
def invoke(self, arg, from_tty):
|
||||
if not arg:
|
||||
raise gdb.GdbError('Please provide pointer to struct device')
|
||||
dev = gdb.parse_and_eval(arg)
|
||||
if dev.type != device_type.get_type().pointer():
|
||||
raise gdb.GdbError('Please provide pointer to struct device')
|
||||
_show_device(dev, level=0, recursive=True)
|
||||
|
||||
|
||||
class LxDeviceFindByBusName(gdb.Function):
|
||||
'''Find struct device by bus and name (both strings)'''
|
||||
|
||||
def __init__(self):
|
||||
super(LxDeviceFindByBusName, self).__init__('lx_device_find_by_bus_name')
|
||||
|
||||
def invoke(self, bus, name):
|
||||
name = name.string()
|
||||
bus = get_bus_by_name(bus.string())
|
||||
for dev in bus_for_each_device(bus):
|
||||
if dev_name(dev) == name:
|
||||
return dev
|
||||
|
||||
|
||||
class LxDeviceFindByClassName(gdb.Function):
|
||||
'''Find struct device by class and name (both strings)'''
|
||||
|
||||
def __init__(self):
|
||||
super(LxDeviceFindByClassName, self).__init__('lx_device_find_by_class_name')
|
||||
|
||||
def invoke(self, cls, name):
|
||||
name = name.string()
|
||||
cls = get_class_by_name(cls.string())
|
||||
for dev in class_for_each_device(cls):
|
||||
if dev_name(dev) == name:
|
||||
return dev
|
||||
|
||||
|
||||
LxDeviceListBus()
|
||||
LxDeviceListClass()
|
||||
LxDeviceListTree()
|
||||
LxDeviceFindByBusName()
|
||||
LxDeviceFindByClassName()
|
83
scripts/gdb/linux/genpd.py
Normal file
83
scripts/gdb/linux/genpd.py
Normal file
|
@ -0,0 +1,83 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Copyright (c) NXP 2019
|
||||
|
||||
import gdb
|
||||
import sys
|
||||
|
||||
from linux.utils import CachedType
|
||||
from linux.lists import list_for_each_entry
|
||||
|
||||
generic_pm_domain_type = CachedType('struct generic_pm_domain')
|
||||
pm_domain_data_type = CachedType('struct pm_domain_data')
|
||||
device_link_type = CachedType('struct device_link')
|
||||
|
||||
|
||||
def kobject_get_path(kobj):
|
||||
path = kobj['name'].string()
|
||||
parent = kobj['parent']
|
||||
if parent:
|
||||
path = kobject_get_path(parent) + '/' + path
|
||||
return path
|
||||
|
||||
|
||||
def rtpm_status_str(dev):
|
||||
if dev['power']['runtime_error']:
|
||||
return 'error'
|
||||
if dev['power']['disable_depth']:
|
||||
return 'unsupported'
|
||||
_RPM_STATUS_LOOKUP = [
|
||||
"active",
|
||||
"resuming",
|
||||
"suspended",
|
||||
"suspending"
|
||||
]
|
||||
return _RPM_STATUS_LOOKUP[dev['power']['runtime_status']]
|
||||
|
||||
|
||||
class LxGenPDSummary(gdb.Command):
|
||||
'''Print genpd summary
|
||||
|
||||
Output is similar to /sys/kernel/debug/pm_genpd/pm_genpd_summary'''
|
||||
|
||||
def __init__(self):
|
||||
super(LxGenPDSummary, self).__init__('lx-genpd-summary', gdb.COMMAND_DATA)
|
||||
|
||||
def summary_one(self, genpd):
|
||||
if genpd['status'] == 0:
|
||||
status_string = 'on'
|
||||
else:
|
||||
status_string = 'off-{}'.format(genpd['state_idx'])
|
||||
|
||||
slave_names = []
|
||||
for link in list_for_each_entry(
|
||||
genpd['master_links'],
|
||||
device_link_type.get_type().pointer(),
|
||||
'master_node'):
|
||||
slave_names.apend(link['slave']['name'])
|
||||
|
||||
gdb.write('%-30s %-15s %s\n' % (
|
||||
genpd['name'].string(),
|
||||
status_string,
|
||||
', '.join(slave_names)))
|
||||
|
||||
# Print devices in domain
|
||||
for pm_data in list_for_each_entry(genpd['dev_list'],
|
||||
pm_domain_data_type.get_type().pointer(),
|
||||
'list_node'):
|
||||
dev = pm_data['dev']
|
||||
kobj_path = kobject_get_path(dev['kobj'])
|
||||
gdb.write(' %-50s %s\n' % (kobj_path, rtpm_status_str(dev)))
|
||||
|
||||
def invoke(self, arg, from_tty):
|
||||
gdb.write('domain status slaves\n');
|
||||
gdb.write(' /device runtime status\n');
|
||||
gdb.write('----------------------------------------------------------------------\n');
|
||||
for genpd in list_for_each_entry(
|
||||
gdb.parse_and_eval('&gpd_list'),
|
||||
generic_pm_domain_type.get_type().pointer(),
|
||||
'gpd_list_node'):
|
||||
self.summary_one(genpd)
|
||||
|
||||
|
||||
LxGenPDSummary()
|
|
@ -35,3 +35,5 @@ else:
|
|||
import linux.constants
|
||||
import linux.timerlist
|
||||
import linux.clk
|
||||
import linux.genpd
|
||||
import linux.device
|
||||
|
|
|
@ -27,6 +27,7 @@ my $email_usename = 1;
|
|||
my $email_maintainer = 1;
|
||||
my $email_reviewer = 1;
|
||||
my $email_list = 1;
|
||||
my $email_moderated_list = 1;
|
||||
my $email_subscriber_list = 0;
|
||||
my $email_git_penguin_chiefs = 0;
|
||||
my $email_git = 0;
|
||||
|
@ -248,6 +249,7 @@ if (!GetOptions(
|
|||
'r!' => \$email_reviewer,
|
||||
'n!' => \$email_usename,
|
||||
'l!' => \$email_list,
|
||||
'moderated!' => \$email_moderated_list,
|
||||
's!' => \$email_subscriber_list,
|
||||
'multiline!' => \$output_multiline,
|
||||
'roles!' => \$output_roles,
|
||||
|
@ -1023,7 +1025,8 @@ MAINTAINER field selection options:
|
|||
--r => include reviewer(s) if any
|
||||
--n => include name 'Full Name <addr\@domain.tld>'
|
||||
--l => include list(s) if any
|
||||
--s => include subscriber only list(s) if any
|
||||
--moderated => include moderated lists(s) if any (default: true)
|
||||
--s => include subscriber only list(s) if any (default: false)
|
||||
--remove-duplicates => minimize duplicate email names/addresses
|
||||
--roles => show roles (status:subsystem, git-signer, list, etc...)
|
||||
--rolestats => show roles and statistics (commits/total_commits, %)
|
||||
|
@ -1313,11 +1316,14 @@ sub add_categories {
|
|||
} else {
|
||||
if ($email_list) {
|
||||
if (!$hash_list_to{lc($list_address)}) {
|
||||
$hash_list_to{lc($list_address)} = 1;
|
||||
if ($list_additional =~ m/moderated/) {
|
||||
push(@list_to, [$list_address,
|
||||
"moderated list${list_role}"]);
|
||||
if ($email_moderated_list) {
|
||||
$hash_list_to{lc($list_address)} = 1;
|
||||
push(@list_to, [$list_address,
|
||||
"moderated list${list_role}"]);
|
||||
}
|
||||
} else {
|
||||
$hash_list_to{lc($list_address)} = 1;
|
||||
push(@list_to, [$list_address,
|
||||
"open list${list_role}"]);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue