From: Jan Kiszka <jan.kiszka@domain.hid>
To: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>
Cc: Xenomai core <Xenomai-core@domain.hid>
Subject: Re: [Xenomai-core] [Xenomai-git] Jan Kiszka : Native: Work around for error code corruption in rt_cond_wait[ _until]
Date: Tue, 02 Mar 2010 17:02:59 +0100 [thread overview]
Message-ID: <4B8D36B3.6040602@domain.hid> (raw)
In-Reply-To: <4B8D3600.8090000@domain.hid>
Jan Kiszka wrote:
> Gilles Chanteperdrix wrote:
>> GIT version control wrote:
>>> Module: xenomai-jki
>>> Branch: for-upstream
>>> Commit: 4b5370dce6f3a655ac104b93b032f3b639206fd5
>>> URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=4b5370dce6f3a655ac104b93b032f3b639206fd5
>>>
>>> Author: Jan Kiszka <jan.kiszka@domain.hid>
>>> Date: Tue Mar 2 16:24:59 2010 +0100
>>>
>>> Native: Work around for error code corruption in rt_cond_wait[_until]
>>>
>>> User space suffers from losing the error code of the cond wait prologue.
>>> We actually had to return the prologue error to user space and use that
>>> one after the epilogue succeeded, but the existing kernel ABI does not
>>> allow this, nor is existing user space prepared for this.
>>>
>>> As a work around, keep the prologue error code in xnthread's errcode and
>>> restore it from there when user space re-enters the kernel for the
>>> epilogue. This requires no ABI changes, but suffers from potential
>>> overwriting if the same or some other errcode touching service is called
>>> from a user space signal handler in between the calls. Moreover, current
>>> user space also prevents that we can return -EINTR on interruption while
>>> blocked on the condition variable, which was possible before.
>>>
>>> A true fix will require a new syscall and updated user space libs.
>>>
>>> Signed-off-by: Jan Kiszka <jan.kiszka@domain.hid>
>>>
>>> ---
>>>
>>> ksrc/skins/native/syscall.c | 19 +++++++++++++++----
>>> 1 files changed, 15 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/ksrc/skins/native/syscall.c b/ksrc/skins/native/syscall.c
>>> index 462ee7e..930a28d 100644
>>> --- a/ksrc/skins/native/syscall.c
>>> +++ b/ksrc/skins/native/syscall.c
>>> @@ -1841,7 +1841,7 @@ static int __rt_cond_wait_prologue(struct pt_regs *regs)
>>> RT_MUTEX *mutex;
>>> RT_COND *cond;
>>> RTIME timeout;
>>> - int err;
>>> + int err, epilogue_err;
>>>
>>> if (__xn_safe_copy_from_user(&cph, (void __user *)__xn_reg_arg1(regs),
>>> sizeof(cph)))
>>> @@ -1868,11 +1868,15 @@ static int __rt_cond_wait_prologue(struct pt_regs *regs)
>>> return -EFAULT;
>>>
>>> err = rt_cond_wait_prologue(cond, mutex, &lockcnt, timeout_mode, timeout);
>>> + xnpod_current_thread()->errcode = err;
>>>
>>> /* Reacquire the mutex if it was unlocked in the prologue and we were
>>> not interrupted. */
>>> - if (lockcnt && err != -EINTR)
>>> - err = rt_cond_wait_epilogue(mutex, lockcnt);
>>> + if (lockcnt && err != -EINTR) {
>>> + epilogue_err = rt_cond_wait_epilogue(mutex, lockcnt);
>>> + if (!err)
>>> + err = epilogue_err;
>> IMO, Here should be:
>> if (epilogue_err < 0)
>> err = epilogue_err;
>>
>
> That would be wrong (if it equals -EINTR), but I get your point: What
In fact, my current version is wrong /wrt EINTR. Back to the drawing board.
> should take precedence, prologue or epilogue error? So far the decision
> was simple (always prologue before 2.5), since we now also consider the
> epilogue. So we could
>
> - always pick the epilogue (except for -EINTR) or
> - only do so if the prologue reported a "less fatal" error than the
> epilogue
>
> E.g. if the prologue failed due to -EIDRM, I would prefer to always
> propagate this instead of whatever the epilogue reports.
>
> Jan
>
Jan
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
prev parent reply other threads:[~2010-03-02 16:02 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <E1NmUAX-0004WJ-Eq@domain.hid>
2010-03-02 15:43 ` [Xenomai-core] [Xenomai-git] Jan Kiszka : Native: Work around for error code corruption in rt_cond_wait[ _until] Gilles Chanteperdrix
2010-03-02 16:00 ` Jan Kiszka
2010-03-02 16:02 ` Jan Kiszka [this message]
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=4B8D36B3.6040602@domain.hid \
--to=jan.kiszka@domain.hid \
--cc=Xenomai-core@domain.hid \
--cc=gilles.chanteperdrix@xenomai.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.