Unverified Commit f9870b23 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!14176 padata: make padata_do_parallel find alternate callback CPU

parents 07d14ba2 f44b6222
Loading
Loading
Loading
Loading
+2 −31
Original line number Diff line number Diff line
@@ -70,35 +70,6 @@ struct pcrypt_aead_ctx {
	unsigned int cb_cpu;
};

static int pcrypt_do_parallel(struct padata_priv *padata, unsigned int *cb_cpu,
			      struct padata_pcrypt *pcrypt)
{
	unsigned int cpu_index, cpu, i;
	struct pcrypt_cpumask *cpumask;

	cpu = *cb_cpu;

	rcu_read_lock_bh();
	cpumask = rcu_dereference_bh(pcrypt->cb_cpumask);
	if (cpumask_test_cpu(cpu, cpumask->mask))
			goto out;

	if (!cpumask_weight(cpumask->mask))
			goto out;

	cpu_index = cpu % cpumask_weight(cpumask->mask);

	cpu = cpumask_first(cpumask->mask);
	for (i = 0; i < cpu_index; i++)
		cpu = cpumask_next(cpu, cpumask->mask);

	*cb_cpu = cpu;

out:
	rcu_read_unlock_bh();
	return padata_do_parallel(pcrypt->pinst, padata, cpu);
}

static int pcrypt_aead_setkey(struct crypto_aead *parent,
			      const u8 *key, unsigned int keylen)
{
@@ -172,7 +143,7 @@ static int pcrypt_aead_encrypt(struct aead_request *req)
			       req->cryptlen, req->iv);
	aead_request_set_ad(creq, req->assoclen);

	err = pcrypt_do_parallel(padata, &ctx->cb_cpu, &pencrypt);
	err = padata_do_parallel(pencrypt.pinst, padata, &ctx->cb_cpu);
	if (!err)
		return -EINPROGRESS;
	if (err == -EBUSY) {
@@ -220,7 +191,7 @@ static int pcrypt_aead_decrypt(struct aead_request *req)
			       req->cryptlen, req->iv);
	aead_request_set_ad(creq, req->assoclen);

	err = pcrypt_do_parallel(padata, &ctx->cb_cpu, &pdecrypt);
	err = padata_do_parallel(pdecrypt.pinst, padata, &ctx->cb_cpu);
	if (!err)
		return -EINPROGRESS;
	if (err == -EBUSY) {
+1 −1
Original line number Diff line number Diff line
@@ -167,7 +167,7 @@ extern struct padata_instance *padata_alloc_possible(
					struct workqueue_struct *wq);
extern void padata_free(struct padata_instance *pinst);
extern int padata_do_parallel(struct padata_instance *pinst,
			      struct padata_priv *padata, int cb_cpu);
			      struct padata_priv *padata, int *cb_cpu);
extern void padata_do_serial(struct padata_priv *padata);
extern int padata_set_cpumask(struct padata_instance *pinst, int cpumask_type,
			      cpumask_var_t cpumask);
+20 −7
Original line number Diff line number Diff line
@@ -96,17 +96,19 @@ static void padata_parallel_worker(struct work_struct *parallel_work)
 *
 * @pinst: padata instance
 * @padata: object to be parallelized
 * @cb_cpu: cpu the serialization callback function will run on,
 *          must be in the serial cpumask of padata(i.e. cpumask.cbcpu).
 * @cb_cpu: pointer to the CPU that the serialization callback function should
 *          run on.  If it's not in the serial cpumask of @pinst
 *          (i.e. cpumask.cbcpu), this function selects a fallback CPU and if
 *          none found, returns -EINVAL.
 *
 * The parallelization callback function will run with BHs off.
 * Note: Every object which is parallelized by padata_do_parallel
 * must be seen by padata_do_serial.
 */
int padata_do_parallel(struct padata_instance *pinst,
		       struct padata_priv *padata, int cb_cpu)
		       struct padata_priv *padata, int *cb_cpu)
{
	int target_cpu, err;
	int i, cpu, cpu_index, target_cpu, err;
	struct padata_parallel_queue *queue;
	struct parallel_data *pd;

@@ -118,9 +120,20 @@ int padata_do_parallel(struct padata_instance *pinst,
	if (!(pinst->flags & PADATA_INIT) || pinst->flags & PADATA_INVALID)
		goto out;

	if (!cpumask_test_cpu(cb_cpu, pd->cpumask.cbcpu))
	if (!cpumask_test_cpu(*cb_cpu, pd->cpumask.cbcpu)) {
		if (!cpumask_weight(pd->cpumask.cbcpu))
			goto out;

		/* Select an alternate fallback CPU and notify the caller. */
		cpu_index = *cb_cpu % cpumask_weight(pd->cpumask.cbcpu);

		cpu = cpumask_first(pd->cpumask.cbcpu);
		for (i = 0; i < cpu_index; i++)
			cpu = cpumask_next(cpu, pd->cpumask.cbcpu);

		*cb_cpu = cpu;
	}

	err = -EBUSY;
	if ((pinst->flags & PADATA_RESET))
		goto out;
@@ -131,7 +144,7 @@ int padata_do_parallel(struct padata_instance *pinst,
	err = 0;
	atomic_inc(&pd->refcnt);
	padata->pd = pd;
	padata->cb_cpu = cb_cpu;
	padata->cb_cpu = *cb_cpu;

	target_cpu = padata_cpu_hash(pd);
	padata->cpu = target_cpu;