drbd_tracing.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. /*
  2. drbd_tracing.c
  3. This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
  4. Copyright (C) 2003-2008, LINBIT Information Technologies GmbH.
  5. Copyright (C) 2003-2008, Philipp Reisner <philipp.reisner@linbit.com>.
  6. Copyright (C) 2003-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
  7. drbd is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2, or (at your option)
  10. any later version.
  11. drbd is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with drbd; see the file COPYING. If not, write to
  17. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <linux/module.h>
  20. #include <linux/drbd.h>
  21. #include <linux/ctype.h>
  22. #include "drbd_int.h"
  23. #include "drbd_tracing.h"
  24. #include <linux/drbd_tag_magic.h>
  25. MODULE_LICENSE("GPL");
  26. MODULE_AUTHOR("Philipp Reisner, Lars Ellenberg");
  27. MODULE_DESCRIPTION("DRBD tracepoint probes");
  28. MODULE_PARM_DESC(trace_mask, "Bitmap of events to trace see drbd_tracing.c");
  29. MODULE_PARM_DESC(trace_level, "Current tracing level (changeable in /sys)");
  30. MODULE_PARM_DESC(trace_devs, "Bitmap of devices to trace (changeable in /sys)");
  31. unsigned int trace_mask = 0; /* Bitmap of events to trace */
  32. int trace_level; /* Current trace level */
  33. int trace_devs; /* Bitmap of devices to trace */
  34. module_param(trace_mask, uint, 0444);
  35. module_param(trace_level, int, 0644);
  36. module_param(trace_devs, int, 0644);
  37. enum {
  38. TRACE_PACKET = 0x0001,
  39. TRACE_RQ = 0x0002,
  40. TRACE_UUID = 0x0004,
  41. TRACE_RESYNC = 0x0008,
  42. TRACE_EE = 0x0010,
  43. TRACE_UNPLUG = 0x0020,
  44. TRACE_NL = 0x0040,
  45. TRACE_AL_EXT = 0x0080,
  46. TRACE_INT_RQ = 0x0100,
  47. TRACE_MD_IO = 0x0200,
  48. TRACE_EPOCH = 0x0400,
  49. };
  50. /* Buffer printing support
  51. * dbg_print_flags: used for Flags arg to drbd_print_buffer
  52. * - DBGPRINT_BUFFADDR; if set, each line starts with the
  53. * virtual address of the line being output. If clear,
  54. * each line starts with the offset from the beginning
  55. * of the buffer. */
  56. enum dbg_print_flags {
  57. DBGPRINT_BUFFADDR = 0x0001,
  58. };
  59. /* Macro stuff */
  60. static char *nl_packet_name(int packet_type)
  61. {
  62. /* Generate packet type strings */
  63. #define NL_PACKET(name, number, fields) \
  64. [P_ ## name] = # name,
  65. #define NL_INTEGER Argh!
  66. #define NL_BIT Argh!
  67. #define NL_INT64 Argh!
  68. #define NL_STRING Argh!
  69. static char *nl_tag_name[P_nl_after_last_packet] = {
  70. #include "linux/drbd_nl.h"
  71. };
  72. return (packet_type < sizeof(nl_tag_name)/sizeof(nl_tag_name[0])) ?
  73. nl_tag_name[packet_type] : "*Unknown*";
  74. }
  75. /* /Macro stuff */
  76. static inline int is_mdev_trace(struct drbd_conf *mdev, unsigned int level)
  77. {
  78. return trace_level >= level && ((1 << mdev_to_minor(mdev)) & trace_devs);
  79. }
  80. static void probe_drbd_unplug(struct drbd_conf *mdev, char *msg)
  81. {
  82. if (!is_mdev_trace(mdev, TRACE_LVL_ALWAYS))
  83. return;
  84. dev_info(DEV, "%s, ap_bio_count=%d\n", msg, atomic_read(&mdev->ap_bio_cnt));
  85. }
  86. static void probe_drbd_uuid(struct drbd_conf *mdev, enum drbd_uuid_index index)
  87. {
  88. static char *uuid_str[UI_EXTENDED_SIZE] = {
  89. [UI_CURRENT] = "CURRENT",
  90. [UI_BITMAP] = "BITMAP",
  91. [UI_HISTORY_START] = "HISTORY_START",
  92. [UI_HISTORY_END] = "HISTORY_END",
  93. [UI_SIZE] = "SIZE",
  94. [UI_FLAGS] = "FLAGS",
  95. };
  96. if (!is_mdev_trace(mdev, TRACE_LVL_ALWAYS))
  97. return;
  98. if (index >= UI_EXTENDED_SIZE) {
  99. dev_warn(DEV, " uuid_index >= EXTENDED_SIZE\n");
  100. return;
  101. }
  102. dev_info(DEV, " uuid[%s] now %016llX\n",
  103. uuid_str[index],
  104. (unsigned long long)mdev->ldev->md.uuid[index]);
  105. }
  106. static void probe_drbd_md_io(struct drbd_conf *mdev, int rw,
  107. struct drbd_backing_dev *bdev)
  108. {
  109. if (!is_mdev_trace(mdev, TRACE_LVL_ALWAYS))
  110. return;
  111. dev_info(DEV, " %s metadata superblock now\n",
  112. rw == READ ? "Reading" : "Writing");
  113. }
  114. static void probe_drbd_ee(struct drbd_conf *mdev, struct drbd_epoch_entry *e, char* msg)
  115. {
  116. if (!is_mdev_trace(mdev, TRACE_LVL_ALWAYS))
  117. return;
  118. dev_info(DEV, "EE %s sec=%llus size=%u e=%p\n",
  119. msg, (unsigned long long)e->sector, e->size, e);
  120. }
  121. static void probe_drbd_epoch(struct drbd_conf *mdev, struct drbd_epoch *epoch,
  122. enum epoch_event ev)
  123. {
  124. static char *epoch_event_str[] = {
  125. [EV_PUT] = "put",
  126. [EV_GOT_BARRIER_NR] = "got_barrier_nr",
  127. [EV_BARRIER_DONE] = "barrier_done",
  128. [EV_BECAME_LAST] = "became_last",
  129. [EV_TRACE_FLUSH] = "issuing_flush",
  130. [EV_TRACE_ADD_BARRIER] = "added_barrier",
  131. [EV_TRACE_SETTING_BI] = "just set barrier_in_next_epoch",
  132. };
  133. if (!is_mdev_trace(mdev, TRACE_LVL_ALWAYS))
  134. return;
  135. ev &= ~EV_CLEANUP;
  136. switch (ev) {
  137. case EV_TRACE_ALLOC:
  138. dev_info(DEV, "Allocate epoch %p/xxxx { } nr_epochs=%d\n", epoch, mdev->epochs);
  139. break;
  140. case EV_TRACE_FREE:
  141. dev_info(DEV, "Freeing epoch %p/%d { size=%d } nr_epochs=%d\n",
  142. epoch, epoch->barrier_nr, atomic_read(&epoch->epoch_size),
  143. mdev->epochs);
  144. break;
  145. default:
  146. dev_info(DEV, "Update epoch %p/%d { size=%d active=%d %c%c n%c%c } ev=%s\n",
  147. epoch, epoch->barrier_nr, atomic_read(&epoch->epoch_size),
  148. atomic_read(&epoch->active),
  149. test_bit(DE_HAVE_BARRIER_NUMBER, &epoch->flags) ? 'n' : '-',
  150. test_bit(DE_CONTAINS_A_BARRIER, &epoch->flags) ? 'b' : '-',
  151. test_bit(DE_BARRIER_IN_NEXT_EPOCH_ISSUED, &epoch->flags) ? 'i' : '-',
  152. test_bit(DE_BARRIER_IN_NEXT_EPOCH_DONE, &epoch->flags) ? 'd' : '-',
  153. epoch_event_str[ev]);
  154. }
  155. }
  156. static void probe_drbd_netlink(void *data, int is_req)
  157. {
  158. struct cn_msg *msg = data;
  159. if (is_req) {
  160. struct drbd_nl_cfg_req *nlp = (struct drbd_nl_cfg_req *)msg->data;
  161. printk(KERN_INFO "drbd%d: "
  162. "Netlink: << %s (%d) - seq: %x, ack: %x, len: %x\n",
  163. nlp->drbd_minor,
  164. nl_packet_name(nlp->packet_type),
  165. nlp->packet_type,
  166. msg->seq, msg->ack, msg->len);
  167. } else {
  168. struct drbd_nl_cfg_reply *nlp = (struct drbd_nl_cfg_reply *)msg->data;
  169. printk(KERN_INFO "drbd%d: "
  170. "Netlink: >> %s (%d) - seq: %x, ack: %x, len: %x\n",
  171. nlp->minor,
  172. nlp->packet_type == P_nl_after_last_packet ?
  173. "Empty-Reply" : nl_packet_name(nlp->packet_type),
  174. nlp->packet_type,
  175. msg->seq, msg->ack, msg->len);
  176. }
  177. }
  178. static void probe_drbd_actlog(struct drbd_conf *mdev, sector_t sector, char* msg)
  179. {
  180. unsigned int enr = (sector >> (AL_EXTENT_SHIFT-9));
  181. if (!is_mdev_trace(mdev, TRACE_LVL_ALWAYS))
  182. return;
  183. dev_info(DEV, "%s (sec=%llus, al_enr=%u, rs_enr=%d)\n",
  184. msg, (unsigned long long) sector, enr,
  185. (int)BM_SECT_TO_EXT(sector));
  186. }
  187. /**
  188. * drbd_print_buffer() - Hexdump arbitrary binary data into a buffer
  189. * @prefix: String is output at the beginning of each line output.
  190. * @flags: Currently only defined flag: DBGPRINT_BUFFADDR; if set, each
  191. * line starts with the virtual address of the line being
  192. * output. If clear, each line starts with the offset from the
  193. * beginning of the buffer.
  194. * @size: Indicates the size of each entry in the buffer. Supported
  195. * values are sizeof(char), sizeof(short) and sizeof(int)
  196. * @buffer: Start address of buffer
  197. * @buffer_va: Virtual address of start of buffer (normally the same
  198. * as Buffer, but having it separate allows it to hold
  199. * file address for example)
  200. * @length: length of buffer
  201. */
  202. static void drbd_print_buffer(const char *prefix, unsigned int flags, int size,
  203. const void *buffer, const void *buffer_va,
  204. unsigned int length)
  205. #define LINE_SIZE 16
  206. #define LINE_ENTRIES (int)(LINE_SIZE/size)
  207. {
  208. const unsigned char *pstart;
  209. const unsigned char *pstart_va;
  210. const unsigned char *pend;
  211. char bytes_str[LINE_SIZE*3+8], ascii_str[LINE_SIZE+8];
  212. char *pbytes = bytes_str, *pascii = ascii_str;
  213. int offset = 0;
  214. long sizemask;
  215. int field_width;
  216. int index;
  217. const unsigned char *pend_str;
  218. const unsigned char *p;
  219. int count;
  220. /* verify size parameter */
  221. if (size != sizeof(char) &&
  222. size != sizeof(short) &&
  223. size != sizeof(int)) {
  224. printk(KERN_DEBUG "drbd_print_buffer: "
  225. "ERROR invalid size %d\n", size);
  226. return;
  227. }
  228. sizemask = size-1;
  229. field_width = size*2;
  230. /* Adjust start/end to be on appropriate boundary for size */
  231. buffer = (const char *)((long)buffer & ~sizemask);
  232. pend = (const unsigned char *)
  233. (((long)buffer + length + sizemask) & ~sizemask);
  234. if (flags & DBGPRINT_BUFFADDR) {
  235. /* Move start back to nearest multiple of line size,
  236. * if printing address. This results in nicely formatted output
  237. * with addresses being on line size (16) byte boundaries */
  238. pstart = (const unsigned char *)((long)buffer & ~(LINE_SIZE-1));
  239. } else {
  240. pstart = (const unsigned char *)buffer;
  241. }
  242. /* Set value of start VA to print if addresses asked for */
  243. pstart_va = (const unsigned char *)buffer_va
  244. - ((const unsigned char *)buffer-pstart);
  245. /* Calculate end position to nicely align right hand side */
  246. pend_str = pstart + (((pend-pstart) + LINE_SIZE-1) & ~(LINE_SIZE-1));
  247. /* Init strings */
  248. *pbytes = *pascii = '\0';
  249. /* Start at beginning of first line */
  250. p = pstart;
  251. count = 0;
  252. while (p < pend_str) {
  253. if (p < (const unsigned char *)buffer || p >= pend) {
  254. /* Before start of buffer or after end- print spaces */
  255. pbytes += sprintf(pbytes, "%*c ", field_width, ' ');
  256. pascii += sprintf(pascii, "%*c", size, ' ');
  257. p += size;
  258. } else {
  259. /* Add hex and ascii to strings */
  260. int val;
  261. switch (size) {
  262. default:
  263. case 1:
  264. val = *(unsigned char *)p;
  265. break;
  266. case 2:
  267. val = *(unsigned short *)p;
  268. break;
  269. case 4:
  270. val = *(unsigned int *)p;
  271. break;
  272. }
  273. pbytes += sprintf(pbytes, "%0*x ", field_width, val);
  274. for (index = size; index; index--) {
  275. *pascii++ = isprint(*p) ? *p : '.';
  276. p++;
  277. }
  278. }
  279. count++;
  280. if (count == LINE_ENTRIES || p >= pend_str) {
  281. /* Null terminate and print record */
  282. *pascii = '\0';
  283. printk(KERN_DEBUG "%s%8.8lx: %*s|%*s|\n",
  284. prefix,
  285. (flags & DBGPRINT_BUFFADDR)
  286. ? (long)pstart_va:(long)offset,
  287. LINE_ENTRIES*(field_width+1), bytes_str,
  288. LINE_SIZE, ascii_str);
  289. /* Move onto next line */
  290. pstart_va += (p-pstart);
  291. pstart = p;
  292. count = 0;
  293. offset += LINE_SIZE;
  294. /* Re-init strings */
  295. pbytes = bytes_str;
  296. pascii = ascii_str;
  297. *pbytes = *pascii = '\0';
  298. }
  299. }
  300. }
  301. static void probe_drbd_resync(struct drbd_conf *mdev, int level, const char *fmt, va_list args)
  302. {
  303. char str[256];
  304. if (!is_mdev_trace(mdev, level))
  305. return;
  306. if (vsnprintf(str, 256, fmt, args) >= 256)
  307. str[255] = 0;
  308. printk(KERN_INFO "%s %s: %s", dev_driver_string(disk_to_dev(mdev->vdisk)),
  309. dev_name(disk_to_dev(mdev->vdisk)), str);
  310. }
  311. static void probe_drbd_bio(struct drbd_conf *mdev, const char *pfx, struct bio *bio, int complete,
  312. struct drbd_request *r)
  313. {
  314. #if defined(CONFIG_LBDAF) || defined(CONFIG_LBD)
  315. #define SECTOR_FORMAT "%Lx"
  316. #else
  317. #define SECTOR_FORMAT "%lx"
  318. #endif
  319. #define SECTOR_SHIFT 9
  320. unsigned long lowaddr = (unsigned long)(bio->bi_sector << SECTOR_SHIFT);
  321. char *faddr = (char *)(lowaddr);
  322. char rb[sizeof(void *)*2+6] = { 0, };
  323. struct bio_vec *bvec;
  324. int segno;
  325. const int rw = bio->bi_rw;
  326. const int biorw = (rw & (RW_MASK|RWA_MASK));
  327. const int biobarrier = (rw & (1<<BIO_RW_BARRIER));
  328. const int biosync = (rw & ((1<<BIO_RW_UNPLUG) | (1<<BIO_RW_SYNCIO)));
  329. if (!is_mdev_trace(mdev, TRACE_LVL_ALWAYS))
  330. return;
  331. if (r)
  332. sprintf(rb, "Req:%p ", r);
  333. dev_info(DEV, "%s %s:%s%s%s Bio:%p %s- %soffset " SECTOR_FORMAT ", size %x\n",
  334. complete ? "<<<" : ">>>",
  335. pfx,
  336. biorw == WRITE ? "Write" : "Read",
  337. biobarrier ? " : B" : "",
  338. biosync ? " : S" : "",
  339. bio,
  340. rb,
  341. complete ? (bio_flagged(bio, BIO_UPTODATE) ? "Success, " : "Failed, ") : "",
  342. bio->bi_sector << SECTOR_SHIFT,
  343. bio->bi_size);
  344. if (trace_level >= TRACE_LVL_METRICS &&
  345. ((biorw == WRITE) ^ complete)) {
  346. printk(KERN_DEBUG " ind page offset length\n");
  347. __bio_for_each_segment(bvec, bio, segno, 0) {
  348. printk(KERN_DEBUG " [%d] %p %8.8x %8.8x\n", segno,
  349. bvec->bv_page, bvec->bv_offset, bvec->bv_len);
  350. if (trace_level >= TRACE_LVL_ALL) {
  351. char *bvec_buf;
  352. unsigned long flags;
  353. bvec_buf = bvec_kmap_irq(bvec, &flags);
  354. drbd_print_buffer(" ", DBGPRINT_BUFFADDR, 1,
  355. bvec_buf,
  356. faddr,
  357. (bvec->bv_len <= 0x80)
  358. ? bvec->bv_len : 0x80);
  359. bvec_kunmap_irq(bvec_buf, &flags);
  360. if (bvec->bv_len > 0x40)
  361. printk(KERN_DEBUG " ....\n");
  362. faddr += bvec->bv_len;
  363. }
  364. }
  365. }
  366. }
  367. static void probe_drbd_req(struct drbd_request *req, enum drbd_req_event what, char *msg)
  368. {
  369. static const char *rq_event_names[] = {
  370. [created] = "created",
  371. [to_be_send] = "to_be_send",
  372. [to_be_submitted] = "to_be_submitted",
  373. [queue_for_net_write] = "queue_for_net_write",
  374. [queue_for_net_read] = "queue_for_net_read",
  375. [send_canceled] = "send_canceled",
  376. [send_failed] = "send_failed",
  377. [handed_over_to_network] = "handed_over_to_network",
  378. [connection_lost_while_pending] =
  379. "connection_lost_while_pending",
  380. [recv_acked_by_peer] = "recv_acked_by_peer",
  381. [write_acked_by_peer] = "write_acked_by_peer",
  382. [neg_acked] = "neg_acked",
  383. [conflict_discarded_by_peer] = "conflict_discarded_by_peer",
  384. [barrier_acked] = "barrier_acked",
  385. [data_received] = "data_received",
  386. [read_completed_with_error] = "read_completed_with_error",
  387. [read_ahead_completed_with_error] = "reada_completed_with_error",
  388. [write_completed_with_error] = "write_completed_with_error",
  389. [completed_ok] = "completed_ok",
  390. };
  391. struct drbd_conf *mdev = req->mdev;
  392. const int rw = (req->master_bio == NULL ||
  393. bio_data_dir(req->master_bio) == WRITE) ?
  394. 'W' : 'R';
  395. const unsigned long s = req->rq_state;
  396. if (what != nothing) {
  397. dev_info(DEV, "__req_mod(%p %c ,%s)\n", req, rw, rq_event_names[what]);
  398. } else {
  399. dev_info(DEV, "%s %p %c L%c%c%cN%c%c%c%c%c %u (%llus +%u) %s\n",
  400. msg, req, rw,
  401. s & RQ_LOCAL_PENDING ? 'p' : '-',
  402. s & RQ_LOCAL_COMPLETED ? 'c' : '-',
  403. s & RQ_LOCAL_OK ? 'o' : '-',
  404. s & RQ_NET_PENDING ? 'p' : '-',
  405. s & RQ_NET_QUEUED ? 'q' : '-',
  406. s & RQ_NET_SENT ? 's' : '-',
  407. s & RQ_NET_DONE ? 'd' : '-',
  408. s & RQ_NET_OK ? 'o' : '-',
  409. req->epoch,
  410. (unsigned long long)req->sector,
  411. req->size,
  412. drbd_conn_str(mdev->state.conn));
  413. }
  414. }
  415. #define drbd_peer_str drbd_role_str
  416. #define drbd_pdsk_str drbd_disk_str
  417. #define PSM(A) \
  418. do { \
  419. if (mask.A) { \
  420. int i = snprintf(p, len, " " #A "( %s )", \
  421. drbd_##A##_str(val.A)); \
  422. if (i >= len) \
  423. return op; \
  424. p += i; \
  425. len -= i; \
  426. } \
  427. } while (0)
  428. static char *dump_st(char *p, int len, union drbd_state mask, union drbd_state val)
  429. {
  430. char *op = p;
  431. *p = '\0';
  432. PSM(role);
  433. PSM(peer);
  434. PSM(conn);
  435. PSM(disk);
  436. PSM(pdsk);
  437. return op;
  438. }
  439. #define INFOP(fmt, args...) \
  440. do { \
  441. if (trace_level >= TRACE_LVL_ALL) { \
  442. dev_info(DEV, "%s:%d: %s [%d] %s %s " fmt , \
  443. file, line, current->comm, current->pid, \
  444. sockname, recv ? "<<<" : ">>>" , \
  445. ## args); \
  446. } else { \
  447. dev_info(DEV, "%s %s " fmt, sockname, \
  448. recv ? "<<<" : ">>>" , \
  449. ## args); \
  450. } \
  451. } while (0)
  452. static char *_dump_block_id(u64 block_id, char *buff)
  453. {
  454. if (is_syncer_block_id(block_id))
  455. strcpy(buff, "SyncerId");
  456. else
  457. sprintf(buff, "%llx", (unsigned long long)block_id);
  458. return buff;
  459. }
  460. static void probe_drbd_packet(struct drbd_conf *mdev, struct socket *sock,
  461. int recv, union p_polymorph *p, char *file, int line)
  462. {
  463. char *sockname = sock == mdev->meta.socket ? "meta" : "data";
  464. int cmd = (recv == 2) ? p->header.command : be16_to_cpu(p->header.command);
  465. char tmp[300];
  466. union drbd_state m, v;
  467. switch (cmd) {
  468. case P_HAND_SHAKE:
  469. INFOP("%s (protocol %u-%u)\n", cmdname(cmd),
  470. be32_to_cpu(p->handshake.protocol_min),
  471. be32_to_cpu(p->handshake.protocol_max));
  472. break;
  473. case P_BITMAP: /* don't report this */
  474. case P_COMPRESSED_BITMAP: /* don't report this */
  475. break;
  476. case P_DATA:
  477. INFOP("%s (sector %llus, id %s, seq %u, f %x)\n", cmdname(cmd),
  478. (unsigned long long)be64_to_cpu(p->data.sector),
  479. _dump_block_id(p->data.block_id, tmp),
  480. be32_to_cpu(p->data.seq_num),
  481. be32_to_cpu(p->data.dp_flags)
  482. );
  483. break;
  484. case P_DATA_REPLY:
  485. case P_RS_DATA_REPLY:
  486. INFOP("%s (sector %llus, id %s)\n", cmdname(cmd),
  487. (unsigned long long)be64_to_cpu(p->data.sector),
  488. _dump_block_id(p->data.block_id, tmp)
  489. );
  490. break;
  491. case P_RECV_ACK:
  492. case P_WRITE_ACK:
  493. case P_RS_WRITE_ACK:
  494. case P_DISCARD_ACK:
  495. case P_NEG_ACK:
  496. case P_NEG_RS_DREPLY:
  497. INFOP("%s (sector %llus, size %u, id %s, seq %u)\n",
  498. cmdname(cmd),
  499. (long long)be64_to_cpu(p->block_ack.sector),
  500. be32_to_cpu(p->block_ack.blksize),
  501. _dump_block_id(p->block_ack.block_id, tmp),
  502. be32_to_cpu(p->block_ack.seq_num)
  503. );
  504. break;
  505. case P_DATA_REQUEST:
  506. case P_RS_DATA_REQUEST:
  507. INFOP("%s (sector %llus, size %u, id %s)\n", cmdname(cmd),
  508. (long long)be64_to_cpu(p->block_req.sector),
  509. be32_to_cpu(p->block_req.blksize),
  510. _dump_block_id(p->block_req.block_id, tmp)
  511. );
  512. break;
  513. case P_BARRIER:
  514. case P_BARRIER_ACK:
  515. INFOP("%s (barrier %u)\n", cmdname(cmd), p->barrier.barrier);
  516. break;
  517. case P_SYNC_PARAM:
  518. case P_SYNC_PARAM89:
  519. INFOP("%s (rate %u, verify-alg \"%.64s\", csums-alg \"%.64s\")\n",
  520. cmdname(cmd), be32_to_cpu(p->rs_param_89.rate),
  521. p->rs_param_89.verify_alg, p->rs_param_89.csums_alg);
  522. break;
  523. case P_UUIDS:
  524. INFOP("%s Curr:%016llX, Bitmap:%016llX, "
  525. "HisSt:%016llX, HisEnd:%016llX\n",
  526. cmdname(cmd),
  527. (unsigned long long)be64_to_cpu(p->uuids.uuid[UI_CURRENT]),
  528. (unsigned long long)be64_to_cpu(p->uuids.uuid[UI_BITMAP]),
  529. (unsigned long long)be64_to_cpu(p->uuids.uuid[UI_HISTORY_START]),
  530. (unsigned long long)be64_to_cpu(p->uuids.uuid[UI_HISTORY_END]));
  531. break;
  532. case P_SIZES:
  533. INFOP("%s (d %lluMiB, u %lluMiB, c %lldMiB, "
  534. "max bio %x, q order %x)\n",
  535. cmdname(cmd),
  536. (long long)(be64_to_cpu(p->sizes.d_size)>>(20-9)),
  537. (long long)(be64_to_cpu(p->sizes.u_size)>>(20-9)),
  538. (long long)(be64_to_cpu(p->sizes.c_size)>>(20-9)),
  539. be32_to_cpu(p->sizes.max_segment_size),
  540. be32_to_cpu(p->sizes.queue_order_type));
  541. break;
  542. case P_STATE:
  543. v.i = be32_to_cpu(p->state.state);
  544. m.i = 0xffffffff;
  545. dump_st(tmp, sizeof(tmp), m, v);
  546. INFOP("%s (s %x {%s})\n", cmdname(cmd), v.i, tmp);
  547. break;
  548. case P_STATE_CHG_REQ:
  549. m.i = be32_to_cpu(p->req_state.mask);
  550. v.i = be32_to_cpu(p->req_state.val);
  551. dump_st(tmp, sizeof(tmp), m, v);
  552. INFOP("%s (m %x v %x {%s})\n", cmdname(cmd), m.i, v.i, tmp);
  553. break;
  554. case P_STATE_CHG_REPLY:
  555. INFOP("%s (ret %x)\n", cmdname(cmd),
  556. be32_to_cpu(p->req_state_reply.retcode));
  557. break;
  558. case P_PING:
  559. case P_PING_ACK:
  560. /*
  561. * Dont trace pings at summary level
  562. */
  563. if (trace_level < TRACE_LVL_ALL)
  564. break;
  565. /* fall through... */
  566. default:
  567. INFOP("%s (%u)\n", cmdname(cmd), cmd);
  568. break;
  569. }
  570. }
  571. static int __init drbd_trace_init(void)
  572. {
  573. int ret;
  574. if (trace_mask & TRACE_UNPLUG) {
  575. ret = register_trace_drbd_unplug(probe_drbd_unplug);
  576. WARN_ON(ret);
  577. }
  578. if (trace_mask & TRACE_UUID) {
  579. ret = register_trace_drbd_uuid(probe_drbd_uuid);
  580. WARN_ON(ret);
  581. }
  582. if (trace_mask & TRACE_EE) {
  583. ret = register_trace_drbd_ee(probe_drbd_ee);
  584. WARN_ON(ret);
  585. }
  586. if (trace_mask & TRACE_PACKET) {
  587. ret = register_trace_drbd_packet(probe_drbd_packet);
  588. WARN_ON(ret);
  589. }
  590. if (trace_mask & TRACE_MD_IO) {
  591. ret = register_trace_drbd_md_io(probe_drbd_md_io);
  592. WARN_ON(ret);
  593. }
  594. if (trace_mask & TRACE_EPOCH) {
  595. ret = register_trace_drbd_epoch(probe_drbd_epoch);
  596. WARN_ON(ret);
  597. }
  598. if (trace_mask & TRACE_NL) {
  599. ret = register_trace_drbd_netlink(probe_drbd_netlink);
  600. WARN_ON(ret);
  601. }
  602. if (trace_mask & TRACE_AL_EXT) {
  603. ret = register_trace_drbd_actlog(probe_drbd_actlog);
  604. WARN_ON(ret);
  605. }
  606. if (trace_mask & TRACE_RQ) {
  607. ret = register_trace_drbd_bio(probe_drbd_bio);
  608. WARN_ON(ret);
  609. }
  610. if (trace_mask & TRACE_INT_RQ) {
  611. ret = register_trace_drbd_req(probe_drbd_req);
  612. WARN_ON(ret);
  613. }
  614. if (trace_mask & TRACE_RESYNC) {
  615. ret = register_trace__drbd_resync(probe_drbd_resync);
  616. WARN_ON(ret);
  617. }
  618. return 0;
  619. }
  620. module_init(drbd_trace_init);
  621. static void __exit drbd_trace_exit(void)
  622. {
  623. if (trace_mask & TRACE_UNPLUG)
  624. unregister_trace_drbd_unplug(probe_drbd_unplug);
  625. if (trace_mask & TRACE_UUID)
  626. unregister_trace_drbd_uuid(probe_drbd_uuid);
  627. if (trace_mask & TRACE_EE)
  628. unregister_trace_drbd_ee(probe_drbd_ee);
  629. if (trace_mask & TRACE_PACKET)
  630. unregister_trace_drbd_packet(probe_drbd_packet);
  631. if (trace_mask & TRACE_MD_IO)
  632. unregister_trace_drbd_md_io(probe_drbd_md_io);
  633. if (trace_mask & TRACE_EPOCH)
  634. unregister_trace_drbd_epoch(probe_drbd_epoch);
  635. if (trace_mask & TRACE_NL)
  636. unregister_trace_drbd_netlink(probe_drbd_netlink);
  637. if (trace_mask & TRACE_AL_EXT)
  638. unregister_trace_drbd_actlog(probe_drbd_actlog);
  639. if (trace_mask & TRACE_RQ)
  640. unregister_trace_drbd_bio(probe_drbd_bio);
  641. if (trace_mask & TRACE_INT_RQ)
  642. unregister_trace_drbd_req(probe_drbd_req);
  643. if (trace_mask & TRACE_RESYNC)
  644. unregister_trace__drbd_resync(probe_drbd_resync);
  645. tracepoint_synchronize_unregister();
  646. }
  647. module_exit(drbd_trace_exit);