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: Tue, 29 Jul 2014 15:28:25 -0700	[thread overview]
Message-ID: <1406672905.2970.940.camel@schen9-DESK> (raw)
In-Reply-To: <1406305521.2970.851.camel@schen9-DESK>

On Fri, 2014-07-25 at 09:25 -0700, Tim Chen wrote:
> 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?
> 

Peter,

Is my explanation adequate or you still have objection to the implementation?  I'm
trying to decide here whether to extend our batch processing by
the crypto daemon (prolong our busy period) 
based on whether there are other tasks to run.  Pre-emption and
resuming the crypto daemon is okay. Even if there's a pre-emption and
context switch in between, we can still do extended processing if
there's nothing else to run. Otherwise the cpu will go idle. 

Tim

  reply	other threads:[~2014-07-29 22:28 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
2014-07-29 22:28       ` Tim Chen [this message]
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=1406672905.2970.940.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