From: Frederic Weisbecker <fweisbec@gmail.com>
To: Arnd Bergmann <arnd@arndb.de>
Cc: linux-kernel@vger.kernel.org, Christoph Hellwig <hch@lst.de>,
Andi Kleen <andi@firstfloor.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Greg Kroah-Hartman <gregkh@suse.de>
Subject: Re: [PATCH 3/5] tty: handle VT specific compat ioctls in vt driver
Date: Fri, 7 Aug 2009 08:23:58 +0200 [thread overview]
Message-ID: <20090807062356.GA4955@nowhere> (raw)
In-Reply-To: <1249564170-18627-4-git-send-email-arnd@arndb.de>
Hi,
On Thu, Aug 06, 2009 at 03:09:28PM +0200, Arnd Bergmann wrote:
> The VT specific compat_ioctl handlers are the only ones
> in common code that require the BKL. Moving them into
> the vt driver lets us remove the BKL from the other handlers
> and cleans up the code.
Why does it require the bkl?
> +
> +long vt_compat_ioctl(struct tty_struct *tty, struct file * file,
> + unsigned int cmd, unsigned long arg)
> +{
> + struct vc_data *vc = tty->driver_data;
> + struct console_font_op op; /* used in multiple places here */
> + struct kbd_struct *kbd;
> + unsigned int console;
> + void __user *up = (void __user *)arg;
> + int perm;
> + int ret = 0;
> +
> + console = vc->vc_num;
> +
> + lock_kernel();
It would be really nice to add a comment here that explain what it
is protecting.
I would like to work on removing the bkl from tty, and such nude lock_kernel()
don't help much to work in this area.
This is more than ever a FUD lock, nothing about its role in tty in the Lockronomicon,
and even not in the comments :-)
Thanks!
Frederic.
> +
> + if (!vc_cons_allocated(console)) { /* impossible? */
> + ret = -ENOIOCTLCMD;
> + goto out;
> + }
> +
> + /*
> + * To have permissions to do most of the vt ioctls, we either have
> + * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
> + */
> + perm = 0;
> + if (current->signal->tty == tty || capable(CAP_SYS_TTY_CONFIG))
> + perm = 1;
> +
> + kbd = kbd_table + console;
> + switch (cmd) {
> + /*
> + * these need special handlers for incompatible data structures
> + */
> + case PIO_FONTX:
> + case GIO_FONTX:
> + ret = compat_fontx_ioctl(cmd, up, perm, &op);
> + break;
> +
> + case KDFONTOP:
> + ret = compat_kdfontop_ioctl(up, perm, &op, vc);
> + break;
> +
> + case PIO_UNIMAP:
> + case GIO_UNIMAP:
> + ret = do_unimap_ioctl(cmd, up, perm, vc);
> + break;
> +
> + /*
> + * all these treat 'arg' as an integer
> + */
> + case KIOCSOUND:
> + case KDMKTONE:
> +#ifdef CONFIG_X86
> + case KDADDIO:
> + case KDDELIO:
> +#endif
> + case KDSETMODE:
> + case KDMAPDISP:
> + case KDUNMAPDISP:
> + case KDSKBMODE:
> + case KDSKBMETA:
> + case KDSKBLED:
> + case KDSETLED:
> + case KDSIGACCEPT:
> + case VT_ACTIVATE:
> + case VT_WAITACTIVE:
> + case VT_RELDISP:
> + case VT_DISALLOCATE:
> + case VT_RESIZE:
> + case VT_RESIZEX:
> + goto fallback;
> +
> + /*
> + * the rest has a compatible data structure behind arg,
> + * but we have to convert it to a proper 64 bit pointer.
> + */
> + default:
> + arg = (unsigned long)compat_ptr(arg);
> + goto fallback;
> + }
> +out:
> + unlock_kernel();
> + return ret;
> +
> +fallback:
> + unlock_kernel();
> + return vt_ioctl(tty, file, cmd, arg);
> +}
> +
> +
> +#endif /* CONFIG_COMPAT */
> +
> +
> /*
> * Sometimes we want to wait until a particular VT has been activated. We
> * do it in a very simple manner. Everybody waits on a single queue and
> diff --git a/include/linux/tty.h b/include/linux/tty.h
> index e8c6c91..38f3786 100644
> --- a/include/linux/tty.h
> +++ b/include/linux/tty.h
> @@ -526,5 +526,8 @@ extern void console_print(const char *);
> extern int vt_ioctl(struct tty_struct *tty, struct file *file,
> unsigned int cmd, unsigned long arg);
>
> +extern long vt_compat_ioctl(struct tty_struct *tty, struct file * file,
> + unsigned int cmd, unsigned long arg);
> +
> #endif /* __KERNEL__ */
> #endif
> --
> 1.6.3.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
next prev parent reply other threads:[~2009-08-07 6:24 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-06 13:09 [PATCH 0/5] Kill the BKL in compat ioctl handling Arnd Bergmann
2009-08-06 13:09 ` [PATCH 1/5] arch/um: handle compat_ioctl in tty line driver Arnd Bergmann
2009-08-13 5:08 ` Amerigo Wang
2009-08-06 13:09 ` [PATCH 2/5] s390: move keyboard compat ioctls into tty3270 driver Arnd Bergmann
2009-08-06 13:09 ` [PATCH 3/5] tty: handle VT specific compat ioctls in vt driver Arnd Bergmann
2009-08-07 6:23 ` Frederic Weisbecker [this message]
2009-08-07 7:04 ` Arnd Bergmann
2009-08-07 8:04 ` Frederic Weisbecker
2009-08-07 12:02 ` Arnd Bergmann
2009-08-08 0:34 ` Frederic Weisbecker
2009-08-08 0:41 ` Greg KH
2009-08-08 1:03 ` Frederic Weisbecker
2009-08-08 3:20 ` Greg KH
2009-08-10 16:24 ` Arnd Bergmann
2009-08-07 9:57 ` Alan Cox
2009-08-07 19:23 ` Frederic Weisbecker
2009-08-06 13:09 ` [PATCH 4/5] compat_ioctl: remove VT specific ioctl handlers Arnd Bergmann
2009-08-06 13:09 ` [PATCH 5/5] compat_ioctl: do not hold BKL in handlers Arnd Bergmann
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=20090807062356.GA4955@nowhere \
--to=fweisbec@gmail.com \
--cc=andi@firstfloor.org \
--cc=arnd@arndb.de \
--cc=gregkh@suse.de \
--cc=hch@lst.de \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/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.