Currently the "fake" input events generated by uinput in response to effect uploads will return an effect with an id that has already been handled by input_ff_upload in ff-core.c, which can modify the effect id. This causes a problem specifically when the effect originally uploaded via the EVIOCSFF ioctl contained an effect with -1, as the userspace code handling UI_FF_UPLOAD receives an effect with an id other than -1, and therefore will not know an allocation was requested. I notice that the "old" field on the ff_effect struct is set to NULL when the -1 id is changed (in input_ff_upload), which can serve as a flag that an allocation was requested. If it is the intention is that uinput users check if old == NULL to know when allocations are needed I think uinput documentation should describe this. I first noticed this using python-evdev, see my issue report here: https://github.com/gvalkov/python-evdev/issues/199