From: "karl malbrain" <karl@petzent.com>
To: "Linux-Os@Analogic. Com" <linux-os@analogic.com>
Cc: "Linux-Kernel@Vger. Kernel. Org" <linux-kernel@vger.kernel.org>
Subject: RE: 2.6.9: serial_core: uart_open
Date: Tue, 12 Jul 2005 13:32:55 -0700 [thread overview]
Message-ID: <031d01c58720$e2844670$4b010059@petzent.com> (raw)
>On Tue, 12 Jul 2005, karl malbrain wrote:
>
>>> On Tue, 12 Jul 2005, karl malbrain wrote:
>>
>>>> The uart_open code loops waiting for CD to be asserted (whenever CLOCAL
>>>> is not set). The bottom of the loop contains the following code:
>>>>
>>>> up(&state->sem);
>>>> schedule();
>>>> down(&state->sem);
>>>>
>>>> if( signal_pending(current) )
>>>> break;
>>>>
>>>> When I issue an open("/dev/ttyS1", O_RDWR) from a terminal session on
>>>> the console, the system seems to come to a stop in this loop until the
>>>> process is killed. I suspect that the scheduler is choosing this
process
>>>> to run again because of an elevated console priority of some sort.
>>>>
>>>> Is there a kernel mechanism to put a process to sleep until awakened by
>>>> an event to replace this looping behaviour?
>>>>
>>>> Thanks, karl malbrain, malbrain-at-yahoo-dot-com
>>>>
>>>
>>> In the first place, you should perform an open(O_NDELAY), so the open
>>> returns immediately with anything that has potential "modem-control".
>>> Then you can set the device to blocking using fcntl(F_GETFL), F_SETFL.
>>
>>> Also, the task that is waiting for the open() is sleeping. That's
>>> what schedule() does.
>>
>>> Cheers,
>>> Dick Johnson
>>
>> I'm looking for the POSIX behaviour of delaying the open until CD is
>> asserted by the modem. If schedule() doesn't select another process to
run,
>schedule() gives the CPU to any runnable process. That's how it works.
>Most all drivers that are waiting for an event will give up the CPU
>by executing schedule(). That's how-come you can be doing something
>useful while file-I/O is occurring.
That looks like a problem. If uart_open is just calling schedule() and if
the current process running in uart_open is being selected again, the system
is hung.
>> no wonder the system is hung at this point, because the uart_open loop
>> doesn't break until CD is asserted by the modem. This sounds like a
serious
>> bug.
>You need to look at your code.
The code:
#include <fcntl.h>
#include <stdio.h>
int main (void)
{
int fd = open ("/dev/ttyS1");
printf("Opened\n");
}
>
> karl_m
>
>There is no bug although there may be a bug in your code.
>Just do `cat /dev/ttyS1` or whatever your device is. It will
>wait on the open if modem-control is enabled, and you can see
>from another terminal that nothing is spinning.
>$ ps laxw | grep cat
>
>0 0 11555 2791 17 0 3512 348 - S tty2 0:00 cat
/dev/ttyS0
> |
> |__ clearly sleeping
>
>0 0 11610 11556 16 0 3656 568 - R tty3 0:00 grep cat
Are you sure that CLOCAL is not set on /dev/ttyS0? and that the cat is not
sleeping on a read??? That's my original question: how can uart_open be
changed to put the process to sleep rather than looping like it does now.
>Cheers,
>Dick Johnson
karl m
next reply other threads:[~2005-07-12 20:34 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-12 20:32 karl malbrain [this message]
[not found] <Pine.LNX.4.61.0507151150290.11664@chaos.analogic.com>
2005-07-15 16:57 ` 2.6.9: serial_core: uart_open karl malbrain
[not found] <Pine.LNX.4.61.0507130850110.18969@chaos.analogic.com>
2005-07-13 17:53 ` karl malbrain
2005-07-14 8:26 ` Russell King
2005-07-14 17:16 ` karl malbrain
2005-07-14 18:57 ` Russell King
2005-07-14 19:30 ` karl malbrain
2005-07-14 22:35 ` karl malbrain
2005-07-15 7:28 ` Russell King
2005-07-15 16:02 ` karl malbrain
2005-07-15 20:32 ` Russell King
2005-07-15 20:48 ` karl malbrain
2005-07-15 16:20 ` karl malbrain
-- strict thread matches above, loose matches on Subject: below --
2005-07-12 19:27 karl malbrain
2005-07-12 18:36 karl malbrain
2005-07-12 21:03 ` Russell King
2005-07-12 21:17 ` karl malbrain
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='031d01c58720$e2844670$4b010059@petzent.com' \
--to=karl@petzent.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-os@analogic.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 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.