projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'linux-2.6'
[powerpc.git]
/
drivers
/
input
/
evdev.c
diff --git
a/drivers/input/evdev.c
b/drivers/input/evdev.c
index
bfee4f9
..
e5b4e9b
100644
(file)
--- a/
drivers/input/evdev.c
+++ b/
drivers/input/evdev.c
@@
-63,10
+63,7
@@
static void evdev_pass_event(struct evdev_client *client,
}
/*
}
/*
- * Pass incoming event to all connected clients. Note that we are
- * caleld under a spinlock with interrupts off so we don't need
- * to use rcu_read_lock() here. Writers will be using syncronize_sched()
- * instead of synchrnoize_rcu().
+ * Pass incoming event to all connected clients.
*/
static void evdev_event(struct input_handle *handle,
unsigned int type, unsigned int code, int value)
*/
static void evdev_event(struct input_handle *handle,
unsigned int type, unsigned int code, int value)
@@
-80,6
+77,8
@@
static void evdev_event(struct input_handle *handle,
event.code = code;
event.value = value;
event.code = code;
event.value = value;
+ rcu_read_lock();
+
client = rcu_dereference(evdev->grab);
if (client)
evdev_pass_event(client, &event);
client = rcu_dereference(evdev->grab);
if (client)
evdev_pass_event(client, &event);
@@
-87,6
+86,8
@@
static void evdev_event(struct input_handle *handle,
list_for_each_entry_rcu(client, &evdev->client_list, node)
evdev_pass_event(client, &event);
list_for_each_entry_rcu(client, &evdev->client_list, node)
evdev_pass_event(client, &event);
+ rcu_read_unlock();
+
wake_up_interruptible(&evdev->wait);
}
wake_up_interruptible(&evdev->wait);
}
@@
-142,12
+143,7
@@
static int evdev_grab(struct evdev *evdev, struct evdev_client *client)
return error;
rcu_assign_pointer(evdev->grab, client);
return error;
rcu_assign_pointer(evdev->grab, client);
- /*
- * We don't use synchronize_rcu() here because read-side
- * critical section is protected by a spinlock instead
- * of rcu_read_lock().
- */
- synchronize_sched();
+ synchronize_rcu();
return 0;
}
return 0;
}
@@
-158,7
+154,7
@@
static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client)
return -EINVAL;
rcu_assign_pointer(evdev->grab, NULL);
return -EINVAL;
rcu_assign_pointer(evdev->grab, NULL);
- synchronize_
sched
();
+ synchronize_
rcu
();
input_release_device(&evdev->handle);
return 0;
input_release_device(&evdev->handle);
return 0;
@@
-170,7
+166,7
@@
static void evdev_attach_client(struct evdev *evdev,
spin_lock(&evdev->client_lock);
list_add_tail_rcu(&client->node, &evdev->client_list);
spin_unlock(&evdev->client_lock);
spin_lock(&evdev->client_lock);
list_add_tail_rcu(&client->node, &evdev->client_list);
spin_unlock(&evdev->client_lock);
- synchronize_
sched
();
+ synchronize_
rcu
();
}
static void evdev_detach_client(struct evdev *evdev,
}
static void evdev_detach_client(struct evdev *evdev,
@@
-179,7
+175,7
@@
static void evdev_detach_client(struct evdev *evdev,
spin_lock(&evdev->client_lock);
list_del_rcu(&client->node);
spin_unlock(&evdev->client_lock);
spin_lock(&evdev->client_lock);
list_del_rcu(&client->node);
spin_unlock(&evdev->client_lock);
- synchronize_
sched
();
+ synchronize_
rcu
();
}
static int evdev_open_device(struct evdev *evdev)
}
static int evdev_open_device(struct evdev *evdev)
@@
-192,8
+188,11
@@
static int evdev_open_device(struct evdev *evdev)
if (!evdev->exist)
retval = -ENODEV;
if (!evdev->exist)
retval = -ENODEV;
- else if (!evdev->open++)
+ else if (!evdev->open++)
{
retval = input_open_device(&evdev->handle);
retval = input_open_device(&evdev->handle);
+ if (retval)
+ evdev->open--;
+ }
mutex_unlock(&evdev->mutex);
return retval;
mutex_unlock(&evdev->mutex);
return retval;
@@
-309,7
+308,7
@@
struct input_event_compat {
#elif defined(CONFIG_S390)
# define COMPAT_TEST test_thread_flag(TIF_31BIT)
#elif defined(CONFIG_MIPS)
#elif defined(CONFIG_S390)
# define COMPAT_TEST test_thread_flag(TIF_31BIT)
#elif defined(CONFIG_MIPS)
-# define COMPAT_TEST
(current->thread.mflags & M
F_32BIT_ADDR)
+# define COMPAT_TEST
test_thread_flag(TI
F_32BIT_ADDR)
#else
# define COMPAT_TEST test_thread_flag(TIF_32BIT)
#endif
#else
# define COMPAT_TEST test_thread_flag(TIF_32BIT)
#endif
@@
-496,7
+495,7
@@
static unsigned int evdev_poll(struct file *file, poll_table *wait)
#ifdef CONFIG_COMPAT
#define BITS_PER_LONG_COMPAT (sizeof(compat_long_t) * 8)
#ifdef CONFIG_COMPAT
#define BITS_PER_LONG_COMPAT (sizeof(compat_long_t) * 8)
-#define
NBIT
S_COMPAT(x) ((((x) - 1) / BITS_PER_LONG_COMPAT) + 1)
+#define
BITS_TO_LONG
S_COMPAT(x) ((((x) - 1) / BITS_PER_LONG_COMPAT) + 1)
#ifdef __BIG_ENDIAN
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
#ifdef __BIG_ENDIAN
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
@@
-505,7
+504,7
@@
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
int len, i;
if (compat) {
int len, i;
if (compat) {
- len =
NBIT
S_COMPAT(maxbit) * sizeof(compat_long_t);
+ len =
BITS_TO_LONG
S_COMPAT(maxbit) * sizeof(compat_long_t);
if (len > maxlen)
len = maxlen;
if (len > maxlen)
len = maxlen;
@@
-516,7
+515,7
@@
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
sizeof(compat_long_t)))
return -EFAULT;
} else {
sizeof(compat_long_t)))
return -EFAULT;
} else {
- len =
NBIT
S(maxbit) * sizeof(long);
+ len =
BITS_TO_LONG
S(maxbit) * sizeof(long);
if (len > maxlen)
len = maxlen;
if (len > maxlen)
len = maxlen;
@@
-531,8
+530,8
@@
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
unsigned int maxlen, void __user *p, int compat)
{
int len = compat ?
unsigned int maxlen, void __user *p, int compat)
{
int len = compat ?
-
NBIT
S_COMPAT(maxbit) * sizeof(compat_long_t) :
-
NBIT
S(maxbit) * sizeof(long);
+
BITS_TO_LONG
S_COMPAT(maxbit) * sizeof(compat_long_t) :
+
BITS_TO_LONG
S(maxbit) * sizeof(long);
if (len > maxlen)
len = maxlen;
if (len > maxlen)
len = maxlen;
@@
-546,7
+545,7
@@
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
unsigned int maxlen, void __user *p, int compat)
{
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
unsigned int maxlen, void __user *p, int compat)
{
- int len =
NBIT
S(maxbit) * sizeof(long);
+ int len =
BITS_TO_LONG
S(maxbit) * sizeof(long);
if (len > maxlen)
len = maxlen;
if (len > maxlen)
len = maxlen;