From: Ralf Baechle <ralf@linux-mips.org>
To: "Kevin D. Kissell" <kevink@mips.com>
Cc: linux-mips@linux-mips.org
Subject: Re: Patches for 34K APRP
Date: Thu, 17 Apr 2008 14:26:10 +0100 [thread overview]
Message-ID: <20080417132610.GB31453@linux-mips.org> (raw)
In-Reply-To: <4805FFE6.5080903@mips.com>
On Wed, Apr 16, 2008 at 03:32:22PM +0200, Kevin D. Kissell wrote:
> --- a/arch/mips/kernel/kspd.c
> +++ b/arch/mips/kernel/kspd.c
> @@ -257,7 +257,7 @@ void sp_work_handle_request(void)
>
> vcwd = vpe_getcwd(tclimit);
>
> - /* change to the cwd of the process that loaded the SP program */
> + /* change to cwd of the process that loaded the SP program */
> old_fs = get_fs();
> set_fs(KERNEL_DS);
> sys_chdir(vcwd);
> @@ -323,6 +323,9 @@ static void sp_cleanup(void)
> set >>= 1;
> }
> }
> +
> + /* Put daemon cwd back to root to avoid umount problems */
> + sys_chdir("/");
Still not kosher; there might be multiple roots on a system ...
> }
>
> static int channel_open = 0;
> diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c
> index 1ba00c1..c0bb347 100644
> --- a/arch/mips/kernel/rtlx.c
> +++ b/arch/mips/kernel/rtlx.c
> @@ -73,6 +73,15 @@ static void rtlx_dispatch(void)
> static irqreturn_t rtlx_interrupt(int irq, void *dev_id)
> {
> int i;
> + unsigned int flags, vpeflags;
> +
> + /* Ought not to be strictly necessary for SMTC builds */
> + local_irq_save(flags);
> + vpeflags = dvpe();
> + set_c0_status(0x100 << MIPS_CPU_RTLX_IRQ);
> + irq_enable_hazard();
> + evpe(vpeflags);
> + local_irq_restore(flags);
>
> for (i = 0; i < RTLX_CHANNELS; i++) {
> wake_up(&channel_wqs[i].lx_queue);
> @@ -109,7 +118,8 @@ static void __used dump_rtlx(void)
> static int rtlx_init(struct rtlx_info *rtlxi)
> {
> if (rtlxi->id != RTLX_ID) {
> - printk(KERN_ERR "no valid RTLX id at 0x%p 0x%lx\n", rtlxi, rtlxi->id);
> + printk(KERN_ERR "no valid RTLX id at 0x%p 0x%lx\n",
> + rtlxi, rtlxi->id);
> return -ENOEXEC;
> }
>
> @@ -163,51 +173,51 @@ int rtlx_open(int index, int can_sleep)
>
> if (rtlx == NULL) {
> if( (p = vpe_get_shared(tclimit)) == NULL) {
> - if (can_sleep) {
> - __wait_event_interruptible(channel_wqs[index].lx_queue,
> - (p = vpe_get_shared(tclimit)),
> - ret);
> - if (ret)
> - goto out_fail;
> - } else {
> - printk(KERN_DEBUG "No SP program loaded, and device "
> - "opened with O_NONBLOCK\n");
> - ret = -ENOSYS;
> + if (can_sleep) {
> + __wait_event_interruptible(channel_wqs[index].lx_queue,
> + (p = vpe_get_shared(tclimit)), ret);
> + if (ret)
> goto out_fail;
> - }
> + } else {
> + printk(KERN_DEBUG "No SP program loaded, and device "
> + "opened with O_NONBLOCK\n");
> + ret = -ENOSYS;
> + goto out_fail;
> + }
> }
>
> smp_rmb();
> if (*p == NULL) {
> - if (can_sleep) {
> - DEFINE_WAIT(wait);
> -
> - for (;;) {
> - prepare_to_wait(&channel_wqs[index].lx_queue, &wait, TASK_INTERRUPTIBLE);
> - smp_rmb();
> - if (*p != NULL)
> - break;
> - if (!signal_pending(current)) {
> - schedule();
> - continue;
> - }
> - ret = -ERESTARTSYS;
> - goto out_fail;
> + if (can_sleep) {
> + DEFINE_WAIT(wait);
> +
> + for (;;) {
> + prepare_to_wait(&channel_wqs[index].lx_queue,
> + &wait, TASK_INTERRUPTIBLE);
> + smp_rmb();
> + if (*p != NULL)
> + break;
> + if (!signal_pending(current)) {
> + schedule();
> + continue;
> }
> - finish_wait(&channel_wqs[index].lx_queue, &wait);
> - } else {
> - printk(" *vpe_get_shared is NULL. "
> - "Has an SP program been loaded?\n");
> - ret = -ENOSYS;
> + ret = -ERESTARTSYS;
> goto out_fail;
> }
> + finish_wait(&channel_wqs[index].lx_queue, &wait);
> + } else {
> + printk(" *vpe_get_shared is NULL. "
> + "Has an SP program been loaded?\n");
> + ret = -ENOSYS;
> + goto out_fail;
> + }
> }
>
> if ((unsigned int)*p < KSEG0) {
> - printk(KERN_WARNING "vpe_get_shared returned an invalid pointer "
> - "maybe an error code %d\n", (int)*p);
> - ret = -ENOSYS;
> - goto out_fail;
> + printk(KERN_WARNING "vpe_get_shared returned an invalid "
> + "pointer maybe an error code %d\n", (int)*p);
> + ret = -ENOSYS;
> + goto out_fail;
Indention one tab per nested block.
> }
>
> if ((ret = rtlx_init(*p)) < 0)
> @@ -233,6 +243,10 @@ out_ret:
>
> int rtlx_release(int index)
> {
> + if (rtlx == NULL) {
> + printk("rtlx_release() with null rtlx\n");
Missing KERN_ facility level. I turned this printk into a pr_err().
> + return 0;
> + }
> rtlx->channel[index].lx_state = RTLX_STATE_UNUSED;
> return 0;
> }
> @@ -252,8 +266,8 @@ unsigned int rtlx_read_poll(int index, int can_sleep)
> int ret = 0;
>
> __wait_event_interruptible(channel_wqs[index].lx_queue,
> - chan->lx_read != chan->lx_write || sp_stopping,
> - ret);
> + (chan->lx_read != chan->lx_write)
> + || sp_stopping, ret);
Linux conding style:
if (expr1 ||
expr2)
GNU coding style:
if (expr1
|| expr2)
Gno GNUs ;-)
> if (ret)
> return ret;
>
> @@ -283,7 +297,9 @@ static inline int write_spacefree(int read, int write, int size)
> unsigned int rtlx_write_poll(int index)
> {
> struct rtlx_channel *chan = &rtlx->channel[index];
> - return write_spacefree(chan->rt_read, chan->rt_write, chan->buffer_size);
> +
> + return write_spacefree(chan->rt_read, chan->rt_write,
> + chan->buffer_size);
> }
>
> ssize_t rtlx_read(int index, void __user *buff, size_t count)
> @@ -345,8 +361,8 @@ ssize_t rtlx_write(int index, const void __user *buffer, size_t count)
> rt_read = rt->rt_read;
>
> /* total number of bytes to copy */
> - count = min(count,
> - (size_t)write_spacefree(rt_read, rt->rt_write, rt->buffer_size));
> + count = min(count, (size_t)write_spacefree(rt_read, rt->rt_write,
> + rt->buffer_size));
>
> /* first bit from write pointer to the end of the buffer, or count */
> fl = min(count, (size_t) rt->buffer_size - rt->rt_write);
> @@ -515,6 +531,11 @@ static int __init rtlx_module_init(void)
>
> if (cpu_has_vint)
> set_vi_handler(MIPS_CPU_RTLX_IRQ, rtlx_dispatch);
> + else {
> + printk("APRP RTLX init on non-vectored-interrupt processor\n");
Missing KERN_ facility level. I turned this printk into a pr_err().
> + err = -ENODEV;
> + goto out_chrdev;
> + }
>
> rtlx_irq.dev_id = rtlx;
> setup_irq(rtlx_irq_num, &rtlx_irq);
> diff --git a/include/asm-mips/rtlx.h b/include/asm-mips/rtlx.h
> index 65778c8..20b6660 100644
> --- a/include/asm-mips/rtlx.h
> +++ b/include/asm-mips/rtlx.h
> @@ -29,13 +29,13 @@ extern unsigned int rtlx_read_poll(int index, int can_sleep);
> extern unsigned int rtlx_write_poll(int index);
>
> enum rtlx_state {
> - RTLX_STATE_UNUSED,
> + RTLX_STATE_UNUSED = 0,
> RTLX_STATE_INITIALISED,
> RTLX_STATE_REMOTE_READY,
> RTLX_STATE_OPENED
> };
>
> -#define RTLX_BUFFER_SIZE 1024
> +#define RTLX_BUFFER_SIZE 2048
>
> /* each channel supports read and write.
> linux (vpe0) reads lx_buffer and writes rt_buffer
Applie with a few fixes but not the chdir issue.
Thanks,
Ralf
next prev parent reply other threads:[~2008-04-17 13:26 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-16 13:32 Patches for 34K APRP Kevin D. Kissell
2008-04-16 13:42 ` Kevin D. Kissell
2008-04-17 12:10 ` Ralf Baechle
2008-04-17 12:29 ` Ralf Baechle
2008-04-17 12:43 ` Ralf Baechle
2008-04-17 13:38 ` Kevin D. Kissell
2008-04-18 9:52 ` Ralf Baechle
2008-04-17 13:26 ` Ralf Baechle [this message]
2008-04-17 13:43 ` Kevin D. Kissell
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=20080417132610.GB31453@linux-mips.org \
--to=ralf@linux-mips.org \
--cc=kevink@mips.com \
--cc=linux-mips@linux-mips.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.