Comment 18 for bug 1112907

Revision history for this message
Konstantin U. (fd.ru) wrote : Re: upowerd crashed with signal 5 in dbus_g_connection_register_g_object()

According to my syslog, upowerd crash always follows a power_supply error, so I thought there must be some connection:

Mar 10 02:59:45 dev kernel: [ 160.051819] power_supply hid-00:12:a1:68:a3:1b-battery: driver failed to report `capacity' property: -5
Mar 10 02:59:45 dev kernel: [ 160.137237] do_trap: 66 callbacks suppressed
Mar 10 02:59:45 dev kernel: [ 160.137248] traps: upowerd[1502] trap int3 ip:7f2c0c1b92b5 sp:7fff26f6c440 error:0

If you look into linux-*/drivers/power/power_supply_sysfs.c, you can easily find the suspect:

        ssize_t ret = 0;
        ...

        if (off == POWER_SUPPLY_PROP_TYPE)
                value.intval = psy->type;
        else
                ret = psy->get_property(psy, off, &value);

        if (ret < 0) {
                if (ret == -ENODATA)
                        dev_dbg(dev, "driver has no data for `%s' property\n",
                                attr->attr.name);
                else if (ret != -ENODEV)
                        dev_err(dev, "driver failed to report `%s' property: %zd\n",
                                attr->attr.name, ret);
                return ret;
        }

Here, "ret" is assigned only once, which means psy->get_property() returns -EIO (-5).

psy->get_property() is actually calls hidinput_get_battery_property() from linux-*/drivers/hid/hid-input.c:

battery->get_property = hidinput_get_battery_property;

And the only place in hidinput_get_battery_property where we can get -EIO is:

          case POWER_SUPPLY_PROP_CAPACITY:
                ret = dev->hid_get_raw_report(dev, dev->battery_report_id,
                                              buf, sizeof(buf),
                                              dev->battery_report_type);
                ...
                break;

... and my knowledge isn't enough to dig a little deeper ;)

So, as a temporary solution I've recompiled kernel with commented out CONFIG_HID_BATTERY_STRENGTH and it works perfectly.