jintack

io latency patch on Xen x86

Nov 12th, 2015
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.65 KB | None | 0 0
  1. diff --git a/drivers/simple/xen-simpleback/simpleback.c b/drivers/simple/xen-simpleback/simpleback.c
  2. index 86d36d6..93acc07 100644
  3. --- a/drivers/simple/xen-simpleback/simpleback.c
  4. +++ b/drivers/simple/xen-simpleback/simpleback.c
  5. @@ -49,21 +49,49 @@ static void simpleif_notify_work(struct xen_simpleif *simpleif)
  6. //if (notify)
  7. }
  8. */
  9. -
  10. -static __always_inline volatile unsigned long read_cc(void)
  11. +static __always_inline volatile unsigned long read_cc_before(void)
  12. {
  13. unsigned long cc;
  14. #ifdef CONFIG_ARM64
  15. isb();
  16. - //asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
  17. - asm volatile("mrs %0, CNTPCT_EL0" : "=r" (cc) ::);
  18. + asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
  19. isb();
  20. -#else
  21. +#elif defined(CONFIG_ARM)
  22. asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
  23. +#elif defined(CONFIG_X86_64)
  24. + asm volatile ("CPUID\n\t"::: "%rax", "%rbx", "%rcx", "%rdx");
  25. + asm volatile ( "RDTSC\n\t"
  26. + "shl $0x20, %%rdx\n\t"
  27. + "or %%rax, %%rdx\n\t"
  28. + "mov %%rdx, %0\n\t"
  29. + : "=r" (cc)
  30. + :: "%rax", "%rbx", "%rcx", "%rdx");
  31. #endif
  32. return cc;
  33. }
  34.  
  35. +static __always_inline volatile unsigned long read_cc_after(void)
  36. +{
  37. + unsigned long cc;
  38. +#ifdef CONFIG_ARM64
  39. + isb();
  40. + asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
  41. + isb();
  42. +#elif defined(CONFIG_ARM)
  43. + asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
  44. +#elif defined(CONFIG_X86_64)
  45. + asm volatile (
  46. + "mov %%cr0, %%rax\n\t"
  47. + "mov %%rax, %%cr0\n\t"
  48. + "RDTSC\n\t"
  49. + "shl $0x20, %%rdx\n\t"
  50. + "or %%rax, %%rdx\n\t"
  51. + "mov %%rdx, %0\n\t"
  52. + : "=r" (cc)
  53. + :: "%rax", "%rdx");
  54. +#endif
  55. + return cc;
  56. +}
  57.  
  58. irqreturn_t xen_simpleif_be_int(int irq, void *dev_id)
  59. {
  60. @@ -83,7 +111,8 @@ irqreturn_t xen_simpleif_be_int(int irq, void *dev_id)
  61. cc = read_cc();
  62. */
  63.  
  64. - notify_remote_via_irq(simpleif->irq);
  65. + if (simpleif->irq != 0)
  66. + notify_remote_via_irq(simpleif->irq);
  67. // HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
  68. return IRQ_HANDLED;
  69. }
  70. diff --git a/drivers/simple/xen-simplefront.c b/drivers/simple/xen-simplefront.c
  71. index 2a3f811..bc7b46f 100644
  72. --- a/drivers/simple/xen-simplefront.c
  73. +++ b/drivers/simple/xen-simplefront.c
  74. @@ -26,19 +26,51 @@
  75. #define SIMPLE_RING_SIZE __CONST_RING_SIZE(simpleif, PAGE_SIZE)
  76.  
  77.  
  78. -static __always_inline volatile unsigned long read_cc(void)
  79. +static __always_inline volatile unsigned long read_cc_before(void)
  80. {
  81. - unsigned long cc;
  82. + unsigned long cc;
  83. #ifdef CONFIG_ARM64
  84. - isb();
  85. - asm volatile("mrs %0, CNTPCT_EL0" : "=r" (cc) ::);
  86. - isb();
  87. -#elif CONFIG_ARM
  88. - asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
  89. + isb();
  90. + asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
  91. + isb();
  92. +#elif defined(CONFIG_ARM)
  93. + asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
  94. +#elif defined(CONFIG_X86_64)
  95. + asm volatile ("CPUID\n\t"::: "%rax", "%rbx", "%rcx", "%rdx");
  96. + asm volatile ( "RDTSC\n\t"
  97. + "shl $0x20, %%rdx\n\t"
  98. + "or %%rax, %%rdx\n\t"
  99. + "mov %%rdx, %0\n\t"
  100. + : "=r" (cc)
  101. + :: "%rax", "%rbx", "%rcx", "%rdx");
  102. #endif
  103. - return cc;
  104. + return cc;
  105. }
  106.  
  107. +static __always_inline volatile unsigned long read_cc_after(void)
  108. +{
  109. + unsigned long cc;
  110. +#ifdef CONFIG_ARM64
  111. + isb();
  112. + asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
  113. + isb();
  114. +#elif defined(CONFIG_ARM)
  115. + asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
  116. +#elif defined(CONFIG_X86_64)
  117. + asm volatile (
  118. + "mov %%cr0, %%rax\n\t"
  119. + "mov %%rax, %%cr0\n\t"
  120. + "RDTSC\n\t"
  121. + "shl $0x20, %%rdx\n\t"
  122. + "or %%rax, %%rdx\n\t"
  123. + "mov %%rdx, %0\n\t"
  124. + : "=r" (cc)
  125. + :: "%rax", "%rdx");
  126. +#endif
  127. + return cc;
  128. +}
  129. +
  130. +
  131. unsigned long cc_before;
  132. unsigned long cc_after;
  133.  
  134. @@ -53,12 +85,12 @@ struct simplefront_info
  135. static irqreturn_t simpleif_interrupt(int irq, void *dev_id)
  136. {
  137.  
  138. - cc_after = read_cc();
  139. + cc_after = read_cc_after();
  140. // printk("jintack simple frontend get response from backend\n");
  141. trace_printk("before:\t%lu\tafter:\t%lu\tdiff:\t%lu\n", cc_before, cc_after, cc_after - cc_before);
  142. cc_before = 0;
  143. -/*
  144. -
  145. + /* This is for sending data */
  146. + /*
  147. struct blkfront_info *info = (struct blkfront_info *)dev_id;
  148. RING_IDX i, rp;
  149. int more_to_do;
  150. @@ -83,7 +115,7 @@ static irqreturn_t simpleif_interrupt(int irq, void *dev_id)
  151.  
  152. if (more_to_do)
  153. printk("jintack more_to_do??\n");
  154. -*/
  155. + */
  156. return IRQ_HANDLED;
  157. }
  158.  
  159. @@ -230,7 +262,7 @@ int simpleif_request_dummy(void)
  160. if (cc_before)
  161. trace_printk("cc_before overwrite detected, %ld\n", cc_before);
  162. cc_before = 100; /* make cache hot */
  163. - cc_before = read_cc();
  164. + cc_before = read_cc_before();
  165. notify_remote_via_irq(info->irq);
  166. HYPERVISOR_sched_op(SCHEDOP_block, NULL);
  167. return 0;
Advertisement
Add Comment
Please, Sign In to add comment