On Tue, Mar 11, 2025 at 04:30:18PM -0400, John B. Wyatt IV wrote: > Extracting the code allows these previously local (global to the file) > variables and functions to be used in other files of tuna. Reducing > the number of globals makes the code cleaner and reduces the size of > tuna-cmd.py. > > Included a suggestion by Crystal to move a function from the latter > patch into utils.py and make it dependant on get_nr_cpus() (v2). > > Included a request by John Kacur to place the SPDX message at the top of > the file (v4). > > Suggested-by: Crystal Wood <crwood@xxxxxxxxxx> > > Signed-off-by: John B. Wyatt IV <jwyatt@xxxxxxxxxx> > Signed-off-by: John B. Wyatt IV <sageofredondo@xxxxxxxxx> > --- > tuna-cmd.py | 34 +++++++--------------------------- > tuna/utils.py | 28 ++++++++++++++++++++++++++++ > 2 files changed, 35 insertions(+), 27 deletions(-) > create mode 100644 tuna/utils.py > > diff --git a/tuna-cmd.py b/tuna-cmd.py > index f37e286..d0323f5 100755 > --- a/tuna-cmd.py > +++ b/tuna-cmd.py > @@ -21,7 +21,7 @@ from functools import reduce > import tuna.new_eth as ethtool > import tuna.tuna_sched as tuna_sched > import procfs > -from tuna import tuna, sysfs > +from tuna import tuna, sysfs, utils > import logging > import time > import shutil > @@ -76,7 +76,6 @@ except: > > # FIXME: ETOOMANYGLOBALS, we need a class! > > -nr_cpus = None > ps = None > irqs = None > > @@ -233,25 +232,6 @@ def gen_parser(): > return parser > > > -def get_nr_cpus(): > - """ Get all cpus including disabled cpus """ > - global nr_cpus > - if nr_cpus: > - return nr_cpus > - nr_cpus = os.sysconf('SC_NPROCESSORS_CONF') > - return nr_cpus > - > -nics = None > - > - > -def get_nics(): > - global nics > - if nics: > - return nics > - nics = ethtool.get_active_devices() > - return nics > - > - > def thread_help(tid): > global ps > if not ps: > @@ -277,7 +257,7 @@ def save(cpu_list, thread_list, filename): > if (cpu_list and not set(kt.affinity).intersection(set(cpu_list))) or \ > (thread_list and kt.pid not in thread_list): > del kthreads[name] > - tuna.generate_rtgroups(filename, kthreads, get_nr_cpus()) > + tuna.generate_rtgroups(filename, kthreads, utils.get_nr_cpus()) > > > def ps_show_header(has_ctxt_switch_info, cgroups=False): > @@ -328,7 +308,7 @@ def format_affinity(affinity): > if len(affinity) <= 4: > return ",".join(str(a) for a in affinity) > > - return ",".join(str(hex(a)) for a in procfs.hexbitmask(affinity, get_nr_cpus())) > + return ",".join(str(hex(a)) for a in procfs.hexbitmask(affinity, utils.get_nr_cpus())) > > def ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info, sock_inodes, > sock_inode_re, cgroups, columns=None, compact=True): > @@ -351,7 +331,7 @@ def ps_show_thread(pid, affect_children, ps, has_ctxt_switch_info, sock_inodes, > irqs = procfs.interrupts() > users = irqs[tuna.irq_thread_number(cmd)]["users"] > for u in users: > - if u in get_nics(): > + if u in utils.get_nics(): > users[users.index(u)] = "%s(%s)" % ( > u, ethtool.get_module(u)) > users = ",".join(users) > @@ -486,7 +466,7 @@ def do_ps(thread_list, cpu_list, irq_list, show_uthreads, show_kthreads, > > > def find_drivers_by_users(users): > - nics = get_nics() > + nics = utils.get_nics() > drivers = [] > for u in users: > try: > @@ -689,10 +669,10 @@ def main(): > apply_config(args.profilename) > > elif args.command in ['include', 'I']: > - tuna.include_cpus(args.cpu_list, get_nr_cpus()) > + tuna.include_cpus(args.cpu_list, utils.get_nr_cpus()) > > elif args.command in ['isolate', 'i']: > - tuna.isolate_cpus(args.cpu_list, get_nr_cpus()) > + tuna.isolate_cpus(args.cpu_list, utils.get_nr_cpus()) > > elif args.command in ['run', 'r']: > > diff --git a/tuna/utils.py b/tuna/utils.py > new file mode 100644 > index 0000000..f55432d > --- /dev/null > +++ b/tuna/utils.py > @@ -0,0 +1,28 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +# Copyright (C) 2024 John B. Wyatt IV > + > +import os > + > +import tuna.new_eth as ethtool > + > +# Collect a few globals and functions so they can be reused in other modules > +nr_cpus = None > +nics = None > + > +def get_nr_cpus(): > + """ Get all cpus including disabled cpus """ > + global nr_cpus > + if nr_cpus != None: Really a nit: as a general standard, objects should be compared to None using the "is" operator. > + return nr_cpus > + nr_cpus = os.sysconf('SC_NPROCESSORS_CONF') > + return nr_cpus > + > +def get_all_cpu_list(): > + return list(range(get_nr_cpus())) > + > +def get_nics(): > + global nics > + if nics != None: Ditto. > + return nics > + nics = ethtool.get_active_devices() > + return nics > -- > 2.48.1 >