static int diagcharmdm_close(struct inode *inode, struct file *file) { int i = 0; DIAG_INFO("%s:%s(parent:%s): tgid=%d\n", __func__, current->comm, current->parent->comm, current->tgid); if (driver) { mutex_lock(&driver->diagcharmdm_mutex); driver->ref_count--; /* On Client exit, try to destroy all 3 pools */ diagmem_exit(driver, POOL_TYPE_COPY); diagmem_exit(driver, POOL_TYPE_HDLC); diagmem_exit(driver, POOL_TYPE_WRITE_STRUCT); for (i = 0; i < driver->num_mdmclients; i++) if (driver->mdmclient_map[i].pid == current->tgid) { driver->mdmclient_map[i].pid = 0; break; } if (i < driver->num_mdmclients) DIAG_INFO("%s:#%d(%d) %s close\n", __func__, i, current->tgid, current->comm); else DIAG_WARNING("%s: nothing close\n", __func__); mutex_unlock(&driver->diagcharmdm_mutex); return 0; } return -ENOMEM; }
static int diagcharmdm_open(struct inode *inode, struct file *file) { int i = 0; #if defined(CONFIG_MACH_MECHA) if (!sdio_diag_initialized) { DIAG_INFO("sdio diag isn't in embedded mode \n"); return 0; } #endif DIAG_INFO("%s:%s(parent:%s): tgid=%d\n", __func__, current->comm, current->parent->comm, current->tgid); if (driver) { mutex_lock(&driver->diagcharmdm_mutex); for (i = 0; i < driver->num_mdmclients; i++) if (driver->mdmclient_map[i].pid == 0) break; if (i < driver->num_mdmclients) { driver->mdmclient_map[i].pid = current->tgid; strncpy(driver->mdmclient_map[i].name, current->comm, 20); driver->mdmclient_map[i].name[19] = '\0'; } else { mutex_unlock(&driver->diagcharmdm_mutex); DIAG_INFO("%s:reach max client count\n", __func__); for (i = 0; i < driver->num_mdmclients; i++) DIAG_WARNING("%d) %s PID=%d", i, driver-> mdmclient_map[i].name, driver->mdmclient_map[i].pid); return -ENOMEM; } driver->mdmdata_ready[i] |= MSG_MASKS_TYPE; driver->mdmdata_ready[i] |= EVENT_MASKS_TYPE; driver->mdmdata_ready[i] |= LOG_MASKS_TYPE; #if defined(CONFIG_ARCH_MSM8X60_LTE) if (driver->ref_count == 0) diagmem_init(driver); driver->ref_count++; #endif mutex_unlock(&driver->diagcharmdm_mutex); return 0; } return -ENOMEM; }
static int diagcharmdm_close(struct inode *inode, struct file *file) { int i = 0; #if defined(CONFIG_MACH_MECHA) if (!sdio_diag_initialized) { DIAG_INFO("sdio diag isn't in embedded mode \n"); return 0; } #endif DIAG_INFO("%s:%s(parent:%s): tgid=%d\n", __func__, current->comm, current->parent->comm, current->tgid); if (driver) { mutex_lock(&driver->diagcharmdm_mutex); #if defined(CONFIG_ARCH_MSM8X60_LTE) driver->ref_count--; /* On Client exit, try to destroy all 3 pools */ diagmem_exit(driver, POOL_TYPE_COPY); diagmem_exit(driver, POOL_TYPE_HDLC); diagmem_exit(driver, POOL_TYPE_WRITE_STRUCT); #endif for (i = 0; i < driver->num_mdmclients; i++) if (driver->mdmclient_map[i].pid == current->tgid) { driver->mdmclient_map[i].pid = 0; break; } if (i < driver->num_mdmclients) DIAG_INFO("%s:#%d(%d) %s close\n", __func__, i, current->tgid, current->comm); else DIAG_WARNING("%s: nothing close\n", __func__); mutex_unlock(&driver->diagcharmdm_mutex); return 0; } return -ENOMEM; }
static int diagcharmdm_open(struct inode *inode, struct file *file) { int i = 0; DIAG_INFO("%s:%s(parent:%s): tgid=%d\n", __func__, current->comm, current->parent->comm, current->tgid); if (driver) { mutex_lock(&driver->diagcharmdm_mutex); for (i = 0; i < driver->num_mdmclients; i++) if (driver->mdmclient_map[i].pid == 0) break; if (i < driver->num_mdmclients) { driver->mdmclient_map[i].pid = current->tgid; strncpy(driver->mdmclient_map[i].name, current->comm, 20); driver->mdmclient_map[i].name[19] = '\0'; } else { mutex_unlock(&driver->diagcharmdm_mutex); DIAG_INFO("%s:reach max client count\n", __func__); for (i = 0; i < driver->num_clients; i++) DIAG_WARNING("%d) %s PID=%d", i, driver-> mdmclient_map[i].name, driver->mdmclient_map[i].pid); return -ENOMEM; } driver->mdmdata_ready[i] |= MSG_MASKS_TYPE; driver->mdmdata_ready[i] |= EVENT_MASKS_TYPE; driver->mdmdata_ready[i] |= LOG_MASKS_TYPE; if (driver->ref_count == 0) diagmem_init(driver); driver->ref_count++; mutex_unlock(&driver->diagcharmdm_mutex); return 0; } return -ENOMEM; }
static int diagchar_open(struct inode *inode, struct file *file) { int i = 0; void *temp; DIAG_INFO("%s:%s(parent:%s): tgid=%d\n", __func__, current->comm, current->parent->comm, current->tgid); if (driver) { mutex_lock(&driver->diagchar_mutex); for (i = 0; i < driver->num_clients; i++) if (driver->client_map[i].pid == 0) break; if (i < driver->num_clients) { diag_add_client(i, file); } else { if (i < threshold_client_limit) { driver->num_clients++; temp = krealloc(driver->client_map , (driver->num_clients) * sizeof(struct diag_client_map), GFP_KERNEL); if (!temp) goto fail; else driver->client_map = temp; temp = krealloc(driver->data_ready , (driver->num_clients) * sizeof(int), GFP_KERNEL); if (!temp) goto fail; else driver->data_ready = temp; diag_add_client(i, file); } else { mutex_unlock(&driver->diagchar_mutex); pr_alert("Max client limit for DIAG reached\n"); DIAG_INFO("Cannot open handle %s" " %d", current->comm, current->tgid); for (i = 0; i < driver->num_clients; i++) DIAG_WARNING("%d) %s PID=%d", i, driver-> client_map[i].name, driver->client_map[i].pid); return -ENOMEM; } } driver->data_ready[i] |= MSG_MASKS_TYPE; driver->data_ready[i] |= EVENT_MASKS_TYPE; driver->data_ready[i] |= LOG_MASKS_TYPE; if (driver->ref_count == 0) diagmem_init(driver); driver->ref_count++; mutex_unlock(&driver->diagchar_mutex); return 0; } return -ENOMEM; fail: mutex_unlock(&driver->diagchar_mutex); driver->num_clients--; pr_alert("diag: Insufficient memory for new client"); return -ENOMEM; }