【发布时间】:2013-09-07 14:27:40
【问题描述】:
我编写了一个简单的内核模块,其中包括以下 ksocket 连接接受代码:
.....(some ksocket initiation)
while( on_service )
{
sockfd_c = kaccept(sockfd_s, (struct sockaddr *)&addr_cli, &addr_len);
kclose(sockfd_c);
}
并编写一个简单的客户端来连接到这个套接字服务器。 在控制台中,我发现当我连续运行客户端连接时,“free”命令会增加内存使用量。
kaccept()和kclose()函数如下。
int kclose(ksocket_t sockfd)
{
struct socket *sk;
int ret;
sk = (struct socket *)sockfd;
ret = sk->ops->release(sk);
if (sk)
{
sock_release(sk);
}
return ret;
}
ksocket_t kaccept(ksocket_t socket, struct sockaddr *address, int *address_len)
{
struct socket *sk;
struct socket *new_sk = NULL;
int ret;
sk = (struct socket *)socket;
sxg_debug("family = %d, type = %d, protocol = %d\n",
sk->sk->sk_family, sk->type, sk->sk->sk_protocol);
//new_sk = sock_alloc();
//sock_alloc() is not exported, so i use sock_create() instead
ret = sock_create(sk->sk->sk_family, sk->type, sk->sk->sk_protocol, &new_sk);
if (ret < 0)
return NULL;
if (!new_sk)
return NULL;
new_sk->type = sk->type;
new_sk->ops = sk->ops;
ret = sk->ops->accept(sk, new_sk, 0 /*sk->file->f_flags*/);
if (ret < 0)
goto error_kaccept;
if (address)
{
ret = new_sk->ops->getname(new_sk, address, address_len, 2);
if (ret < 0)
goto error_kaccept;
}
return new_sk;
error_kaccept:
sock_release(new_sk);
return NULL;
}
有人知道内存泄漏的原因/方式吗?
【问题讨论】:
-
我必须纠正我的问题。最初,我认为这是内存泄漏问题。但我有以下发现。我的任务是在内核空间中创建一个套接字服务器。每次我的程序接受传入连接(没有任何数据传输)然后关闭它时,我发现它会消耗一些内存(通过“free”命令观察)。即使我通过 sock_release() 关闭了套接字连接,内存使用量也不会减少。最后系统打印“内存不足”然后崩溃。我已将 tcp_tw_recycle 和 tcp_tw_reuse 设置为 1,以减少 TIME_WAIT 状态下的 TCP 等待时间。
-
Linux内核版本为3.2.0。
标签: c kernel-module kernel