All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: aubrey.li@linux.intel.com
Cc: oe-kbuild-all@lists.linux.dev
Subject: [anolis-intel-cloud:devel-5.10 7/7] drivers/crypto/ccp/vpsp.c:65: warning: Function parameter or member 'vpsp_cmd_ctx_table' not described in 'DEFINE_HASHTABLE'
Date: Thu, 3 Apr 2025 02:41:01 +0800	[thread overview]
Message-ID: <202504030255.RstgRL6u-lkp@intel.com> (raw)

tree:   https://gitee.com/anolis/intel-cloud-kernel.git devel-5.10
head:   5bcfae793917ca097364501bd3ff69d749df729e
commit: 6ce26e500b6bb9b4220c636e1bd657ecda0b4d4a [7/7] anolis: crypto: ccp: Use a workqueue to clean up the vpsp ringbuffer
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20250403/202504030255.RstgRL6u-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250403/202504030255.RstgRL6u-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202504030255.RstgRL6u-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/crypto/ccp/vpsp.c:65: warning: Function parameter or member 'vpsp_cmd_ctx_table' not described in 'DEFINE_HASHTABLE'
>> drivers/crypto/ccp/vpsp.c:65: warning: Function parameter or member '11' not described in 'DEFINE_HASHTABLE'
>> drivers/crypto/ccp/vpsp.c:124: warning: Function parameter or member 'key1' not described in 'vpsp_cmd_ctx_create'
>> drivers/crypto/ccp/vpsp.c:124: warning: Function parameter or member 'key2' not described in 'vpsp_cmd_ctx_create'
>> drivers/crypto/ccp/vpsp.c:124: warning: Excess function parameter 'hkey' description in 'vpsp_cmd_ctx_create'
   drivers/crypto/ccp/vpsp.c:220: warning: Function parameter or member 'vpsp' not described in 'kvm_pv_psp_cmd_pre_op'
   drivers/crypto/ccp/vpsp.c:220: warning: Function parameter or member 'data_gpa' not described in 'kvm_pv_psp_cmd_pre_op'
>> drivers/crypto/ccp/vpsp.c:220: warning: Function parameter or member 'cmd_ctx' not described in 'kvm_pv_psp_cmd_pre_op'
   drivers/crypto/ccp/vpsp.c:474: warning: Cannot understand  * @brief Directly convert the gpa address into hpa and forward it to PSP,
    on line 474 - I thought it was a doc line
   drivers/crypto/ccp/vpsp.c:580: warning: Cannot understand  * @brief copy data in gpa to host memory and send it to psp for processing.
    on line 580 - I thought it was a doc line
   drivers/crypto/ccp/vpsp.c:722: warning: cannot understand function prototype: 'uint32_t allow_default_vid = 1; '
>> drivers/crypto/ccp/vpsp.c:737: warning: Function parameter or member 'ctx' not described in 'vpsp_get_dev_ctx'
>> drivers/crypto/ccp/vpsp.c:737: warning: Function parameter or member 'pid' not described in 'vpsp_get_dev_ctx'
   drivers/crypto/ccp/vpsp.c:763: warning: Function parameter or member 'vid' not described in 'vpsp_add_vid'


