Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 96008
b: refs/heads/master
c: f925093
h: refs/heads/master
v: v3
  • Loading branch information
grzegorz.chwesewicz@chilan.com authored and Jason Wessel committed May 5, 2008
1 parent d46ff86 commit 0a4a2c2
Show file tree
Hide file tree
Showing 10 changed files with 183 additions and 32 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 50f7ad2500b27ce5c42be3a6936f143b158f7bc3
refs/heads/master: f92509371ec06227a7e29778f395776d31b0deab
8 changes: 5 additions & 3 deletions trunk/Documentation/DocBook/kgdb.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
kgdb is a source level debugger for linux kernel. It is used along
with gdb to debug a linux kernel. The expectation is that gdb can
be used to "break in" to the kernel to inspect memory, variables
and look through a cal stack information similar to what an
and look through call stack information similar to what an
application developer would use gdb for. It is possible to place
breakpoints in kernel code and perform some limited execution
stepping.
Expand All @@ -93,8 +93,10 @@
<chapter id="CompilingAKernel">
<title>Compiling a kernel</title>
<para>
To enable <symbol>CONFIG_KGDB</symbol>, look under the "Kernel debugging"
and then select "KGDB: kernel debugging with remote gdb".
To enable <symbol>CONFIG_KGDB</symbol> you should first turn on
"Prompt for development and/or incomplete code/drivers"
(CONFIG_EXPERIMENTAL) in "General setup", then under the
"Kernel debugging" select "KGDB: kernel debugging with remote gdb".
</para>
<para>
Next you should choose one of more I/O drivers to interconnect debugging
Expand Down
176 changes: 170 additions & 6 deletions trunk/kernel/futex.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ struct futex_q {
/* Key which the futex is hashed on: */
union futex_key key;

/* For fd, sigio sent using these: */
int fd;
struct file *filp;

/* Optional priority inheritance state: */
struct futex_pi_state *pi_state;
struct task_struct *task;
Expand All @@ -122,6 +126,9 @@ struct futex_hash_bucket {

static struct futex_hash_bucket futex_queues[1<<FUTEX_HASHBITS];

/* Futex-fs vfsmount entry: */
static struct vfsmount *futex_mnt;

/*
* Take mm->mmap_sem, when futex is shared
*/
Expand Down Expand Up @@ -603,6 +610,8 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb,
static void wake_futex(struct futex_q *q)
{
plist_del(&q->list, &q->list.plist);
if (q->filp)
send_sigio(&q->filp->f_owner, q->fd, POLL_IN);
/*
* The lock in wake_up_all() is a crucial memory barrier after the
* plist_del() and also before assigning to q->lock_ptr.
Expand Down Expand Up @@ -979,10 +988,14 @@ static int futex_requeue(u32 __user *uaddr1, struct rw_semaphore *fshared,
}

/* The key must be already stored in q->key. */
static inline struct futex_hash_bucket *queue_lock(struct futex_q *q)
static inline struct futex_hash_bucket *
queue_lock(struct futex_q *q, int fd, struct file *filp)
{
struct futex_hash_bucket *hb;

q->fd = fd;
q->filp = filp;

init_waitqueue_head(&q->waiters);

get_futex_key_refs(&q->key);
Expand All @@ -993,7 +1006,7 @@ static inline struct futex_hash_bucket *queue_lock(struct futex_q *q)
return hb;
}

static inline void queue_me(struct futex_q *q, struct futex_hash_bucket *hb)
static inline void __queue_me(struct futex_q *q, struct futex_hash_bucket *hb)
{
int prio;

Expand Down Expand Up @@ -1028,6 +1041,15 @@ queue_unlock(struct futex_q *q, struct futex_hash_bucket *hb)
* exactly once. They are called with the hashed spinlock held.
*/

/* The key must be already stored in q->key. */
static void queue_me(struct futex_q *q, int fd, struct file *filp)
{
struct futex_hash_bucket *hb;

hb = queue_lock(q, fd, filp);
__queue_me(q, hb);
}

/* Return 1 if we were still queued (ie. 0 means we were woken) */
static int unqueue_me(struct futex_q *q)
{
Expand Down Expand Up @@ -1172,7 +1194,7 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
if (unlikely(ret != 0))
goto out_release_sem;

hb = queue_lock(&q);
hb = queue_lock(&q, -1, NULL);

/*
* Access the page AFTER the futex is queued.
Expand Down Expand Up @@ -1216,7 +1238,7 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
goto out_unlock_release_sem;

/* Only actually queue if *uaddr contained val. */
queue_me(&q, hb);
__queue_me(&q, hb);

/*
* Now the futex is queued and we have checked the data, we
Expand Down Expand Up @@ -1364,7 +1386,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
goto out_release_sem;

retry_unlocked:
hb = queue_lock(&q);
hb = queue_lock(&q, -1, NULL);

retry_locked:
ret = lock_taken = 0;
Expand Down Expand Up @@ -1477,7 +1499,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
/*
* Only actually queue now that the atomic ops are done:
*/
queue_me(&q, hb);
__queue_me(&q, hb);

/*
* Now the futex is queued and we have checked the data, we
Expand Down Expand Up @@ -1724,6 +1746,121 @@ static int futex_unlock_pi(u32 __user *uaddr, struct rw_semaphore *fshared)
return ret;
}

static int futex_close(struct inode *inode, struct file *filp)
{
struct futex_q *q = filp->private_data;

unqueue_me(q);
kfree(q);

return 0;
}

/* This is one-shot: once it's gone off you need a new fd */
static unsigned int futex_poll(struct file *filp,
struct poll_table_struct *wait)
{
struct futex_q *q = filp->private_data;
int ret = 0;

poll_wait(filp, &q->waiters, wait);

/*
* plist_node_empty() is safe here without any lock.
* q->lock_ptr != 0 is not safe, because of ordering against wakeup.
*/
if (plist_node_empty(&q->list))
ret = POLLIN | POLLRDNORM;

return ret;
}

static const struct file_operations futex_fops = {
.release = futex_close,
.poll = futex_poll,
};

/*
* Signal allows caller to avoid the race which would occur if they
* set the sigio stuff up afterwards.
*/
static int futex_fd(u32 __user *uaddr, int signal)
{
struct futex_q *q;
struct file *filp;
int ret, err;
struct rw_semaphore *fshared;
static unsigned long printk_interval;

if (printk_timed_ratelimit(&printk_interval, 60 * 60 * 1000)) {
printk(KERN_WARNING "Process `%s' used FUTEX_FD, which "
"will be removed from the kernel in June 2007\n",
current->comm);
}

ret = -EINVAL;
if (!valid_signal(signal))
goto out;

ret = get_unused_fd();
if (ret < 0)
goto out;
filp = get_empty_filp();
if (!filp) {
put_unused_fd(ret);
ret = -ENFILE;
goto out;
}
filp->f_op = &futex_fops;
filp->f_path.mnt = mntget(futex_mnt);
filp->f_path.dentry = dget(futex_mnt->mnt_root);
filp->f_mapping = filp->f_path.dentry->d_inode->i_mapping;

if (signal) {
err = __f_setown(filp, task_pid(current), PIDTYPE_PID, 1);
if (err < 0) {
goto error;
}
filp->f_owner.signum = signal;
}

q = kmalloc(sizeof(*q), GFP_KERNEL);
if (!q) {
err = -ENOMEM;
goto error;
}
q->pi_state = NULL;

fshared = &current->mm->mmap_sem;
down_read(fshared);
err = get_futex_key(uaddr, fshared, &q->key);

if (unlikely(err != 0)) {
up_read(fshared);
kfree(q);
goto error;
}

/*
* queue_me() must be called before releasing mmap_sem, because
* key->shared.inode needs to be referenced while holding it.
*/
filp->private_data = q;

queue_me(q, ret, filp);
up_read(fshared);

/* Now we map fd to filp, so userspace can access it */
fd_install(ret, filp);
out:
return ret;
error:
put_unused_fd(ret);
put_filp(filp);
ret = err;
goto out;
}

/*
* Support for robust futexes: the kernel cleans up held futexes at
* thread exit time.
Expand Down Expand Up @@ -1955,6 +2092,10 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
case FUTEX_WAKE_BITSET:
ret = futex_wake(uaddr, fshared, val, val3);
break;
case FUTEX_FD:
/* non-zero val means F_SETOWN(getpid()) & F_SETSIG(val) */
ret = futex_fd(uaddr, val);
break;
case FUTEX_REQUEUE:
ret = futex_requeue(uaddr, fshared, uaddr2, val, val2, NULL);
break;
Expand Down Expand Up @@ -2015,6 +2156,19 @@ asmlinkage long sys_futex(u32 __user *uaddr, int op, u32 val,
return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
}

static int futexfs_get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data,
struct vfsmount *mnt)
{
return get_sb_pseudo(fs_type, "futex", NULL, FUTEXFS_SUPER_MAGIC, mnt);
}

static struct file_system_type futex_fs_type = {
.name = "futexfs",
.get_sb = futexfs_get_sb,
.kill_sb = kill_anon_super,
};

static int __init futex_init(void)
{
u32 curval;
Expand All @@ -2039,6 +2193,16 @@ static int __init futex_init(void)
spin_lock_init(&futex_queues[i].lock);
}

i = register_filesystem(&futex_fs_type);
if (i)
return i;

futex_mnt = kern_mount(&futex_fs_type);
if (IS_ERR(futex_mnt)) {
unregister_filesystem(&futex_fs_type);
return PTR_ERR(futex_mnt);
}

return 0;
}
__initcall(futex_init);
4 changes: 0 additions & 4 deletions trunk/sound/drivers/pcsp/pcsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,17 +194,13 @@ static void pcsp_stop_beep(struct snd_pcsp *chip)
spin_unlock_irq(&chip->substream_lock);
}

#ifdef CONFIG_PM
static int pcsp_suspend(struct platform_device *dev, pm_message_t state)
{
struct snd_pcsp *chip = platform_get_drvdata(dev);
pcsp_stop_beep(chip);
snd_pcm_suspend_all(chip->pcm);
return 0;
}
#else
#define pcsp_suspend NULL
#endif /* CONFIG_PM */

static void pcsp_shutdown(struct platform_device *dev)
{
Expand Down
5 changes: 4 additions & 1 deletion trunk/sound/pci/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -515,16 +515,19 @@ config SND_FM801
config SND_FM801_TEA575X_BOOL
bool "ForteMedia FM801 + TEA5757 tuner"
depends on SND_FM801
depends on VIDEO_V4L1=y || VIDEO_V4L1=SND_FM801
help
Say Y here to include support for soundcards based on the ForteMedia
FM801 chip with a TEA5757 tuner connected to GPIO1-3 pins (Media
Forte SF256-PCS-02) into the snd-fm801 driver.

This will enable support for the old V4L1 API.

config SND_FM801_TEA575X
tristate
depends on SND_FM801_TEA575X_BOOL
default SND_FM801
select VIDEO_V4L1
select VIDEO_DEV

config SND_HDA_INTEL
tristate "Intel HD Audio"
Expand Down
9 changes: 1 addition & 8 deletions trunk/sound/pci/ac97/ac97_patch.c
Original file line number Diff line number Diff line change
Expand Up @@ -3446,7 +3446,6 @@ static const struct snd_kcontrol_new snd_ac97_controls_vt1617a[] = {
int patch_vt1617a(struct snd_ac97 * ac97)
{
int err = 0;
int val;

/* we choose to not fail out at this point, but we tell the
caller when we return */
Expand All @@ -3457,13 +3456,7 @@ int patch_vt1617a(struct snd_ac97 * ac97)
/* bring analog power consumption to normal by turning off the
* headphone amplifier, like WinXP driver for EPIA SP
*/
/* We need to check the bit before writing it.
* On some (many?) hardwares, setting bit actually clears it!
*/
val = snd_ac97_read(ac97, 0x5c);
if (!(val & 0x20))
snd_ac97_write_cache(ac97, 0x5c, 0x20);

snd_ac97_write_cache(ac97, 0x5c, 0x20);
ac97->ext_id |= AC97_EI_SPDIF; /* force the detection of spdif */
ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000;
ac97->build_ops = &patch_vt1616_ops;
Expand Down
5 changes: 1 addition & 4 deletions trunk/sound/pci/hda/patch_realtek.c
Original file line number Diff line number Diff line change
Expand Up @@ -11902,10 +11902,7 @@ static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
hda_nid_t nid,
int pin_type, int dac_idx)
{
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
pin_type);
snd_hda_codec_write(codec, dac_idx, 0, AC_VERB_SET_AMP_GAIN_MUTE,
AMP_OUT_UNMUTE);
alc_set_pin_output(codec, nid, pin_type);
}

static void alc861_auto_init_multi_out(struct hda_codec *codec)
Expand Down
2 changes: 0 additions & 2 deletions trunk/sound/pci/hda/patch_sigmatel.c
Original file line number Diff line number Diff line change
Expand Up @@ -4289,8 +4289,6 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = {
{ .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
{ .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
{ .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
{ .id = 0x83847645, .name = "92HD206X", .patch = patch_stac927x },
{ .id = 0x83847646, .name = "92HD206D", .patch = patch_stac927x },
/* The following does not take into account .id=0x83847661 when subsys =
* 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
* currently not fully supported.
Expand Down
Loading

0 comments on commit 0a4a2c2

Please sign in to comment.