mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* kernel/module/dups.c:118:6: warning: no previous prototype for 'kmod_dup_request_exists_wait'
@ 2023-05-02  1:59 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2023-05-02  1:59 UTC (permalink / raw)
  To: Luis Chamberlain; +Cc: oe-kbuild-all, linux-kernel

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   c8c655c34e33544aec9d64b660872ab33c29b5f1
commit: 8660484ed1cf3261e89e0bad94c6395597e87599 module: add debugging auto-load duplicate module support
date:   12 days ago
config: sparc-allyesconfig (https://download.01.org/0day-ci/archive/20230502/202305020955.b724hNuQ-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8660484ed1cf3261e89e0bad94c6395597e87599
        git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout 8660484ed1cf3261e89e0bad94c6395597e87599
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sparc olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sparc SHELL=/bin/bash kernel/module/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Link: https://lore.kernel.org/oe-kbuild-all/202305020955.b724hNuQ-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> kernel/module/dups.c:118:6: warning: no previous prototype for 'kmod_dup_request_exists_wait' [-Wmissing-prototypes]
     118 | bool kmod_dup_request_exists_wait(char *module_name, bool wait, int *dup_ret)
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> kernel/module/dups.c:220:6: warning: no previous prototype for 'kmod_dup_request_announce' [-Wmissing-prototypes]
     220 | void kmod_dup_request_announce(char *module_name, int ret)
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~


vim +/kmod_dup_request_exists_wait +118 kernel/module/dups.c

   117	
 > 118	bool kmod_dup_request_exists_wait(char *module_name, bool wait, int *dup_ret)
   119	{
   120		struct kmod_dup_req *kmod_req, *new_kmod_req;
   121		int ret;
   122	
   123		/*
   124		 * Pre-allocate the entry in case we have to use it later
   125		 * to avoid contention with the mutex.
   126		 */
   127		new_kmod_req = kzalloc(sizeof(*new_kmod_req), GFP_KERNEL);
   128		if (!new_kmod_req)
   129			return false;
   130	
   131		memcpy(new_kmod_req->name, module_name, strlen(module_name));
   132		INIT_WORK(&new_kmod_req->complete_work, kmod_dup_request_complete);
   133		INIT_DELAYED_WORK(&new_kmod_req->delete_work, kmod_dup_request_delete);
   134		init_completion(&new_kmod_req->first_req_done);
   135	
   136		mutex_lock(&kmod_dup_mutex);
   137	
   138		kmod_req = kmod_dup_request_lookup(module_name);
   139		if (!kmod_req) {
   140			/*
   141			 * If the first request that came through for a module
   142			 * was with request_module_nowait() we cannot wait for it
   143			 * and share its return value with other users which may
   144			 * have used request_module() and need a proper return value
   145			 * so just skip using them as an anchor.
   146			 *
   147			 * If a prior request to this one came through with
   148			 * request_module() though, then a request_module_nowait()
   149			 * would benefit from duplicate detection.
   150			 */
   151			if (!wait) {
   152				kfree(new_kmod_req);
   153				pr_debug("New request_module_nowait() for %s -- cannot track duplicates for this request\n", module_name);
   154				mutex_unlock(&kmod_dup_mutex);
   155				return false;
   156			}
   157	
   158			/*
   159			 * There was no duplicate, just add the request so we can
   160			 * keep tab on duplicates later.
   161			 */
   162			pr_debug("New request_module() for %s\n", module_name);
   163			list_add_rcu(&new_kmod_req->list, &dup_kmod_reqs);
   164			mutex_unlock(&kmod_dup_mutex);
   165			return false;
   166		}
   167		mutex_unlock(&kmod_dup_mutex);
   168	
   169		/* We are dealing with a duplicate request now */
   170		kfree(new_kmod_req);
   171	
   172		/*
   173		 * To fix these try to use try_then_request_module() instead as that
   174		 * will check if the component you are looking for is present or not.
   175		 * You could also just queue a single request to load the module once,
   176		 * instead of having each and everything you need try to request for
   177		 * the module.
   178		 *
   179		 * Duplicate request_module() calls  can cause quite a bit of wasted
   180		 * vmalloc() space when racing with userspace.
   181		 */
   182		if (enable_dups_trace)
   183			WARN(1, "module-autoload: duplicate request for module %s\n", module_name);
   184		else
   185			pr_warn("module-autoload: duplicate request for module %s\n", module_name);
   186	
   187		if (!wait) {
   188			/*
   189			 * If request_module_nowait() was used then the user just
   190			 * wanted to issue the request and if another module request
   191			 * was already its way with the same name we don't care for
   192			 * the return value either. Let duplicate request_module_nowait()
   193			 * calls bail out right away.
   194			 */
   195			*dup_ret = 0;
   196			return true;
   197		}
   198	
   199		/*
   200		 * If a duplicate request_module() was used they *may* care for
   201		 * the return value, so we have no other option but to wait for
   202		 * the first caller to complete. If the first caller used
   203		 * the request_module_nowait() call, subsquent callers will
   204		 * deal with the comprmise of getting a successful call with this
   205		 * optimization enabled ...
   206		 */
   207		ret = wait_for_completion_state(&kmod_req->first_req_done,
   208						TASK_UNINTERRUPTIBLE | TASK_KILLABLE);
   209		if (ret) {
   210			*dup_ret = ret;
   211			return true;
   212		}
   213	
   214		/* Now the duplicate request has the same exact return value as the first request */
   215		*dup_ret = kmod_req->dup_ret;
   216	
   217		return true;
   218	}
   219	
 > 220	void kmod_dup_request_announce(char *module_name, int ret)

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-05-02  2:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-02  1:59 kernel/module/dups.c:118:6: warning: no previous prototype for 'kmod_dup_request_exists_wait' kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®