Re: cannot release a UDP kernel socket - why ?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,
  I don't think there is any misuse using the kthread_run; indeed it
is a macro not a function. This does not say that I cannot use it. It
is used widely:
for example, in pdflush.c:

http://lxr.linux.no/linux+v2.6.29/mm/pdflush.c#L178
or here:
http://lxr.linux.no/linux+v2.6.29/fs/ocfs2/journal.c#L1353

And if you will grep in the kernel tree, there are more
places.

regards,
Mark



On Tue, Apr 28, 2009 at 8:58 AM, Pei Lin <telent997@xxxxxxxxx> wrote:
> hi,
> i think you misuse the kthread_run,this a macro not a function.
>
> reference the define(linux-2.6.30-rc3):
> /**
>  13  * kthread_run - create and wake a thread.
>  14  * @threadfn: the function to run until signal_pending(current).
>  15  * @data: data ptr for @threadfn.
>  16  * @namefmt: printf-style name for the thread.
>  17  *
>  18  * Description: Convenient wrapper for kthread_create() followed by
>  19  * wake_up_process().  Returns the kthread or ERR_PTR(-ENOMEM).
>  20  */
>  21 #define kthread_run(threadfn, data, namefmt, ...)                          \
>  22 ({                                                                         \
>  23         struct task_struct *__k                                            \
>  24                 = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
>  25         if (!IS_ERR(__k))                                                  \
>  26                 wake_up_process(__k);                                      \
>  27         __k;                                                               \
>  28 })
>
> BRs
>
> Lin
>
>
>
>
> 2009/4/27 Mark Ryden <markryde@xxxxxxxxx>:
>> Hello,
>>  The following module creates a UDP kernel socket which calls sock_recvms.
>> after insmoding the module ,
>> netstat -nl | grep 4000 shows that indeed a socket was created and that it
>> listens on port 4000.
>> However, after running rmmod  on the module, it does **not** close the socket.
>> netstat -nl | grep 4000 shows that it **does** exist; the "rmmod"
>> itself hangs, and
>> there are no kernel messages.
>> Any ideas?
>>
>> The code of the module is below:
>>
>> static int createUdpInSocket(void)
>> {
>>        int res;
>>        struct sockaddr_in server;
>>        int servererror;
>>        unsigned char *buf;
>>        printk( KERN_ERR "createUdpInSocket\n" );
>>
>>        if( sock_create( PF_INET,SOCK_DGRAM,IPPROTO_UDP,&udpInserversocket)<0 ) {
>>                printk(KERN_ERR "server: Error creating udpserversocket.\n" );
>>                return -EIO;
>>        }
>>        server.sin_family      = AF_INET;
>>        server.sin_addr.s_addr = INADDR_ANY;
>>        server.sin_port = htons((unsigned short)4000);
>>        servererror = udpInserversocket->ops->bind(udpInserversocket,
>>                        (struct sockaddr *) &server, sizeof(server) );
>>                {
>>                struct msghdr msg;
>>                struct iovec iov;
>>                mm_segment_t oldfs;
>>                int size = 0;
>>                int len = 160;
>>                iov.iov_base = buf;
>>                msg.msg_flags = 0;
>>                msg.msg_name = &server;
>>                msg.msg_namelen  = sizeof(struct sockaddr_in);
>>                msg.msg_control = NULL;
>>                msg.msg_controllen = 0;
>>                msg.msg_iov = &iov;
>>                msg.msg_iovlen = 1;
>>                msg.msg_control = NULL;
>>
>>                oldfs = get_fs();
>>                set_fs(KERNEL_DS);
>>                printk("before sock_recvmsg in %s %s\n",__FUNCTION__,__FILE__);
>>                size = sock_recvmsg(udpInserversocket,&msg,len,msg.msg_flags);
>>                printk("after sock_recvmsg in %s %s\n",__FUNCTION__,__FILE__);
>>                set_fs(oldfs);
>>
>>                }
>> }
>>
>>
>> static int kernThread(void *arg)
>> {
>>        allow_signal(SIGKILL);
>>
>>  createUdpInSocket();
>>
>>        return 0;
>> }
>>
>>
>> static int __init nic_init(void)
>>        {
>>        int ret;
>>        void *kdata;
>>        p = kthread_run(kernThread,kdata,"myKernThread");
>>
>>        return 0;
>>        }
>>
>> //////////////////////////////////////////////////////////////////////////////
>>
>> static void __exit nic_exit(void)
>>        {
>>        printk("in nic_exit\n");
>>  if (p)
>>          kthread_stop(p);
>>
>>        if (udpInserversocket)
>>                sock_release(udpInserversocket);
>>
>>        }
>>
>>
>> //////////////////////////////////////////////////////////////////////////////
>>
>> module_init(nic_init)
>> module_exit(nic_exit)
>>
>> Regards,
>> Mark Ryden
>>
>> --
>> To unsubscribe from this list: send an email with
>> "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
>> Please read the FAQ at http://kernelnewbies.org/FAQ
>>
>>
>

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux