[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202008052204.eXZb6di1%lkp@intel.com>
Date: Wed, 5 Aug 2020 22:23:24 +0800
From: kernel test robot <lkp@...el.com>
To: Andra Paraschiv <andraprs@...zon.com>,
linux-kernel <linux-kernel@...r.kernel.org>
Cc: kbuild-all@...ts.01.org, Anthony Liguori <aliguori@...zon.com>,
Benjamin Herrenschmidt <benh@...nel.crashing.org>,
Colm MacCarthaigh <colmmacc@...zon.com>,
David Duncan <davdunc@...zon.com>,
Bjoern Doebel <doebel@...zon.de>,
David Woodhouse <dwmw@...zon.co.uk>,
Frank van der Linden <fllinden@...zon.com>,
Alexander Graf <graf@...zon.de>, Greg KH <greg@...ah.com>
Subject: Re: [PATCH v6 15/18] nitro_enclaves: Add Makefile for the Nitro
Enclaves driver
Hi Andra,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on linux/master]
[also build test ERROR on linus/master v5.8 next-20200805]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Andra-Paraschiv/Add-support-for-Nitro-Enclaves/20200805-171942
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git bcf876870b95592b52519ed4aafcf9d95999bc9c
config: arm64-allyesconfig (attached as .config)
compiler: aarch64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@...el.com>
All errors (new ones prefixed by >>):
drivers/virt/nitro_enclaves/ne_misc_dev.c: In function 'ne_setup_cpu_pool':
>> drivers/virt/nitro_enclaves/ne_misc_dev.c:245:46: error: 'smp_num_siblings' undeclared (first use in this function); did you mean 'cpu_sibling'?
245 | ne_cpu_pool.avail_cores_size = nr_cpu_ids / smp_num_siblings;
| ^~~~~~~~~~~~~~~~
| cpu_sibling
drivers/virt/nitro_enclaves/ne_misc_dev.c:245:46: note: each undeclared identifier is reported only once for each function it appears in
drivers/virt/nitro_enclaves/ne_misc_dev.c: In function 'ne_enclave_ioctl':
drivers/virt/nitro_enclaves/ne_misc_dev.c:928:54: error: 'smp_num_siblings' undeclared (first use in this function)
928 | if (vcpu_id >= (ne_enclave->avail_cpu_cores_size * smp_num_siblings)) {
| ^~~~~~~~~~~~~~~~
vim +245 drivers/virt/nitro_enclaves/ne_misc_dev.c
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 130
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 131 /**
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 132 * ne_setup_cpu_pool() - Set the NE CPU pool after handling sanity checks such
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 133 * as not sharing CPU cores with the primary / parent VM
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 134 * or not using CPU 0, which should remain available for
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 135 * the primary / parent VM. Offline the CPUs from the
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 136 * pool after the checks passed.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 137 * @ne_cpu_list: The CPU list used for setting NE CPU pool.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 138 *
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 139 * Context: Process context.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 140 * Return:
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 141 * * 0 on success.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 142 * * Negative return value on failure.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 143 */
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 144 static int ne_setup_cpu_pool(const char *ne_cpu_list)
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 145 {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 146 int core_id = -1;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 147 unsigned int cpu = 0;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 148 cpumask_var_t cpu_pool = NULL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 149 unsigned int cpu_sibling = 0;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 150 unsigned int i = 0;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 151 int numa_node = -1;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 152 int rc = -EINVAL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 153
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 154 if (!ne_cpu_list)
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 155 return 0;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 156
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 157 if (!zalloc_cpumask_var(&cpu_pool, GFP_KERNEL))
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 158 return -ENOMEM;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 159
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 160 mutex_lock(&ne_cpu_pool.mutex);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 161
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 162 rc = cpulist_parse(ne_cpu_list, cpu_pool);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 163 if (rc < 0) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 164 pr_err("%s: Error in cpulist parse [rc=%d]\n", ne_misc_dev.name, rc);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 165
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 166 goto free_pool_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 167 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 168
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 169 cpu = cpumask_any(cpu_pool);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 170 if (cpu >= nr_cpu_ids) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 171 pr_err("%s: No CPUs available in CPU pool\n", ne_misc_dev.name);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 172
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 173 rc = -EINVAL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 174
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 175 goto free_pool_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 176 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 177
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 178 /*
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 179 * Check if the CPUs from the NE CPU pool are from the same NUMA node.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 180 */
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 181 for_each_cpu(cpu, cpu_pool) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 182 if (numa_node < 0) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 183 numa_node = cpu_to_node(cpu);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 184 if (numa_node < 0) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 185 pr_err("%s: Invalid NUMA node %d\n",
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 186 ne_misc_dev.name, numa_node);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 187
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 188 rc = -EINVAL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 189
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 190 goto free_pool_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 191 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 192 } else {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 193 if (numa_node != cpu_to_node(cpu)) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 194 pr_err("%s: CPUs with different NUMA nodes\n",
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 195 ne_misc_dev.name);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 196
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 197 rc = -EINVAL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 198
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 199 goto free_pool_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 200 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 201 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 202 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 203
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 204 /*
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 205 * Check if CPU 0 and its siblings are included in the provided CPU pool
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 206 * They should remain available for the primary / parent VM.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 207 */
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 208 if (cpumask_test_cpu(0, cpu_pool)) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 209 pr_err("%s: CPU 0 has to remain available\n", ne_misc_dev.name);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 210
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 211 rc = -EINVAL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 212
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 213 goto free_pool_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 214 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 215
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 216 for_each_cpu(cpu_sibling, topology_sibling_cpumask(0)) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 217 if (cpumask_test_cpu(cpu_sibling, cpu_pool)) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 218 pr_err("%s: CPU sibling %d for CPU 0 is in CPU pool\n",
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 219 ne_misc_dev.name, cpu_sibling);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 220
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 221 rc = -EINVAL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 222
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 223 goto free_pool_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 224 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 225 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 226
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 227 /*
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 228 * Check if CPU siblings are included in the provided CPU pool. The
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 229 * expectation is that CPU cores are made available in the CPU pool for
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 230 * enclaves.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 231 */
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 232 for_each_cpu(cpu, cpu_pool) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 233 for_each_cpu(cpu_sibling, topology_sibling_cpumask(cpu)) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 234 if (!cpumask_test_cpu(cpu_sibling, cpu_pool)) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 235 pr_err("%s: CPU %d is not in CPU pool\n",
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 236 ne_misc_dev.name, cpu_sibling);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 237
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 238 rc = -EINVAL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 239
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 240 goto free_pool_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 241 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 242 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 243 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 244
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 @245 ne_cpu_pool.avail_cores_size = nr_cpu_ids / smp_num_siblings;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 246
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 247 ne_cpu_pool.avail_cores = kcalloc(ne_cpu_pool.avail_cores_size,
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 248 sizeof(*ne_cpu_pool.avail_cores),
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 249 GFP_KERNEL);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 250 if (!ne_cpu_pool.avail_cores) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 251 rc = -ENOMEM;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 252
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 253 goto free_pool_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 254 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 255
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 256 for (i = 0; i < ne_cpu_pool.avail_cores_size; i++)
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 257 if (!zalloc_cpumask_var(&ne_cpu_pool.avail_cores[i], GFP_KERNEL)) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 258 rc = -ENOMEM;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 259
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 260 goto free_cores_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 261 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 262
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 263 /* Split the NE CPU pool in CPU cores. */
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 264 for_each_cpu(cpu, cpu_pool) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 265 core_id = topology_core_id(cpu);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 266 if (core_id < 0 || core_id >= ne_cpu_pool.avail_cores_size) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 267 pr_err("%s: Invalid core id %d\n",
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 268 ne_misc_dev.name, core_id);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 269
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 270 rc = -EINVAL;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 271
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 272 goto clear_cpumask;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 273 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 274
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 275 cpumask_set_cpu(cpu, ne_cpu_pool.avail_cores[core_id]);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 276 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 277
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 278 /*
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 279 * CPUs that are given to enclave(s) should not be considered online
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 280 * by Linux anymore, as the hypervisor will degrade them to floating.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 281 * The physical CPUs (full cores) are carved out of the primary / parent
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 282 * VM and given to the enclave VM. The same number of vCPUs would run
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 283 * on less pCPUs for the primary / parent VM.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 284 *
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 285 * We offline them here, to not degrade performance and expose correct
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 286 * topology to Linux and user space.
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 287 */
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 288 for_each_cpu(cpu, cpu_pool) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 289 rc = remove_cpu(cpu);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 290 if (rc != 0) {
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 291 pr_err("%s: CPU %d is not offlined [rc=%d]\n",
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 292 ne_misc_dev.name, cpu, rc);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 293
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 294 goto online_cpus;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 295 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 296 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 297
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 298 free_cpumask_var(cpu_pool);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 299
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 300 ne_cpu_pool.numa_node = numa_node;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 301
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 302 mutex_unlock(&ne_cpu_pool.mutex);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 303
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 304 return 0;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 305
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 306 online_cpus:
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 307 for_each_cpu(cpu, cpu_pool)
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 308 add_cpu(cpu);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 309 clear_cpumask:
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 310 for (i = 0; i < ne_cpu_pool.avail_cores_size; i++)
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 311 cpumask_clear(ne_cpu_pool.avail_cores[i]);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 312 free_cores_cpumask:
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 313 for (i = 0; i < ne_cpu_pool.avail_cores_size; i++)
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 314 free_cpumask_var(ne_cpu_pool.avail_cores[i]);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 315 kfree(ne_cpu_pool.avail_cores);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 316 ne_cpu_pool.avail_cores_size = 0;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 317 free_pool_cpumask:
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 318 free_cpumask_var(cpu_pool);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 319 mutex_unlock(&ne_cpu_pool.mutex);
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 320
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 321 return rc;
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 322 }
7d5c9a7dfa51e60 Andra Paraschiv 2020-08-05 323
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Download attachment ".config.gz" of type "application/gzip" (73551 bytes)
Powered by blists - more mailing lists