Skip to content

Commit c514132

Browse files
dgchinnerdchinner
authored andcommitted
xfs: log ticket region debug is largely useless
xlog_tic_add_region() is used to trace the regions being added to a log ticket to provide information in the situation where a ticket reservation overrun occurs. The information gathered is stored int the ticket, and dumped if xlog_print_tic_res() is called. For a front end struct xfs_trans overrun, the ticket only contains reservation tracking information - the ticket is never handed to the log so has no regions attached to it. The overrun debug information in this case comes from xlog_print_trans(), which walks the items attached to the transaction and dumps their attached formatted log vectors directly. It also dumps the ticket state, but that only contains reservation accounting and nothing else. Hence xlog_print_tic_res() never dumps region or overrun information from this path. xlog_tic_add_region() is actually called from xlog_write(), which means it is being used to track the regions seen in a CIL checkpoint log vector chain. In looking at CIL behaviour recently, I've seen 32MB checkpoints regularly exceed 250,000 regions in the LV chain. The log ticket debug code can track *15* regions. IOWs, if there is a ticket overrun in the CIL code, the ticket region tracking code is going to be completely useless for determining what went wrong. The only thing it can tell us is how much of an overrun occurred, and we really don't need extra debug information in the log ticket to tell us that. Indeed, the main place we call xlog_tic_add_region() is also adding up the number of regions and the space used so that xlog_write() knows how much will be written to the log. This is exactly the same information that log ticket is storing once we take away the useless region tracking array. Hence xlog_tic_add_region() is not useful, but can be called 250,000 times a CIL push... Just strip all that debug "information" out of the of the log ticket and only have it report reservation space information when an overrun occurs. This also reduces the size of a log ticket down by about 150 bytes... Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Chandan Babu R <chandan.babu@oracle.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
1 parent 8d547cf commit c514132

2 files changed

Lines changed: 6 additions & 121 deletions

File tree

fs/xfs/xfs_log.c

Lines changed: 6 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -378,30 +378,6 @@ xlog_grant_head_check(
378378
return error;
379379
}
380380

