Blinkled memory leak? (Alix platform)

  • On my Alix2d3, I've noticed that blinkled appears to be leaking memory over time.

    I've got 2 PPPoE ADAL WANs and each linked to an LED. One of my ADSL PPPoE sessions has been dropping a bit (but not enough to report a fault), but this should just cause the blinkled package to restart more often.

    After 3 days uptime;

    [2.1-RELEASE][root@xxxxx]/root(2): ps axu | grep blink | grep -v grep
    root   42625  6.0  3.6 10468  8756  ??  SNs  10:03PM  75:00.95 /usr/local/bin/blinkled -i pppoe1 -l /dev/led/led2
    root   43044  5.0  3.6 10468  8756  ??  SNs  10:03PM  75:00.41 /usr/local/bin/blinkled -i pppoe0 -l /dev/led/led3

    Immediately after restarting the blinkled package via status_services.php

    [2.1-RELEASE][root@xxxxxx]/root(4): ps axu | grep blink | grep -v grep
    root   51248  7.0  0.4  3300  1048  ??  Ss    5:02PM   0:01.96 /usr/local/bin/blinkled -i pppoe1 -l /dev/led/led2
    root   51593  7.0  0.4  3300  1048  ??  Ss    5:02PM   0:01.96 /usr/local/bin/blinkled -i pppoe0 -l /dev/led/led3

    I've looked at the blinkled code, and it is dead simple. So why is the total memory for the process going up?

    The only thing I can think of is that the kvm_openfiles call is leaking handles somehow, or it isn't behaving nicely If the pppoe device does stuff under it.

  • I guess if you think it is actually leaking its going to be in something that is calling something and then not freeing it I guess. I had a look and I don't really see anything but its not like I have been doing much C in a long while.

    You should pkg_add -r valgrind and run it against the blinkled I guess. See what it says.

  • I think I've found a semi-reliable way to reproduce the leak. But as this is an alix2d3 with 256mb box running extra stuff pushes it's memory limits tight.

    If the interface goes away, the following code to never hit the cleanup path (can't find the source on the git repos, so from that post linked in the first post.):

       for(ifp = TAILQ_FIRST(&ifh); ifp; ifp = TAILQ_NEXT(&ifc, if_list))
          n = kvm_read(kd, (u_long)ifp, &ifc, sizeof(ifc));
             fprintf(stderr, "Error: kvm_read(element): %s\n", kvm_geterr(kd));
             return -1;
          if(strcmp(ifname, ifc.if_xname) == 0)
             data->opackets = ifc.if_data.ifi_opackets;
             data->ipackets = ifc.if_data.ifi_ipackets;
             data->obytes = ifc.if_data.ifi_obytes;
             data->ibytes = ifc.if_data.ifi_ibytes;
             data->baudrate = ifc.if_data.ifi_baudrate;
             return 0;

    Note; there is no kvm_close(kd) if the interface isn't matched.

    I guess the package isn't being restarted in some conditions when the interface derps.

Log in to reply