Commit 56cf2635 authored by Rahul Lakkireddy's avatar Rahul Lakkireddy Committed by David S. Miller

cxgb4: update dump collection logic to use compression

Update firmware dump collection logic to use compression when available.
Let collection logic attempt to do compression, instead of returning out
of memory early.
Signed-off-by: default avatarRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: default avatarVishal Kulkarni <vishal@chelsio.com>
Signed-off-by: default avatarGanesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5165674f
...@@ -19,7 +19,8 @@ ...@@ -19,7 +19,8 @@
#include "cudbg_if.h" #include "cudbg_if.h"
#include "cudbg_lib_common.h" #include "cudbg_lib_common.h"
int cudbg_get_buff(struct cudbg_buffer *pdbg_buff, u32 size, int cudbg_get_buff(struct cudbg_init *pdbg_init,
struct cudbg_buffer *pdbg_buff, u32 size,
struct cudbg_buffer *pin_buff) struct cudbg_buffer *pin_buff)
{ {
u32 offset; u32 offset;
...@@ -28,17 +29,30 @@ int cudbg_get_buff(struct cudbg_buffer *pdbg_buff, u32 size, ...@@ -28,17 +29,30 @@ int cudbg_get_buff(struct cudbg_buffer *pdbg_buff, u32 size,
if (offset + size > pdbg_buff->size) if (offset + size > pdbg_buff->size)
return CUDBG_STATUS_NO_MEM; return CUDBG_STATUS_NO_MEM;
if (pdbg_init->compress_type != CUDBG_COMPRESSION_NONE) {
if (size > pdbg_init->compress_buff_size)
return CUDBG_STATUS_NO_MEM;
pin_buff->data = (char *)pdbg_init->compress_buff;
pin_buff->offset = 0;
pin_buff->size = size;
return 0;
}
pin_buff->data = (char *)pdbg_buff->data + offset; pin_buff->data = (char *)pdbg_buff->data + offset;
pin_buff->offset = offset; pin_buff->offset = offset;
pin_buff->size = size; pin_buff->size = size;
pdbg_buff->size -= size;
return 0; return 0;
} }
void cudbg_put_buff(struct cudbg_buffer *pin_buff, void cudbg_put_buff(struct cudbg_init *pdbg_init,
struct cudbg_buffer *pdbg_buff) struct cudbg_buffer *pin_buff)
{ {
pdbg_buff->size += pin_buff->size; /* Clear compression buffer for re-use */
if (pdbg_init->compress_type != CUDBG_COMPRESSION_NONE)
memset(pdbg_init->compress_buff, 0,
pdbg_init->compress_buff_size);
pin_buff->data = NULL; pin_buff->data = NULL;
pin_buff->offset = 0; pin_buff->offset = 0;
pin_buff->size = 0; pin_buff->size = 0;
......
...@@ -87,6 +87,9 @@ struct cudbg_init { ...@@ -87,6 +87,9 @@ struct cudbg_init {
struct adapter *adap; /* Pointer to adapter structure */ struct adapter *adap; /* Pointer to adapter structure */
void *outbuf; /* Output buffer */ void *outbuf; /* Output buffer */
u32 outbuf_size; /* Output buffer size */ u32 outbuf_size; /* Output buffer size */
u8 compress_type; /* Type of compression to use */
void *compress_buff; /* Compression buffer */
u32 compress_buff_size; /* Compression buffer size */
}; };
static inline unsigned int cudbg_mbytes_to_bytes(unsigned int size) static inline unsigned int cudbg_mbytes_to_bytes(unsigned int size)
......
...@@ -78,10 +78,11 @@ struct cudbg_error { ...@@ -78,10 +78,11 @@ struct cudbg_error {
#define CDUMP_MAX_COMP_BUF_SIZE ((64 * 1024) - 1) #define CDUMP_MAX_COMP_BUF_SIZE ((64 * 1024) - 1)
#define CUDBG_CHUNK_SIZE ((CDUMP_MAX_COMP_BUF_SIZE / 1024) * 1024) #define CUDBG_CHUNK_SIZE ((CDUMP_MAX_COMP_BUF_SIZE / 1024) * 1024)
int cudbg_get_buff(struct cudbg_buffer *pdbg_buff, u32 size, int cudbg_get_buff(struct cudbg_init *pdbg_init,
struct cudbg_buffer *pdbg_buff, u32 size,
struct cudbg_buffer *pin_buff);
void cudbg_put_buff(struct cudbg_init *pdbg_init,
struct cudbg_buffer *pin_buff); struct cudbg_buffer *pin_buff);
void cudbg_put_buff(struct cudbg_buffer *pin_buff,
struct cudbg_buffer *pdbg_buff);
void cudbg_update_buff(struct cudbg_buffer *pin_buff, void cudbg_update_buff(struct cudbg_buffer *pin_buff,
struct cudbg_buffer *pout_buff); struct cudbg_buffer *pout_buff);
#endif /* __CUDBG_LIB_COMMON_H__ */ #endif /* __CUDBG_LIB_COMMON_H__ */
/*
* Copyright (C) 2018 Chelsio Communications. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* The full GNU General Public License is included in this distribution in
* the file called "COPYING".
*
*/
#ifndef __CUDBG_ZLIB_H__
#define __CUDBG_ZLIB_H__
static inline int cudbg_compress_buff(struct cudbg_init *pdbg_init,
struct cudbg_buffer *pin_buff,
struct cudbg_buffer *pout_buff)
{
return 0;
}
#endif /* __CUDBG_ZLIB_H__ */
...@@ -341,22 +341,14 @@ static void cxgb4_cudbg_collect_entity(struct cudbg_init *pdbg_init, ...@@ -341,22 +341,14 @@ static void cxgb4_cudbg_collect_entity(struct cudbg_init *pdbg_init,
const struct cxgb4_collect_entity *e_arr, const struct cxgb4_collect_entity *e_arr,
u32 arr_size, void *buf, u32 *tot_size) u32 arr_size, void *buf, u32 *tot_size)
{ {
struct adapter *adap = pdbg_init->adap;
struct cudbg_error cudbg_err = { 0 }; struct cudbg_error cudbg_err = { 0 };
struct cudbg_entity_hdr *entity_hdr; struct cudbg_entity_hdr *entity_hdr;
u32 entity_size, i; u32 i, total_size = 0;
u32 total_size = 0;
int ret; int ret;
for (i = 0; i < arr_size; i++) { for (i = 0; i < arr_size; i++) {
const struct cxgb4_collect_entity *e = &e_arr[i]; const struct cxgb4_collect_entity *e = &e_arr[i];
/* Skip entities that won't fit in output buffer */
entity_size = cxgb4_get_entity_length(adap, e->entity);
if (entity_size >
pdbg_init->outbuf_size - *tot_size - total_size)
continue;
entity_hdr = cudbg_get_entity_hdr(buf, e->entity); entity_hdr = cudbg_get_entity_hdr(buf, e->entity);
entity_hdr->entity_type = e->entity; entity_hdr->entity_type = e->entity;
entity_hdr->start_offset = dbg_buff->offset; entity_hdr->start_offset = dbg_buff->offset;
...@@ -408,7 +400,8 @@ int cxgb4_cudbg_collect(struct adapter *adap, void *buf, u32 *buf_size, ...@@ -408,7 +400,8 @@ int cxgb4_cudbg_collect(struct adapter *adap, void *buf, u32 *buf_size,
cudbg_hdr->max_entities = CUDBG_MAX_ENTITY; cudbg_hdr->max_entities = CUDBG_MAX_ENTITY;
cudbg_hdr->chip_ver = adap->params.chip; cudbg_hdr->chip_ver = adap->params.chip;
cudbg_hdr->dump_type = CUDBG_DUMP_TYPE_MINI; cudbg_hdr->dump_type = CUDBG_DUMP_TYPE_MINI;
cudbg_hdr->compress_type = CUDBG_COMPRESSION_NONE; cudbg_init.compress_type = CUDBG_COMPRESSION_NONE;
cudbg_hdr->compress_type = cudbg_init.compress_type;
min_size = sizeof(struct cudbg_hdr) + min_size = sizeof(struct cudbg_hdr) +
sizeof(struct cudbg_entity_hdr) * sizeof(struct cudbg_entity_hdr) *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment