From: Luis Henriques <luis.henriques@canonical.com>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org,
kernel-team@lists.ubuntu.com
Cc: Khalid Aziz <khalid.aziz@oracle.com>,
Andrea Arcangeli <aarcange@redhat.com>,
Pravin Shelar <pshelar@nicira.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Ben Hutchings <bhutchings@solarflare.com>,
Christoph Lameter <cl@linux.com>,
Johannes Weiner <jweiner@redhat.com>,
Mel Gorman <mgorman@suse.de>, Rik van Riel <riel@redhat.com>,
Andi Kleen <andi@firstfloor.org>,
Minchan Kim <minchan@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Guillaume Morin <guillaume@morinfr.org>,
Luis Henriques <luis.henriques@canonical.com>
Subject: [PATCH 3.5 84/88] mm: hugetlbfs: fix hugetlbfs optimization
Date: Fri, 7 Feb 2014 11:23:21 +0000 [thread overview]
Message-ID: <1391772205-22239-85-git-send-email-luis.henriques@canonical.com> (raw)
In-Reply-To: <1391772205-22239-1-git-send-email-luis.henriques@canonical.com>
3.5.7.30 -stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrea Arcangeli <aarcange@redhat.com>
commit 27c73ae759774e63313c1fbfeb17ba076cea64c5 upstream.
Commit 7cb2ef56e6a8 ("mm: fix aio performance regression for database
caused by THP") can cause dereference of a dangling pointer if
split_huge_page runs during PageHuge() if there are updates to the
tail_page->private field.
Also it is repeating compound_head twice for hugetlbfs and it is running
compound_head+compound_trans_head for THP when a single one is needed in
both cases.
The new code within the PageSlab() check doesn't need to verify that the
THP page size is never bigger than the smallest hugetlbfs page size, to
avoid memory corruption.
A longstanding theoretical race condition was found while fixing the
above (see the change right after the skip_unlock label, that is
relevant for the compound_lock path too).
By re-establishing the _mapcount tail refcounting for all compound
pages, this also fixes the below problem:
echo 0 >/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
BUG: Bad page state in process bash pfn:59a01
page:ffffea000139b038 count:0 mapcount:10 mapping: (null) index:0x0
page flags: 0x1c00000000008000(tail)
Modules linked in:
CPU: 6 PID: 2018 Comm: bash Not tainted 3.12.0+ #25
Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
Call Trace:
dump_stack+0x55/0x76
bad_page+0xd5/0x130
free_pages_prepare+0x213/0x280
__free_pages+0x36/0x80
update_and_free_page+0xc1/0xd0
free_pool_huge_page+0xc2/0xe0
set_max_huge_pages.part.58+0x14c/0x220
nr_hugepages_store_common.isra.60+0xd0/0xf0
nr_hugepages_store+0x13/0x20
kobj_attr_store+0xf/0x20
sysfs_write_file+0x189/0x1e0
vfs_write+0xc5/0x1f0
SyS_write+0x55/0xb0
system_call_fastpath+0x16/0x1b
Signed-off-by: Khalid Aziz <khalid.aziz@oracle.com>
Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
Tested-by: Khalid Aziz <khalid.aziz@oracle.com>
Cc: Pravin Shelar <pshelar@nicira.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Ben Hutchings <bhutchings@solarflare.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Johannes Weiner <jweiner@redhat.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Rik van Riel <riel@redhat.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Minchan Kim <minchan@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Guillaume Morin <guillaume@morinfr.org>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
---
include/linux/hugetlb.h | 6 ++
mm/hugetlb.c | 17 ++++++
mm/swap.c | 143 ++++++++++++++++++++++++++++--------------------
3 files changed, 106 insertions(+), 60 deletions(-)
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 9003fe3..16df330 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -24,6 +24,7 @@ struct hugepage_subpool *hugepage_new_subpool(long nr_blocks);
void hugepage_put_subpool(struct hugepage_subpool *spool);
int PageHuge(struct page *page);
+int PageHeadHuge(struct page *page_head);
void reset_vma_resv_huge_pages(struct vm_area_struct *vma);
int hugetlb_sysctl_handler(struct ctl_table *, int, void __user *, size_t *, loff_t *);
@@ -85,6 +86,11 @@ static inline int PageHuge(struct page *page)
return 0;
}
+static inline int PageHeadHuge(struct page *page_head)
+{
+ return 0;
+}
+
static inline void reset_vma_resv_huge_pages(struct vm_area_struct *vma)
{
}
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 44fd603..6c53091 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -679,6 +679,23 @@ int PageHuge(struct page *page)
}
EXPORT_SYMBOL_GPL(PageHuge);
+/*
+ * PageHeadHuge() only returns true for hugetlbfs head page, but not for
+ * normal or transparent huge pages.
+ */
+int PageHeadHuge(struct page *page_head)
+{
+ compound_page_dtor *dtor;
+
+ if (!PageHead(page_head))
+ return 0;
+
+ dtor = get_compound_page_dtor(page_head);
+
+ return dtor == free_huge_page;
+}
+EXPORT_SYMBOL_GPL(PageHeadHuge);
+
pgoff_t __basepage_index(struct page *page)
{
struct page *page_head = compound_head(page);
diff --git a/mm/swap.c b/mm/swap.c
index 0c833e8..6325163 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -78,19 +78,6 @@ static void __put_compound_page(struct page *page)
static void put_compound_page(struct page *page)
{
- /*
- * hugetlbfs pages cannot be split from under us. If this is a
- * hugetlbfs page, check refcount on head page and release the page if
- * the refcount becomes zero.
- */
- if (PageHuge(page)) {
- page = compound_head(page);
- if (put_page_testzero(page))
- __put_compound_page(page);
-
- return;
- }
-
if (unlikely(PageTail(page))) {
/* __split_huge_page_refcount can run under us */
struct page *page_head = compound_trans_head(page);
@@ -107,14 +94,31 @@ static void put_compound_page(struct page *page)
* still hot on arches that do not support
* this_cpu_cmpxchg_double().
*/
- if (PageSlab(page_head)) {
- if (PageTail(page)) {
+ if (PageSlab(page_head) || PageHeadHuge(page_head)) {
+ if (likely(PageTail(page))) {
+ /*
+ * __split_huge_page_refcount
+ * cannot race here.
+ */
+ VM_BUG_ON(!PageHead(page_head));
+ atomic_dec(&page->_mapcount);
if (put_page_testzero(page_head))
VM_BUG_ON(1);
-
- atomic_dec(&page->_mapcount);
- goto skip_lock_tail;
+ if (put_page_testzero(page_head))
+ __put_compound_page(page_head);
+ return;
} else
+ /*
+ * __split_huge_page_refcount
+ * run before us, "page" was a
+ * THP tail. The split
+ * page_head has been freed
+ * and reallocated as slab or
+ * hugetlbfs page of smaller
+ * order (only possible if
+ * reallocated as slab on
+ * x86).
+ */
goto skip_lock;
}
/*
@@ -128,8 +132,27 @@ static void put_compound_page(struct page *page)
/* __split_huge_page_refcount run before us */
compound_unlock_irqrestore(page_head, flags);
skip_lock:
- if (put_page_testzero(page_head))
- __put_single_page(page_head);
+ if (put_page_testzero(page_head)) {
+ /*
+ * The head page may have been
+ * freed and reallocated as a
+ * compound page of smaller
+ * order and then freed again.
+ * All we know is that it
+ * cannot have become: a THP
+ * page, a compound page of
+ * higher order, a tail page.
+ * That is because we still
+ * hold the refcount of the
+ * split THP tail and
+ * page_head was the THP head
+ * before the split.
+ */
+ if (PageHead(page_head))
+ __put_compound_page(page_head);
+ else
+ __put_single_page(page_head);
+ }
out_put_single:
if (put_page_testzero(page))
__put_single_page(page);
@@ -151,7 +174,6 @@ out_put_single:
VM_BUG_ON(atomic_read(&page->_count) != 0);
compound_unlock_irqrestore(page_head, flags);
-skip_lock_tail:
if (put_page_testzero(page_head)) {
if (PageHead(page_head))
__put_compound_page(page_head);
@@ -194,51 +216,52 @@ bool __get_page_tail(struct page *page)
* proper PT lock that already serializes against
* split_huge_page().
*/
+ unsigned long flags;
bool got = false;
- struct page *page_head;
-
- /*
- * If this is a hugetlbfs page it cannot be split under us. Simply
- * increment refcount for the head page.
- */
- if (PageHuge(page)) {
- page_head = compound_head(page);
- atomic_inc(&page_head->_count);
- got = true;
- } else {
- unsigned long flags;
+ struct page *page_head = compound_trans_head(page);
- page_head = compound_trans_head(page);
- if (likely(page != page_head &&
- get_page_unless_zero(page_head))) {
-
- /* Ref to put_compound_page() comment. */
- if (PageSlab(page_head)) {
- if (likely(PageTail(page))) {
- __get_page_tail_foll(page, false);
- return true;
- } else {
- put_page(page_head);
- return false;
- }
- }
-
- /*
- * page_head wasn't a dangling pointer but it
- * may not be a head page anymore by the time
- * we obtain the lock. That is ok as long as it
- * can't be freed from under us.
- */
- flags = compound_lock_irqsave(page_head);
- /* here __split_huge_page_refcount won't run anymore */
+ if (likely(page != page_head && get_page_unless_zero(page_head))) {
+ /* Ref to put_compound_page() comment. */
+ if (PageSlab(page_head) || PageHeadHuge(page_head)) {
if (likely(PageTail(page))) {
+ /*
+ * This is a hugetlbfs page or a slab
+ * page. __split_huge_page_refcount
+ * cannot race here.
+ */
+ VM_BUG_ON(!PageHead(page_head));
__get_page_tail_foll(page, false);
- got = true;
- }
- compound_unlock_irqrestore(page_head, flags);
- if (unlikely(!got))
+ return true;
+ } else {
+ /*
+ * __split_huge_page_refcount run
+ * before us, "page" was a THP
+ * tail. The split page_head has been
+ * freed and reallocated as slab or
+ * hugetlbfs page of smaller order
+ * (only possible if reallocated as
+ * slab on x86).
+ */
put_page(page_head);
+ return false;
+ }
+ }
+
+ /*
+ * page_head wasn't a dangling pointer but it
+ * may not be a head page anymore by the time
+ * we obtain the lock. That is ok as long as it
+ * can't be freed from under us.
+ */
+ flags = compound_lock_irqsave(page_head);
+ /* here __split_huge_page_refcount won't run anymore */
+ if (likely(PageTail(page))) {
+ __get_page_tail_foll(page, false);
+ got = true;
}
+ compound_unlock_irqrestore(page_head, flags);
+ if (unlikely(!got))
+ put_page(page_head);
}
return got;
}
--
1.8.3.2
next prev parent reply other threads:[~2014-02-07 11:26 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-07 11:21 [3.5.y.z extended stable] Linux 3.5.7.30 stable review Luis Henriques
2014-02-07 11:21 ` [PATCH 3.5 01/88] ext4: fix deadlock when writing in ENOSPC conditions Luis Henriques
2014-02-07 11:21 ` [PATCH 3.5 02/88] writeback: Fix data corruption on NFS Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 03/88] md/raid5: Fix possible confusion when multiple write errors occur Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 04/88] md/raid10: fix two bugs in handling of known-bad-blocks Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 05/88] md/raid10: fix bug when raid10 recovery fails to recover a block Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 06/88] hwmon: (coretemp) Fix truncated name of alarm attributes Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 07/88] nilfs2: fix segctor bug that causes file system corruption Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 08/88] mm: fix crash when using XFS on loopback Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 09/88] vfs: In d_path don't call d_dname on a mount point Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 10/88] perf/x86/amd/ibs: Fix waking up from S3 for AMD family 10h Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 11/88] staging: comedi: 8255_pci: fix for newer PCI-DIO48H Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 12/88] mm/memory-failure.c: recheck PageHuge() after hugetlb page migrate successfully Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 13/88] serial: amba-pl011: use port lock to guard control register access Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 14/88] rtlwifi: rtl8192cu: Fix W=1 build warning Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 15/88] rtlwifi: rtl8192cu: Add new firmware Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 16/88] rtlwifi: Set the link state Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 17/88] rtlwifi: rtl8192c: Add new definitions in the dm_common header Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 18/88] rtlwifi: rtl8192cu: Fix some code in RF handling Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 19/88] NFSv4: OPEN must handle the NFS4ERR_IO return code correctly Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 20/88] parport: parport_pc: remove double PCI ID for NetMos Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 21/88] staging: vt6656: [BUG] BBvUpdatePreEDThreshold Always set sensitivity on bScanning Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 22/88] [SCSI] bfa: Chinook quad port 16G FC HBA claim issue Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 23/88] usb: option: add new zte 3g modem pids to option driver Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 24/88] [media] dib8000: make 32 bits read atomic Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 25/88] serial: add support for 200 v3 series Titan card Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 26/88] usb: xhci: Check for XHCI_PLAT in xhci_cleanup_msix() Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 27/88] x86/efi: Fix off-by-one bug in EFI Boot Services reservation Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 28/88] perf kvm: Fix kvm report without guestmount Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 29/88] mtd: mxc_nand: remove duplicated ecc_stats counting Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 30/88] xen/pvhvm: If xen_platform_pci=0 is set don't blow up (v4) Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 31/88] USB: serial: add support for iBall 3.5G connect usb modem Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 32/88] USB: Nokia 502 is an unusual device Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 33/88] USB: cypress_m8: fix ring-indicator detection and reporting Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 34/88] ALSA: rme9652: fix a missing comma in channel_map_9636_ds[] Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 35/88] sunrpc: Fix infinite loop in RPC state machine Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 36/88] spidev: fix hang when transfer_one_message fails Luis Henriques
2014-02-07 18:17 ` Daniel Santos
2014-02-07 18:37 ` Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 37/88] dm thin: initialize dm_thin_new_mapping returned by get_next_mapping Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 38/88] SELinux: Fix memory leak upon loading policy Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 39/88] drm/radeon: warn users when hw_i2c is enabled (v2) Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 40/88] USB: ftdi_sio: added CS5 quirk for broken smartcard readers Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 41/88] serial: 8250: enable UART_BUG_NOMSR for Tegra Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 42/88] dm: wait until embedded kobject is released before destroying a device Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 43/88] dm space map common: make sure new space is used during extend Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 44/88] ASoC: adau1701: Fix ADAU1701_SEROCTL_WORD_LEN_16 constant Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 45/88] radeon/pm: Guard access to rdev->pm.power_state array Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 46/88] drm/radeon: skip colorbuffer checking if COLOR_INFO.FORMAT is set to INVALID Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 47/88] staging: r8712u: Set device type to wlan Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 48/88] ALSA: Enable CONFIG_ZONE_DMA for smaller PCI DMA masks Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 49/88] mmc: atmel-mci: fix timeout errors in SDIO mode when using DMA Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 50/88] rtlwifi: rtl8192cu: Add new device ID Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 51/88] mwifiex: add missing endian conversion for fw_tsf Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 52/88] b43: Fix lockdep splat Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 53/88] b43: Fix unload oops if firmware is not available Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 54/88] b43legacy: " Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 55/88] nfs4.1: properly handle ENOTSUP in SECINFO_NO_NAME Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 56/88] audit: correct a type mismatch in audit_syscall_exit() Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 57/88] md/raid5: fix long-standing problem with bitmap handling on write failure Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 58/88] drm/radeon: set the full cache bit for fences on r7xx+ Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 59/88] hp_accel: Add a new PnP ID HPQ6007 for new HP laptops Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 60/88] intel-iommu: fix off-by-one in pagetable freeing Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 61/88] fuse: fix pipe_buf_operations Luis Henriques
2014-02-07 11:22 ` [PATCH 3.5 62/88] drm/cirrus: correct register values for 16bpp Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 63/88] IB/qib: Fix QP check when looping back to/from QP1 Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 64/88] ore: Fix wrong math in allocation of per device BIO Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 65/88] b43: fix the wrong assignment of status.freq in b43_rx() Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 66/88] KVM: PPC: e500: Fix bad address type in deliver_tlb_misss() Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 67/88] Btrfs: handle EAGAIN case properly in btrfs_drop_snapshot() Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 68/88] ACPI / init: Flag use of ACPI and ACPI idioms for power supplies to regulator API Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 69/88] powerpc: Make sure "cache" directory is removed when offlining cpu Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 70/88] drm/radeon/DCE4+: clear bios scratch dpms bit (v2) Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 71/88] mm/page-writeback.c: fix dirty_balance_reserve subtraction from dirtyable memory Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 72/88] target/iscsi: Fix network portal creation race Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 73/88] mm, oom: base root bonus on current usage Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 74/88] x86, x32: Correct invalid use of user timespec in the kernel Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 75/88] alpha: fix broken network checksum Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 76/88] ARM: at91: smc: bug fix in sam9_smc_cs_read() Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 77/88] KVM: s390: fix diagnose code extraction Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 78/88] e752x_edac: Fix pci_dev usage count Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 79/88] lib/decompressors: fix "no limit" output buffer length Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 80/88] bnx2x: fix DMA unmapping of TSO split BDs Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 81/88] inet_diag: fix inet_diag_dump_icsk() timewait socket state logic Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 82/88] net: avoid reference counter overflows on fib_rules in multicast forwarding Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 83/88] net,via-rhine: Fix tx_timeout handling Luis Henriques
2014-02-07 11:23 ` Luis Henriques [this message]
2014-02-07 11:23 ` [PATCH 3.5 85/88] usb: core: get config and string descriptors for unauthorized devices Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 86/88] tty/serial: at91: Handle shutdown more safely Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 87/88] slub: Fix calculation of cpu slabs Luis Henriques
2014-02-07 11:23 ` [PATCH 3.5 88/88] turbostat: Use GCC's CPUID functions to support PIC Luis Henriques
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1391772205-22239-85-git-send-email-luis.henriques@canonical.com \
--to=luis.henriques@canonical.com \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=bhutchings@solarflare.com \
--cc=cl@linux.com \
--cc=gregkh@linuxfoundation.org \
--cc=guillaume@morinfr.org \
--cc=jweiner@redhat.com \
--cc=kernel-team@lists.ubuntu.com \
--cc=khalid.aziz@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mgorman@suse.de \
--cc=minchan@kernel.org \
--cc=pshelar@nicira.com \
--cc=riel@redhat.com \
--cc=stable@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®