From: t_jeang Date: Tue, 6 Jan 2009 12:06:02 +0000 (+0000) Subject: imported patch netback-defensive.patch X-Git-Tag: netback-linearise-skbs X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=0e7608495197e2bcaf317b225c9cc4dc9b008ca3;p=xenclient%2Fkernel.git imported patch netback-defensive.patch --- diff --git a/drivers/xen/netback/netback.c b/drivers/xen/netback/netback.c index c853fd40..c91849d9 100644 --- a/drivers/xen/netback/netback.c +++ b/drivers/xen/netback/netback.c @@ -89,15 +89,17 @@ static inline unsigned long idx_to_kaddr(unsigned int idx) return (unsigned long)pfn_to_kaddr(idx_to_pfn(idx)); } -/* extra field used in struct page */ +/* we use an extra field in struct page to map pages to pending reqs */ +#define NETIF_INDEX_MASK 0xABCD0000UL /* magic sanity check value */ static inline void netif_set_page_index(struct page *pg, unsigned int index) { - *(unsigned long *)&pg->mapping = index; + *(unsigned long *)&pg->mapping = index | NETIF_INDEX_MASK; } static inline int netif_page_index(struct page *pg) { - unsigned long idx = (unsigned long)pg->mapping; + unsigned long val = (unsigned long)pg->mapping; + unsigned long idx = val & ~NETIF_INDEX_MASK; if (!PageForeign(pg)) return -1; @@ -105,6 +107,19 @@ static inline int netif_page_index(struct page *pg) if ((idx >= MAX_PENDING_REQS) || (mmap_pages[idx] != pg)) return -1; + if (unlikely((val & NETIF_INDEX_MASK) != NETIF_INDEX_MASK)) { + printk(KERN_ERR "apparent netback page %p doesn't have NETIF_INDEX_MASK magic: %lx, dtor %#lx\n", + pg, val, pg->index); + printk(KERN_ERR "-- page flags are %lx - %s; %s; %s\n", + pg->flags, + PageForeign(pg) ? "FOREIGN" : "not-foreign", + PageNetback(pg) ? "NETBACK" : "not-netback", + PageBlkback(pg) ? "BLKBACK" : "not-blkback"); + printk(KERN_ERR "-- page flags are %lx\n", pg->flags); + printk(KERN_ERR "-- page count is %d\n", page_count(pg)); + BUG(); + } + return idx; }