Linux cryptographic layer development
 help / color / mirror / Atom feed
From: Tim Chen <tim.c.chen@linux.intel.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Herbert Xu <herbert@gondor.apana.org.au>,
	"H. Peter Anvin" <hpa@zytor.com>,
	"David S.Miller" <davem@davemloft.net>,
	Ingo Molnar <mingo@kernel.org>,
	Chandramouli Narayanan <mouli@linux.intel.com>,
	Vinodh Gopal <vinodh.gopal@intel.com>,
	James Guilford <james.guilford@intel.com>,
	Wajdi Feghali <wajdi.k.feghali@intel.com>,
	Jussi Kivilinna <jussi.kivilinna@iki.fi>,
	Thomas Gleixner <tglx@linutronix.de>,
	Tadeusz Struk <tadeusz.struk@intel.com>,
	tkhai@yandex.ru, linux-crypto@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 2/7] crypto: SHA1 multibuffer crypto hash infrastructure
Date: Fri, 25 Jul 2014 09:25:21 -0700	[thread overview]
Message-ID: <1406305521.2970.851.camel@schen9-DESK> (raw)
In-Reply-To: <20140725070800.GS3935@laptop>

On Fri, 2014-07-25 at 09:08 +0200, Peter Zijlstra wrote:
> On Tue, Jul 22, 2014 at 03:09:32PM -0700, Tim Chen wrote:
> > +/* Called in workqueue context, do one real cryption work (via
> > + * req->complete) and reschedule itself if there are more work to
> > + * do. */
> 
> You seem to manage the 'normal' comment style in other places, this one
> 'special' for a reason?

Yes, I'll need to correct it.

> 
> > +static void mcryptd_queue_worker(struct work_struct *work)
> > +{
> > +	struct mcryptd_cpu_queue *cpu_queue;
> > +	struct crypto_async_request *req, *backlog;
> > +	int i;
> > +
> > +	/*
> > +	 * Need to loop through more than once for multi-buffer to
> > +	 * be effective.
> > +	 */
> > +
> > +	cpu_queue = container_of(work, struct mcryptd_cpu_queue, work);
> > +	i = 0;
> > +	while (i < MCRYPTD_BATCH || single_task_running()) {
> > +		/*
> > +		 * preempt_disable/enable is used to prevent
> > +		 * being preempted by mcryptd_enqueue_request()
> > +		 */
> > +		local_bh_disable();
> > +		preempt_disable();
> > +		backlog = crypto_get_backlog(&cpu_queue->queue);
> > +		req = crypto_dequeue_request(&cpu_queue->queue);
> > +		preempt_enable();
> > +		local_bh_enable();
> > +
> > +		if (!req)
> > +			return;
> > +
> > +		if (backlog)
> > +			backlog->complete(backlog, -EINPROGRESS);
> > +		req->complete(req, 0);
> > +		if (!cpu_queue->queue.qlen)
> > +			return;
> > +		++i;
> > +	}
> > +	if (cpu_queue->queue.qlen)
> > +		queue_work(kcrypto_wq, &cpu_queue->work);
> > +}
> 
> Right, so I don't think you need that single_task_running() thing for
> this. Also its a rather inconclusive test, a task can come in while
> processing the request, preempt the processing, complete and by the time
> we're back to check if we want to continue the loop its only us again.
> 
> So its actually misleading..
> 
> You could do that, but then you have to keep preemption disabled across
> the entire thing, and break out on need_resched(), that would entirely
> obviate the need for single_task_running(), but would increase the
> preemption latency by however long the req processing takes, so that's
> bad too.
> 
> But you can get similar 'fuzzy' semantics as above by using something
> like:
> 
> static inline bool did_context_switch(unsigned long *nivcs)
> {
> 	if (*nivcs != current->nivcs) {
> 		*nivcs = current->nivcs;
> 		return true;
> 	}
> 	return false;
> }
> 
> static void mcryptd_queue_worker()
> {
> 	...
> 	unsigned long nivcs = current->nivcs;
> 
> 	...
> 
> 	while (!did_context_switch(&nivcs) || i < MCRYPTD_BATCH)

Won't I need something like 

while ((!did_context_switch(&nivcs) && single_task_running()) 
	|| i < MCRYPTD_BATCH)

in case I got some new task in my run queue but I did not get
pre-empted?  I should not continue to run in that case.

> 
> 	...
> }
> 
> It'll terminate earlier I suppose, its the inverse test. But I think you
> want to terminate early if there's any activity.

I have some doubts here.
If I'm still the only task running, why not continue, even if I've been
pre-empted?  Since there's nothing else to run, why not take
advantage of the cpu?

Thanks.

Tim

  reply	other threads:[~2014-07-25 16:25 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <cover.1406033477.git.tim.c.chen@linux.intel.com>
2014-07-22 22:09 ` [PATCH v5 0/7] crypto: SHA1 multibuffer implementation Tim Chen
2014-07-22 22:09 ` [PATCH v5 1/7] sched: Add function single_task_running to let a task check if it is the only task running on a cpu Tim Chen
2014-07-22 22:09 ` [PATCH v5 2/7] crypto: SHA1 multibuffer crypto hash infrastructure Tim Chen
2014-07-25  7:08   ` Peter Zijlstra
2014-07-25 16:25     ` Tim Chen [this message]
2014-07-29 22:28       ` Tim Chen
2014-07-30 10:01         ` Peter Zijlstra
2014-07-25  7:26   ` Peter Zijlstra
2014-07-25 16:47     ` Tim Chen
2014-07-22 22:09 ` [PATCH v5 3/7] crypto: SHA1 multibuffer crypto opportunistic flush Tim Chen
2014-07-25  7:22   ` Peter Zijlstra
2014-07-22 22:09 ` [PATCH v5 4/7] crypto: SHA1 multibuffer algorithm data structures Tim Chen
2014-07-22 22:09 ` [PATCH v5 5/7] crypto: SHA1 multibuffer submit and flush routines for AVX2 Tim Chen
2014-07-22 22:09 ` [PATCH v5 6/7] crypto: SHA1 multibuffer crypto computation (x8 AVX2) Tim Chen
2014-07-22 22:09 ` [PATCH v5 7/7] crypto: SHA1 multibuffer scheduler Tim Chen

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=1406305521.2970.851.camel@schen9-DESK \
    --to=tim.c.chen@linux.intel.com \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=hpa@zytor.com \
    --cc=james.guilford@intel.com \
    --cc=jussi.kivilinna@iki.fi \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mouli@linux.intel.com \
    --cc=peterz@infradead.org \
    --cc=tadeusz.struk@intel.com \
    --cc=tglx@linutronix.de \
    --cc=tkhai@yandex.ru \
    --cc=vinodh.gopal@intel.com \
    --cc=wajdi.k.feghali@intel.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox