Xen bug fixes for 3.15-rc5
- Fix arm64 crash on boot. - Quiet a noisy arm build warning (virt_to_pfn() redefined). -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQEcBAABAgAGBQJTcMoxAAoJEFxbo/MsZsTReiIIAIJByICKcw/CvwUozD4d/h0C xTTcKBRbRMtufhab8WYb/y1eAzuh2azkiUYEphliMQWbPM8Mq5axVsV3MD1lRZjE VgniPsCfXE1w9HsBASfLoXutEzBa2+u+BGTef2E0PEFWUiY3BXv6nHoM3QV1e1VN 5t48DH2xuYiQnX0Hdf/MyMvh++TOXoYuOwD+pozMPNNEox7bD3XTV2XrR4MF9Kf8 Q2qMqttyJXvpafHfm3rJXdoJGLciemYx8XcB4Bz+P+i981iEkOoBwTtYPRDmEobu UGnh1jnzJOOjsBq9SzI+JM7zIvPQ/+ZS59dfEwf8161cWqDKsIWtW8WZpSifTkM= =5zf5 -----END PGP SIGNATURE----- Merge tag 'stable/for-linus-3.15-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip Pull xen bug fixes from David Vrabel: - Fix arm64 crash on boot. - Quiet a noisy arm build warning (virt_to_pfn() redefined). * tag 'stable/for-linus-3.15-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip: arm64: introduce virt_to_pfn xen/events/fifo: correctly align bitops arm/xen: Remove definiition of virt_to_pfn in asm/xen/page.h
This commit is contained in:
commit
619b589190
@ -77,7 +77,6 @@ static inline xpaddr_t machine_to_phys(xmaddr_t machine)
|
|||||||
}
|
}
|
||||||
/* VIRT <-> MACHINE conversion */
|
/* VIRT <-> MACHINE conversion */
|
||||||
#define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v))))
|
#define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v))))
|
||||||
#define virt_to_pfn(v) (PFN_DOWN(__pa(v)))
|
|
||||||
#define virt_to_mfn(v) (pfn_to_mfn(virt_to_pfn(v)))
|
#define virt_to_mfn(v) (pfn_to_mfn(virt_to_pfn(v)))
|
||||||
#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT))
|
#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT))
|
||||||
|
|
||||||
|
@ -138,6 +138,7 @@ static inline void *phys_to_virt(phys_addr_t x)
|
|||||||
#define __pa(x) __virt_to_phys((unsigned long)(x))
|
#define __pa(x) __virt_to_phys((unsigned long)(x))
|
||||||
#define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x)))
|
#define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x)))
|
||||||
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
||||||
|
#define virt_to_pfn(x) __phys_to_pfn(__virt_to_phys(x))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* virt_to_page(k) convert a _valid_ virtual address to struct page *
|
* virt_to_page(k) convert a _valid_ virtual address to struct page *
|
||||||
|
@ -66,7 +66,22 @@ static DEFINE_PER_CPU(struct evtchn_fifo_queue, cpu_queue);
|
|||||||
static event_word_t *event_array[MAX_EVENT_ARRAY_PAGES] __read_mostly;
|
static event_word_t *event_array[MAX_EVENT_ARRAY_PAGES] __read_mostly;
|
||||||
static unsigned event_array_pages __read_mostly;
|
static unsigned event_array_pages __read_mostly;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sync_set_bit() and friends must be unsigned long aligned on non-x86
|
||||||
|
* platforms.
|
||||||
|
*/
|
||||||
|
#if !defined(CONFIG_X86) && BITS_PER_LONG > 32
|
||||||
|
|
||||||
|
#define BM(w) (unsigned long *)((unsigned long)w & ~0x7UL)
|
||||||
|
#define EVTCHN_FIFO_BIT(b, w) \
|
||||||
|
(((unsigned long)w & 0x4UL) ? (EVTCHN_FIFO_ ##b + 32) : EVTCHN_FIFO_ ##b)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#define BM(w) ((unsigned long *)(w))
|
#define BM(w) ((unsigned long *)(w))
|
||||||
|
#define EVTCHN_FIFO_BIT(b, w) EVTCHN_FIFO_ ##b
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline event_word_t *event_word_from_port(unsigned port)
|
static inline event_word_t *event_word_from_port(unsigned port)
|
||||||
{
|
{
|
||||||
@ -161,33 +176,38 @@ static void evtchn_fifo_bind_to_cpu(struct irq_info *info, unsigned cpu)
|
|||||||
static void evtchn_fifo_clear_pending(unsigned port)
|
static void evtchn_fifo_clear_pending(unsigned port)
|
||||||
{
|
{
|
||||||
event_word_t *word = event_word_from_port(port);
|
event_word_t *word = event_word_from_port(port);
|
||||||
sync_clear_bit(EVTCHN_FIFO_PENDING, BM(word));
|
sync_clear_bit(EVTCHN_FIFO_BIT(PENDING, word), BM(word));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void evtchn_fifo_set_pending(unsigned port)
|
static void evtchn_fifo_set_pending(unsigned port)
|
||||||
{
|
{
|
||||||
event_word_t *word = event_word_from_port(port);
|
event_word_t *word = event_word_from_port(port);
|
||||||
sync_set_bit(EVTCHN_FIFO_PENDING, BM(word));
|
sync_set_bit(EVTCHN_FIFO_BIT(PENDING, word), BM(word));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool evtchn_fifo_is_pending(unsigned port)
|
static bool evtchn_fifo_is_pending(unsigned port)
|
||||||
{
|
{
|
||||||
event_word_t *word = event_word_from_port(port);
|
event_word_t *word = event_word_from_port(port);
|
||||||
return sync_test_bit(EVTCHN_FIFO_PENDING, BM(word));
|
return sync_test_bit(EVTCHN_FIFO_BIT(PENDING, word), BM(word));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool evtchn_fifo_test_and_set_mask(unsigned port)
|
static bool evtchn_fifo_test_and_set_mask(unsigned port)
|
||||||
{
|
{
|
||||||
event_word_t *word = event_word_from_port(port);
|
event_word_t *word = event_word_from_port(port);
|
||||||
return sync_test_and_set_bit(EVTCHN_FIFO_MASKED, BM(word));
|
return sync_test_and_set_bit(EVTCHN_FIFO_BIT(MASKED, word), BM(word));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void evtchn_fifo_mask(unsigned port)
|
static void evtchn_fifo_mask(unsigned port)
|
||||||
{
|
{
|
||||||
event_word_t *word = event_word_from_port(port);
|
event_word_t *word = event_word_from_port(port);
|
||||||
sync_set_bit(EVTCHN_FIFO_MASKED, BM(word));
|
sync_set_bit(EVTCHN_FIFO_BIT(MASKED, word), BM(word));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool evtchn_fifo_is_masked(unsigned port)
|
||||||
|
{
|
||||||
|
event_word_t *word = event_word_from_port(port);
|
||||||
|
return sync_test_bit(EVTCHN_FIFO_BIT(MASKED, word), BM(word));
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Clear MASKED, spinning if BUSY is set.
|
* Clear MASKED, spinning if BUSY is set.
|
||||||
*/
|
*/
|
||||||
@ -211,7 +231,7 @@ static void evtchn_fifo_unmask(unsigned port)
|
|||||||
BUG_ON(!irqs_disabled());
|
BUG_ON(!irqs_disabled());
|
||||||
|
|
||||||
clear_masked(word);
|
clear_masked(word);
|
||||||
if (sync_test_bit(EVTCHN_FIFO_PENDING, BM(word))) {
|
if (evtchn_fifo_is_pending(port)) {
|
||||||
struct evtchn_unmask unmask = { .port = port };
|
struct evtchn_unmask unmask = { .port = port };
|
||||||
(void)HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask);
|
(void)HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask);
|
||||||
}
|
}
|
||||||
@ -243,7 +263,7 @@ static void handle_irq_for_port(unsigned port)
|
|||||||
|
|
||||||
static void consume_one_event(unsigned cpu,
|
static void consume_one_event(unsigned cpu,
|
||||||
struct evtchn_fifo_control_block *control_block,
|
struct evtchn_fifo_control_block *control_block,
|
||||||
unsigned priority, uint32_t *ready)
|
unsigned priority, unsigned long *ready)
|
||||||
{
|
{
|
||||||
struct evtchn_fifo_queue *q = &per_cpu(cpu_queue, cpu);
|
struct evtchn_fifo_queue *q = &per_cpu(cpu_queue, cpu);
|
||||||
uint32_t head;
|
uint32_t head;
|
||||||
@ -273,10 +293,9 @@ static void consume_one_event(unsigned cpu,
|
|||||||
* copy of the ready word.
|
* copy of the ready word.
|
||||||
*/
|
*/
|
||||||
if (head == 0)
|
if (head == 0)
|
||||||
clear_bit(priority, BM(ready));
|
clear_bit(priority, ready);
|
||||||
|
|
||||||
if (sync_test_bit(EVTCHN_FIFO_PENDING, BM(word))
|
if (evtchn_fifo_is_pending(port) && !evtchn_fifo_is_masked(port))
|
||||||
&& !sync_test_bit(EVTCHN_FIFO_MASKED, BM(word)))
|
|
||||||
handle_irq_for_port(port);
|
handle_irq_for_port(port);
|
||||||
|
|
||||||
q->head[priority] = head;
|
q->head[priority] = head;
|
||||||
@ -285,7 +304,7 @@ static void consume_one_event(unsigned cpu,
|
|||||||
static void evtchn_fifo_handle_events(unsigned cpu)
|
static void evtchn_fifo_handle_events(unsigned cpu)
|
||||||
{
|
{
|
||||||
struct evtchn_fifo_control_block *control_block;
|
struct evtchn_fifo_control_block *control_block;
|
||||||
uint32_t ready;
|
unsigned long ready;
|
||||||
unsigned q;
|
unsigned q;
|
||||||
|
|
||||||
control_block = per_cpu(cpu_control_block, cpu);
|
control_block = per_cpu(cpu_control_block, cpu);
|
||||||
|
Loading…
Reference in New Issue
Block a user