【问题标题】:Memory leak by using ksocket使用 ksocket 导致内存泄漏
【发布时间】: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


【解决方案1】:

使用valgrind查找内存泄漏

作为

valgrind ./your_program

【讨论】:

【解决方案2】:

我的内核版本是 3.2,我正在尝试编写一个内核套接字服务器。 经过几天的战斗,我有以下发现。

我使用 sock_create() 创建一个套接字服务器,然后通过监听并接受连接

sockfd_srv = sock_create(...)
...
while(1) {
    sockfd_srv->ops->listen();
    sockfd_cli = sock_create(...);
    sockfd_srv->ops->accept(..., &sockfd_cli);
    ....(do something)
    sock_release(sockfd_cli);
}

即使我通过 sock_release() 释放客户端的套接字,上述程序也会导致内存泄漏。最后,系统会内存不足。

我在使用 sock_create_lite() 而不是 sock_create() 的地方将其更改如下。

sockfd_srv = sock_create(...)
...
while(1) {
    sockfd_srv->ops->listen();
    sockfd_cli = sock_create_lite(...);
    sockfd_srv->ops->accept(..., &sockfd_cli);
    ....(do something)
    sock_release(sockfd_cli);
}

那么内存泄漏问题就没有了。

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2015-07-06
    • 2014-06-07
    • 2013-11-20
    • 2011-10-28
    • 2016-01-18
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多