All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jan Beulich" <JBeulich@suse.com>
To: Chao Peng <chao.p.peng@linux.intel.com>
Cc: keir@xen.org, Ian.Campbell@citrix.com,
	stefano.stabellini@eu.citrix.com, George.Dunlap@eu.citrix.com,
	andrew.cooper3@citrix.com, Ian.Jackson@eu.citrix.com,
	xen-devel@lists.xen.org, dgdegra@tycho.nsa.gov
Subject: Re: [PATCH v14 01/10] x86: add generic resource (e.g. MSR) access hypercall
Date: Tue, 02 Sep 2014 11:24:02 +0100	[thread overview]
Message-ID: <5405B6E2020000780002FCD0@mail.emea.novell.com> (raw)
In-Reply-To: <20140902100412.GE15872@pengc-linux>

>>> On 02.09.14 at 12:04, <chao.p.peng@linux.intel.com> wrote:
> On Tue, Sep 02, 2014 at 09:52:21AM +0100, Jan Beulich wrote:
>> >>> On 02.09.14 at 10:33, <chao.p.peng@linux.intel.com> wrote:
>> > On Fri, Aug 29, 2014 at 04:40:52PM +0100, Jan Beulich wrote:
>> >> >>> On 28.08.14 at 09:43, <chao.p.peng@linux.intel.com> wrote:
>> >> > +    case XENPF_resource_op:
>> >> > +    {
>> >> > +        struct xen_resource_access ra;
>> >> > +        struct xenpf_resource_op *rsc_op = &op->u.resource_op;
>> >> > +        unsigned int i, j = 0, cpu = smp_processor_id();
>> >> > +
>> >> > +        for ( i = 0; i < rsc_op->nr; i++ )
>> >> > +        {
>> >> > +            if ( copy_from_guest_offset(&ra.data, rsc_op->data, i, 1) )
>> >> > +            {
>> >> > +                ret = -EFAULT;
>> >> > +                break;
>> >> > +            }
>> >> > +
>> >> > +            if ( ra.data.cpu == cpu )
>> >> > +                resource_access_one(&ra);
>> >> > +            else if ( cpu_online(ra.data.cpu) )
>> >> > +                on_selected_cpus(cpumask_of(ra.data.cpu),
>> >> > +                                 resource_access_one, &ra, 1);
>> >> > +            else
>> >> > +            {
>> >> > +                ret = -ENODEV;
>> >> > +                break;
>> >> > +            }
>> >> > +
>> >> > +            if ( ra.ret )
>> >> > +            {
>> >> > +                ret = ra.ret;
>> >> > +                break;
>> >> > +            }
>> >> > +
>> >> > +            if ( copy_to_guest_offset(rsc_op->data, i, &ra.data, 1) )
>> >> > +            {
>> >> > +                ret = -EFAULT;
>> >> > +                break;
>> >> > +            }
>> >> > +
>> >> > +            /* Find the start point that requires no preemption */
>> >> > +            if ( ra.data.flag && j == 0 )
>> >> > +                j = i;
>> >> > +            /* Set j = 0 when walking out of the non-preemption area */
>> >> > +            if ( ra.data.flag == 0 )
>> >> > +                j = 0;
>> >> > +            if ( hypercall_preempt_check() )
>> >> > +            {
>> >> > +                ret = hypercall_create_continuation(
>> >> > +                    __HYPERVISOR_platform_op, "ih",
>> >> > +                    ra.data.flag ? j : i, u_xenpf_op);
>> >> 
>> >> Which means everything starting from j will be re-executed
>> >> another time when continuing. That creates three problems: You
>> >> can't guarantee forwards progress, you may do something
>> >> having side effects more than once, and you break the operation
>> >> in a place that was requested to not be preemptible.
>> > I saw the problem here. Actually the j or i here will not be passed to
>> > next iteration successfully. Possibly a 'count' param is needed to be
>> > added to do_platform_op() for this purpose.
>> 
>> You can't add any parameter to do_platform_op(), and I also
>> don't see why you'd need to.
>> 
> Let me shed more light on this.
> 
> The 'i' we want to pass to next iteration is saved in guest_cpu_user_regs in
> hypercall_create_continuation(), which will be used as parameter for
> the re-execution of do_platform_op(). Take do_hvm_op() as example,
> 
>  6199        rc = hypercall_create_continuation(__HYPERVISOR_hvm_op,"lh",
>  6120                                            op | start_iter, arg);
> 
> It reuses several bits in existed param 'op' to pass the start_iter and then
> the start_iter is obtained in the second call of do_hvm_op():
> 
>  5478     unsigned long start_iter = op & ~HVMOP_op_mask;
> 
> For our case we only save the 'i' into guest_cpu_user_regs but we lack of
> way to accept it.
> 
> However, the method used in do_hvm_op() does not work for us as 
> do_platform_op()
> only has one point type param which we can't safely reuse any bit.

Correct, which means you can't just copy that mechanism. There
are two possible solutions I see here:
1) Make an exception and store the continuation information in
the interface structure (but say so clearly in the public header - the
lack of such information is why we can't do this elsewhere).
2) Fiddle with the multicall mechanism to allow indicating the desire
to skip preemption checking for the current iteration, and
do the batching desired here via the multicall layer.

Of course there are more heavyweight solutions like introducing a
brand new hypercall.

Out of the two options above I'd personally prefer the second.

Jan

  reply	other threads:[~2014-09-02 10:24 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-28  7:43 [PATCH v14 00/10] enable Cache QoS Monitoring (CQM) feature Chao Peng
2014-08-28  7:43 ` [PATCH v14 01/10] x86: add generic resource (e.g. MSR) access hypercall Chao Peng
2014-08-29 15:40   ` Jan Beulich
2014-09-02  8:33     ` Chao Peng
2014-09-02  8:52       ` Jan Beulich
2014-09-02 10:04         ` Chao Peng
2014-09-02 10:24           ` Jan Beulich [this message]
2014-08-28  7:43 ` [PATCH v14 02/10] xsm: add resource operation related xsm policy Chao Peng
2014-08-29 18:55   ` Daniel De Graaf
2014-08-28  7:43 ` [PATCH v14 03/10] tools: provide interface for generic resource access Chao Peng
2014-08-28  7:43 ` [PATCH v14 04/10] x86: detect and initialize Platform QoS Monitoring feature Chao Peng
2014-08-28 10:52   ` Andrew Cooper
2014-09-02  8:40     ` Chao Peng
2014-09-01 11:38   ` Jan Beulich
2014-09-02  9:05     ` Chao Peng
2014-09-02  9:30       ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 05/10] x86: dynamically attach/detach QoS monitoring service for a guest Chao Peng
2014-09-01 11:39   ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 06/10] x86: collect global QoS monitoring information Chao Peng
2014-09-01 11:44   ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 07/10] x86: enable QoS monitoring for each domain RMID Chao Peng
2014-09-01 11:49   ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 08/10] x86: add QoS monitoring related MSRs in allowed list Chao Peng
2014-08-28  7:43 ` [PATCH v14 09/10] xsm: add platform QoS related xsm policies Chao Peng
2014-08-28  7:43 ` [PATCH v14 10/10] tools: CMDs and APIs for Platform QoS Monitoring Chao Peng

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=5405B6E2020000780002FCD0@mail.emea.novell.com \
    --to=jbeulich@suse.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=chao.p.peng@linux.intel.com \
    --cc=dgdegra@tycho.nsa.gov \
    --cc=keir@xen.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /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.