Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Dump of assembler code for function bucket_enqueue_single:
- /export/dpdk.org/build/include/rte_lcore.h:
- 72 rte_lcore_id(void)
- 73 {
- 74 return RTE_PER_LCORE(_lcore_id);
- 0x000000000068cdc0 <+0>: 02 08 40 f9 ldr x2, [x0, #16]
- 0x000000000068cdc4 <+4>: 44 d0 3b d5 mrs x4, tpidr_el0
- 0x000000000068cdc8 <+8>: 43 26 00 90 adrp x3, 0xb54000
- 0x000000000068cdcc <+12>: 63 f4 45 f9 ldr x3, [x3, #3048]
- 0x000000000068cdd0 <+16>: 22 00 02 8a and x2, x1, x2
- 0x000000000068cdd4 <+20>: 84 68 63 b8 ldr w4, [x4, x3]
- /export/dpdk.org/drivers/mempool/bucket/rte_mempool_bucket.c:
- 111 if (likely(hdr->lcore_id == lcore_id)) {
- 0x000000000068cdd8 <+24>: 43 00 40 b9 ldr w3, [x2]
- 0x000000000068cddc <+28>: 7f 00 04 6b cmp w3, w4
- 0x000000000068cde0 <+32>: 81 02 00 54 b.ne 0x68ce30 <bucket_enqueue_single+112> // b.any
- 112 if (hdr->fill_cnt < bd->obj_per_bucket - 1) {
- 0x000000000068cde4 <+36>: 01 08 40 b9 ldr w1, [x0, #8]
- 0x000000000068cde8 <+40>: 44 10 40 39 ldrb w4, [x2, #4]
- 0x000000000068cdec <+44>: 21 04 00 51 sub w1, w1, #0x1
- 0x000000000068cdf0 <+48>: 9f 00 01 6b cmp w4, w1
- 0x000000000068cdf4 <+52>: a2 00 00 54 b.cs 0x68ce08 <bucket_enqueue_single+72> // b.hs, b.nlast
- 113 hdr->fill_cnt++;
- 0x000000000068cdf8 <+56>: 84 04 00 11 add w4, w4, #0x1
- 0x000000000068cdfc <+60>: 00 00 80 52 mov w0, #0x0 // #0
- 0x000000000068ce00 <+64>: 44 10 00 39 strb w4, [x2, #4]
- 0x000000000068ce04 <+68>: c0 03 5f d6 ret
- 114 } else {
- 115 hdr->fill_cnt = 0;
- 0x000000000068ce08 <+72>: 03 4c 23 8b add x3, x0, w3, uxtw #3
- 0x000000000068ce0c <+76>: 5f 10 00 39 strb wzr, [x2, #4]
- 116 /* Stack is big enough to put all buckets */
- 117 bucket_stack_push(bd->buckets[lcore_id], hdr);
- 0x000000000068ce10 <+80>: 00 00 80 52 mov w0, #0x0 // #0
- 0x000000000068ce14 <+84>: 63 10 40 f9 ldr x3, [x3, #32]
- 82 stack->objects[stack->top++] = obj;
- 0x000000000068ce18 <+88>: 61 00 40 b9 ldr w1, [x3]
- 0x000000000068ce1c <+92>: 24 04 00 11 add w4, w1, #0x1
- 0x000000000068ce20 <+96>: 64 00 00 b9 str w4, [x3]
- 0x000000000068ce24 <+100>: 61 4c 21 8b add x1, x3, w1, uxtw #3
- 0x000000000068ce28 <+104>: 22 04 00 f9 str x2, [x1, #8]
- 0x000000000068ce2c <+108>: c0 03 5f d6 ret
- 118 }
- 119 } else if (hdr->lcore_id != LCORE_ID_ANY) {
- 0x000000000068ce30 <+112>: 7f 04 00 31 cmn w3, #0x1
- 0x000000000068ce34 <+116>: 61 05 00 54 b.ne 0x68cee0 <bucket_enqueue_single+288> // b.any
- 121 bd->adoption_buffer_rings[hdr->lcore_id];
- 122
- 123 rc = rte_ring_enqueue(adopt_ring, obj);
- 124 /* Ring is big enough to put all objects */
- 125 RTE_ASSERT(rc == 0);
- 126 } else if (hdr->fill_cnt < bd->obj_per_bucket - 1) {
- 0x000000000068ce38 <+120>: 03 08 40 b9 ldr w3, [x0, #8]
- 0x000000000068ce3c <+124>: 41 10 40 39 ldrb w1, [x2, #4]
- 0x000000000068ce40 <+128>: 63 04 00 51 sub w3, w3, #0x1
- 0x000000000068ce44 <+132>: 3f 00 03 6b cmp w1, w3
- 0x000000000068ce48 <+136>: a2 00 00 54 b.cs 0x68ce5c <bucket_enqueue_single+156> // b.hs, b.nlast
- 127 hdr->fill_cnt++;
- 0x000000000068ce4c <+140>: 21 04 00 11 add w1, w1, #0x1
- 0x000000000068ce50 <+144>: 00 00 80 52 mov w0, #0x0 // #0
- 0x000000000068ce54 <+148>: 41 10 00 39 strb w1, [x2, #4]
- 0x000000000068ce58 <+152>: c0 03 5f d6 ret
- 128 } else {
- 129 hdr->fill_cnt = 0;
- 0x000000000068ce5c <+156>: 5f 10 00 39 strb wzr, [x2, #4]
- 130 rc = rte_ring_enqueue(bd->shared_bucket_ring, hdr);
- 0x000000000068ce60 <+160>: 00 0c 40 f9 ldr x0, [x0, #24]
- /export/dpdk.org/build/include/rte_ring.h:
- 532 return rte_ring_enqueue_bulk(r, &obj, 1, NULL) ? 0 : -ENOBUFS;
- 0x000000000068ce64 <+164>: 05 00 04 91 add x5, x0, #0x100
- 0x000000000068ce68 <+168>: 03 38 40 b9 ldr w3, [x0, #56]
- 0x000000000068ce6c <+172>: 04 08 41 b9 ldr w4, [x0, #264]
- /export/dpdk.org/build/include/rte_ring_c11_mem.h:
- 64 *old_head = __atomic_load_n(&r->prod.head, __ATOMIC_ACQUIRE);
- 0x000000000068ce70 <+176>: a1 fc df 88 ldar w1, [x5]
- 0x000000000068ce74 <+180>: a4 09 00 34 cbz w4, 0x68cfa8 <bucket_enqueue_single+488>
- 65 do {
- 66 /* Reset n to the initial burst count */
- 67 n = max;
- 68
- 69 /* load-acquire synchronize with store-release of ht->tail
- 70 * in update_tail.
- 71 */
- 72 const uint32_t cons_tail = __atomic_load_n(&r->cons.tail,
- 0x000000000068ce78 <+184>: 05 10 08 91 add x5, x0, #0x204
- 0x000000000068ce7c <+188>: a5 fc df 88 ldar w5, [x5]
- 73 __ATOMIC_ACQUIRE);
- 74
- 75 /* The subtraction is done between two unsigned 32bits value
- 76 * (the result is always modulo 32 bits even if we have
- 77 * *old_head > cons_tail). So 'free_entries' is always between 0
- 78 * and capacity (which is < size).
- 79 */
- 80 *free_entries = (capacity + cons_tail - *old_head);
- 81
- 82 /* check that we have enough room in ring */
- 83 if (unlikely(n > *free_entries))
- 0x000000000068ce80 <+192>: 63 00 05 0b add w3, w3, w5
- 0x000000000068ce84 <+196>: 3f 00 03 6b cmp w1, w3
- 0x000000000068ce88 <+200>: c0 08 00 54 b.eq 0x68cfa0 <bucket_enqueue_single+480> // b.none
- 84 n = (behavior == RTE_RING_QUEUE_FIXED) ?
- 85 0 : *free_entries;
- 86
- 87 if (n == 0)
- 88 return 0;
- 89
- 90 *new_head = *old_head + n;
- 0x000000000068ce8c <+204>: 26 04 00 11 add w6, w1, #0x1
- 91 if (is_sp)
- 92 r->prod.head = *new_head, success = 1;
- 0x000000000068ce90 <+208>: 06 00 01 b9 str w6, [x0, #256]
- /export/dpdk.org/build/include/rte_ring.h:
- 349 ENQUEUE_PTRS(r, &r[1], prod_head, obj_table, n, void *);
- 0x000000000068ce94 <+212>: 05 0c 46 29 ldp w5, w3, [x0, #48]
- 0x000000000068ce98 <+216>: 07 00 0c 91 add x7, x0, #0x300
- 0x000000000068ce9c <+220>: 23 00 03 0a and w3, w1, w3
- 0x000000000068cea0 <+224>: 68 04 00 11 add w8, w3, #0x1
- 0x000000000068cea4 <+228>: bf 00 08 6b cmp w5, w8
- 0x000000000068cea8 <+232>: 49 01 00 54 b.ls 0x68ced0 <bucket_enqueue_single+272> // b.plast
- 0x000000000068ceac <+236>: e2 58 23 f8 str x2, [x7, w3, uxtw #3]
- /export/dpdk.org/build/include/rte_ring_c11_mem.h:
- 23 if (!single)
- 0x000000000068ceb0 <+240>: 00 10 04 91 add x0, x0, #0x104
- 0x000000000068ceb4 <+244>: 84 00 00 35 cbnz w4, 0x68cec4 <bucket_enqueue_single+260>
- 0x000000000068ceb8 <+248>: 02 00 40 b9 ldr w2, [x0]
- 0x000000000068cebc <+252>: 3f 00 02 6b cmp w1, w2
- 0x000000000068cec0 <+256>: 01 09 00 54 b.ne 0x68cfe0 <bucket_enqueue_single+544> // b.any
- 24 while (unlikely(old_val != __atomic_load_n(&ht->tail,
- 25 __ATOMIC_RELAXED)))
- 26 rte_pause();
- 27
- 28 __atomic_store_n(&ht->tail, new_val, __ATOMIC_RELEASE);
- 0x000000000068cec4 <+260>: 06 fc 9f 88 stlr w6, [x0]
- /export/dpdk.org/build/include/rte_ring.h:
- 355 return n;
- 0x000000000068cec8 <+264>: 00 00 80 52 mov w0, #0x0 // #0
- 0x000000000068cecc <+268>: c0 03 5f d6 ret
- 0x000000000068ced0 <+272>: bf 00 03 6b cmp w5, w3
- 0x000000000068ced4 <+276>: c8 fe ff 54 b.hi 0x68ceac <bucket_enqueue_single+236> // b.pmore
- 349 ENQUEUE_PTRS(r, &r[1], prod_head, obj_table, n, void *);
- 0x000000000068ced8 <+280>: 02 80 01 f9 str x2, [x0, #768]
- 0x000000000068cedc <+284>: f5 ff ff 17 b 0x68ceb0 <bucket_enqueue_single+240>
- /export/dpdk.org/drivers/mempool/bucket/rte_mempool_bucket.c:
- 120 struct rte_ring *adopt_ring =
- 0x000000000068cee0 <+288>: 03 4c 23 8b add x3, x0, w3, uxtw #3
- 0x000000000068cee4 <+292>: 60 10 42 f9 ldr x0, [x3, #1056]
- /export/dpdk.org/build/include/rte_ring.h:
- 532 return rte_ring_enqueue_bulk(r, &obj, 1, NULL) ? 0 : -ENOBUFS;
- 0x000000000068cee8 <+296>: 05 00 04 91 add x5, x0, #0x100
- 0x000000000068ceec <+300>: 03 38 40 b9 ldr w3, [x0, #56]
- 0x000000000068cef0 <+304>: 04 08 41 b9 ldr w4, [x0, #264]
- /export/dpdk.org/build/include/rte_ring_c11_mem.h:
- 64 *old_head = __atomic_load_n(&r->prod.head, __ATOMIC_ACQUIRE);
- 0x000000000068cef4 <+308>: a2 fc df 88 ldar w2, [x5]
- 0x000000000068cef8 <+312>: 07 10 08 91 add x7, x0, #0x204
- 0x000000000068cefc <+316>: 84 03 00 34 cbz w4, 0x68cf6c <bucket_enqueue_single+428>
- 65 do {
- 66 /* Reset n to the initial burst count */
- 67 n = max;
- 68
- 69 /* load-acquire synchronize with store-release of ht->tail
- 70 * in update_tail.
- 71 */
- 72 const uint32_t cons_tail = __atomic_load_n(&r->cons.tail,
- 0x000000000068cf00 <+320>: e5 fc df 88 ldar w5, [x7]
- 73 __ATOMIC_ACQUIRE);
- 74
- 75 /* The subtraction is done between two unsigned 32bits value
- 76 * (the result is always modulo 32 bits even if we have
- 77 * *old_head > cons_tail). So 'free_entries' is always between 0
- 78 * and capacity (which is < size).
- 79 */
- 80 *free_entries = (capacity + cons_tail - *old_head);
- 81
- 82 /* check that we have enough room in ring */
- 83 if (unlikely(n > *free_entries))
- 0x000000000068cf04 <+324>: 63 00 05 0b add w3, w3, w5
- 0x000000000068cf08 <+328>: 5f 00 03 6b cmp w2, w3
- 0x000000000068cf0c <+332>: a0 04 00 54 b.eq 0x68cfa0 <bucket_enqueue_single+480> // b.none
- 84 n = (behavior == RTE_RING_QUEUE_FIXED) ?
- 85 0 : *free_entries;
- 86
- 87 if (n == 0)
- 88 return 0;
- 89
- 90 *new_head = *old_head + n;
- 0x000000000068cf10 <+336>: 46 04 00 11 add w6, w2, #0x1
- 91 if (is_sp)
- 92 r->prod.head = *new_head, success = 1;
- 0x000000000068cf14 <+340>: 06 00 01 b9 str w6, [x0, #256]
- /export/dpdk.org/build/include/rte_ring.h:
- 349 ENQUEUE_PTRS(r, &r[1], prod_head, obj_table, n, void *);
- 0x000000000068cf18 <+344>: 05 0c 46 29 ldp w5, w3, [x0, #48]
- 0x000000000068cf1c <+348>: 08 00 0c 91 add x8, x0, #0x300
- 0x000000000068cf20 <+352>: 43 00 03 0a and w3, w2, w3
- 0x000000000068cf24 <+356>: 67 04 00 11 add w7, w3, #0x1
- 0x000000000068cf28 <+360>: bf 00 07 6b cmp w5, w7
- 0x000000000068cf2c <+364>: 89 01 00 54 b.ls 0x68cf5c <bucket_enqueue_single+412> // b.plast
- 0x000000000068cf30 <+368>: 01 59 23 f8 str x1, [x8, w3, uxtw #3]
- /export/dpdk.org/build/include/rte_ring_c11_mem.h:
- 23 if (!single)
- 0x000000000068cf34 <+372>: 00 10 04 91 add x0, x0, #0x104
- 0x000000000068cf38 <+376>: 64 fc ff 35 cbnz w4, 0x68cec4 <bucket_enqueue_single+260>
- 0x000000000068cf3c <+380>: 01 00 40 b9 ldr w1, [x0]
- 0x000000000068cf40 <+384>: 3f 00 02 6b cmp w1, w2
- 0x000000000068cf44 <+388>: 00 fc ff 54 b.eq 0x68cec4 <bucket_enqueue_single+260> // b.none
- /export/dpdk.org/build/include/rte_pause_64.h:
- 17 asm volatile("yield" ::: "memory");
- 0x000000000068cf48 <+392>: 3f 20 03 d5 yield
- 0x000000000068cf4c <+396>: 01 00 40 b9 ldr w1, [x0]
- 0x000000000068cf50 <+400>: 3f 00 02 6b cmp w1, w2
- 0x000000000068cf54 <+404>: 80 fb ff 54 b.eq 0x68cec4 <bucket_enqueue_single+260> // b.none
- 0x000000000068cf58 <+408>: fc ff ff 17 b 0x68cf48 <bucket_enqueue_single+392>
- 0x000000000068cf5c <+412>: bf 00 03 6b cmp w5, w3
- 0x000000000068cf60 <+416>: 88 fe ff 54 b.hi 0x68cf30 <bucket_enqueue_single+368> // b.pmore
- 0x000000000068cf64 <+420>: 01 80 01 f9 str x1, [x0, #768]
- 0x000000000068cf68 <+424>: f3 ff ff 17 b 0x68cf34 <bucket_enqueue_single+372>
- 0x000000000068cf6c <+428>: e8 fc df 88 ldar w8, [x7]
- 0x000000000068cf70 <+432>: 68 00 08 0b add w8, w3, w8
- 0x000000000068cf74 <+436>: 46 04 00 11 add w6, w2, #0x1
- 0x000000000068cf78 <+440>: 5f 00 08 6b cmp w2, w8
- 0x000000000068cf7c <+444>: 20 01 00 54 b.eq 0x68cfa0 <bucket_enqueue_single+480> // b.none
- 0x000000000068cf80 <+448>: a8 fc 5f 88 ldaxr w8, [x5]
- 0x000000000068cf84 <+452>: 1f 01 02 6b cmp w8, w2
- 0x000000000068cf88 <+456>: 61 00 00 54 b.ne 0x68cf94 <bucket_enqueue_single+468> // b.any
- 0x000000000068cf8c <+460>: a6 7c 09 88 stxr w9, w6, [x5]
- 0x000000000068cf90 <+464>: 89 ff ff 35 cbnz w9, 0x68cf80 <bucket_enqueue_single+448>
- 0x000000000068cf94 <+468>: e2 03 08 2a mov w2, w8
- 0x000000000068cf98 <+472>: 00 fc ff 54 b.eq 0x68cf18 <bucket_enqueue_single+344> // b.none
- 0x000000000068cf9c <+476>: f4 ff ff 17 b 0x68cf6c <bucket_enqueue_single+428>
- 0x000000000068cfa0 <+480>: 00 0d 80 12 mov w0, #0xffffff97 // #-105
- 0x000000000068cfa4 <+484>: c0 03 5f d6 ret
- 0x000000000068cfa8 <+488>: 08 10 08 91 add x8, x0, #0x204
- 0x000000000068cfac <+492>: 07 fd df 88 ldar w7, [x8]
- 0x000000000068cfb0 <+496>: 67 00 07 0b add w7, w3, w7
- 0x000000000068cfb4 <+500>: 26 04 00 11 add w6, w1, #0x1
- 0x000000000068cfb8 <+504>: 3f 00 07 6b cmp w1, w7
- 0x000000000068cfbc <+508>: 20 ff ff 54 b.eq 0x68cfa0 <bucket_enqueue_single+480> // b.none
- 0x000000000068cfc0 <+512>: a7 fc 5f 88 ldaxr w7, [x5]
- 0x000000000068cfc4 <+516>: ff 00 01 6b cmp w7, w1
- 0x000000000068cfc8 <+520>: 61 00 00 54 b.ne 0x68cfd4 <bucket_enqueue_single+532> // b.any
- 0x000000000068cfcc <+524>: a6 7c 09 88 stxr w9, w6, [x5]
- 0x000000000068cfd0 <+528>: 89 ff ff 35 cbnz w9, 0x68cfc0 <bucket_enqueue_single+512>
- 0x000000000068cfd4 <+532>: e1 03 07 2a mov w1, w7
- 0x000000000068cfd8 <+536>: e0 f5 ff 54 b.eq 0x68ce94 <bucket_enqueue_single+212> // b.none
- 0x000000000068cfdc <+540>: f4 ff ff 17 b 0x68cfac <bucket_enqueue_single+492>
- 0x000000000068cfe0 <+544>: 3f 20 03 d5 yield
- 0x000000000068cfe4 <+548>: b5 ff ff 17 b 0x68ceb8 <bucket_enqueue_single+248>
- End of assembler dump.
Add Comment
Please, Sign In to add comment