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 /drivers/char/agp/frontend.c | |
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>
Diffstat (limited to 'drivers/char/agp/frontend.c')
-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 | ||