vim +65 drivers/crypto/ccp/vpsp.c

    33	
    34	/*
    35	 * The file mainly implements the base execution
    36	 * logic of virtual PSP in kernel mode, which mainly includes:
    37	 *	(1) Preprocess the guest data in the host kernel
    38	 *
    39	 *	(2) The command that has been converted will interact
    40	 *		with the channel of the psp through the driver and
    41	 *		try to obtain the execution result
    42	 *	(3) The executed command data is recovered, and then returned to the VM
    43	 *
    44	 * The primary implementation logic of virtual PSP in kernel mode
    45	 * call trace:
    46	 * guest command(vmmcall, KVM_HC_PSP_COPY_FORWARD_OP)
    47	 *		   |
    48	 *	kvm_pv_psp_copy_op---->	| -> kvm_pv_psp_cmd_pre_op
    49	 *				|
    50	 *				| -> vpsp_try_do_cmd/vpsp_try_get_result
    51	 *				|	|<=> psp device driver
    52	 *				|
    53	 *				|
    54	 *				|-> kvm_pv_psp_cmd_post_op
    55	 *
    56	 * guest command(vmmcall, KVM_HC_PSP_FORWARD_OP)
    57	 *		   |
    58	 *	kvm_pv_psp_forward_op-> |-> vpsp_try_do_cmd/vpsp_try_get_result
    59	 *					|<=> psp device driver
    60	 */
    61	/**
    62	 * used to locate the command context,
    63	 * when the guest enters the host via vmmcall
    64	 */
  > 65	DEFINE_HASHTABLE(vpsp_cmd_ctx_table, 11);
    66	DEFINE_RWLOCK(table_rwlock);
    67	
    68	static struct vpsp_cmd_ctx *vpsp_hashtable_find_cmd_ctx(gpa_t key1, pid_t key2)
    69	{
    70		struct vpsp_cmd_ctx *entry = NULL;
    71		bool is_found = false;
    72	
    73		read_lock(&table_rwlock);
    74		hash_for_each_possible(vpsp_cmd_ctx_table, entry, node, key1) {
    75			if (entry->key1 == key1 && entry->key2 == key2) {
    76				is_found = true;
    77				break;
    78			}
    79		}
    80		read_unlock(&table_rwlock);
    81		if (!is_found)
    82			entry = NULL;
    83	
    84		return entry;
    85	}
    86	
    87	static void vpsp_hashtable_add_cmd_ctx(struct vpsp_cmd_ctx *ctx)
    88	{
    89		struct vpsp_cmd_ctx *entry = NULL;
    90	
    91		write_lock(&table_rwlock);
    92		hash_for_each_possible(vpsp_cmd_ctx_table, entry, node, ctx->key1) {
    93			if (entry->key1 == ctx->key1 &&
    94					entry->key2 == ctx->key2) {
    95				vpsp_cmd_ctx_obj_put(entry, true);
    96				break;
    97			}
    98		}
    99		hash_add(vpsp_cmd_ctx_table, &ctx->node, ctx->key1);
   100		write_unlock(&table_rwlock);
   101	
   102		vpsp_cmd_ctx_obj_get(ctx);
   103	}
   104	
   105	static void vpsp_hashtable_remove_cmd_ctx(struct vpsp_cmd_ctx *ctx)
   106	{
   107		write_lock(&table_rwlock);
   108		hash_del(&ctx->node);
   109		write_unlock(&table_rwlock);
   110	
   111		vpsp_cmd_ctx_obj_put(ctx, false);
   112	}
   113	
   114	/**
   115	 * Create a vpsp_cmd_ctx object and insert it into the
   116	 * vpsp_cmd_ctx_table hash table.
   117	 *
   118	 * @hkey: The key value for the hash table vpsp_cmd_ctx_table
   119	 *
   120	 * Return: the address of the vpsp_cmd_ctx object
   121	 *	   if created successfully, otherwise returns NULL
   122	 */
   123	static struct vpsp_cmd_ctx *vpsp_cmd_ctx_create(gpa_t key1, pid_t key2)
 > 124	{
   125		struct vpsp_cmd_ctx *cmd_ctx = kmem_cache_zalloc(vpsp_cmd_ctx_slab, GFP_KERNEL);
   126	
   127		if (cmd_ctx) {
   128			/**
   129			 * According to the implementation of refcount,
   130			 * the initial value must be greater than 0.
   131			 */
   132			refcount_set(&cmd_ctx->ref, 1);
   133			cmd_ctx->statval = VPSP_CMD_STATUS_RUNNING;
   134			cmd_ctx->key1 = key1;
   135			cmd_ctx->key2 = key2;
   136			vpsp_hashtable_add_cmd_ctx(cmd_ctx);
   137		}
   138		return cmd_ctx;
   139	}
   140	
   141	/**
   142	 * Destroys the specified vpsp_cmd_ctx object,
   143	 * indicating it will no longer be accessed.
   144	 *
   145	 * But does not necessarily free the cmd_ctx memory immediately,
   146	 * only additional to perform decrement refcount.
   147	 *
   148	 * Actual memory release occurs when the refcount drops to 0,
   149	 * which may happen during the vpsp_worker_handler or
   150	 * vpsp_cmd_ctx_destroy process.
   151	 *
   152	 * @cmd_ctx: the vpsp_cmd_ctx object
   153	 */
   154	static void vpsp_cmd_ctx_destroy(struct vpsp_cmd_ctx *cmd_ctx)
   155	{
   156		if (!cmd_ctx)
   157			return;
   158		/**
   159		 * The initial refcount is 1,
   160		 * need to additional decrement a refcount.
   161		 */
   162		vpsp_cmd_ctx_obj_put(cmd_ctx, false);
   163		vpsp_hashtable_remove_cmd_ctx(cmd_ctx);
   164	}
   165	
   166	void vpsp_cmd_ctx_obj_get(struct vpsp_cmd_ctx *cmd_ctx)
   167	{
   168		refcount_inc(&cmd_ctx->ref);
   169	}
   170	
   171	void vpsp_cmd_ctx_obj_put(struct vpsp_cmd_ctx *cmd_ctx, bool force)
   172	{
   173		do {
   174			if (refcount_dec_and_test(&cmd_ctx->ref)) {
   175				kfree(cmd_ctx->data);
   176				memset(cmd_ctx, 0, sizeof(*cmd_ctx));
   177				kmem_cache_free(vpsp_cmd_ctx_slab, cmd_ctx);
   178				force = false;
   179			}
   180		} while (force);
   181	}
   182	
   183	struct psp_cmdresp_head {
   184		uint32_t buf_size;
   185		uint32_t cmdresp_size;
   186		uint32_t cmdresp_code;
   187	} __packed;
   188	
   189	static int check_gpa_range(struct vpsp_dev_ctx *vpsp_ctx, gpa_t addr, uint32_t size)
   190	{
   191		if (!vpsp_ctx || !addr)
   192			return -EFAULT;
   193	
   194		if (addr >= vpsp_ctx->gpa_start && (addr + size) <= vpsp_ctx->gpa_end)
   195			return 0;
   196		return -EFAULT;
   197	}
   198	
   199	static int check_psp_mem_range(struct vpsp_dev_ctx *vpsp_ctx,
   200				void *data, uint32_t size)
   201	{
   202		if ((((uintptr_t)data + size - 1) & ~PSP_2MB_MASK) !=
   203				((uintptr_t)data & ~PSP_2MB_MASK)) {
   204			pr_err("data %llx, size %d crossing 2MB\n", (u64)data, size);
   205			return -EFAULT;
   206		}
   207	
   208		if (vpsp_ctx)
   209			return check_gpa_range(vpsp_ctx, (gpa_t)data, size);
   210	
   211		return 0;
   212	}
   213	
   214	/**
   215	 * Copy Guest data to the Host kernel buffer
   216	 * and allocate a cmd_ctx to insert into the vpsp_cmd_ctx_table.
   217	 */
   218	static int kvm_pv_psp_cmd_pre_op(struct kvm_vpsp *vpsp, gpa_t data_gpa,
   219			struct vpsp_cmd_ctx **cmd_ctx)
 > 220	{
   221		int ret = 0;
   222		void *data = NULL;
   223		struct psp_cmdresp_head psp_head;
   224		uint32_t data_size;
   225	
   226		if (unlikely(!cmd_ctx))
   227			return -EFAULT;
   228		*cmd_ctx = NULL;
   229	
   230		if (unlikely(vpsp->read_guest(vpsp->kvm, data_gpa, &psp_head,
   231						sizeof(struct psp_cmdresp_head))))
   232			return -EFAULT;
   233	
   234		data_size = psp_head.buf_size;
   235		if (check_psp_mem_range(NULL, (void *)data_gpa, data_size))
   236			return -EFAULT;
   237	
   238		data = kzalloc(data_size, GFP_KERNEL);
   239		if (!data)
   240			return -ENOMEM;
   241	
   242		*cmd_ctx = vpsp_cmd_ctx_create(data_gpa, vpsp->kvm->userspace_pid);
   243		if (!(*cmd_ctx)) {
   244			ret = -EFAULT;
   245			goto end;
   246		}
   247	
   248		if (unlikely(vpsp->read_guest(vpsp->kvm, data_gpa, data, data_size))) {
   249			ret = -EFAULT;
   250			goto end;
   251		}
   252	
   253		(*cmd_ctx)->data = data;
   254		(*cmd_ctx)->data_size = data_size;
   255	end:
   256		if (ret) {
   257			vpsp_cmd_ctx_destroy(*cmd_ctx);
   258			kfree(data);
   259		}
   260		return ret;
   261	}
   262	

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

                 reply	other threads:[~2025-04-02 18:41 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202504030255.RstgRL6u-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=aubrey.li@linux.intel.com \
    --cc=oe-kbuild-all@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.