]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.xen/xen-netback-notify-multi
Updated xen patches taken from suse.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.xen / xen-netback-notify-multi
1 From: jbeulich@novell.com
2 Subject: netback: use multicall for send multiple notifications
3 Patch-mainline: obsolete
4
5 This also does a small fairness improvement since now notifications
6 get sent in the order requests came in rather than in the inverse one.
7
8 --- sle11-2009-03-24.orig/drivers/xen/core/evtchn.c 2009-03-31 13:36:56.000000000 +0200
9 +++ sle11-2009-03-24/drivers/xen/core/evtchn.c 2009-03-31 13:37:08.000000000 +0200
10 @@ -1294,6 +1294,21 @@ void notify_remote_via_irq(int irq)
11 }
12 EXPORT_SYMBOL_GPL(notify_remote_via_irq);
13
14 +int multi_notify_remote_via_irq(multicall_entry_t *mcl, int irq)
15 +{
16 + int evtchn = evtchn_from_irq(irq);
17 +
18 + BUG_ON(type_from_irq(irq) == IRQT_VIRQ);
19 + BUG_IF_IPI(irq);
20 +
21 + if (!VALID_EVTCHN(evtchn))
22 + return -EINVAL;
23 +
24 + multi_notify_remote_via_evtchn(mcl, evtchn);
25 + return 0;
26 +}
27 +EXPORT_SYMBOL_GPL(multi_notify_remote_via_irq);
28 +
29 int irq_to_evtchn_port(int irq)
30 {
31 BUG_IF_VIRQ_PER_CPU(irq);
32 --- sle11-2009-03-24.orig/drivers/xen/netback/netback.c 2008-12-23 09:35:42.000000000 +0100
33 +++ sle11-2009-03-24/drivers/xen/netback/netback.c 2008-12-23 09:35:48.000000000 +0100
34 @@ -748,10 +748,20 @@ static void net_rx_action(unsigned long
35 npo.meta_cons += nr_frags + 1;
36 }
37
38 - while (notify_nr != 0) {
39 - irq = notify_list[--notify_nr];
40 + if (notify_nr == 1) {
41 + irq = *notify_list;
42 __clear_bit(irq, rx_notify);
43 notify_remote_via_irq(irq + DYNIRQ_BASE);
44 + } else {
45 + for (count = ret = 0; ret < notify_nr; ++ret) {
46 + irq = notify_list[ret];
47 + __clear_bit(irq, rx_notify);
48 + if (!multi_notify_remote_via_irq(rx_mcl + count,
49 + irq + DYNIRQ_BASE))
50 + ++count;
51 + }
52 + if (HYPERVISOR_multicall(rx_mcl, count))
53 + BUG();
54 }
55
56 /* More work to do? */
57 --- sle11-2009-03-24.orig/include/xen/evtchn.h 2009-03-04 11:38:25.000000000 +0100
58 +++ sle11-2009-03-24/include/xen/evtchn.h 2008-12-01 12:10:27.000000000 +0100
59 @@ -179,6 +179,18 @@ static inline void notify_remote_via_evt
60 VOID(HYPERVISOR_event_channel_op(EVTCHNOP_send, &send));
61 }
62
63 +static inline void
64 +multi_notify_remote_via_evtchn(multicall_entry_t *mcl, int port)
65 +{
66 + struct evtchn_send *send = (void *)(mcl->args + 2);
67 +
68 + BUILD_BUG_ON(sizeof(*send) > sizeof(mcl->args) - 2 * sizeof(*mcl->args));
69 + send->port = port;
70 + mcl->op = __HYPERVISOR_event_channel_op;
71 + mcl->args[0] = EVTCHNOP_send;
72 + mcl->args[1] = (unsigned long)send;
73 +}
74 +
75 /* Clear an irq's pending state, in preparation for polling on it. */
76 void xen_clear_irq_pending(int irq);
77
78 @@ -197,6 +209,7 @@ void xen_poll_irq(int irq);
79 * by bind_*_to_irqhandler().
80 */
81 void notify_remote_via_irq(int irq);
82 +int multi_notify_remote_via_irq(multicall_entry_t *, int irq);
83 int irq_to_evtchn_port(int irq);
84
85 #define PIRQ_SET_MAPPING 0x0