381-
static void
382-
xlog_tic_reset_res(xlog_ticket_t *tic)
383-
{
384-
tic->t_res_num = 0;
385-
tic->t_res_arr_sum = 0;
386-
tic->t_res_num_ophdrs = 0;
387-
}
388-
389-
static void
390-
xlog_tic_add_region(xlog_ticket_t *tic, uint len, uint type)
391-
{
392-
if (tic->t_res_num == XLOG_TIC_LEN_MAX) {
393-
/* add to overflow and start again */
394-
tic->t_res_o_flow += tic->t_res_arr_sum;
395-
tic->t_res_num = 0;
396-
tic->t_res_arr_sum = 0;
397-
}
398-
399-
tic->t_res_arr[tic->t_res_num].r_len = len;
400-
tic->t_res_arr[tic->t_res_num].r_type = type;
401-
tic->t_res_arr_sum += len;
402-
tic->t_res_num++;
403-
}
404-
405381
bool
406382
xfs_log_writable(
407383
struct xfs_mount *mp)
@@ -451,8 +427,6 @@ xfs_log_regrant(
451427
xlog_grant_push_ail(log, tic->t_unit_res);
452428

453429
tic->t_curr_res = tic->t_unit_res;
454-
xlog_tic_reset_res(tic);
455-
456430
if (tic->t_cnt > 0)
457431
return 0;
458432

@@ -2178,63 +2152,11 @@ xlog_print_tic_res(
21782152
struct xfs_mount *mp,
21792153
struct xlog_ticket *ticket)
21802154
{
2181-
uint i;
2182-
uint ophdr_spc = ticket->t_res_num_ophdrs * (uint)sizeof(xlog_op_header_t);
2183-
2184-
/* match with XLOG_REG_TYPE_* in xfs_log.h */
2185-
#define REG_TYPE_STR(type, str) [XLOG_REG_TYPE_##type] = str
2186-
static char *res_type_str[] = {
2187-
REG_TYPE_STR(BFORMAT, "bformat"),
2188-
REG_TYPE_STR(BCHUNK, "bchunk"),
2189-
REG_TYPE_STR(EFI_FORMAT, "efi_format"),
2190-
REG_TYPE_STR(EFD_FORMAT, "efd_format"),
2191-
REG_TYPE_STR(IFORMAT, "iformat"),
2192-
REG_TYPE_STR(ICORE, "icore"),
2193-
REG_TYPE_STR(IEXT, "iext"),
2194-
REG_TYPE_STR(IBROOT, "ibroot"),
2195-
REG_TYPE_STR(ILOCAL, "ilocal"),
2196-
REG_TYPE_STR(IATTR_EXT, "iattr_ext"),
2197-
REG_TYPE_STR(IATTR_BROOT, "iattr_broot"),
2198-
REG_TYPE_STR(IATTR_LOCAL, "iattr_local"),
2199-
REG_TYPE_STR(QFORMAT, "qformat"),
2200-
REG_TYPE_STR(DQUOT, "dquot"),
2201-
REG_TYPE_STR(QUOTAOFF, "quotaoff"),
2202-
REG_TYPE_STR(LRHEADER, "LR header"),
2203-
REG_TYPE_STR(UNMOUNT, "unmount"),
2204-
REG_TYPE_STR(COMMIT, "commit"),
2205-
REG_TYPE_STR(TRANSHDR, "trans header"),
2206-
REG_TYPE_STR(ICREATE, "inode create"),
2207-
REG_TYPE_STR(RUI_FORMAT, "rui_format"),
2208-
REG_TYPE_STR(RUD_FORMAT, "rud_format"),
2209-
REG_TYPE_STR(CUI_FORMAT, "cui_format"),
2210-
REG_TYPE_STR(CUD_FORMAT, "cud_format"),
2211-
REG_TYPE_STR(BUI_FORMAT, "bui_format"),
2212-
REG_TYPE_STR(BUD_FORMAT, "bud_format"),
2213-
};
2214-
BUILD_BUG_ON(ARRAY_SIZE(res_type_str) != XLOG_REG_TYPE_MAX + 1);
2215-
#undef REG_TYPE_STR
2216-
22172155
xfs_warn(mp, "ticket reservation summary:");
2218-
xfs_warn(mp, " unit res = %d bytes",
2219-
ticket->t_unit_res);
2220-
xfs_warn(mp, " current res = %d bytes",
2221-
ticket->t_curr_res);
2222-
xfs_warn(mp, " total reg = %u bytes (o/flow = %u bytes)",
2223-
ticket->t_res_arr_sum, ticket->t_res_o_flow);
2224-
xfs_warn(mp, " ophdrs = %u (ophdr space = %u bytes)",
2225-
ticket->t_res_num_ophdrs, ophdr_spc);
2226-
xfs_warn(mp, " ophdr + reg = %u bytes",
2227-
ticket->t_res_arr_sum + ticket->t_res_o_flow + ophdr_spc);
2228-
xfs_warn(mp, " num regions = %u",
2229-
ticket->t_res_num);
2230-
2231-
for (i = 0; i < ticket->t_res_num; i++) {
2232-
uint r_type = ticket->t_res_arr[i].r_type;
2233-
xfs_warn(mp, "region[%u]: %s - %u bytes", i,
2234-
((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ?
2235-
"bad-rtype" : res_type_str[r_type]),
2236-
ticket->t_res_arr[i].r_len);
2237-
}
2156+
xfs_warn(mp, " unit res = %d bytes", ticket->t_unit_res);
2157+
xfs_warn(mp, " current res = %d bytes", ticket->t_curr_res);
2158+
xfs_warn(mp, " original count = %d", ticket->t_ocnt);
2159+
xfs_warn(mp, " remaining count = %d", ticket->t_cnt);
22382160
}
22392161

22402162
/*
@@ -2299,7 +2221,6 @@ xlog_write_calc_vec_length(
22992221
uint optype)
23002222
{
23012223
struct xfs_log_vec *lv;
2302-
int headers = 0;
23032224
int len = 0;
23042225
int i;
23052226

@@ -2308,17 +2229,9 @@ xlog_write_calc_vec_length(
23082229
if (lv->lv_buf_len == XFS_LOG_VEC_ORDERED)
23092230
continue;
23102231

2311-
headers += lv->lv_niovecs;
2312-
2313-
for (i = 0; i < lv->lv_niovecs; i++) {
2314-
struct xfs_log_iovec *vecp = &lv->lv_iovecp[i];
2315-
2316-
len += vecp->i_len;
2317-
xlog_tic_add_region(ticket, vecp->i_len, vecp->i_type);
2318-
}
2232+
for (i = 0; i < lv->lv_niovecs; i++)
2233+
len += lv->lv_iovecp[i].i_len;
23192234
}
2320-
ticket->t_res_num_ophdrs += headers;
2321-
23222235
return len;
23232236
}
23242237

@@ -2377,7 +2290,6 @@ xlog_write_setup_copy(
23772290

23782291
/* account for new log op header */
23792292
ticket->t_curr_res -= sizeof(struct xlog_op_header);
2380-
ticket->t_res_num_ophdrs++;
23812293

23822294
return sizeof(struct xlog_op_header);
23832295
}
@@ -3025,9 +2937,6 @@ xlog_state_get_iclog_space(
30252937
*/
30262938
if (log_offset == 0) {
30272939
ticket->t_curr_res -= log->l_iclog_hsize;
3028-
xlog_tic_add_region(ticket,
3029-
log->l_iclog_hsize,
3030-
XLOG_REG_TYPE_LRHEADER);
30312940
head->h_cycle = cpu_to_be32(log->l_curr_cycle);
30322941
head->h_lsn = cpu_to_be64(
30332942
xlog_assign_lsn(log->l_curr_cycle, log->l_curr_block));
@@ -3107,7 +3016,6 @@ xfs_log_ticket_regrant(
31073016
xlog_grant_sub_space(log, &log->l_write_head.grant,
31083017
ticket->t_curr_res);
31093018
ticket->t_curr_res = ticket->t_unit_res;
3110-
xlog_tic_reset_res(ticket);
31113019

31123020
trace_xfs_log_ticket_regrant_sub(log, ticket);
31133021

@@ -3118,7 +3026,6 @@ xfs_log_ticket_regrant(
31183026
trace_xfs_log_ticket_regrant_exit(log, ticket);
31193027

31203028
ticket->t_curr_res = ticket->t_unit_res;
3121-
xlog_tic_reset_res(ticket);
31223029
}
31233030

31243031
xfs_log_ticket_put(ticket);
@@ -3628,8 +3535,6 @@ xlog_ticket_alloc(
36283535
if (permanent)
36293536
tic->t_flags |= XLOG_TIC_PERM_RESERV;
36303537

3631-
xlog_tic_reset_res(tic);
3632-
36333538
return tic;
36343539
}
36353540

fs/xfs/xfs_log_priv.h

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -142,19 +142,6 @@ enum xlog_iclog_state {
142142

143143
#define XLOG_COVER_OPS 5
144144

145-
/* Ticket reservation region accounting */
146-
#define XLOG_TIC_LEN_MAX 15
147-
148-
/*
149-
* Reservation region
150-
* As would be stored in xfs_log_iovec but without the i_addr which
151-
* we don't care about.
152-
*/
153-
typedef struct xlog_res {
154-
uint r_len; /* region length :4 */
155-
uint r_type; /* region's transaction type :4 */
156-
} xlog_res_t;
157-
158145
typedef struct xlog_ticket {
159146
struct list_head t_queue; /* reserve/write queue */
160147
struct task_struct *t_task; /* task that owns this ticket */
@@ -165,13 +152,6 @@ typedef struct xlog_ticket {
165152
char t_ocnt; /* original count : 1 */
166153
char t_cnt; /* current count : 1 */
167154
char t_flags; /* properties of reservation : 1 */
168-
169-
/* reservation array fields */
170-
uint t_res_num; /* num in array : 4 */
171-
uint t_res_num_ophdrs; /* num op hdrs : 4 */
172-
uint t_res_arr_sum; /* array sum : 4 */
173-
uint t_res_o_flow; /* sum overflow : 4 */
174-
xlog_res_t t_res_arr[XLOG_TIC_LEN_MAX]; /* array of res : 8 * 15 */
175155
} xlog_ticket_t;
176156

177157
/*

0 commit comments

Comments
 (0)