* [patch -mm] update mq_notify to use a struct pid
@ 2006-09-08 16:39 Cedric Le Goater
2006-09-09 2:39 ` Eric W. Biederman
0 siblings, 1 reply; 23+ messages in thread
From: Cedric Le Goater @ 2006-09-08 16:39 UTC (permalink / raw)
To: Linux Kernel Mailing List; +Cc: Eric Biederman, Andrew Morton, containers
message queues can signal a process waiting for a message.
this patch replaces the pid_t value with a struct pid to avoid pid wrap
around problems.
Signed-off-by: Cedric Le Goater <clg@fr.ibm.com>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Andrew Morton <akpm@osdl.org>
Cc: containers@lists.osdl.org
---
ipc/mqueue.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
Index: 2.6.18-rc6-mm1/ipc/mqueue.c
===================================================================
--- 2.6.18-rc6-mm1.orig/ipc/mqueue.c
+++ 2.6.18-rc6-mm1/ipc/mqueue.c
@@ -73,7 +73,7 @@ struct mqueue_inode_info {
struct mq_attr attr;
struct sigevent notify;
- pid_t notify_owner;
+ struct pid* notify_owner;
struct user_struct *user; /* user who created, for accounting */
struct sock *notify_sock;
struct sk_buff *notify_cookie;
@@ -134,7 +134,7 @@ static struct inode *mqueue_get_inode(st
INIT_LIST_HEAD(&info->e_wait_q[0].list);
INIT_LIST_HEAD(&info->e_wait_q[1].list);
info->messages = NULL;
- info->notify_owner = 0;
+ info->notify_owner = NULL;
info->qsize = 0;
info->user = NULL; /* set when all is ok */
memset(&info->attr, 0, sizeof(info->attr));
@@ -338,7 +338,7 @@ static ssize_t mqueue_read_file(struct f
(info->notify_owner &&
info->notify.sigev_notify == SIGEV_SIGNAL) ?
info->notify.sigev_signo : 0,
- info->notify_owner);
+ pid_nr(info->notify_owner));
spin_unlock(&info->lock);
buffer[sizeof(buffer)-1] = '\0';
slen = strlen(buffer)+1;
@@ -363,7 +363,7 @@ static int mqueue_flush_file(struct file
struct mqueue_inode_info *info = MQUEUE_I(filp->f_dentry->d_inode);
spin_lock(&info->lock);
- if (current->tgid == info->notify_owner)
+ if (task_tgid(current) == info->notify_owner)
remove_notification(info);
spin_unlock(&info->lock);
@@ -518,8 +518,8 @@ static void __do_notify(struct mqueue_in
sig_i.si_pid = current->tgid;
sig_i.si_uid = current->uid;
- kill_proc_info(info->notify.sigev_signo,
- &sig_i, info->notify_owner);
+ kill_pid_info(info->notify.sigev_signo,
+ &sig_i, info->notify_owner);
break;
case SIGEV_THREAD:
set_cookie(info->notify_cookie, NOTIFY_WOKENUP);
@@ -528,7 +528,8 @@ static void __do_notify(struct mqueue_in
break;
}
/* after notification unregisters process */
- info->notify_owner = 0;
+ put_pid(info->notify_owner);
+ info->notify_owner = NULL;
}
wake_up(&info->wait_q);
}
@@ -566,12 +567,13 @@ static long prepare_timeout(const struct
static void remove_notification(struct mqueue_inode_info *info)
{
- if (info->notify_owner != 0 &&
+ if (info->notify_owner != NULL &&
info->notify.sigev_notify == SIGEV_THREAD) {
set_cookie(info->notify_cookie, NOTIFY_REMOVED);
netlink_sendskb(info->notify_sock, info->notify_cookie, 0);
}
- info->notify_owner = 0;
+ put_pid(info->notify_owner);
+ info->notify_owner = NULL;
}
static int mq_attr_ok(struct mq_attr *attr)
@@ -1062,11 +1064,11 @@ retry:
ret = 0;
spin_lock(&info->lock);
if (u_notification == NULL) {
- if (info->notify_owner == current->tgid) {
+ if (info->notify_owner == task_tgid(current)) {
remove_notification(info);
inode->i_atime = inode->i_ctime = CURRENT_TIME;
}
- } else if (info->notify_owner != 0) {
+ } else if (info->notify_owner != NULL) {
ret = -EBUSY;
} else {
switch (notification.sigev_notify) {
@@ -1086,7 +1088,8 @@ retry:
info->notify.sigev_notify = SIGEV_SIGNAL;
break;
}
- info->notify_owner = current->tgid;
+
+ info->notify_owner = get_pid(task_tgid(current));
inode->i_atime = inode->i_ctime = CURRENT_TIME;
}
spin_unlock(&info->lock);
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-08 16:39 [patch -mm] update mq_notify to use a struct pid Cedric Le Goater @ 2006-09-09 2:39 ` Eric W. Biederman 2006-09-11 10:17 ` Cedric Le Goater 0 siblings, 1 reply; 23+ messages in thread From: Eric W. Biederman @ 2006-09-09 2:39 UTC (permalink / raw) To: Cedric Le Goater; +Cc: Linux Kernel Mailing List, Andrew Morton, containers Cedric Le Goater <clg@fr.ibm.com> writes: > message queues can signal a process waiting for a message. > > this patch replaces the pid_t value with a struct pid to avoid pid wrap > around problems. > > Signed-off-by: Cedric Le Goater <clg@fr.ibm.com> > Cc: Eric Biederman <ebiederm@xmission.com> > Cc: Andrew Morton <akpm@osdl.org> > Cc: containers@lists.osdl.org Signed-off-by: Eric Biederman <ebiederm@xmission.com> I was just about to send out this patch in a couple more hours. So expect the fact we wrote the same code is a good sign :) Eric ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-09 2:39 ` Eric W. Biederman @ 2006-09-11 10:17 ` Cedric Le Goater 2006-09-11 11:09 ` Eric W. Biederman 2006-09-11 15:48 ` [patch -mm] update mq_notify to use a struct pid Oleg Nesterov 0 siblings, 2 replies; 23+ messages in thread From: Cedric Le Goater @ 2006-09-11 10:17 UTC (permalink / raw) To: Eric W. Biederman Cc: Linux Kernel Mailing List, Andrew Morton, containers, Oleg Nesterov Eric W. Biederman wrote: > Cedric Le Goater <clg@fr.ibm.com> writes: > >> message queues can signal a process waiting for a message. >> >> this patch replaces the pid_t value with a struct pid to avoid pid wrap >> around problems. >> >> Signed-off-by: Cedric Le Goater <clg@fr.ibm.com> >> Cc: Eric Biederman <ebiederm@xmission.com> >> Cc: Andrew Morton <akpm@osdl.org> >> Cc: containers@lists.osdl.org > > Signed-off-by: Eric Biederman <ebiederm@xmission.com> > > I was just about to send out this patch in a couple more hours. Well, you did the same with the usb/devio.c and friends :) > So expect the fact we wrote the same code is a good sign :) How does oleg feel about it ? I've seen some long thread on possible race conditions with put_pid() and solutions with rcu. I didn't quite get all of it ... it will need another run for me. On the "pid_t to struct pid*" topic: * I started smbfs and realized it was useless. * in the following, the init process is being killed directly using 1. I'm not sure how useful it would be to use a struct pid. To begin with, may be they could use a : kill_init(int signum, int priv) ./arch/mips/sgi-ip32/ip32-reset.c ./arch/powerpc/platforms/iseries/mf.c ./drivers/parisc/power.c ./drivers/char/snsc_event.c ./kernel/sys.c ./kernel/sysctl.c ./drivers/char/nwbutton.c ./drivers/s390/s390mach.c * some more drivers, * some more kthread to convert C. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-11 10:17 ` Cedric Le Goater @ 2006-09-11 11:09 ` Eric W. Biederman 2006-09-11 14:05 ` Cedric Le Goater 2006-09-11 15:48 ` [patch -mm] update mq_notify to use a struct pid Oleg Nesterov 1 sibling, 1 reply; 23+ messages in thread From: Eric W. Biederman @ 2006-09-11 11:09 UTC (permalink / raw) To: Cedric Le Goater; +Cc: Linux Kernel Mailing List, containers Cedric Le Goater <clg@fr.ibm.com> writes: > Eric W. Biederman wrote: >> Cedric Le Goater <clg@fr.ibm.com> writes: >> >>> message queues can signal a process waiting for a message. >>> >>> this patch replaces the pid_t value with a struct pid to avoid pid wrap >>> around problems. >>> >>> Signed-off-by: Cedric Le Goater <clg@fr.ibm.com> >>> Cc: Eric Biederman <ebiederm@xmission.com> >>> Cc: Andrew Morton <akpm@osdl.org> >>> Cc: containers@lists.osdl.org >> >> Signed-off-by: Eric Biederman <ebiederm@xmission.com> >> >> I was just about to send out this patch in a couple more hours. > > Well, you did the same with the usb/devio.c and friends :) Good. The you should be familiar enough with it to review my patch and make certain I didn't do anything stupid :) >> So expect the fact we wrote the same code is a good sign :) > > How does oleg feel about it ? I've seen some long thread on possible race > conditions with put_pid() and solutions with rcu. I didn't quite get all of > it ... it will need another run for me. Short. Oleg felt it was a shame that locking was needed to use a struct pid. While parsing that I realized my second vt patch that deals with vt_pid (the pid for console switching) has a subtle race, and that patch needs to be reworked. We confused each other. :) > On the "pid_t to struct pid*" topic: > > * I started smbfs and realized it was useless. Killing the user space part is useless? I thought that is what I saw happening. Of course I don't frequently mount smbfs. > * in the following, the init process is being killed directly using 1. I'm > not sure how useful it would be to use a struct pid. To begin with, may be > they could use a : > > kill_init(int signum, int priv) An interesting notion. The other half of them use cad_pid. Converting that is going to need some sysctl work, so I have been ignoring it temporarily. Filling in a struct pid through sysctl is extremely ugly at the moment, plus cad_pid needs some locking. > ./arch/mips/sgi-ip32/ip32-reset.c > ./arch/powerpc/platforms/iseries/mf.c > ./drivers/parisc/power.c > ./drivers/char/snsc_event.c > ./kernel/sys.c > ./kernel/sysctl.c > ./drivers/char/nwbutton.c > ./drivers/s390/s390mach.c > > * some more drivers, > * some more kthread to convert Ok. Time to exchange some status information, before I roll over and go back to sleep. My patch todo list (almost a series file) currently looks like: > n_r396r > fs3270-Change-to-use-struct-pid.txt > smbfs-Make-conn_pid-a-struct-pid.txt > ncpfs-Use-struct-pid-to-track-the-userspace-watchdog-process.txt > > Don-t-use-kill_pg-in-the-sunos-compatibility-code.txt > > usbatm-use-kthread-api (I think I have this one) I did usbatm mostly to figure out why kthread conversions seem to be so hard, and got lucky this one wasn't too ugly. > The-dvb_core-needs-to-use-the-kthread-api-not-kernel-threads.txt > nfs-Note-we-need-to-start-using-the-kthreads-api.txt dvb-core I have only started looking at. nfs I noticed it is the svc stuff that matters. usbatm, dvb-core, and nfs are the 3 kernel_thread users that also use kill_proc, and thus are high on my immediate hit list. > pid-Replace-session_of_pgrp-with-pgrp_in_current_session.txt > pid-Use-struct-pid-for-talking-about-process-groups-in-exit.c.txt > pid-Replace-is_orphaned_pgrp-with-is_current_pgrp_orphaned.txt > > tty-Update-the-tty-layer-to-work-with-struct-pid.txt I need to ensure I don't have a race with task->signal->tty_old_pgrp. tty_old_pgrp is a weird notion that I haven't fully wrapped my head around yet. > pid-Remove-use-of-old-do_each_task_pid-while_each_task_pid.txt > > Rewrite-kill_something_info-so-it-uses-newer-helpers.txt > > pid-Remove-now-unused-do_each_task_pid-and-while_each_task_pid.txt > Remove-the-now-unused-kill_pg-kill_pg_info-and-__kill_pg_info.txt > > > pid-Better-tests-for-same-thread-group-membership.txt > pid-Cleanup-the-pid-equality-tests.txt > pid-Track-the-sending-pid-of-a-queued-signal.txt > proc-Use-pid_nr-in-array.c-so-the-code-is-foobar-safe.txt > > sysctl-Implement-get_data-put_data.txt > > cad-pid (killing init) Once the above list is processed none of the old none of the signal functions that take a pid_t is needed anymore. i.e. kill_proc, kill_pg, and do_each_task_pid will be removable. I have at least a first draft of everything on my list except for the kthread conversions which I just started messing with yesterday. But don't worry about beating me to something if you feel you have it complete. That just means I will have enough of a clue to review your code :) Eric ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-11 11:09 ` Eric W. Biederman @ 2006-09-11 14:05 ` Cedric Le Goater 2006-09-11 19:01 ` Eric W. Biederman 0 siblings, 1 reply; 23+ messages in thread From: Cedric Le Goater @ 2006-09-11 14:05 UTC (permalink / raw) To: Eric W. Biederman; +Cc: Linux Kernel Mailing List, containers Eric W. Biederman wrote: >>> I was just about to send out this patch in a couple more hours. >> Well, you did the same with the usb/devio.c and friends :) > > Good. The you should be familiar enough with it to review my patch > and make certain I didn't do anything stupid :) well, the least i can try ... >>> So expect the fact we wrote the same code is a good sign :) >> How does oleg feel about it ? I've seen some long thread on possible race >> conditions with put_pid() and solutions with rcu. I didn't quite get all of >> it ... it will need another run for me. > > Short. Oleg felt it was a shame that locking was needed to use a > struct pid. > > While parsing that I realized my second vt patch that deals with > vt_pid (the pid for console switching) has a subtle race, and > that patch needs to be reworked. > > We confused each other. :) > >> On the "pid_t to struct pid*" topic: >> >> * I started smbfs and realized it was useless. > > Killing the user space part is useless? > I thought that is what I saw happening. smb_fill_super() says : if (warn_count < 5) { warn_count++; printk(KERN_EMERG "smbfs is deprecated and will be removed in" " December, 2006. Please migrate to cifs\n"); } So, i guess we should forget about it and spend our time on the cifs kthread instead. > Of course I don't frequently mount smbfs. > >> * in the following, the init process is being killed directly using 1. I'm >> not sure how useful it would be to use a struct pid. To begin with, may be >> they could use a : >> >> kill_init(int signum, int priv) > > An interesting notion. The other half of them use cad_pid. yes. > Converting that is going to need some sysctl work, so I have been > ignoring it temporarily. > > Filling in a struct pid through sysctl is extremely ugly at the > moment, plus cad_pid needs some locking. Which distros use /proc/sys/kernel/cad_pid and why ? I can image the need but i didn't find much on the topic. > My patch todo list (almost a series file) currently looks like: >> n_r396r >> fs3270-Change-to-use-struct-pid.txt done that. will send to martin for review. >> smbfs-Make-conn_pid-a-struct-pid.txt deprecated in december. so we could just forget about it. >> ncpfs-Use-struct-pid-to-track-the-userspace-watchdog-process.txt >> >> Don-t-use-kill_pg-in-the-sunos-compatibility-code.txt >> >> usbatm-use-kthread-api (I think I have this one) > I did usbatm mostly to figure out why kthread conversions seem > to be so hard, and got lucky this one wasn't too ugly. argh. i've done also and i just send my second version of the patch to the maintainer Duncan Sands. This one might just be useless also because greg kh has a patch in -mm to enable multithread probing of USB devices. >> The-dvb_core-needs-to-use-the-kthread-api-not-kernel-threads.txt >> nfs-Note-we-need-to-start-using-the-kthreads-api.txt > > dvb-core I have only started looking at. suka and i have sent patches to fix : drivers/media/video/tvaudio.c drivers/media/video/saa7134/saa7134-tvaudio.c we are no waiting for the maintainer feedback. > nfs I noticed it is the svc stuff that matters. > > usbatm, dvb-core, and nfs are the 3 kernel_thread users > that also use kill_proc, and thus are high on my immediate hit list. nfs is also full of signal_pending() ... >> pid-Replace-session_of_pgrp-with-pgrp_in_current_session.txt >> pid-Use-struct-pid-for-talking-about-process-groups-in-exit.c.txt >> pid-Replace-is_orphaned_pgrp-with-is_current_pgrp_orphaned.txt >> >> tty-Update-the-tty-layer-to-work-with-struct-pid.txt > I need to ensure I don't have a race with task->signal->tty_old_pgrp. > tty_old_pgrp is a weird notion that I haven't fully wrapped my head > around yet. > >> pid-Remove-use-of-old-do_each_task_pid-while_each_task_pid.txt >> >> Rewrite-kill_something_info-so-it-uses-newer-helpers.txt >> >> pid-Remove-now-unused-do_each_task_pid-and-while_each_task_pid.txt >> Remove-the-now-unused-kill_pg-kill_pg_info-and-__kill_pg_info.txt >> >> >> pid-Better-tests-for-same-thread-group-membership.txt >> pid-Cleanup-the-pid-equality-tests.txt >> pid-Track-the-sending-pid-of-a-queued-signal.txt is that about updating the siginfos in collect_signal() to hold the right pid value depending on the pid namespace they are being received ? >> proc-Use-pid_nr-in-array.c-so-the-code-is-foobar-safe.txt >> >> sysctl-Implement-get_data-put_data.txt >> >> cad-pid (killing init) > > Once the above list is processed none of the old none of the signal > functions that take a pid_t is needed anymore. > i.e. kill_proc, kill_pg, and do_each_task_pid will be removable. > > I have at least a first draft of everything on my list except for the > kthread conversions which I just started messing with yesterday. But > don't worry about beating me to something if you feel you have it > complete. That just means I will have enough of a clue to review your > code :) good list ! I look at it in details. thanks, C. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-11 14:05 ` Cedric Le Goater @ 2006-09-11 19:01 ` Eric W. Biederman 2006-09-11 21:53 ` Cedric Le Goater 2006-09-12 11:05 ` Herbert Poetzl 0 siblings, 2 replies; 23+ messages in thread From: Eric W. Biederman @ 2006-09-11 19:01 UTC (permalink / raw) To: Cedric Le Goater; +Cc: Linux Kernel Mailing List, containers Cedric you mentioned a couple of other patches that are in flight. In the future could you please Cc: the containers list so independent efforts are less likely to duplicate work, and we are more likely to review each others patches instead? Cedric Le Goater <clg@fr.ibm.com> writes: > Eric W. Biederman wrote: > >>>> I was just about to send out this patch in a couple more hours. >>> Well, you did the same with the usb/devio.c and friends :) >> >> Good. The you should be familiar enough with it to review my patch >> and make certain I didn't do anything stupid :) > > well, the least i can try ... > >>> * I started smbfs and realized it was useless. >> >> Killing the user space part is useless? >> I thought that is what I saw happening. > > smb_fill_super() says : > > if (warn_count < 5) { > warn_count++; > printk(KERN_EMERG "smbfs is deprecated and will be removed in" > " December, 2006. Please migrate to cifs\n"); > } > > So, i guess we should forget about it and spend our time on the cifs > kthread instead. Sure. Although in this instance the changes are simple enough I will probably send the patch anyway :) That at least explains why you figured it was useless work. >> Of course I don't frequently mount smbfs. >> >>> * in the following, the init process is being killed directly using 1. I'm >>> not sure how useful it would be to use a struct pid. To begin with, may be >>> they could use a : >>> >>> kill_init(int signum, int priv) >> >> An interesting notion. The other half of them use cad_pid. > > yes. > >> Converting that is going to need some sysctl work, so I have been >> ignoring it temporarily. >> >> Filling in a struct pid through sysctl is extremely ugly at the >> moment, plus cad_pid needs some locking. > > Which distros use /proc/sys/kernel/cad_pid and why ? I can image the need > but i didn't find much on the topic. I'm not at all certain, and I'm not even certain I care. The concept is there in the code so it needs to be dealt with. Although if I we extend the cad_pid concept it may make a difference. >> My patch todo list (almost a series file) currently looks like: >>> n_r396r >>> fs3270-Change-to-use-struct-pid.txt > > done that. will send to martin for review. Added to my queue of pending patches to look at review. >>> ncpfs-Use-struct-pid-to-track-the-userspace-watchdog-process.txt >>> >>> Don-t-use-kill_pg-in-the-sunos-compatibility-code.txt >>> >>> usbatm-use-kthread-api (I think I have this one) >> I did usbatm mostly to figure out why kthread conversions seem >> to be so hard, and got lucky this one wasn't too ugly. > > argh. i've done also and i just send my second version of the patch to the > maintainer Duncan Sands. > > This one might just be useless also because greg kh has a patch in -mm to > enable multithread probing of USB devices. Added to my queue of pending patches to track down and reivew. >>> The-dvb_core-needs-to-use-the-kthread-api-not-kernel-threads.txt >>> nfs-Note-we-need-to-start-using-the-kthreads-api.txt >> >> dvb-core I have only started looking at. > > suka and i have sent patches to fix : > > drivers/media/video/tvaudio.c > drivers/media/video/saa7134/saa7134-tvaudio.c > > we are no waiting for the maintainer feedback. Ok. I think I saw a little of that. >> nfs I noticed it is the svc stuff that matters. >> >> usbatm, dvb-core, and nfs are the 3 kernel_thread users >> that also use kill_proc, and thus are high on my immediate hit list. > > nfs is also full of signal_pending() ... Yes, there is a lot to read and understand before I can confidently do much with nfs. >>> pid-Better-tests-for-same-thread-group-membership.txt >>> pid-Cleanup-the-pid-equality-tests.txt >>> pid-Track-the-sending-pid-of-a-queued-signal.txt > > is that about updating the siginfos in collect_signal() to hold the right > pid value depending on the pid namespace they are being received ? Yes in send_signal, and in collect signal. To make it work easily I needed to add a struct pid to struct sigqueue. So in send_signal I generate the struct pid from the pid_t value and in collect signal I regenerate the numeric value. Eric ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-11 19:01 ` Eric W. Biederman @ 2006-09-11 21:53 ` Cedric Le Goater 2006-09-12 1:22 ` Eric W. Biederman 2006-09-12 11:05 ` Herbert Poetzl 1 sibling, 1 reply; 23+ messages in thread From: Cedric Le Goater @ 2006-09-11 21:53 UTC (permalink / raw) To: Eric W. Biederman; +Cc: Linux Kernel Mailing List, containers Eric W. Biederman wrote: > Cedric you mentioned a couple of other patches that are in flight. > In the future could you please Cc: the containers list so independent > efforts are less likely to duplicate work, and we are more likely > to review each others patches instead? yes sure, i was relying on the openvz wiki to avoid duplicated efforts on this topic but i guess email is just the one and only tool for this kind of development :) [ ... ] >>> Converting that is going to need some sysctl work, so I have been >>> ignoring it temporarily. >>> >>> Filling in a struct pid through sysctl is extremely ugly at the >>> moment, plus cad_pid needs some locking. >> Which distros use /proc/sys/kernel/cad_pid and why ? I can image the need >> but i didn't find much on the topic. > > I'm not at all certain, and I'm not even certain I care. The concept > is there in the code so it needs to be dealt with. OK. It would be nice to make sure this is still in use before trying to deal with /proc/sys/kernel/cad_pid. > Although if I we extend the cad_pid concept it may make a difference. what do you mean by extending cad_pid ? kill_init() ? [ ... ] >> is that about updating the siginfos in collect_signal() to hold the right >> pid value depending on the pid namespace they are being received ? > > Yes in send_signal, and in collect signal. To make it work easily I needed > to add a struct pid to struct sigqueue. So in send_signal I generate > the struct pid from the pid_t value and in collect signal I regenerate > the numeric value. OK. That's what i imagined also but we need a bit more of the pid namespace to regenerate the numerical value. So, how will you convert this 'struct pid*' in a pid value using the current pid namespace ? thinking aloud : * if the pid namespace of the sending struct pid and current match, use nr. * if they don't, if the sending pid namespace is the ancestor of the current pid namespace use 0 else it's a bug. struct pid* needs a pid namespace attribute and pid namespace needs to know its parent. C. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-11 21:53 ` Cedric Le Goater @ 2006-09-12 1:22 ` Eric W. Biederman 2006-09-12 15:37 ` Cedric Le Goater 0 siblings, 1 reply; 23+ messages in thread From: Eric W. Biederman @ 2006-09-12 1:22 UTC (permalink / raw) To: Cedric Le Goater; +Cc: Linux Kernel Mailing List, containers Cedric Le Goater <clg@fr.ibm.com> writes: > Eric W. Biederman wrote: > >> Cedric you mentioned a couple of other patches that are in flight. >> In the future could you please Cc: the containers list so independent >> efforts are less likely to duplicate work, and we are more likely >> to review each others patches instead? > > yes sure, i was relying on the openvz wiki to avoid duplicated efforts on > this topic but i guess email is just the one and only tool for this kind of > development :) Sure. Especially when it comes to helping review each others code :) Not duplicating work is not really my goal, not submitting a patch after a patch has been reviewed and accepted is. Plus we need patch review. Several people working on a patch in parallel if it is difficult can frequently find a solution that a single person would miss. >>>> Filling in a struct pid through sysctl is extremely ugly at the >>>> moment, plus cad_pid needs some locking. >>> Which distros use /proc/sys/kernel/cad_pid and why ? I can image the need >>> but i didn't find much on the topic. >> >> I'm not at all certain, and I'm not even certain I care. The concept >> is there in the code so it needs to be dealt with. > > OK. It would be nice to make sure this is still in use before trying to > deal with /proc/sys/kernel/cad_pid. > >> Although if I we extend the cad_pid concept it may make a difference. > > what do you mean by extending cad_pid ? kill_init() ? My meaning was every time we are sending a signal to init. It is quite possible we should be using cad_pid instead. >>> is that about updating the siginfos in collect_signal() to hold the right >>> pid value depending on the pid namespace they are being received ? >> >> Yes in send_signal, and in collect signal. To make it work easily I needed >> to add a struct pid to struct sigqueue. So in send_signal I generate >> the struct pid from the pid_t value and in collect signal I regenerate >> the numeric value. > > OK. That's what i imagined also but we need a bit more of the pid namespace > to regenerate the numerical value. So, how will you convert this 'struct > pid*' in a pid value using the current pid namespace ? By calling pid_nr :) The question I guess is how will pid_nr be implemented. > thinking aloud : > > * if the pid namespace of the sending struct pid and current match, > use nr. > * if they don't, > if the sending pid namespace is the ancestor of the current pid > namespace > use 0 > else > it's a bug. > > struct pid* needs a pid namespace attribute and pid namespace needs to know > its parent. Yes, that sounds correct. There is also the case that should not come up with signals where we have a pid from a child namespace, that we should also be able to compute the pid for. In essence I intend to have a list of pid_namespace, pid_t pairs connected to a struct pid that we can look through to find the appropriate pid. Eric ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-12 1:22 ` Eric W. Biederman @ 2006-09-12 15:37 ` Cedric Le Goater 2006-09-12 16:03 ` Eric W. Biederman 0 siblings, 1 reply; 23+ messages in thread From: Cedric Le Goater @ 2006-09-12 15:37 UTC (permalink / raw) To: Eric W. Biederman; +Cc: Linux Kernel Mailing List, containers Eric W. Biederman wrote: [ ... ] > There is also the case that should not come up with signals where > we have a pid from a child namespace, that we should also be able to > compute the pid for. I don't understand how a signal can come from a child pid namespace ? > In essence I intend to have a list of pid_namespace, pid_t pairs connected > to a struct pid that we can look through to find the appropriate pid. yes, that's the purpose of pid_nr() I guess. This list would contain in nearly all cases a single pair (current pid namespace, pid value). It will contain 2 pairs for a task that has unshared its pid namespace : a pair for the current pid namespace, that needs to allocated when unshare() is called, and one pair for the ancestor pid namespace which is already allocated. Do you see more ? C. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-12 15:37 ` Cedric Le Goater @ 2006-09-12 16:03 ` Eric W. Biederman 0 siblings, 0 replies; 23+ messages in thread From: Eric W. Biederman @ 2006-09-12 16:03 UTC (permalink / raw) To: Cedric Le Goater; +Cc: Linux Kernel Mailing List, containers Cedric Le Goater <clg@fr.ibm.com> writes: > Eric W. Biederman wrote: > > [ ... ] > >> There is also the case that should not come up with signals where >> we have a pid from a child namespace, that we should also be able to >> compute the pid for. > > I don't understand how a signal can come from a child pid namespace ? SIG_CHLD is the only case where I think we will be sending a signal from the child pid namespace. Reading pids from the status files in /proc, from a parent namespace, is another example where we need to deal with the pid of children. >> In essence I intend to have a list of pid_namespace, pid_t pairs connected >> to a struct pid that we can look through to find the appropriate pid. > > yes, that's the purpose of pid_nr() I guess. > > This list would contain in nearly all cases a single pair (current pid > namespace, pid value). It will contain 2 pairs for a task that has unshared > its pid namespace : a pair for the current pid namespace, that needs to > allocated when unshare() is called, and one pair for the ancestor pid > namespace which is already allocated. > > Do you see more ? I don't see the list getting longer until we get into a nested pid namespaces. As long as the interface is well defined for the container in a container case I don't mind having additional restrictions. I will note that you can get some extremely weird interactions if you do things like open a file descriptor in the parent pid namespace. Fork two children each child in a different pid_namespaces. fcntl(F_SETOWN) is called in one child, and fcntl(F_GETOWN) is called in the other child. So we can't just call BUG_ON, if we have can't find the namespace. But returning 0 from pid_nr should be fine. Eric ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-11 19:01 ` Eric W. Biederman 2006-09-11 21:53 ` Cedric Le Goater @ 2006-09-12 11:05 ` Herbert Poetzl 2006-09-12 15:14 ` Eric W. Biederman 2006-09-14 20:01 ` [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 Herbert Poetzl 1 sibling, 2 replies; 23+ messages in thread From: Herbert Poetzl @ 2006-09-12 11:05 UTC (permalink / raw) To: Eric W. Biederman; +Cc: Cedric Le Goater, containers, Linux Kernel Mailing List On Mon, Sep 11, 2006 at 01:01:18PM -0600, Eric W. Biederman wrote: > > Cedric you mentioned a couple of other patches that are in flight. > In the future could you please Cc: the containers list so independent > efforts are less likely to duplicate work, and we are more likely > to review each others patches instead? > > Cedric Le Goater <clg@fr.ibm.com> writes: > > > Eric W. Biederman wrote: > > > >>>> I was just about to send out this patch in a couple more hours. > >>> Well, you did the same with the usb/devio.c and friends :) > >> > >> Good. The you should be familiar enough with it to review my patch > >> and make certain I didn't do anything stupid :) > > > > well, the least i can try ... > > > > >>> * I started smbfs and realized it was useless. > >> > >> Killing the user space part is useless? > >> I thought that is what I saw happening. > > > > smb_fill_super() says : > > > > if (warn_count < 5) { > > warn_count++; > > printk(KERN_EMERG "smbfs is deprecated and will be removed in" > > " December, 2006. Please migrate to cifs\n"); > > } > > > > So, i guess we should forget about it and spend our time on the cifs > > kthread instead. > > Sure. Although in this instance the changes are simple enough I will > probably send the patch anyway :) That at least explains why you > figured it was useless work. > > > >> Of course I don't frequently mount smbfs. > >> > >>> * in the following, the init process is being killed directly > >>> using 1. I'm not sure how useful it would be to use a struct pid. > >>> To begin with, may be they could use a : > >>> > >>> kill_init(int signum, int priv) > >> > >> An interesting notion. The other half of them use cad_pid. > > > > yes. > > > >> Converting that is going to need some sysctl work, so I have been > >> ignoring it temporarily. > >> > >> Filling in a struct pid through sysctl is extremely ugly at the > >> moment, plus cad_pid needs some locking. > > > > Which distros use /proc/sys/kernel/cad_pid and why ? I can image the > > need but i didn't find much on the topic. > > I'm not at all certain, and I'm not even certain I care. The concept > is there in the code so it needs to be dealt with. Although if I we > extend the cad_pid concept it may make a difference. > > >> My patch todo list (almost a series file) currently looks like: > >> > >>> n_r396r fs3270-Change-to-use-struct-pid.txt > > > > done that. will send to martin for review. > > Added to my queue of pending patches to look at review. > > >>> ncpfs-Use-struct-pid-to-track-the-userspace-watchdog-process.txt > >>> > >>> Don-t-use-kill_pg-in-the-sunos-compatibility-code.txt > >>> > >>> usbatm-use-kthread-api (I think I have this one) > >> > >> I did usbatm mostly to figure out why kthread conversions seem to > >> be so hard, and got lucky this one wasn't too ugly. > > > > argh. i've done also and i just send my second version of the patch > > to the maintainer Duncan Sands. > > > > This one might just be useless also because greg kh has a patch in > > -mm to enable multithread probing of USB devices. > > Added to my queue of pending patches to track down and reivew. > > > >>> The-dvb_core-needs-to-use-the-kthread-api-not-kernel-threads.txt > >>> nfs-Note-we-need-to-start-using-the-kthreads-api.txt > >> > >> dvb-core I have only started looking at. > > > > suka and i have sent patches to fix : > > > > drivers/media/video/tvaudio.c > > drivers/media/video/saa7134/saa7134-tvaudio.c > > > > we are no waiting for the maintainer feedback. > > Ok. I think I saw a little of that. > > >> nfs I noticed it is the svc stuff that matters. > >> > >> usbatm, dvb-core, and nfs are the 3 kernel_thread users > >> that also use kill_proc, and thus are high on my immediate hit list. > > nfs is also full of signal_pending() ... > Yes, there is a lot to read and understand before I can confidently > do much with nfs. I already did a lot of adjustments to the nfs system, and I poked aound in dvb-core before, so I will take a look at this in the next few days, at least the switch to the kthread api should not be a big deal ... HTH, Herbert > >>> pid-Better-tests-for-same-thread-group-membership.txt > >>> pid-Cleanup-the-pid-equality-tests.txt > >>> pid-Track-the-sending-pid-of-a-queued-signal.txt > > > > is that about updating the siginfos in collect_signal() to hold the right > > pid value depending on the pid namespace they are being received ? > > Yes in send_signal, and in collect signal. To make it work easily I > needed to add a struct pid to struct sigqueue. So in send_signal I > generate the struct pid from the pid_t value and in collect signal I > regenerate the numeric value. > > > Eric > > _______________________________________________ > Containers mailing list > Containers@lists.osdl.org > https://lists.osdl.org/mailman/listinfo/containers ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-12 11:05 ` Herbert Poetzl @ 2006-09-12 15:14 ` Eric W. Biederman 2006-09-14 20:01 ` [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 Herbert Poetzl 1 sibling, 0 replies; 23+ messages in thread From: Eric W. Biederman @ 2006-09-12 15:14 UTC (permalink / raw) To: Herbert Poetzl; +Cc: Cedric Le Goater, containers, Linux Kernel Mailing List Herbert Poetzl <herbert@13thfloor.at> writes: > I already did a lot of adjustments to the nfs system, and > I poked aound in dvb-core before, so I will take a look > at this in the next few days, at least the switch to the > kthread api should not be a big deal ... Ok. If you can get this it would be great. To some extent the last holdouts on the kernel_thread api seem to be the ones that are not trivial to convert :( Eric ^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-09-12 11:05 ` Herbert Poetzl 2006-09-12 15:14 ` Eric W. Biederman @ 2006-09-14 20:01 ` Herbert Poetzl 2006-09-14 21:07 ` Cedric Le Goater 1 sibling, 1 reply; 23+ messages in thread From: Herbert Poetzl @ 2006-09-14 20:01 UTC (permalink / raw) To: Eric W. Biederman, Cedric Le Goater, containers, Linux Kernel Mailing List Cc: v4l-dvb-maintainer, Andrew Morton, Andrew de Quincey Okay, as I promised, I had a first shot at the dvb kernel_thread to kthread API port, and here is the result, which is running fine here since yesterday, including module load/unload and software suspend (which doesn't work as expected with or without this patch :), I didn't convert the dvb_ca_en50221 as I do not have such an interface, but if the conversion process is fine with the v4l-dvb maintainers, it should not be a problem to send a patch for that too ... best, Herbert Signed-off-by: Herbert Poetzl <herbert@13thfloor.at> diff -NurpP linux-2.6.18-rc6/drivers/media/dvb/dvb-core/dvb_frontend.c linux-2.6.18-rc6-kthread.v02.3/drivers/media/dvb/dvb-core/dvb_frontend.c --- linux-2.6.18-rc6/drivers/media/dvb/dvb-core/dvb_frontend.c 2006-09-12 18:16:12 +0200 +++ linux-2.6.18-rc6-kthread.v02.3/drivers/media/dvb/dvb-core/dvb_frontend.c 2006-09-14 21:23:37 +0200 @@ -36,6 +36,7 @@ #include <linux/list.h> #include <linux/suspend.h> #include <linux/jiffies.h> +#include <linux/kthread.h> #include <asm/processor.h> #include "dvb_frontend.h" @@ -100,7 +101,7 @@ struct dvb_frontend_private { struct semaphore sem; struct list_head list_head; wait_queue_head_t wait_queue; - pid_t thread_pid; + struct task_struct *thread; unsigned long release_jiffies; unsigned int exit; unsigned int wakeup; @@ -508,19 +509,11 @@ static int dvb_frontend_thread(void *dat struct dvb_frontend *fe = data; struct dvb_frontend_private *fepriv = fe->frontend_priv; unsigned long timeout; - char name [15]; fe_status_t s; struct dvb_frontend_parameters *params; dprintk("%s\n", __FUNCTION__); - snprintf (name, sizeof(name), "kdvb-fe-%i", fe->dvb->num); - - lock_kernel(); - daemonize(name); - sigfillset(¤t->blocked); - unlock_kernel(); - fepriv->check_wrapped = 0; fepriv->quality = 0; fepriv->delay = 3*HZ; @@ -534,14 +527,16 @@ static int dvb_frontend_thread(void *dat up(&fepriv->sem); /* is locked when we enter the thread... */ timeout = wait_event_interruptible_timeout(fepriv->wait_queue, - dvb_frontend_should_wakeup(fe), - fepriv->delay); - if (0 != dvb_frontend_is_exiting(fe)) { + dvb_frontend_should_wakeup(fe) || kthread_should_stop(), + fepriv->delay); + + if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) { /* got signal or quitting */ break; } - try_to_freeze(); + if (try_to_freeze()) + continue; if (down_interruptible(&fepriv->sem)) break; @@ -591,7 +586,7 @@ static int dvb_frontend_thread(void *dat fe->ops.sleep(fe); } - fepriv->thread_pid = 0; + fepriv->thread = NULL; mb(); dvb_frontend_wakeup(fe); @@ -600,7 +595,6 @@ static int dvb_frontend_thread(void *dat static void dvb_frontend_stop(struct dvb_frontend *fe) { - unsigned long ret; struct dvb_frontend_private *fepriv = fe->frontend_priv; dprintk ("%s\n", __FUNCTION__); @@ -608,33 +602,17 @@ static void dvb_frontend_stop(struct dvb fepriv->exit = 1; mb(); - if (!fepriv->thread_pid) - return; - - /* check if the thread is really alive */ - if (kill_proc(fepriv->thread_pid, 0, 1) == -ESRCH) { - printk("dvb_frontend_stop: thread PID %d already died\n", - fepriv->thread_pid); - /* make sure the mutex was not held by the thread */ - init_MUTEX (&fepriv->sem); + if (!fepriv->thread) return; - } - - /* wake up the frontend thread, so it notices that fe->exit == 1 */ - dvb_frontend_wakeup(fe); - /* wait until the frontend thread has exited */ - ret = wait_event_interruptible(fepriv->wait_queue,0 == fepriv->thread_pid); - if (-ERESTARTSYS != ret) { - fepriv->state = FESTATE_IDLE; - return; - } + kthread_stop(fepriv->thread); + init_MUTEX (&fepriv->sem); fepriv->state = FESTATE_IDLE; /* paranoia check in case a signal arrived */ - if (fepriv->thread_pid) - printk("dvb_frontend_stop: warning: thread PID %d won't exit\n", - fepriv->thread_pid); + if (fepriv->thread) + printk("dvb_frontend_stop: warning: thread %p won't exit\n", + fepriv->thread); } s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime) @@ -684,10 +662,11 @@ static int dvb_frontend_start(struct dvb { int ret; struct dvb_frontend_private *fepriv = fe->frontend_priv; + struct task_struct *fe_thread; dprintk ("%s\n", __FUNCTION__); - if (fepriv->thread_pid) { + if (fepriv->thread) { if (!fepriv->exit) return 0; else @@ -701,18 +680,18 @@ static int dvb_frontend_start(struct dvb fepriv->state = FESTATE_IDLE; fepriv->exit = 0; - fepriv->thread_pid = 0; + fepriv->thread = NULL; mb(); - ret = kernel_thread (dvb_frontend_thread, fe, 0); - - if (ret < 0) { - printk("dvb_frontend_start: failed to start kernel_thread (%d)\n", ret); + fe_thread = kthread_run(dvb_frontend_thread, fe, + "kdvb-fe-%i", fe->dvb->num); + if (IS_ERR(fe_thread)) { + ret = PTR_ERR(fe_thread); + printk("dvb_frontend_start: failed to start kthread (%d)\n", ret); up(&fepriv->sem); return ret; } - fepriv->thread_pid = ret; - + fepriv->thread = fe_thread; return 0; } diff -NurpP linux-2.6.18-rc6/drivers/media/dvb/ttpci/av7110.c linux-2.6.18-rc6-kthread.v02.3/drivers/media/dvb/ttpci/av7110.c --- linux-2.6.18-rc6/drivers/media/dvb/ttpci/av7110.c 2006-09-12 18:16:13 +0200 +++ linux-2.6.18-rc6-kthread.v02.3/drivers/media/dvb/ttpci/av7110.c 2006-09-14 21:21:03 +0200 @@ -51,6 +51,7 @@ #include <linux/firmware.h> #include <linux/crc32.h> #include <linux/i2c.h> +#include <linux/kthread.h> #include <asm/system.h> @@ -223,11 +224,10 @@ static void recover_arm(struct av7110 *a static void av7110_arm_sync(struct av7110 *av7110) { - av7110->arm_rmmod = 1; - wake_up_interruptible(&av7110->arm_wait); + if (av7110->arm_thread) + kthread_stop(av7110->arm_thread); - while (av7110->arm_thread) - msleep(1); + av7110->arm_thread = NULL; } static int arm_thread(void *data) @@ -238,17 +238,11 @@ static int arm_thread(void *data) dprintk(4, "%p\n",av7110); - lock_kernel(); - daemonize("arm_mon"); - sigfillset(¤t->blocked); - unlock_kernel(); - - av7110->arm_thread = current; - for (;;) { timeout = wait_event_interruptible_timeout(av7110->arm_wait, - av7110->arm_rmmod, 5 * HZ); - if (-ERESTARTSYS == timeout || av7110->arm_rmmod) { + kthread_should_stop(), 5 * HZ); + + if (-ERESTARTSYS == timeout || kthread_should_stop()) { /* got signal or told to quit*/ break; } @@ -276,7 +270,6 @@ static int arm_thread(void *data) av7110->arm_errors = 0; } - av7110->arm_thread = NULL; return 0; } @@ -2334,6 +2327,7 @@ static int __devinit av7110_attach(struc const int length = TS_WIDTH * TS_HEIGHT; struct pci_dev *pdev = dev->pci; struct av7110 *av7110; + struct task_struct *thread; int ret, count = 0; dprintk(4, "dev: %p\n", dev); @@ -2618,9 +2612,12 @@ static int __devinit av7110_attach(struc printk ("dvb-ttpci: Warning, firmware version 0x%04x is too old. " "System might be unstable!\n", FW_VERSION(av7110->arm_app)); - ret = kernel_thread(arm_thread, (void *) av7110, 0); - if (ret < 0) + thread = kthread_run(arm_thread, (void *) av7110, "arm_mon"); + if (IS_ERR(thread)) { + ret = PTR_ERR(thread); goto err_stop_arm_9; + } + av7110->arm_thread = thread; /* set initial volume in mixer struct */ av7110->mixer.volume_left = volume; diff -NurpP linux-2.6.18-rc6/drivers/media/dvb/ttpci/av7110.h linux-2.6.18-rc6-kthread.v02.3/drivers/media/dvb/ttpci/av7110.h --- linux-2.6.18-rc6/drivers/media/dvb/ttpci/av7110.h 2006-09-12 18:16:13 +0200 +++ linux-2.6.18-rc6-kthread.v02.3/drivers/media/dvb/ttpci/av7110.h 2006-09-14 21:21:03 +0200 @@ -205,7 +205,6 @@ struct av7110 { struct task_struct *arm_thread; wait_queue_head_t arm_wait; u16 arm_loops; - int arm_rmmod; void *debi_virt; dma_addr_t debi_bus; ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-09-14 20:01 ` [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 Herbert Poetzl @ 2006-09-14 21:07 ` Cedric Le Goater 2006-09-14 22:10 ` Herbert Poetzl 0 siblings, 1 reply; 23+ messages in thread From: Cedric Le Goater @ 2006-09-14 21:07 UTC (permalink / raw) To: Eric W. Biederman, Cedric Le Goater, containers, Linux Kernel Mailing List, v4l-dvb-maintainer, Andrew Morton, Andrew de Quincey Herbert Poetzl wrote: > Okay, as I promised, I had a first shot at the > dvb kernel_thread to kthread API port, and here > is the result, which is running fine here since > yesterday, including module load/unload and > software suspend (which doesn't work as expected > with or without this patch :), So you have such an hardware ? [ ... ] > @@ -600,7 +595,6 @@ static int dvb_frontend_thread(void *dat > > static void dvb_frontend_stop(struct dvb_frontend *fe) > { > - unsigned long ret; > struct dvb_frontend_private *fepriv = fe->frontend_priv; > > dprintk ("%s\n", __FUNCTION__); > @@ -608,33 +602,17 @@ static void dvb_frontend_stop(struct dvb > fepriv->exit = 1; do we still need the ->exit flag now that we are using kthread_stop() ? same question for ->wakeup ? > mb(); > > - if (!fepriv->thread_pid) > - return; > - > - /* check if the thread is really alive */ > - if (kill_proc(fepriv->thread_pid, 0, 1) == -ESRCH) { > - printk("dvb_frontend_stop: thread PID %d already died\n", > - fepriv->thread_pid); > - /* make sure the mutex was not held by the thread */ > - init_MUTEX (&fepriv->sem); > + if (!fepriv->thread) > return; > - } > - > - /* wake up the frontend thread, so it notices that fe->exit == 1 */ > - dvb_frontend_wakeup(fe); > > - /* wait until the frontend thread has exited */ > - ret = wait_event_interruptible(fepriv->wait_queue,0 == fepriv->thread_pid); > - if (-ERESTARTSYS != ret) { > - fepriv->state = FESTATE_IDLE; > - return; > - } > + kthread_stop(fepriv->thread); > + init_MUTEX (&fepriv->sem); the use of the semaphore to synchronise the thread is complex. It will require extra care to avoid deadlocks. > fepriv->state = FESTATE_IDLE; > > /* paranoia check in case a signal arrived */ > - if (fepriv->thread_pid) > - printk("dvb_frontend_stop: warning: thread PID %d won't exit\n", > - fepriv->thread_pid); > + if (fepriv->thread) > + printk("dvb_frontend_stop: warning: thread %p won't exit\n", > + fepriv->thread); kthread_stop uses a completion already. so the above is real paranoia :) > } > > s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime) > @@ -684,10 +662,11 @@ static int dvb_frontend_start(struct dvb > { > int ret; > struct dvb_frontend_private *fepriv = fe->frontend_priv; > + struct task_struct *fe_thread; > > dprintk ("%s\n", __FUNCTION__); > > - if (fepriv->thread_pid) { > + if (fepriv->thread) { > if (!fepriv->exit) > return 0; > else > @@ -701,18 +680,18 @@ static int dvb_frontend_start(struct dvb > > fepriv->state = FESTATE_IDLE; > fepriv->exit = 0; > - fepriv->thread_pid = 0; > + fepriv->thread = NULL; > mb(); > > - ret = kernel_thread (dvb_frontend_thread, fe, 0); > - > - if (ret < 0) { > - printk("dvb_frontend_start: failed to start kernel_thread (%d)\n", ret); > + fe_thread = kthread_run(dvb_frontend_thread, fe, > + "kdvb-fe-%i", fe->dvb->num); > + if (IS_ERR(fe_thread)) { > + ret = PTR_ERR(fe_thread); ret could be local. [ ... ] ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-09-14 21:07 ` Cedric Le Goater @ 2006-09-14 22:10 ` Herbert Poetzl 2006-11-17 1:50 ` Andrew de Quincey 0 siblings, 1 reply; 23+ messages in thread From: Herbert Poetzl @ 2006-09-14 22:10 UTC (permalink / raw) To: Cedric Le Goater Cc: Eric W. Biederman, containers, Linux Kernel Mailing List, v4l-dvb-maintainer, Andrew Morton, Andrew de Quincey On Thu, Sep 14, 2006 at 11:07:49PM +0200, Cedric Le Goater wrote: > Herbert Poetzl wrote: > > Okay, as I promised, I had a first shot at the > > dvb kernel_thread to kthread API port, and here > > is the result, which is running fine here since > > yesterday, including module load/unload and > > software suspend (which doesn't work as expected > > with or without this patch :), > > So you have such an hardware ? yes, I do .. that's how I tested it :) > [ ... ] > > > @@ -600,7 +595,6 @@ static int dvb_frontend_thread(void *dat > > > > static void dvb_frontend_stop(struct dvb_frontend *fe) > > { > > - unsigned long ret; > > struct dvb_frontend_private *fepriv = fe->frontend_priv; > > > > dprintk ("%s\n", __FUNCTION__); > > @@ -608,33 +602,17 @@ static void dvb_frontend_stop(struct dvb > > fepriv->exit = 1; > > do we still need the ->exit flag now that we are using kthread_stop() ? > same question for ->wakeup ? probably not, but I didn't want to change too much on the first try, especially I'd appreciate some feedback to this from the maintainer(s) > > mb(); > > > > - if (!fepriv->thread_pid) > > - return; > > - > > - /* check if the thread is really alive */ > > - if (kill_proc(fepriv->thread_pid, 0, 1) == -ESRCH) { > > - printk("dvb_frontend_stop: thread PID %d already died\n", > > - fepriv->thread_pid); > > - /* make sure the mutex was not held by the thread */ > > - init_MUTEX (&fepriv->sem); > > + if (!fepriv->thread) > > return; > > - } > > - > > - /* wake up the frontend thread, so it notices that fe->exit == 1 */ > > - dvb_frontend_wakeup(fe); > > > > - /* wait until the frontend thread has exited */ > > - ret = wait_event_interruptible(fepriv->wait_queue,0 == fepriv->thread_pid); > > - if (-ERESTARTSYS != ret) { > > - fepriv->state = FESTATE_IDLE; > > - return; > > - } > > + kthread_stop(fepriv->thread); > > + init_MUTEX (&fepriv->sem); > > the use of the semaphore to synchronise the thread is complex. It will > require extra care to avoid deadlocks. well, it 'works' quite fine for now, but yeah, I thought about completely removing the additional synchronization and 'jsut' go with the kthread one, if that is sufficient ... > > fepriv->state = FESTATE_IDLE; > > > > /* paranoia check in case a signal arrived */ > > - if (fepriv->thread_pid) > > - printk("dvb_frontend_stop: warning: thread PID %d won't exit\n", > > - fepriv->thread_pid); > > + if (fepriv->thread) > > + printk("dvb_frontend_stop: warning: thread %p won't exit\n", > > + fepriv->thread); > > kthread_stop uses a completion already. so the above is real paranoia :) again, I think this will go away soon :) > > } > > > > s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime) > > @@ -684,10 +662,11 @@ static int dvb_frontend_start(struct dvb > > { > > int ret; > > struct dvb_frontend_private *fepriv = fe->frontend_priv; > > + struct task_struct *fe_thread; > > > > dprintk ("%s\n", __FUNCTION__); > > > > - if (fepriv->thread_pid) { > > + if (fepriv->thread) { > > if (!fepriv->exit) > > return 0; > > else > > @@ -701,18 +680,18 @@ static int dvb_frontend_start(struct dvb > > > > fepriv->state = FESTATE_IDLE; > > fepriv->exit = 0; > > - fepriv->thread_pid = 0; > > + fepriv->thread = NULL; > > mb(); > > > > - ret = kernel_thread (dvb_frontend_thread, fe, 0); > > - > > - if (ret < 0) { > > - printk("dvb_frontend_start: failed to start kernel_thread (%d)\n", ret); > > + fe_thread = kthread_run(dvb_frontend_thread, fe, > > + "kdvb-fe-%i", fe->dvb->num); > > + if (IS_ERR(fe_thread)) { > > + ret = PTR_ERR(fe_thread); > > ret could be local. correct, will fix that up in the next round thanks for the feedback, Herbert > [ ... ] > > _______________________________________________ > Containers mailing list > Containers@lists.osdl.org > https://lists.osdl.org/mailman/listinfo/containers ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-09-14 22:10 ` Herbert Poetzl @ 2006-11-17 1:50 ` Andrew de Quincey 2006-11-22 14:56 ` [Devel] " Cedric Le Goater 2006-12-12 22:58 ` Eric W. Biederman 0 siblings, 2 replies; 23+ messages in thread From: Andrew de Quincey @ 2006-11-17 1:50 UTC (permalink / raw) To: Herbert Poetzl Cc: Cedric Le Goater, Eric W. Biederman, containers, Linux Kernel Mailing List, v4l-dvb-maintainer, Andrew Morton [snip] > correct, will fix that up in the next round > > thanks for the feedback, > Herbert Hi - the conversion looks good to me.. I can't really offer any more constructive suggestions beyond what Cedric has already said. Theres another thread in dvb_ca_en50221.c that could be converted as well though, hint hint ;) Apologies for the delay in this reply - I've been hibernating for a bit. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Devel] Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-11-17 1:50 ` Andrew de Quincey @ 2006-11-22 14:56 ` Cedric Le Goater 2006-11-22 21:32 ` [v4l-dvb-maintainer] " Andrew de Quincey 2007-01-24 15:47 ` Cedric Le Goater 2006-12-12 22:58 ` Eric W. Biederman 1 sibling, 2 replies; 23+ messages in thread From: Cedric Le Goater @ 2006-11-22 14:56 UTC (permalink / raw) To: devel Cc: Herbert Poetzl, containers, v4l-dvb-maintainer, Linux Kernel Mailing List Andrew de Quincey wrote: > Hi - the conversion looks good to me.. I can't really offer any more > constructive suggestions beyond what Cedric has already said. ok. so, should we just resend a refreshed version of the patch when 2.6.19 comes out ? > Theres another thread in dvb_ca_en50221.c that could be converted as well > though, hint hint ;) ok ok :) i'll look at it ... > Apologies for the delay in this reply - I've been hibernating for a bit. np. thanks, C. ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [v4l-dvb-maintainer] Re: [Devel] Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-11-22 14:56 ` [Devel] " Cedric Le Goater @ 2006-11-22 21:32 ` Andrew de Quincey 2007-01-24 15:47 ` Cedric Le Goater 1 sibling, 0 replies; 23+ messages in thread From: Andrew de Quincey @ 2006-11-22 21:32 UTC (permalink / raw) To: v4l-dvb-maintainer Cc: Cedric Le Goater, devel, containers, Linux Kernel Mailing List, Herbert Poetzl On Wednesday 22 November 2006 14:56, Cedric Le Goater wrote: > Andrew de Quincey wrote: > > Hi - the conversion looks good to me.. I can't really offer any more > > constructive suggestions beyond what Cedric has already said. > > ok. so, should we just resend a refreshed version of the patch when 2.6.19 > comes out ? Yeah - sounds good. > > Theres another thread in dvb_ca_en50221.c that could be converted as well > > though, hint hint ;) > > ok ok :) i'll look at it ... heh :) ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-11-22 14:56 ` [Devel] " Cedric Le Goater 2006-11-22 21:32 ` [v4l-dvb-maintainer] " Andrew de Quincey @ 2007-01-24 15:47 ` Cedric Le Goater 1 sibling, 0 replies; 23+ messages in thread From: Cedric Le Goater @ 2007-01-24 15:47 UTC (permalink / raw) To: Cedric Le Goater Cc: Herbert Poetzl, containers, v4l-dvb-maintainer, Linux Kernel Mailing List Cedric Le Goater wrote: > Andrew de Quincey wrote: > >> Hi - the conversion looks good to me.. I can't really offer any more >> constructive suggestions beyond what Cedric has already said. > > ok. so, should we just resend a refreshed version of the patch when 2.6.19 > comes out ? > >> Theres another thread in dvb_ca_en50221.c that could be converted as well >> though, hint hint ;) > > ok ok :) i'll look at it ... Here's a try. Compiles and boots but I have no hardware to test the patch :( could we replace wait_event_interruptible_timeout() with wait_event_timeout() ? I don't see who would signal the thread. thanks, C. Signed-off-by: Cedric Le Goater <clg@fr.ibm.com> --- drivers/media/dvb/dvb-core/dvb_ca_en50221.c | 59 ++++++++-------------------- 1 file changed, 18 insertions(+), 41 deletions(-) Index: 2.6.20-rc4-mm1/drivers/media/dvb/dvb-core/dvb_ca_en50221.c =================================================================== --- 2.6.20-rc4-mm1.orig/drivers/media/dvb/dvb-core/dvb_ca_en50221.c +++ 2.6.20-rc4-mm1/drivers/media/dvb/dvb-core/dvb_ca_en50221.c @@ -37,6 +37,7 @@ #include <linux/delay.h> #include <linux/spinlock.h> #include <linux/sched.h> +#include <linux/kthread.h> #include "dvb_ca_en50221.h" #include "dvb_ringbuffer.h" @@ -140,14 +141,11 @@ struct dvb_ca_private { wait_queue_head_t wait_queue; /* PID of the monitoring thread */ - pid_t thread_pid; + struct task_struct* thread; /* Wait queue used when shutting thread down */ wait_queue_head_t thread_queue; - /* Flag indicating when thread should exit */ - unsigned int exit:1; - /* Flag indicating if the CA device is open */ unsigned int open:1; @@ -916,8 +914,6 @@ static int dvb_ca_en50221_thread_should_ ca->wakeup = 0; return 1; } - if (ca->exit) - return 1; return 0; } @@ -982,7 +978,6 @@ static void dvb_ca_en50221_thread_update static int dvb_ca_en50221_thread(void *data) { struct dvb_ca_private *ca = data; - char name[15]; int slot; int flags; int status; @@ -991,28 +986,19 @@ static int dvb_ca_en50221_thread(void *d dprintk("%s\n", __FUNCTION__); - /* setup kernel thread */ - snprintf(name, sizeof(name), "kdvb-ca-%i:%i", ca->dvbdev->adapter->num, ca->dvbdev->id); - - lock_kernel(); - daemonize(name); - sigfillset(¤t->blocked); - unlock_kernel(); - /* choose the correct initial delay */ dvb_ca_en50221_thread_update_delay(ca); /* main loop */ - while (!ca->exit) { + while (1) { /* sleep for a bit */ if (!ca->wakeup) { - flags = wait_event_interruptible_timeout(ca->thread_queue, - dvb_ca_en50221_thread_should_wakeup(ca), - ca->delay); - if ((flags == -ERESTARTSYS) || ca->exit) { - /* got signal or quitting */ + flags = wait_event_interruptible_timeout( + ca->thread_queue, + dvb_ca_en50221_thread_should_wakeup(ca) || kthread_should_stop(), + ca->delay); + if ((flags == -ERESTARTSYS) || kthread_should_stop()) break; - } } ca->wakeup = 0; @@ -1182,9 +1168,8 @@ static int dvb_ca_en50221_thread(void *d } /* completed */ - ca->thread_pid = 0; + ca->thread = NULL; mb(); - wake_up_interruptible(&ca->thread_queue); return 0; } @@ -1663,6 +1648,7 @@ int dvb_ca_en50221_init(struct dvb_adapt int ret; struct dvb_ca_private *ca = NULL; int i; + struct task_struct *thread; dprintk("%s\n", __FUNCTION__); @@ -1682,9 +1668,8 @@ int dvb_ca_en50221_init(struct dvb_adapt goto error; } init_waitqueue_head(&ca->wait_queue); - ca->thread_pid = 0; + ca->thread = NULL; init_waitqueue_head(&ca->thread_queue); - ca->exit = 0; ca->open = 0; ca->wakeup = 0; ca->next_read_slot = 0; @@ -1711,13 +1696,14 @@ int dvb_ca_en50221_init(struct dvb_adapt /* create a kthread for monitoring this CA device */ - ret = kernel_thread(dvb_ca_en50221_thread, ca, 0); - - if (ret < 0) { + thread = kthread_run(dvb_ca_en50221_thread, ca, "kdvb-ca-%i:%i", + ca->dvbdev->adapter->num, ca->dvbdev->id); + if (IS_ERR(thread)) { + ret = PTR_ERR(thread); printk("dvb_ca_init: failed to start kernel_thread (%d)\n", ret); goto error; } - ca->thread_pid = ret; + ca->thread = thread; return 0; error: @@ -1748,17 +1734,8 @@ void dvb_ca_en50221_release(struct dvb_c dprintk("%s\n", __FUNCTION__); /* shutdown the thread if there was one */ - if (ca->thread_pid) { - if (kill_proc(ca->thread_pid, 0, 1) == -ESRCH) { - printk("dvb_ca_release adapter %d: thread PID %d already died\n", - ca->dvbdev->adapter->num, ca->thread_pid); - } else { - ca->exit = 1; - mb(); - dvb_ca_en50221_thread_wakeup(ca); - wait_event_interruptible(ca->thread_queue, ca->thread_pid == 0); - } - } + if (ca->thread) + kthread_stop(ca->thread); for (i = 0; i < ca->slot_count; i++) { dvb_ca_en50221_slot_shutdown(ca, i); ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-11-17 1:50 ` Andrew de Quincey 2006-11-22 14:56 ` [Devel] " Cedric Le Goater @ 2006-12-12 22:58 ` Eric W. Biederman 2006-12-12 23:13 ` Herbert Poetzl 1 sibling, 1 reply; 23+ messages in thread From: Eric W. Biederman @ 2006-12-12 22:58 UTC (permalink / raw) To: Herbert Poetzl Cc: Andrew de Quincey, Cedric Le Goater, containers, Linux Kernel Mailing List, v4l-dvb-maintainer, Andrew Morton Andrew de Quincey <adq_dvb@lidskialf.net> writes: > [snip] > >> correct, will fix that up in the next round >> >> thanks for the feedback, >> Herbert > > Hi - the conversion looks good to me.. I can't really offer any more > constructive suggestions beyond what Cedric has already said. > > Theres another thread in dvb_ca_en50221.c that could be converted as well > though, hint hint ;) > > Apologies for the delay in this reply - I've been hibernating for a bit. Guys where are we at on this conversion? Eric ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-12-12 22:58 ` Eric W. Biederman @ 2006-12-12 23:13 ` Herbert Poetzl 2006-12-13 15:55 ` [Devel] " Cedric Le Goater 0 siblings, 1 reply; 23+ messages in thread From: Herbert Poetzl @ 2006-12-12 23:13 UTC (permalink / raw) To: Eric W. Biederman Cc: Andrew de Quincey, Cedric Le Goater, containers, Linux Kernel Mailing List, v4l-dvb-maintainer, Andrew Morton On Tue, Dec 12, 2006 at 03:58:16PM -0700, Eric W. Biederman wrote: > Andrew de Quincey <adq_dvb@lidskialf.net> writes: > > > [snip] > > > >> correct, will fix that up in the next round > >> > >> thanks for the feedback, > >> Herbert > > > > Hi - the conversion looks good to me.. I can't really offer any more > > constructive suggestions beyond what Cedric has already said. > > > > Theres another thread in dvb_ca_en50221.c that could be converted as well > > though, hint hint ;) > > > > Apologies for the delay in this reply - I've been hibernating for a bit. > > Guys where are we at on this conversion? I can take a look at it in the next few days, but I have no hardware to test that, so it would be good to get in contact with somebody who does best, Herbert > Eric ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Devel] Re: [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 2006-12-12 23:13 ` Herbert Poetzl @ 2006-12-13 15:55 ` Cedric Le Goater 0 siblings, 0 replies; 23+ messages in thread From: Cedric Le Goater @ 2006-12-13 15:55 UTC (permalink / raw) To: Eric W. Biederman, Andrew de Quincey, Cedric Le Goater, containers, Linux Kernel Mailing List, v4l-dvb-maintainer, Andrew Morton Herbert Poetzl wrote: > On Tue, Dec 12, 2006 at 03:58:16PM -0700, Eric W. Biederman wrote: >> Andrew de Quincey <adq_dvb@lidskialf.net> writes: >> >>> [snip] >>> >>>> correct, will fix that up in the next round >>>> >>>> thanks for the feedback, >>>> Herbert >>> Hi - the conversion looks good to me.. I can't really offer any more >>> constructive suggestions beyond what Cedric has already said. >>> >>> Theres another thread in dvb_ca_en50221.c that could be converted as well >>> though, hint hint ;) >>> >>> Apologies for the delay in this reply - I've been hibernating for a bit. >> Guys where are we at on this conversion? I said I would but I didn't have much time yet? however, I didn't see any big issue. no semaphore like in dvb_frontend.c. just some kill(0) that looks harmless. > I can take a look at it in the next few days, but > I have no hardware to test that, so it would be > good to get in contact with somebody who does neither do I. below is an updated version of herbert's dvb_frontend.c patch for 2.6.19-mm1 thanks, C. From: Herbert Poetzl <herbert@13thfloor.at> Okay, as I promised, I had a first shot at the dvb kernel_thread to kthread API port, and here is the result, which is running fine here since yesterday, including module load/unload and software suspend (which doesn't work as expected with or without this patch :), I didn't convert the dvb_ca_en50221 as I do not have such an interface, but if the conversion process is fine with the v4l-dvb maintainers, it should not be a problem to send a patch for that too ... best, Herbert Signed-off-by: Herbert Poetzl <herbert@13thfloor.at> --- drivers/media/dvb/dvb-core/dvb_frontend.c | 69 ++++++++++-------------------- drivers/media/dvb/ttpci/av7110.c | 29 +++++------- drivers/media/dvb/ttpci/av7110.h | 1 3 files changed, 37 insertions(+), 62 deletions(-) Index: 2.6.19-mm1/drivers/media/dvb/dvb-core/dvb_frontend.c =================================================================== --- 2.6.19-mm1.orig/drivers/media/dvb/dvb-core/dvb_frontend.c +++ 2.6.19-mm1/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -36,6 +36,7 @@ #include <linux/list.h> #include <linux/freezer.h> #include <linux/jiffies.h> +#include <linux/kthread.h> #include <asm/processor.h> #include "dvb_frontend.h" @@ -100,7 +101,7 @@ struct dvb_frontend_private { struct semaphore sem; struct list_head list_head; wait_queue_head_t wait_queue; - pid_t thread_pid; + struct task_struct *thread; unsigned long release_jiffies; unsigned int exit; unsigned int wakeup; @@ -508,19 +509,11 @@ static int dvb_frontend_thread(void *dat struct dvb_frontend *fe = data; struct dvb_frontend_private *fepriv = fe->frontend_priv; unsigned long timeout; - char name [15]; fe_status_t s; struct dvb_frontend_parameters *params; dprintk("%s\n", __FUNCTION__); - snprintf (name, sizeof(name), "kdvb-fe-%i", fe->dvb->num); - - lock_kernel(); - daemonize(name); - sigfillset(¤t->blocked); - unlock_kernel(); - fepriv->check_wrapped = 0; fepriv->quality = 0; fepriv->delay = 3*HZ; @@ -534,14 +527,16 @@ static int dvb_frontend_thread(void *dat up(&fepriv->sem); /* is locked when we enter the thread... */ timeout = wait_event_interruptible_timeout(fepriv->wait_queue, - dvb_frontend_should_wakeup(fe), - fepriv->delay); - if (0 != dvb_frontend_is_exiting(fe)) { + dvb_frontend_should_wakeup(fe) || kthread_should_stop(), + fepriv->delay); + + if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) { /* got signal or quitting */ break; } - try_to_freeze(); + if (try_to_freeze()) + continue; if (down_interruptible(&fepriv->sem)) break; @@ -591,7 +586,7 @@ static int dvb_frontend_thread(void *dat fe->ops.sleep(fe); } - fepriv->thread_pid = 0; + fepriv->thread = NULL; mb(); dvb_frontend_wakeup(fe); @@ -600,7 +595,6 @@ static int dvb_frontend_thread(void *dat static void dvb_frontend_stop(struct dvb_frontend *fe) { - unsigned long ret; struct dvb_frontend_private *fepriv = fe->frontend_priv; dprintk ("%s\n", __FUNCTION__); @@ -608,33 +602,17 @@ static void dvb_frontend_stop(struct dvb fepriv->exit = 1; mb(); - if (!fepriv->thread_pid) + if (!fepriv->thread) return; - /* check if the thread is really alive */ - if (kill_proc(fepriv->thread_pid, 0, 1) == -ESRCH) { - printk("dvb_frontend_stop: thread PID %d already died\n", - fepriv->thread_pid); - /* make sure the mutex was not held by the thread */ - init_MUTEX (&fepriv->sem); - return; - } - - /* wake up the frontend thread, so it notices that fe->exit == 1 */ - dvb_frontend_wakeup(fe); - - /* wait until the frontend thread has exited */ - ret = wait_event_interruptible(fepriv->wait_queue,0 == fepriv->thread_pid); - if (-ERESTARTSYS != ret) { - fepriv->state = FESTATE_IDLE; - return; - } + kthread_stop(fepriv->thread); + init_MUTEX (&fepriv->sem); fepriv->state = FESTATE_IDLE; /* paranoia check in case a signal arrived */ - if (fepriv->thread_pid) - printk("dvb_frontend_stop: warning: thread PID %d won't exit\n", - fepriv->thread_pid); + if (fepriv->thread) + printk("dvb_frontend_stop: warning: thread %p won't exit\n", + fepriv->thread); } s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime) @@ -684,10 +662,11 @@ static int dvb_frontend_start(struct dvb { int ret; struct dvb_frontend_private *fepriv = fe->frontend_priv; + struct task_struct *fe_thread; dprintk ("%s\n", __FUNCTION__); - if (fepriv->thread_pid) { + if (fepriv->thread) { if (!fepriv->exit) return 0; else @@ -701,18 +680,18 @@ static int dvb_frontend_start(struct dvb fepriv->state = FESTATE_IDLE; fepriv->exit = 0; - fepriv->thread_pid = 0; + fepriv->thread = NULL; mb(); - ret = kernel_thread (dvb_frontend_thread, fe, 0); - - if (ret < 0) { - printk("dvb_frontend_start: failed to start kernel_thread (%d)\n", ret); + fe_thread = kthread_run(dvb_frontend_thread, fe, + "kdvb-fe-%i", fe->dvb->num); + if (IS_ERR(fe_thread)) { + ret = PTR_ERR(fe_thread); + printk("dvb_frontend_start: failed to start kthread (%d)\n", ret); up(&fepriv->sem); return ret; } - fepriv->thread_pid = ret; - + fepriv->thread = fe_thread; return 0; } Index: 2.6.19-mm1/drivers/media/dvb/ttpci/av7110.c =================================================================== --- 2.6.19-mm1.orig/drivers/media/dvb/ttpci/av7110.c +++ 2.6.19-mm1/drivers/media/dvb/ttpci/av7110.c @@ -51,6 +51,7 @@ #include <linux/firmware.h> #include <linux/crc32.h> #include <linux/i2c.h> +#include <linux/kthread.h> #include <asm/system.h> @@ -223,11 +224,10 @@ static void recover_arm(struct av7110 *a static void av7110_arm_sync(struct av7110 *av7110) { - av7110->arm_rmmod = 1; - wake_up_interruptible(&av7110->arm_wait); + if (av7110->arm_thread) + kthread_stop(av7110->arm_thread); - while (av7110->arm_thread) - msleep(1); + av7110->arm_thread = NULL; } static int arm_thread(void *data) @@ -238,17 +238,11 @@ static int arm_thread(void *data) dprintk(4, "%p\n",av7110); - lock_kernel(); - daemonize("arm_mon"); - sigfillset(¤t->blocked); - unlock_kernel(); - - av7110->arm_thread = current; - for (;;) { timeout = wait_event_interruptible_timeout(av7110->arm_wait, - av7110->arm_rmmod, 5 * HZ); - if (-ERESTARTSYS == timeout || av7110->arm_rmmod) { + kthread_should_stop(), 5 * HZ); + + if (-ERESTARTSYS == timeout || kthread_should_stop()) { /* got signal or told to quit*/ break; } @@ -276,7 +270,6 @@ static int arm_thread(void *data) av7110->arm_errors = 0; } - av7110->arm_thread = NULL; return 0; } @@ -2338,6 +2331,7 @@ static int __devinit av7110_attach(struc const int length = TS_WIDTH * TS_HEIGHT; struct pci_dev *pdev = dev->pci; struct av7110 *av7110; + struct task_struct *thread; int ret, count = 0; dprintk(4, "dev: %p\n", dev); @@ -2622,9 +2616,12 @@ static int __devinit av7110_attach(struc printk ("dvb-ttpci: Warning, firmware version 0x%04x is too old. " "System might be unstable!\n", FW_VERSION(av7110->arm_app)); - ret = kernel_thread(arm_thread, (void *) av7110, 0); - if (ret < 0) + thread = kthread_run(arm_thread, (void *) av7110, "arm_mon"); + if (IS_ERR(thread)) { + ret = PTR_ERR(thread); goto err_stop_arm_9; + } + av7110->arm_thread = thread; /* set initial volume in mixer struct */ av7110->mixer.volume_left = volume; Index: 2.6.19-mm1/drivers/media/dvb/ttpci/av7110.h =================================================================== --- 2.6.19-mm1.orig/drivers/media/dvb/ttpci/av7110.h +++ 2.6.19-mm1/drivers/media/dvb/ttpci/av7110.h @@ -205,7 +205,6 @@ struct av7110 { struct task_struct *arm_thread; wait_queue_head_t arm_wait; u16 arm_loops; - int arm_rmmod; void *debi_virt; dma_addr_t debi_bus; ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [patch -mm] update mq_notify to use a struct pid 2006-09-11 10:17 ` Cedric Le Goater 2006-09-11 11:09 ` Eric W. Biederman @ 2006-09-11 15:48 ` Oleg Nesterov 1 sibling, 0 replies; 23+ messages in thread From: Oleg Nesterov @ 2006-09-11 15:48 UTC (permalink / raw) To: Cedric Le Goater Cc: Eric W. Biederman, Linux Kernel Mailing List, Andrew Morton, containers On 09/11, Cedric Le Goater wrote: > > Eric W. Biederman wrote: > > Cedric Le Goater <clg@fr.ibm.com> writes: > > > >> message queues can signal a process waiting for a message. > >> > >> this patch replaces the pid_t value with a struct pid to avoid pid wrap > >> around problems. > >> > >> Signed-off-by: Cedric Le Goater <clg@fr.ibm.com> > >> Cc: Eric Biederman <ebiederm@xmission.com> > >> Cc: Andrew Morton <akpm@osdl.org> > >> Cc: containers@lists.osdl.org > > > > Signed-off-by: Eric Biederman <ebiederm@xmission.com> > > > > I was just about to send out this patch in a couple more hours. > > Well, you did the same with the usb/devio.c and friends :) > > > So expect the fact we wrote the same code is a good sign :) > > How does oleg feel about it ? I've seen some long thread on possible race > conditions with put_pid() and solutions with rcu. I didn't quite get all of > it ... it will need another run for me. I assume you are talking about this patch: http://marc.theaimsgroup.com/?l=linux-mm-commits&m=115773820415171 I think it's ok, info->notify_owner is always used under info->lock. This is simple. If, for example, mqueue_read_file() didn't take info->lock, then we have a problem: pid_nr() may read a freed memory in case when __do_notify()->put_pid() happens at the same time. In this context info->notify_owner is a usual refcounted object, no special attention is needed. Oleg. ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2007-01-24 19:37 UTC | newest] Thread overview: 23+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-09-08 16:39 [patch -mm] update mq_notify to use a struct pid Cedric Le Goater 2006-09-09 2:39 ` Eric W. Biederman 2006-09-11 10:17 ` Cedric Le Goater 2006-09-11 11:09 ` Eric W. Biederman 2006-09-11 14:05 ` Cedric Le Goater 2006-09-11 19:01 ` Eric W. Biederman 2006-09-11 21:53 ` Cedric Le Goater 2006-09-12 1:22 ` Eric W. Biederman 2006-09-12 15:37 ` Cedric Le Goater 2006-09-12 16:03 ` Eric W. Biederman 2006-09-12 11:05 ` Herbert Poetzl 2006-09-12 15:14 ` Eric W. Biederman 2006-09-14 20:01 ` [PATCH/RFC] kthread API conversion for dvb_frontend and av7110 Herbert Poetzl 2006-09-14 21:07 ` Cedric Le Goater 2006-09-14 22:10 ` Herbert Poetzl 2006-11-17 1:50 ` Andrew de Quincey 2006-11-22 14:56 ` [Devel] " Cedric Le Goater 2006-11-22 21:32 ` [v4l-dvb-maintainer] " Andrew de Quincey 2007-01-24 15:47 ` Cedric Le Goater 2006-12-12 22:58 ` Eric W. Biederman 2006-12-12 23:13 ` Herbert Poetzl 2006-12-13 15:55 ` [Devel] " Cedric Le Goater 2006-09-11 15:48 ` [patch -mm] update mq_notify to use a struct pid Oleg Nesterov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).