diff --git a/debian/changelog b/debian/changelog index 51eee2b6d..0a7518bf0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -25,7 +25,7 @@ linux-2.6 (3.2~rc4-1~experimental.1) experimental; urgency=low - blowfish is renamed to blowfish_generic [ Uwe Kleine-König ] - * [amd64] reenable rt featureset with 3.2-rc4-rt5 + * [amd64] reenable rt featureset with 3.2-rc4-rt6 -- Ben Hutchings Sat, 03 Dec 2011 23:07:41 +0000 diff --git a/debian/patches/features/all/rt/acpi-make-ec-lock-raw-as-well.patch b/debian/patches/features/all/rt/acpi-make-ec-lock-raw-as-well.patch new file mode 100644 index 000000000..e0229ba67 --- /dev/null +++ b/debian/patches/features/all/rt/acpi-make-ec-lock-raw-as-well.patch @@ -0,0 +1,113 @@ +From: Clark Williams +Date: Sat Dec 3 09:15:46 2011 -0600 +Subject: ACPI: Convert embedded controller lock to raw spinlock + +Was seeing multiple "scheduling while atomic" backtraces on the +3.2-rc2-rt5 realtime kernel. This patch converts the spinlock in +the ACPI embedded controller structure (curr_lock) to be a raw +spinlock. + +Signed-off-by: Clark Williams +Link: http://lkml.kernel.org/r/20111203093537.7d805f64@redhat.com +Signed-off-by: Thomas Gleixner +Cc: stable-rt@vger.kernel.org +diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c +index b19a18d..5812e01 100644 +--- a/drivers/acpi/ec.c ++++ b/drivers/acpi/ec.c +@@ -152,10 +152,10 @@ static int ec_transaction_done(struct acpi_ec *ec) + { + unsigned long flags; + int ret = 0; +- spin_lock_irqsave(&ec->curr_lock, flags); ++ raw_spin_lock_irqsave(&ec->curr_lock, flags); + if (!ec->curr || ec->curr->done) + ret = 1; +- spin_unlock_irqrestore(&ec->curr_lock, flags); ++ raw_spin_unlock_irqrestore(&ec->curr_lock, flags); + return ret; + } + +@@ -169,7 +169,7 @@ static void start_transaction(struct acpi_ec *ec) + static void advance_transaction(struct acpi_ec *ec, u8 status) + { + unsigned long flags; +- spin_lock_irqsave(&ec->curr_lock, flags); ++ raw_spin_lock_irqsave(&ec->curr_lock, flags); + if (!ec->curr) + goto unlock; + if (ec->curr->wlen > ec->curr->wi) { +@@ -194,7 +194,7 @@ err: + if (in_interrupt()) + ++ec->curr->irq_count; + unlock: +- spin_unlock_irqrestore(&ec->curr_lock, flags); ++ raw_spin_unlock_irqrestore(&ec->curr_lock, flags); + } + + static int acpi_ec_sync_query(struct acpi_ec *ec); +@@ -232,9 +232,9 @@ static int ec_poll(struct acpi_ec *ec) + if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) + break; + pr_debug(PREFIX "controller reset, restart transaction\n"); +- spin_lock_irqsave(&ec->curr_lock, flags); ++ raw_spin_lock_irqsave(&ec->curr_lock, flags); + start_transaction(ec); +- spin_unlock_irqrestore(&ec->curr_lock, flags); ++ raw_spin_unlock_irqrestore(&ec->curr_lock, flags); + } + return -ETIME; + } +@@ -247,17 +247,17 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, + if (EC_FLAGS_MSI) + udelay(ACPI_EC_MSI_UDELAY); + /* start transaction */ +- spin_lock_irqsave(&ec->curr_lock, tmp); ++ raw_spin_lock_irqsave(&ec->curr_lock, tmp); + /* following two actions should be kept atomic */ + ec->curr = t; + start_transaction(ec); + if (ec->curr->command == ACPI_EC_COMMAND_QUERY) + clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); +- spin_unlock_irqrestore(&ec->curr_lock, tmp); ++ raw_spin_unlock_irqrestore(&ec->curr_lock, tmp); + ret = ec_poll(ec); +- spin_lock_irqsave(&ec->curr_lock, tmp); ++ raw_spin_lock_irqsave(&ec->curr_lock, tmp); + ec->curr = NULL; +- spin_unlock_irqrestore(&ec->curr_lock, tmp); ++ raw_spin_unlock_irqrestore(&ec->curr_lock, tmp); + return ret; + } + +@@ -678,7 +678,7 @@ static struct acpi_ec *make_acpi_ec(void) + mutex_init(&ec->lock); + init_waitqueue_head(&ec->wait); + INIT_LIST_HEAD(&ec->list); +- spin_lock_init(&ec->curr_lock); ++ raw_spin_lock_init(&ec->curr_lock); + return ec; + } + +diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h +index ca75b9c..68ed95f 100644 +--- a/drivers/acpi/internal.h ++++ b/drivers/acpi/internal.h +@@ -62,7 +62,7 @@ struct acpi_ec { + wait_queue_head_t wait; + struct list_head list; + struct transaction *curr; +- spinlock_t curr_lock; ++ raw_spinlock_t curr_lock; + }; + + extern struct acpi_ec *first_ec; + +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.18 (GNU/Linux) + +iEYEARECAAYFAk7aQc0ACgkQHyuj/+TTEp1wdQCdGi7huqfZZYwMBW91bICU9zew +FZcAoM6leP805J/d5rruxEvbU1nNPQ6Z +=+fyw +-----END PGP SIGNATURE----- + diff --git a/debian/patches/features/all/rt/localversion.patch b/debian/patches/features/all/rt/localversion.patch index 318d79725..f162cd01f 100644 --- a/debian/patches/features/all/rt/localversion.patch +++ b/debian/patches/features/all/rt/localversion.patch @@ -14,4 +14,4 @@ Index: linux-3.2/localversion-rt --- /dev/null +++ linux-3.2/localversion-rt @@ -0,0 +1 @@ -+-rt5 ++-rt6 diff --git a/debian/patches/features/all/rt/series b/debian/patches/features/all/rt/series index d1e6df32b..e07526f5d 100644 --- a/debian/patches/features/all/rt/series +++ b/debian/patches/features/all/rt/series @@ -204,6 +204,7 @@ pci-access-use-__wake_up_all_locked.patch # ACPI acpi-make-gbl-hardware-lock-raw.patch +acpi-make-ec-lock-raw-as-well.patch ##################################################### # Stuff which should go mainline, but wants some care diff --git a/debian/patches/series/base-extra b/debian/patches/series/base-extra index a7bc05ced..d1c2687d7 100644 --- a/debian/patches/series/base-extra +++ b/debian/patches/series/base-extra @@ -62,6 +62,7 @@ + features/all/rt/wait-provide-__wake_up_all_locked.patch featureset=rt + features/all/rt/pci-access-use-__wake_up_all_locked.patch featureset=rt + features/all/rt/acpi-make-gbl-hardware-lock-raw.patch featureset=rt ++ features/all/rt/acpi-make-ec-lock-raw-as-well.patch featureset=rt + features/all/rt/seqlock-raw-seqlock.patch featureset=rt + features/all/rt/timekeeping-covert-xtimelock.patch featureset=rt + features/all/rt/latency-hist.patch featureset=rt