* [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 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
* 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-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
* 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
* [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-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/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
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 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.