how to cope with "Scheduling in interrupt" problem

From: MingJie Chang
Date: Sun Apr 03 2005 - 23:43:57 EST


Dear all,

I try to modify inet_sendmsg() and inet_recvmsg().
To defer the time to notify a receiver, I use a timer for the problem.
But it causes "Scheduling in interrupt" error.
Is there any method to reform it?

Thank you for tour help

Error:

Scheduling in interrupt
invalid operand: 0000
CPU: 0
EIP: 0819:[<c0005d6f>] Not tainted
EFLAGS: 00010286
eax: 00000018 ebx: c19c2000 ecx: c0170894 edx: fbff9000
esi: c19c2000 edi: c1d42da0 ebp: c19c3cf4 esp: c19c3cd0
ds: 0821 es: 0821 ss: 0821
Process ftp (pid: 1312, stackpage=c19c3000)<1>


code:
inet_sendmsg()
{
.
.
.
BYE:

if(sock->send_nonnotify_size>0&&0==sock->send_set_timer)
{
sock->send_notify_timer.function=notify_receiver;
sock->send_notify_timer.expires=MY_EXT_NOTIFY_TIME + jiffies;
sock->send_notify_timer.data=(unsigned long)(sock);

dbprintk("set notify timer, sock addr=%p\n",sock);
add_timer(&sock->send_notify_timer);
sock->send_set_timer=1;

}
release_sock(sock->sk);
}

static void notify_receiver(unsigned long data)
{
struct socket* sock=(struct socket*)data;
struct SHM_INFO shm_tmp;

if(!sock||!sock->sk)
return;

lock_sock(sock->sk);
sock->send_set_timer=0;

if(sock->send_nonnotify_size)
{
dbprintk("notify_receiver:notify
receivers,size=%d\n",sock->send_nonnotify_size);
sock->send_nonnotify_size=0;

shm_tmp.saddr=ntohl(sock->sk->saddr);
shm_tmp.sport=ntohl(sock->sk->sport);

shm_tmp.reqaddr=shm_tmp.saddr;
shm_tmp.reqport=shm_tmp.sport;

shm_tmp.daddr=ntohl(sock->sk->daddr);
shm_tmp.dport=ntohl(sock->sk->dport);
shm_tmp.maddr=NULL;
release_sock(sock->sk);

dbprintk("notift_recv: call send_data()......");
HYPERVISOR_send_data(&shm_tmp);
dbprintk("done\n");
return;
}

release_sock(sock->sk);
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/