hi folks.
my laptop has been crashing in i915 the last few days and we finally tracked down the cause. cv_wait_sig() can return ERESTART, which has the value of -3. when linux code returns errors it often does it encoded in a pointer, and in the low negative range, so typically a return value is 0, or negative errno. this means that -ERESTART turns into positive 3 and then eg, our PTR_ERR() macro asserts that the errno is not less than zero. so, the basic problem is that netbsd errnos are in the range -6 .. 95, linux has them all positive, and declares special handling for negative values in many cases, and these aren't easy to reconcile. there are two ways i can see to fix this. - all errno interactions with linux style code bases need to have their values mapped to/from linux in all cases, and that the mapped values probably need to be unique. it may be that only ERESTART needs handling (could only remap this, and assert the others aren't set.) this means updating a lot of code, though the vast majority have a common comment. - re-number these for netbsd. i am running a kernel where the negative values have 255 addded to them. (current ELAST is 96, so there's quite a lot of space left.) the first one means not changing our old style for kernel-only errors, but i'm really a fan of that anyway. the second does mean giving up a minor ability to check quickly (user errno should be a small positive number, vs, range or similiar check. i could not find any of these checks anyway, so maybe not a real issue.) i think i prefer the second because it is both simpler to deal with means not having to constantly patch new code for the remap, but it does seem disappointing to have to give up this "feature" so we can have nice things. any suggestions or preferences? .mrg.