All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@siemens.com>
To: Michael Welling <mwelling@ieee.org>
Cc: Gilles Chanteperdrix <gilles.chanteperdrix@xenomai.org>,
	mwelling79@gmail.com, xenomai@xenomai.org
Subject: Re: [Xenomai] RT serial cross-link failure
Date: Mon, 22 Feb 2016 20:16:20 +0100	[thread overview]
Message-ID: <56CB5E84.1010803@siemens.com> (raw)
In-Reply-To: <20160222190431.GB22349@deathstar>

On 2016-02-22 20:04, Michael Welling wrote:
> On Mon, Feb 22, 2016 at 07:05:44PM +0100, Jan Kiszka wrote:
>> On 2016-02-22 18:53, Michael Welling wrote:
>>> On Thu, Feb 18, 2016 at 10:10:48AM -0600, Michael Welling wrote:
>>>> On Thu, Feb 18, 2016 at 08:30:40AM +0100, Wolfgang Netbal wrote:
>>>>>
>>>>>
>>>>> Am 2016-02-18 um 08:10 schrieb Michael Welling:
>>>>>> On Thu, Feb 18, 2016 at 08:02:48AM +0100, Wolfgang Netbal wrote:
>>>>>>>
>>>>>>> Am 2016-02-16 um 18:58 schrieb Michael Welling:
>>>>>>>> On Tue, Feb 16, 2016 at 06:39:50AM +0100, Wolfgang Netbal wrote:
>>>>>>>>> Am 2016-02-15 um 18:41 schrieb Michael Welling:
>>>>>>>>>> I took the time to update the IMX UART driver such that it registers with the 3.18 kernel.
>>>>>>>>>>
>>>>>>>>>> The driver appears to register correctly and the /dev/rtdm/rtser* nodes appear.
>>>>>>>>>>
>>>>>>>>>> When I run the cross-link demo the system hangs after an error in read_task.
>>>>>>>>>>
>>>>>>>>>> Here is the output that I get:
>>>>>>>>>> main : write-file opened
>>>>>>>>>> main : write-config written
>>>>>>>>>> main : read-file opened
>>>>>>>>>> main : read-config written
>>>>>>>>>> main : write-task created
>>>>>>>>>> main : read-task created
>>>>>>>>>> main : starting write-task
>>>>>>>>>> main : strating read-task
>>>>>>>>>>  Nr |   write-irq    |    irq->read    |   write->read   |
>>>>>>>>>> ----------------------------------------------------------
>>>>>>>>>> read_task: error on RTSER_RTIOC_WAIT_EVENT, Operation no permitted
>>>>>>>>>> main : /dev/rtdm/rtser1 (read) -> closed
>>>>>>>>>> read_task: exit
>>>>>>>>>>
>>>>>>>>>> Any ideas why this would happen?
>>>>>>>>>>
>>>>>>>>>> I can provide the patch for the driver if necessary. I tried to keep the changes to a minimal.
>>>>>>>>> Dear Michael,
>>>>>>>>>
>>>>>>>>> I added a patch on December where I extended the IMX UART driver to support
>>>>>>>>> open firmware, maybe my patch can help you to find your issue.
>>>>>>>>> I posted the patch in the mailing list, you can find it here
>>>>>>>>> https://xenomai.org/pipermail/xenomai/2015-December/035655.html
>>>>>>>>>
>>>>>>>>> Kind regards
>>>>>>>>> Wolfgang
>>>>>>> Sorry Michael,
>>>>>>>
>>>>>>> My patch working for xenomai 2.6.4 file ksrc/drivers/serial/rt_imx_uart.c
>>>>>> I am pretty sure that there is another patch applied previous.
>>>>>>
>>>>>> If you look at your patch you see German comments and open firmware code that
>>>>>> is obviously not in the v2.6.4 on the git repository.
>>>>>>
>>>>>> https://git.xenomai.org/xenomai-2.6.git/tree/ksrc/drivers/serial/rt_imx_uart.c?h=v2.6.4
>>>>>>
>>>>> I posted my patch, because I thought that Wolfgang Grandegger the author of
>>>>> the driver may check it and include it to the xenomai if it is useable for
>>>>> other users.
>>>>>
>>>>
>>>> Yes but the patch does not apply to the driver in the source tree.
>>>> Please provide the driver that you have after the patch.
>>>
>>> Any ideas out there?
>>>
>>
>> Are you now referring to the incomplete patch or your original problem
>> again?
> 
> The original problem is my primary concern. I would not mind having another
> version of the driver to test against as well.
> 
>>
>> For the latter case, I would recommend debugging the error code, ie.
>> what threw this at you. In Xenomai context, -EPERM often means that the
>> caller is requesting some (potentially) blocking service without being a
>> real-time task. But, of course, also the driver itself may decide to
>> raise this for whatever reasons.
> 
> Here is the snippet of code from the user app that concerns me:
> .
> .
>         printf(" Nr |   write->irq    |    irq->read    |   write->read   |\n");
>         printf("-----------------------------------------------------------\n");
> 
>         /*
>          * We are in secondary mode now due to printf, the next
>          * blocking Xenomai or driver call will switch us back
>          * (here: RTSER_RTIOC_WAIT_EVENT).
>          */
> 
>         while (1) {
>                 /* waiting for event */
>                 err = ioctl(read_fd, RTSER_RTIOC_WAIT_EVENT, &rx_event);
> .
> .
> 
> So is the comment no longer true with Xenomai 3?

No, that would be a bug.

> 
> Here is the content of the corresponding ioctl in the driver:
> .
> .
>         case RTSER_RTIOC_WAIT_EVENT: {
>                 struct rtser_event ev = { .rxpend_timestamp = 0 };
>                 rtdm_toseq_t timeout_seq;
> 
>                 if (!rtdm_in_rt_context())
>                         return -ENOSYS;
> 
>                 /* Only one waiter allowed, stop any further attempts here. */
>                 if (test_and_set_bit(0, &ctx->ioc_event_lock))
>                         return -EBUSY;
> 
>                 rtdm_toseq_init(&timeout_seq, ctx->config.event_timeout);
> 
>                 rtdm_lock_get_irqsave(&ctx->lock, lock_ctx);
> 
>                 while (!ctx->ioc_events) {
>                         /* Only enable error interrupt
>                            when the user waits for it. */
>                         if (ctx->config.event_mask & RTSER_EVENT_ERRPEND) {
>                                 ctx->ier_status |= IER_STAT;
> #ifdef FIXME
>                                 rt_imx_uart_reg_out(mode, base, IER,
>                                                  ctx->ier_status);
> #endif
>                         }
> 
>                         rtdm_lock_put_irqrestore(&ctx->lock, lock_ctx);
> 
>                         err = rtdm_event_timedwait(&ctx->ioc_event,
>                                                    ctx->config.event_timeout,
>                                                    &timeout_seq);
>                         if (err) {
>                                 /* Device has been closed? */
>                                 if (err == -EIDRM)
>                                         err = -EBADF;
>                                 goto wait_unlock_out;
>                         }
> 
>                         rtdm_lock_get_irqsave(&ctx->lock, lock_ctx);
>                 }
> 
>                 ev.events = ctx->ioc_events;
>                 ctx->ioc_events &=
>                     ~(RTSER_EVENT_MODEMHI | RTSER_EVENT_MODEMLO);
> 
>                 ev.last_timestamp = ctx->last_timestamp;
>                 ev.rx_pending = ctx->in_npend;
> 
>                 if (ctx->in_history)
>                         ev.rxpend_timestamp = ctx->in_history[ctx->in_head];
> 
>                 rtdm_lock_put_irqrestore(&ctx->lock, lock_ctx);
> 
>                 if (rtdm_fd_is_user(fd))
>                         err =
>                             rtdm_safe_copy_to_user(fd, arg, &ev,
>                                                    sizeof(struct
>                                                           rtser_event));
>                         else
>                                 memcpy(arg, &ev, sizeof(struct rtser_event));
> 
> wait_unlock_out:
>                 /* release the simple event waiter lock */
>                 clear_bit(0, &ctx->ioc_event_lock);
>                 break;
>         }
> .
> .
> 
> So either rtdm_event_timedwait or rtdm_safe_copy_to_user is returing -EPERM.

Or things terminate earlier / later in the ioctl dispatching path.

> Looking at the documentation rtdm_safe_copy_to_user does not appear to return -EPERM.
> 
> Looking at the documentation rtdm_event_timedwait:
> -EPERM may be returned if an illegal invocation environment is detected.
> 
> So are we stuck in secondary mode?

Probably.

> Ideas?

You will not get around debugging more information out of your setup.
Use tracing, use well-placed printk.

Jan

-- 
Siemens AG, Corporate Technology, CT RDA ITP SES-DE
Corporate Competence Center Embedded Linux


  reply	other threads:[~2016-02-22 19:16 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-15 17:41 [Xenomai] RT serial cross-link failure Michael Welling
2016-02-16  5:39 ` Wolfgang Netbal
2016-02-16 17:25   ` Michael Welling
2016-02-16 17:29   ` Gilles Chanteperdrix
2016-02-16 17:36     ` Michael Welling
2016-02-16 17:58   ` Michael Welling
2016-02-18  7:02     ` Wolfgang Netbal
2016-02-18  7:10       ` Michael Welling
2016-02-18  7:30         ` Wolfgang Netbal
2016-02-18 16:10           ` Michael Welling
2016-02-22 17:53             ` Michael Welling
2016-02-22 18:05               ` Jan Kiszka
2016-02-22 19:04                 ` Michael Welling
2016-02-22 19:16                   ` Jan Kiszka [this message]
2016-02-22 19:22                     ` Gilles Chanteperdrix
2016-02-22 19:46                       ` Michael Welling
2016-02-22 20:34                         ` Gilles Chanteperdrix
2016-02-22 20:51                     ` Michael Welling
2016-02-22 21:02                       ` Gilles Chanteperdrix
2016-02-22 21:10                         ` Michael Welling
2016-02-22 21:14                           ` Gilles Chanteperdrix
2016-02-22 21:29                             ` Michael Welling

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=56CB5E84.1010803@siemens.com \
    --to=jan.kiszka@siemens.com \
    --cc=gilles.chanteperdrix@xenomai.org \
    --cc=mwelling79@gmail.com \
    --cc=mwelling@ieee.org \
    --cc=xenomai@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.