diff options
| author | John Kacur <jkacur@redhat.com> | 2009-10-11 16:24:25 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2009-10-14 11:36:54 -0400 |
| commit | 55e858c8483af427144f33b42b818b30612b82b0 (patch) | |
| tree | 300663182d53ca9ae77a54dce06066109e927a8f | |
| parent | f96d3015e9f7f7fff4cab7ed1d467664cc980061 (diff) | |
agp: Remove the BKL from agp_open
- Remove the BKL from agp_open
- Perform a few clean-ups.
Analysis:
---------
int minor is local to the function.
The following are protected by agp_fe.agp_mutex
struct agp_file_private *priv;
struct agp_client *client;
Call-outs:
kzalloc should be safe to call under the mutex_lock
agp_find_client_by_pid:
- agp_mmap calls that under agp_fe.agp_mutex which we hold in agp_open
- agpioc_reserve_wrap calls it without any locking what-so-ever.
- Is that an error? Or is that okay because it has pid that is
a unique handle?
agp_insert_file_private:
- This function only manipulates struct agp_file_private, once again
while agp_fe.agp_mutex is held
Signed-off-by: John Kacur <jkacur@redhat.com>
Acked-by: David Airlie <airlied@linux.ie>
LKML-Reference: <alpine.LFD.2.00.0910112216060.12574@localhost.localdomain>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
| -rw-r--r-- | drivers/char/agp/frontend.c | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/drivers/char/agp/frontend.c b/drivers/char/agp/frontend.c index a96f3197e60f..43412c03969e 100644 --- a/drivers/char/agp/frontend.c +++ b/drivers/char/agp/frontend.c | |||
| @@ -676,25 +676,25 @@ static int agp_open(struct inode *inode, struct file *file) | |||
| 676 | int minor = iminor(inode); | 676 | int minor = iminor(inode); |
| 677 | struct agp_file_private *priv; | 677 | struct agp_file_private *priv; |
| 678 | struct agp_client *client; | 678 | struct agp_client *client; |
| 679 | int rc = -ENXIO; | ||
| 680 | |||
| 681 | lock_kernel(); | ||
| 682 | mutex_lock(&(agp_fe.agp_mutex)); | ||
| 683 | 679 | ||
| 684 | if (minor != AGPGART_MINOR) | 680 | if (minor != AGPGART_MINOR) |
| 685 | goto err_out; | 681 | return -ENXIO; |
| 682 | |||
| 683 | mutex_lock(&(agp_fe.agp_mutex)); | ||
| 686 | 684 | ||
| 687 | priv = kzalloc(sizeof(struct agp_file_private), GFP_KERNEL); | 685 | priv = kzalloc(sizeof(struct agp_file_private), GFP_KERNEL); |
| 688 | if (priv == NULL) | 686 | if (priv == NULL) { |
| 689 | goto err_out_nomem; | 687 | mutex_unlock(&(agp_fe.agp_mutex)); |
| 688 | return -ENOMEM; | ||
| 689 | } | ||
| 690 | 690 | ||
| 691 | set_bit(AGP_FF_ALLOW_CLIENT, &priv->access_flags); | 691 | set_bit(AGP_FF_ALLOW_CLIENT, &priv->access_flags); |
| 692 | priv->my_pid = current->pid; | 692 | priv->my_pid = current->pid; |
| 693 | 693 | ||
| 694 | if (capable(CAP_SYS_RAWIO)) { | 694 | if (capable(CAP_SYS_RAWIO)) |
| 695 | /* Root priv, can be controller */ | 695 | /* Root priv, can be controller */ |
| 696 | set_bit(AGP_FF_ALLOW_CONTROLLER, &priv->access_flags); | 696 | set_bit(AGP_FF_ALLOW_CONTROLLER, &priv->access_flags); |
| 697 | } | 697 | |
| 698 | client = agp_find_client_by_pid(current->pid); | 698 | client = agp_find_client_by_pid(current->pid); |
| 699 | 699 | ||
| 700 | if (client != NULL) { | 700 | if (client != NULL) { |
| @@ -704,16 +704,10 @@ static int agp_open(struct inode *inode, struct file *file) | |||
| 704 | file->private_data = (void *) priv; | 704 | file->private_data = (void *) priv; |
| 705 | agp_insert_file_private(priv); | 705 | agp_insert_file_private(priv); |
| 706 | DBG("private=%p, client=%p", priv, client); | 706 | DBG("private=%p, client=%p", priv, client); |
| 707 | mutex_unlock(&(agp_fe.agp_mutex)); | ||
| 708 | unlock_kernel(); | ||
| 709 | return 0; | ||
| 710 | 707 | ||
| 711 | err_out_nomem: | ||
| 712 | rc = -ENOMEM; | ||
| 713 | err_out: | ||
| 714 | mutex_unlock(&(agp_fe.agp_mutex)); | 708 | mutex_unlock(&(agp_fe.agp_mutex)); |
| 715 | unlock_kernel(); | 709 | |
| 716 | return rc; | 710 | return 0; |
| 717 | } | 711 | } |
| 718 | 712 | ||
| 719 | 713 | ||
