Messages in this thread | | | Date | Fri, 27 Nov 2015 05:00:26 +0000 | From | Al Viro <> | Subject | ->poll() instances shouldn't be indefinitely blocking |
| |
Take a look at this: static unsigned int gsc_m2m_poll(struct file *file, struct poll_table_struct *wait) { struct gsc_ctx *ctx = fh_to_ctx(file->private_data); struct gsc_dev *gsc = ctx->gsc_dev; int ret;
if (mutex_lock_interruptible(&gsc->lock)) return -ERESTARTSYS;
ret = v4l2_m2m_poll(file, ctx->m2m_ctx, wait); mutex_unlock(&gsc->lock);
return ret; }
a) ->poll() should not return -E...; callers expect just a bitmap of POLL... values.
b) sure, it's nice that if this thing hangs, we'll be able to kill it. However, if one's ->poll() can hang indefinitely, it means bad things for poll(2), select(2), etc. semantics. What the hell had been intended there?
c) a bunch of v4l2_m2m_poll() callers are also taking some kind of mutex; AFAICS, all of those appear bogus (the rest of them do not play wiht ERESTARTSYS, just plain mutex_lock() for those).
What's going on there?
| |